POJ 3660 Cow Contest(求图的传递性)

题意:

给定n头牛, 然后有m个比较, 求出有多少头牛能确定自己的排名。

分析:

假设有一头牛a, 有ki头牛强于自己, kj头牛弱于自己, ki + kj == n-1时, 那么这头牛的排名就确定了。

对于每个比较建一条有向边

求出a点可达哪些点, 哪些点可达a点即可

#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#define rep(i,a,b) for(int i = a; i < b; i++)
#define _rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
const int maxn = 107;
const int inf = 1e9;
int G[maxn][maxn];
int n , m;
int main()
{
    while(~scanf("%d %d", &n, &m)){
        rep(i,1,maxn) rep(j,1,maxn) G[i][j] = 0;

        rep(i,0,m) {
            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++){
                    if(G[i][j] == 0) G[i][j] = G[i][k] && G[k][j]; //只有当 G[i][k] && G[k][j] 都有路时, G[i][j]才算联通
                }
            }
        }
        int ans = 0;
        _rep(i,1,n){
            int cnt = 0;
            _rep(j,1,n){
                if(G[i][j]) cnt++;
                if(G[j][i]) cnt++;
            }
            if(cnt == n - 1) ans++;
        }
        printf("%d
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Jadon97/p/8342205.html