• POJ 3660 Cow Contest 传递闭包+Floyd


    原题链接:http://poj.org/problem?id=3660

    Cow Contest
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 8395   Accepted: 4734

    Description

    N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors.

    The contest is conducted in several head-to-head rounds, each between two cows. If cow A has a greater skill level than cow B (1 ≤ A ≤ N; 1 ≤ B ≤ NA ≠ B), then cow A will always beat cow B.

    Farmer John is trying to rank the cows by skill level. Given a list the results of M (1 ≤ M ≤ 4,500) two-cow rounds, determine the number of cows whose ranks can be precisely determined from the results. It is guaranteed that the results of the rounds will not be contradictory.

    Input

    * Line 1: Two space-separated integers: N and M
    * Lines 2..M+1: Each line contains two space-separated integers that describe the competitors and results (the first integer, A, is the winner) of a single round of competition: A and B

    Output

    * Line 1: A single integer representing the number of cows whose ranks can be determined
     

    Sample Input

    5 5
    4 3
    4 2
    3 2
    1 2
    2 5
    

    Sample Output

    2
    

    Source

    题意

    给你若干牛之间的优劣关系,问你有多少头牛能够被确定排名。

    题解

    如果有x头牛比当前牛弱,有y头牛比当前牛强,并且x+y=n-1,那么这头牛的排名就被唯一确定了。转化为图论问题,我们若牛a比牛b强,则连接a,b(单向)。运用floyd的思想,令dp[i][j]表示从i能够走到j,即牛i和牛j之间存在强弱关系,那么转移就是dp[i][j]=dp[i][j] | (dp[i][k] & dp[k][j]),跑一发floyd,再统计每个点的度即可。

    代码

    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    #define MAX_N 111
    using namespace std;
    
    bool d[MAX_N][MAX_N];
    int n,m;
    
    void floyd() {
        for (int k = 1; k <= n; k++)
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                    d[i][j] = d[i][j] | (d[i][k] & d[k][j]);
    }
    
    int de[MAX_N];
    
    int main() {
        cin.sync_with_stdio(false);
        cin >> n >> m;
        for (int i = 0; i < m; i++) {
            int u, v;
            cin >> u >> v;
            d[u][v] = 1;
        }
        floyd();
        int ans = 0;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                de[i] += d[i][j], de[j] += d[i][j];
        for (int i = 1; i <= n; i++)if (de[i] == n - 1)ans++;
        cout << ans << endl;
        return 0;
    }
  • 相关阅读:
    linux系统中split命令
    linux系统 如何提取奇数列
    R语言提取奇数行、偶数行、整倍数行、奇数列、偶数列、整倍数列
    linux 系统sed命令如何提取奇数行、偶数行及整倍数行
    linux系统如何提取奇数列
    Can't exec "epstopdf": No such file or directory 报错解决
    beagle 填充 Exception in thread "main" java.lang.IllegalArgumentException: NaN
    sh: gnuplot: command not found 报错记录
    linux 系统 awk命令提取奇数行、偶数行及整数倍行
    R语言subset函数的用法
  • 原文地址:https://www.cnblogs.com/HarryGuo2012/p/4759056.html
Copyright © 2020-2023  润新知