POJ 3660 Cow Contest (Floyd)

题目链接:http://poj.org/problem?id=3660

题意是给你n头牛,给你m条关系,每条关系是a牛比b牛厉害,问可以确定多少头牛的排名。

 

要是a比b厉害,a到b上就建一条有向边......这样建好之后,如果比a牛厉害的牛都能达到a牛,而a牛能到达比a牛差的牛的话,牛的头数又恰好是n-1头,那么a牛的排名则是确定的。

所以用Flody比较方便,要是i到k能到达,k到j能到达,那么i到j就能到达,i就比j厉害。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int MAXN = 105;
 6 bool cost[MAXN][MAXN];
 7 
 8 void init() {
 9     memset(cost , false , sizeof(cost));
10 }
11 
12 int main()
13 {
14     int n , m , u , v;
15     while(cin >> n >> m) {
16         init();
17         while(m--) {
18             cin >> u >> v;
19             cost[u][v] = true;
20         }
21         for(int k = 1 ; k <= n ; k++) {
22             for(int j = 1 ; j <= n ; j++) {
23                 for(int i = 1 ; i <= n ; i++) {
24                     if(cost[i][k] && cost[k][j]) 
25                         cost[i][j] = true;
26                 }
27             }
28         }
29         int cont , res = 0;
30         for(int i = 1 ; i <= n ; i++) {
31             cont = 0;
32             for(int j = 1 ; j <= n ; j++) {
33                 if(cost[i][j] != cost[j][i])
34                     cont += 1;
35             }
36             if(cont == n - 1)
37                 res++;
38         }
39         cout << res << endl;
40     }
41 }

 

你可能感兴趣的:(POJ 3660 Cow Contest (Floyd))