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 }