POJ 3660 Cow Contest 【floyd求传递闭包 + 思维好题】

传送门
// 题意: 每头牛都有一个确定的排名, 两头牛打架排名高的一定会赢, 现在给出m场比赛双方以及结果, 问最多可以确定多少头牛的排名.

思路: 首先分析如何才能确定一头牛的排名, 那就是假设一头牛a可以打败x头牛, 同时也输给了y头牛, 那么如果x+y == n-1那么这头牛的排名就是可以确定的, 同时如果a打败了b, b打败了c, 那么a也是打败了c的, 也就是具有传递性. 所以我们先用floyd求出传递闭包, 然后扫一遍check出满足条件的头数即可.

AC Code

const int maxn = 1e2+5;
int cas=1;
int g[maxn][maxn];
void solve()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1 ; i <= n ; i ++) {
        for (int j = 1 ; j <= n ; j ++) {
            g[i][j] = inf;
        }
        g[i][i] = 0;
    }
    for (int i = 1 ; i <= m ; i ++) {
        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 ++)
                g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
    int ans = 0;
    for (int i = 1 ; i <= n ; i ++) {
        int cnt = 0;
        for (int j = 1 ; j <= n ; j ++) {
            if (i == j) continue;
            if (g[i][j] != inf || g[j][i] != inf) cnt++;
        }
        if (cnt == n-1) ans++;
    }
    printf("%d\n", ans);
}

你可能感兴趣的:(最短路相关)