poj3660
额,应该是一道水题,只要搞清楚想要知道一只牛在什么等级就要和所有的牛都比较过也就是可以从这只牛到所有牛,那么就问题就转化为传递闭包。
View Code
1 #include <stdio.h>
2 #include <string.h>
3 #define MAXN 101
4 bool map[MAXN][MAXN];
5 int n,m;
6 void floyd()
7 {
8 for(int k=1;k<=n;++k)
9 for(int i=1;i<=n;++i)
10 for(int j=1;j<=n;++j)
11 map[i][j]=(map[i][j]||(map[i][k]&&map[k][j]));
12 }
13 int main()
14 {
15 while(scanf("%d %d",&n,&m)==2)
16 {
17 memset(map,false,sizeof(map));
18 for(int i=1;i<=n;++i)
19 map[i][i]=true;
20 for(int i=1,a,b;i<=m;++i)
21 {
22 scanf("%d %d",&a,&b);
23 map[a][b]=true;
24 }
25 floyd();
26 int cnt=0;
27 bool f;
28 for(int i=1;i<=n;++i)
29 {
30 f=true;
31 for(int j=1;j<=n;++j)
32 if(!(map[i][j]||map[j][i]))
33 {
34 f=false;
35 break;
36 }
37 if(f)
38 ++cnt;
39 }
40 printf("%d\n",cnt);
41 }
42 return 0;
43 }