• POJ3660:Cow Contest(Floyd传递闭包)


    Cow Contest

    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 16941   Accepted: 9447

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

    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

    题意:

    有n个人,m场比赛,然后给出m场比赛的胜负关系,问有多少只牛能确定它们自己的名次。

    题解:

    这个题有点像拓扑排序,但是只用拓扑序并不能保证结果的正确性。

    其实解这个题我们只需要发现这样一个关系就好了,若一只牛的名次能够被确定,那么它赢它的牛和它赢的牛个数之和为n-1。

    利用这个关系,我们floyd传递闭包预处理一下,然后判断一下数量关系就好了。

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    using namespace std;
    typedef long long ll;
    const int N = 105, M = 4505;
    int n,m;
    int mp[N][N];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            mp[u][v]=1;
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    mp[i][j]=(mp[i][j]|(mp[i][k]&mp[k][j]));
                }
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            int win=0,lose=0;
            for(int j=1;j<=n;j++){
                if(mp[i][j]) win++;
                if(mp[j][i]) lose++;
            }
            if(win+lose==n-1) ans++;
        }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    centos6.3 配置防火墙,开启80端口、3306端口
    Unable to run man pages on Centos 6
    1. 信息系统基础知识
    2. 软件工程
    CommonJs
    软考资料
    Node.js资料
    qyqt5(一)
    tf源码中的object_detection_tutorial.ipynb文件
    分类结果的评价指标
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10352095.html
Copyright © 2020-2023  润新知