POJ 3660 Cow Contest【floyd】
题目链接:
http://poj.org/problem?id=3660
题目大意:
给出n头牛,m个关系,关系为a的战力比b高。求最后可以确定排名的牛的数量
思路:
1.如果一头牛跟其他所有牛都确定了一个输赢关系,那么该牛的排名就得到了确定,所以用floyd跑一遍传递闭包。然后求得每个点的出度(赢了), 入度(输了)。若该点的度之和为 n - 1 ,即确定排名。
1 #include<stdio.h> 2 #include<string.h> 3 #define mem(a, b) memset(a, b, sizeof(a)) 4 const int MAXN = 110; 5 6 int n; 7 int map[MAXN][MAXN]; //表示i赢j 8 int in[MAXN], out[MAXN]; 9 10 void floyd() 11 { 12 for(int k = 1; k <= n; k ++) 13 for(int i = 1; i <= n; i ++) 14 for(int j = 1; j <= n; j ++) 15 if(map[i][k] && map[k][j]) 16 map[i][j] = 1; 17 } 18 19 int main() 20 { 21 int m; 22 scanf("%d%d", &n, &m); 23 for(int i = 1; i <= m; i ++) 24 { 25 int a, b; 26 scanf("%d%d", &a, &b); 27 map[a][b] = 1; 28 } 29 floyd(); 30 for(int i = 1; i <= n; i ++) 31 for(int j = 1; j <= n; j ++) 32 if(map[i][j]) 33 { 34 out[i] ++; 35 in[j] ++; 36 } 37 int ans = 0; 38 for(int i = 1; i <= n; i ++) 39 if(out[i] + in[i] == n - 1) 40 ans ++; 41 printf("%d\n", ans); 42 return 0; 43 }