POJ 1975 - Median Weight Bead
http://poj.org/problem?id=1975
概要
N 個のビーズに関して「i 番目のビーズは j 番目のビーズよりも重い」という情報が M 個与えられる.
このとき,中央値になりえないビーズの数を答える.
制約
- 1 <= N <= 99
- M に関しては無し?
解法
ワーシャル・フロイドっぽく「i 番目のビーズよりも(重い|軽い)ビーズ」の数を求めて数えるだけ.
poj/1975.cc1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 int main() 7 { 8 int T; 9 cin >> T; 10 while (T-- > 0) { 11 int N, M; 12 cin >> N >> M; 13 vector<vector<int> > lt(N, vector<int>(N, 0)), gt(N, vector<int>(N, 0)); 14 for (int i = 0; i < M; i++) { 15 int u, v; 16 cin >> u >> v; 17 u--; v--; 18 lt[u][v] = 1; 19 gt[v][u] = 1; 20 } 21 22 for (int k = 0; k < N; k++) { 23 for (int i = 0; i < N; i++) { 24 for (int j = 0; j < N; j++) { 25 if (lt[i][k] && lt[k][j]) { 26 lt[i][j] = 1; 27 } 28 } 29 } 30 } 31 for (int k = 0; k < N; k++) { 32 for (int i = 0; i < N; i++) { 33 for (int j = 0; j < N; j++) { 34 if (gt[i][k] && gt[k][j]) { 35 gt[i][j] = 1; 36 } 37 } 38 } 39 } 40 41 int ans = 0; 42 for (int i = 0; i < N; i++) { 43 if (count(lt[i].begin(), lt[i].end(), 1) > N/2 44 || count(gt[i].begin(), gt[i].end(), 1) > N/2) { 45 ++ans; 46 } 47 } 48 cout << ans << endl; 49 } 50 return 0; 51 }