题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1612
解:莫名就成了图。。。我们把A赢了B当做A到B的一条单向边,然后从每个点都dfs一次,(我直接用floyd,反正接受的了n^3...)
能到的点就加上一,最后如果哪个点能到它和它能到的次数之和等于n-1的,就说明它的名次是确定的。
程序:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; bool f[300][300]; int n,m,a,b; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d",&a,&b); f[a][b]=true; } 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]); int ans=0; for (int i=1;i<=n;i++) { int tot=0; for (int j=1;j<=n;j++) if ((f[i][j])||(f[j][i])) tot++; if (tot==n-1) ans++; } printf("%d\n",ans); return 0; }