Cow Contest---poj3660

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

题意:有n头牛,m个关系,a b意思是a能打败b;求能确定排名的有几个;

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

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

 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
",ans);
56     }
57     return 0;
58 }
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4667290.html