传送门
// 题意: 每头牛都有一个确定的排名, 两头牛打架排名高的一定会赢, 现在给出m场比赛双方以及结果, 问最多可以确定多少头牛的排名.
思路: 首先分析如何才能确定一头牛的排名, 那就是假设一头牛a可以打败x头牛, 同时也输给了y头牛, 那么如果x+y == n-1那么这头牛的排名就是可以确定的, 同时如果a打败了b, b打败了c, 那么a也是打败了c的, 也就是具有传递性. 所以我们先用floyd求出传递闭包, 然后扫一遍check出满足条件的头数即可.
AC Code
const int maxn = 1e2+5;
int cas=1;
int g[maxn][maxn];
void solve()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1 ; i <= n ; i ++) {
for (int j = 1 ; j <= n ; j ++) {
g[i][j] = inf;
}
g[i][i] = 0;
}
for (int i = 1 ; i <= m ; i ++) {
int u, v;
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 ++)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
int ans = 0;
for (int i = 1 ; i <= n ; i ++) {
int cnt = 0;
for (int j = 1 ; j <= n ; j ++) {
if (i == j) continue;
if (g[i][j] != inf || g[j][i] != inf) cnt++;
}
if (cnt == n-1) ans++;
}
printf("%d\n", ans);
}