题意:有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 }