OJ题号:洛谷2419
思路:
Floyd求有向图的传递闭包,只要该点与其他所有点相连即可确定名次。
1 #include<cstdio> 2 #include<cstring> 3 int main() { 4 int n,m; 5 scanf("%d%d",&n,&m); 6 bool s[n+1][n+1]; 7 memset(s,0,sizeof s); 8 while(m--) { 9 int a,b; 10 scanf("%d%d",&a,&b); 11 s[a][b]=true; 12 } 13 for(int k=1;k<=n;k++) { 14 for(int i=1;i<=n;i++) { 15 for(int j=1;j<=n;j++) { 16 s[i][j]|=s[i][k]&&s[k][j]; 17 } 18 } 19 } 20 int ans=0; 21 for(int i=1;i<=n;i++) { 22 for(int j=1;j<=n;j++) { 23 if(i==j) continue; 24 if(!s[i][j]&&!s[j][i]) goto Next; 25 } 26 ans++; 27 Next:; 28 } 29 printf("%d ",ans); 30 return 0; 31 }