题意:给出任意两头牛在比赛中的位次关系,求根据所给的数据,能确定几头牛的rank~
思路:求有向图的传递闭包问题~ 简单说,传递性就是如果点i和点k连通,点k和点j连通,那么点i和点j也连通~
由此我们就可以判断出图中任意两点是否相连。 这道题可以用floyd算法求解,最后判断所有与某个点相连的点的个数是否等于n-1,就可以得出结果辣~
AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n,m; int d[105][105]; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(d[i][j]||(d[i][k]&&d[k][j])) d[i][j]=1; } return; } int main() { int x,y; while(scanf("%d%d",&n,&m)!=EOF) { memset(d,0,sizeof(d)); while(m--) { scanf("%d%d",&x,&y); d[x][y]=1; } floyd(); int ans=0,num=0; for(int i=1;i<=n;i++) { num=0; for(int j=1;j<=n;j++) { if(d[i][j]==1||d[j][i]==1) num++; //cout<<i<<" "<<j<<" "<<num<<endl; } if(num==n-1) ans++; } printf("%d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/mowenwen_/article/details/47004903