题意:
给定两个人之间的胜负关系,问有几个人的名次可以确定
思路:
跑完 floyd,可以知道根据给定关系能推出来的所有胜负关系,
然后某个人跟其他 n-1 个人的胜负关系可知的话,他的名次就是可知的
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 100 + 7, maxd = (1<<18)-1, mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;
int n, m;
bool f[maxn][maxn];
void init() {
memset(f, 0, sizeof f);
for(int i = 0; i < m; ++i) {
int u, v;
scanf("%d %d", &u, &v);
f[u][v] = true;
}
}
void solve() {
for(int k = 1; k <= n; ++k) {
for(int i = 1; i <= n; ++i) {
if(i == k) continue;
for(int j = 1; j <= n; ++j) {
if(j == k || j == i) continue;
if(f[i][k] && f[k][j]) f[i][j] = true;
}
}
}
// for(int i = 1; i <= n; ++i) {
// for(int j = 1; j <= n; ++j)
// cout << f[i][j] << " ";
// cout << endl;
// }
int ans = 0;
for(int i = 1; i <= n; ++i) {
int flag = 1;
for(int j = 1; j <= n; ++j) {
if(i == j) continue;
if(!f[i][j] && !f[j][i]) { flag = 0; break; }
}
if(flag) ans++;
}
cout << ans << endl;
}
int main() {
while(~scanf("%d %d", &n, &m) && n+m) {
init();
solve();
}
return 0;
}