zoukankan      html  css  js  c++  java
  • nyoj 211——Cow Contest——————【floyd传递闭包】

    Cow Contest

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述

    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.

     
    输入
    * 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

    There are multi test cases.The input is terminated by two zeros.The number of test cases is no more than 20.
    输出
    For every case:
    * Line 1: A single integer representing the number of cows whose ranks can be determined
    样例输入
    5 5
    4 3
    4 2
    3 2
    1 2
    2 5
    0 0
    样例输出
    2

    题目大意:给你n,m表示n位大牛,有m对能力比较关系,表示a能打败b。问你最后几个人的排名可以确定。

    解题思路:首先用floyd传递闭包,然后枚举统计排名可以确定的人数。某大牛的排名确定,则应该有他与其他n-1个人关系确定,败或赢。
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=120;
    int d[maxn][maxn];
    void floy(int n){
        int i,j,k;
        for(k=1;k<=n;k++){
            for(i=1;i<=n;i++){
                for(j=1;j<=n;j++){
                    d[i][j]=d[i][j]||(d[i][k]&&d[k][j]);
                }
            }
        }
    }
    int work(int n){
        int ret=0,sum,k,i,j;
        for(k=1;k<=n;k++){
            sum=0;
            for(i=1;i<=n;i++){
                if(i==k) continue;
                if(d[k][i]){
                    sum++;
                }
                if(d[i][k]){
                    sum++;
                }
            }
            if(sum==n-1)
                ret++;
        }
        return ret;
    }
    int main(){
        int n,m,i,j,k,a,b;
        while(scanf("%d%d",&n,&m)!=EOF&&(n+m)){
            memset(d,0,sizeof(d));
            for(i=0;i<m;i++){
                scanf("%d%d",&a,&b);
                d[a][b]=1;
            }
            floy(n);
            printf("%d
    ",work(n)) ;
        }
        return 0;
    }
    

      

  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4646036.html
Copyright © 2011-2022 走看看