H - Cow Contest POJ - 3660
题意: 有 n 头牛比赛,边 1 -> 2 代表 1 能赢 2 ,给你 m 条边,问能确定出多少头牛的名次?
思路: 如果 1->2 && 2 ->3 则显然有 1->3 ,所以该关系满足传递关系,则我们可以利用 Floyd 求传递闭包,最后出度 + 入度为 n-1 的点,名次必然确定
复杂度:O(n3)= 1e6
AC代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 110;
const int maxm = 4510;
int n, m;
int mp[maxn][maxn]; // 存图
int in[maxn], out[maxn]; // 入度、出度
void Floyd() {
for(int k = 1; k <= n; k++) {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(mp[i][k] && mp[k][j]) { // 传递关系
if(mp[i][j]) continue; // 可能该传递关系已经被条件给出
mp[i][j] = 1;
in[i]++;
out[j]++;
}
}
}
}
}
int main() {
// freopen("test.in", "r", stdin);
int sum = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
mp[u][v] = 1;
in[u]++;
out[v]++;
}
Floyd();
for(int i = 1; i <= n; i++) if(in[i] + out[i] == n-1) sum++;
printf("%d\n", sum);
return 0;
}