Cow Contest---poj3660

http://poj.org/problem?id=3660

如果一头牛被x头牛打败,并且可以打败y头牛,如果x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任一头牛,可以打败其他的牛的个数x, 和能打败该牛的牛的个数y求出来,在遍历所有牛判断一下是否满足x+y=n-1,就知道这个牛的排名是否能确定了(而传递闭包,正好将所有能得出关系都求出来了)

传递闭包就是如果a>b,b>c那么a>c;

 

Cow Contest---poj3660
 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<math.h>

 4 #include<string.h>

 5 #include<algorithm>

 6 #define INF 0xfffffff

 7 #define N 1100

 8 using namespace std;

 9 

10 int n,m;

11 int maps[N][N];

12 

13 void Floyd()

14 {

15     int i,j,k;

16     for(k=1;k<=n;k++)

17         for(i=1;i<=n;i++)

18             for(j=1;j<=n;j++)

19                 if(maps[i][k]==1&&maps[k][j]==1)

20                     maps[i][j]=1;

21 }

22 

23 int main()

24 {

25     int i,j,a,b;

26     while(scanf("%d%d",&n,&m)!=EOF)

27     {

28 

29         for(i=0;i<=n;i++)

30             for(j=0;j<=n;j++)

31                 maps[i][j]=0;

32 

33         for(i=0;i<m;i++)

34         {

35             scanf("%d%d",&a,&b);

36             maps[a][b]=1;

37         }

38 

39         Floyd();

40 

41         int ans=0;

42         for(i=1;i<=n;i++)

43         {

44             int k=0;

45             for(j=1;j<=n;j++)

46             {

47                 if(i==j)continue;

48 

49                 if(maps[i][j]==1||maps[j][i]==1)

50                     k++;

51             }

52             if(k==n-1)

53                 ans++;

54         }

55         printf("%d\n",ans);

56     }

57     return 0;

58 }
View Code

 

你可能感兴趣的:(test)