版权声明:希望能帮到弱校的ACMer成长,因为自己是弱校菜鸡~~~~ https://blog.csdn.net/Mr__Charles/article/details/82054535
POJ T3660 Cow Contest
题目思路:
典型的用Floyd求传递闭包,如 A > B , B > C 那么 A > C
如何判断是否已确定其Rank(排名)?
因为N个点,最少需要N-1条关系才能最后确定Rank
故无论 大于 还是 小于 其他点,只要关系数相加为 N-1 即已经确定Rank。
代码:
#include<cstdio>
#include<algorithm>
#define maxn 1005
#define INF 0x3f3f3f3f
using namespace std;
int map[maxn][maxn],n,m;
void Init(){
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
map[i][j] = map[j][i] = 0; //初始化没关系,赋值0
}
void Floyd(){
for(int k = 1; k <=n ; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
map[i][j] = map[i][j]||(map[i][k]&&map[k][j]); //模拟通过 i-k 和 k-j 的关系确定 i-j 的关系
}
int main(){
int a,b;
while(~scanf("%d%d",&n,&m)){
Init();
for(int i = 0; i < m; i++){
scanf("%d%d",&a,&b);
map[a][b] = 1; //这里不能反转存储 ,因为是两者的关系,并不是边。
}
Floyd();
int ans = 0;
for(int i = 1;i <= n; i++){
int cnt = 0;
for(int j = 1; j <= n; j++)
if(map[i][j]||map[j][i])
cnt++;
if(cnt == n-1) ans++;
}
printf("%d\n",ans);
}
return 0;
}