• 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;
    }
    

      

  • 相关阅读:
    c++虚继承
    linux常用命令大全
    数据库三大范式最通俗解释
    PG数据库空间大小及数据库对象占用空间大小
    Oracle表分区详解
    Excel数据导入PG库,字符串正则表达式
    Oracle 执行计划
    ASP.NET MVC5框架揭秘 学习笔记01
    .NET简单学习
    蓝桥杯_算法训练_ALGO10_集合运算
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4646036.html
Copyright © 2020-2023  润新知