poj3660 最短路/拓扑序

题意:有n头牛,为了给牛排顺序,给出了牛之间的胜负关系,具有传递性,问给出的胜负关系是否可以给这些牛排出唯一的顺序。

其实是个拓扑排序问题,牛的胜负关系就是有向边,然后判断是否有唯一的拓扑序就行。当然,也可以考虑每头牛若比它强的牛数和比它弱的牛数总和确定是n-1个,那么这头牛的位置就可以唯一确定,那么如果 n 头牛的位置都可以唯一确定,顺序也就可以唯一确定了,所以建立 u 胜 v 的单向边,然后通过 floyd 直接求出所有点的最短路关系, u 到 v 有最短路说明 u 胜 v , v 负 u ,然后统计每一头牛的最短路,和其他牛到它的最短路总数,若为 n - 1 则可以确定该牛名次,然后也可以得出结论。

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int g[105][105];
 5 
 6 int main(){
 7     int n,m;
 8     while(scanf("%d%d",&n,&m)!=EOF){
 9         int a,b,i,j,k;
10         memset(g,0,sizeof(g));
11         for(i=1;i<=m;i++){
12             scanf("%d%d",&a,&b);
13             g[a][b]=1;
14         }
15         for(k=1;k<=n;k++){
16             for(j=1;j<=n;j++){
17                 for(i=1;i<=n;i++){
18                     if(g[i][k]&&g[k][j])g[i][j]=1;
19                 }
20             }
21         }
22         int ans=0;
23         for(i=1;i<=n;i++){
24             int t=0;
25             for(j=1;j<=n;j++){
26                 if(g[i][j])t++;
27                 if(g[j][i])t++;
28             }
29             if(t==n-1)ans++;
30         }
31         printf("%d
",ans);
32     }
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/cenariusxz/p/4785217.html