这道题说的是给你几个点能否判断这个点的rank位置;
也就是判断这个点是否和 所有点有关系;
即 edge[i][j] || edge[j][i]中有一个以上不是无穷大,用flyod算法(n*n*n)遍历即可。
其实看到n<=100就可以猜到是用这个了,数据比较小。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
const int inf = 0x3f3f3f3f;
int edge[105][105],n,m;
void floyd() {
for(int i = 1;i <= n;i++)
edge[i][i] = 0;
for(int k = 1;k <= n;k++)
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++) {
if(edge[i][k] != inf && edge[k][j] != inf && edge[i][j] > edge[i][k] + edge[k][j])
edge[i][j] = edge[i][k] + edge[k][j];
}
}
int main() {
while(~scanf("%d%d",&n,&m)) {
memset(edge,inf,sizeof(edge));
int l,r;
for(int i = 1;i <= m;i++) {
scanf("%d%d",&l,&r);
edge[l][r] = 1;
}
floyd();
int cnt = 0,j;
for(int i = 1;i <= n;i++) {
for(j = 1;j <= n;j++) {
if(edge[i][j] == inf && edge[j][i] == inf)
break;
}
if(j > n)
cnt++;
}
printf("%d\n",cnt);
}
}