POJ T3660 Cow Contest (用Floyd求传递闭包)

版权声明:希望能帮到弱校的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;
}

猜你喜欢

转载自blog.csdn.net/Mr__Charles/article/details/82054535