Cow Contest POJ - 3660

原题链接

考察:最短路

错误思路:

       拓扑排序两次正反建图,当队列只有一个元素说明可以排名.

此思路错在当所有牛都可以排序时,会重复计数.或者图呈8字形,即中间牛可确定排名,两边牛不可,还会计算错误

正确思路:

      如果一头牛可以确定排名,那么他前面的人数和后面的人数都是确定的.即入度+出度==n-1

用floyd算法可以确定两头牛之间的关系

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 110;
 6 int n,m,g[N][N];
 7 void floyd()
 8 {
 9     for(int k=1;k<=n;k++)
10        for(int i=1;i<=n;i++)
11          for(int j=1;j<=n;j++)
12             g[i][j] = min(g[i][j],g[i][k]+g[k][j]);
13 }
14 int main()
15 {
16 //    freopen("in.txt","r",stdin);
17     int res = 0;
18     scanf("%d%d",&n,&m);
19     for(int i=1;i<=n;i++)
20       for(int j=1;j<=n;j++)
21          if(i==j) g[i][j] = 0;
22          else g[i][j] = 0x3f3f3f3f;
23     while(m--)
24     {
25         int x,y; scanf("%d%d",&x,&y);
26         g[x][y] = 1;
27     }
28     floyd();
29     for(int i=1;i<=n;i++)
30     {
31         int ans = 0;
32         for(int j=1;j<=n;j++)
33         {
34             if(i==j) continue;
35             if(g[i][j]!=0x3f3f3f3f) ans++;
36             if(g[j][i]!=0x3f3f3f3f) ans++; 
37         }
38         if(ans==n-1) res++;
39     }
40     printf("%d\n",res);
41     return 0; 
42 }

 

posted @ 2021-01-21 00:06  acmloser  阅读(54)  评论(0编辑  收藏  举报