zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    关于 self 和 super 在oc 中 的疑惑 与 分析
    面向对象总结
    OC面向对象的三大特征
    Web jsp开发学习——Servlet提交表单时用法
    Web jsp开发学习——Servlet提交表单时用法
    Web jsp开发学习——点击菜单页面切换
    Web jsp开发学习——点击菜单页面切换
    珍藏的数据库SQL基础练习题答案
    珍藏的数据库SQL基础练习题答案
    数据库SQL语言学习--上机练习3(插入 更新 删除)
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/10352095.html
Copyright © 2011-2022 走看看