题目链接:点我啊╭(╯^╰)╮
题目大意:
n n n头奶牛, m m m场比赛,每场比赛表示 x x x战胜 y y y,问最后能确定排名的奶牛数是多少?
解题思路:
若 x x x战胜 y y y、 y y y战胜 z z z,则 x x x战胜 z z z,明显是传递闭包,跑一遍Floyd,最后判断每个点的入度和出度之和是否为 n − 1 n-1 n−1即可
代码思路:
Floyd的传递闭包功能
#include<bits/stdc++.h>
using namespace std;
int n, m, d[3000][3000], ans;
void floyed() {
for(int k=0; k<n; k++) //插入k点
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(d[i][k]&&d[k][j])
d[i][j] = 1;
}
void init() {
scanf("%d%d", &n, &m);
memset(d, 0, sizeof(d));
for(int i=0; i<m; i++) {
int x, y;
scanf("%d%d", &x, &y);
d[x-1][y-1]=1;
}
}
int main() {
init();
floyed();
for(int i=0; i<n; i++){
int sum = 0;
for(int j=0; j<n; j++)
if(d[i][j]||d[j][i])
sum++;
if(sum == n-1) ans++;
}
printf("%d\n", ans);
}