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 }
View Code

 

posted @ 2019-10-10 19:29  缘未到  阅读(98)  评论(0编辑  收藏  举报