考虑一个点的排名能被确定,当且仅当不存在另一个点与它互相不能到达。跑一边传递闭包,判断每个点是否满足上述条件即可。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ans=0;
bool f[110][110];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
f[x][y]=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++)
{
bool pd=1;
for(int j=1;j<=n;j++)
if(i!=j&&(!f[i][j])&&(!f[j][i])) {pd=0;break;}
ans+=pd;
}
printf("%d",ans);
return 0;
}