题意:有n(1<=n<=100)个学生参加编程比赛。给出m条实力信息。(1<=M<=4500)其中每一条的格式A B(1<=A<=N,1<=B<=N,A!=B) 意思是A的实力比B强。如果A比B强且B比C强,那么A一定比C强。问最后有多少名学生可以确定他的排名(即他和N - 1个人的关系都可以确定)。
保证输入信息不存在矛盾
第一行n和m。
保证输入信息不存在矛盾
第一行n和m。
以下m行 A B 表示A实力比B强。
思路:Floyd闭包传递。
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 105;
int n, m;
bool d[MAXN][MAXN];
void Floyd()
{
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
d[i][j] = d[i][j] || (d[i][k] && d[k][j]);
}
}
}
}
int main()
{
scanf("%d%d", &n, &m);
while (m--)
{
int u, v;
scanf("%d%d", &u, &v);
d[u][v] = true;
}
Floyd();
int ans = 0;
for (int i = 1; i <= n; i++)
{
int cnt = 0;
for (int j = 1; j <= n; j++)
{
if (d[i][j] || d[j][i]) cnt++;
}
if (cnt >= n - 1) ans++;//一个牛跟n-1个牛有关系,那么他的排名就能被确定
}
printf("%d\n", ans);
return 0;
}
/*
5 5
4 3
4 2
3 2
1 2
2 5
*/