• POJ3660 Cow Contest【最短路-floyd】



    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

    思路:原来是觉得像昨天写的那题一样用bellman判断一下能不能成环

    但是这道题问的不只是一只牛 而是所有牛 而且成环不成环并不能判断他的排名能不能确定

    对于一头牛 如果我们知道有x只牛能赢他 他能赢y只牛 并且x+y=n-1的话 那么他的排名是可以确定的

    所以就用floyd跑一遍 就可以把传递的关系建立起来了

    emmmm传递闭包?题解上有这么说 但是不是很理解有什么关系......因为用了floyd???

    唉离散学了都忘光了 感觉之前学的真的都忘了

    然后遍历每一头牛看看行不行


    代码:

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<cstring>
    #include<queue>
    #include<stack>
    #define inf 0x3f3f3f3f
    
    using namespace std;
    
    int n, m, d[105][105];
    
    void floyd()
    {
        for(int k = 1; k <= n; k++){
            for(int i = 1; i <= n; i++){
                for(int j = 1; j <= n; j++){
                    if(d[i][k] && d[k][j]){
                        d[i][j] = 1;
                    }
                }
            }
        }
    }
    
    int main()
    {
        while(cin>>n>>m){
            for(int i = 0; i < m; i++){
                int a, b;
                cin>>a>>b;
                d[a][b] = 1;
            }
            floyd();
            int ans = 0;
            for(int i = 1; i <= n; i++){
                int num = 0;
                for(int j = 1; j <= n; j++){
                    if(d[i][j] || d[j][i]){
                        num++;
                    }
                }
                if(num == n - 1){
                    ans++;
                }
            }
    
            cout<<ans<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    (CSDN 迁移) jFinal找不到或无法加载主类
    (CSDN迁移) jFinal无法启动_JFinalDemoGenerator问题解决办法
    (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)
    (CSDN迁移)JAVA多线程实现-单线程化线程池newSingleThreadExecutor
    (CSDN迁移) JAVA多线程实现-实现Runnable接口
    (CSDN迁移)JAVA多线程实现-继承Thread
    (CSDN迁移) html中的rel属性
    通过microtask和macrotask理解Vue.nextTick()的实现
    javascript处理异步的三种方法
    git常用的基本命令
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9643425.html
Copyright © 2020-2023  润新知