解题思路:
使用floyd算法求传递闭包,若该点与其他所有点的关系都能确定,则该点的名次可以确定。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define LL long long
using namespace std;
const int MAXN = 100 + 10;
int G[MAXN][MAXN];
int N, M;
int main()
{
while(scanf("%d%d", &N, &M)!=EOF)
{
int u, v;
memset(G, 0, sizeof(G));
for(int i=1;i<=M;i++)
{
scanf("%d%d", &u, &v);
G[u][v] = 1;
}
for(int k=1;k<=N;k++)
{
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(G[i][k] == 1 && G[k][j] == 1)
G[i][j] = 1;
}
}
}
int ans = 0;
for(int i=1;i<=N;i++)
{
int j;
for(j=1;j<=N;j++)
{
if(i == j) continue;
if(G[i][j] == 0 && G[j][i] == 0) break;
}
if(j > N) ans++;
}
printf("%d\n", ans);
}
return 0;
}