目录
显示
题目链接
https://www.luogu.org/problem/P2419
http://poj.org/problem?id=3660
题解
如果 A 能赢 B,我们可以在 A 和 B 之间连一条有向边。如果点 A 能够到达其他所有的点,那么他的排名就能够确定。
如何判断一个点可以到达其他的点呢?我们可以用 floyd 算法来解决。
事实上,求有向图中任意两点连通性的结果叫做有向图的传递闭包。
#include <stdio.h> int f[105][105]; int main() { int n,m,ans=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); f[a][b]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=f[i][j]|(f[i][k]&f[k][j]); for(int i=1;i<=n;i++) { int res=1; for(int j=1;j<=n;j++) if(i!=j)res&=(f[i][j]|f[j][i]); ans+=res; } printf("%d\n",ans); return 0; }