• 图论---Cow Contest


    D-Cow Contest

    N(1≤N≤100)头奶牛,方便编号1。我们正在参加一个程序设计比赛。我们都知道,有些奶牛比其他奶牛的代码更好。每头牛都有一个固定的技能等级,这在竞争者中是独一无二的。

    比赛分几轮进行,每轮由两头奶牛进行。如果奶牛A的技能水平高于奶牛B(1≤A≤N;1≤B≤N;A≠B),那么奶牛A总是打败奶牛B。

    农民约翰正试图按技术水平给牛排序。给出一组M(1≤M≤4500)两轮奶牛轮数的结果,根据结果求出其等级的奶牛数。这些回合的结果将不会相互矛盾,这是可以保证的。

    输入

    第1行:两个用空格分隔的整数:N和M
    第二到第M+1行:每一行包含两个空格分隔的整数,它们描述了竞争对手和一轮比赛的结果(第一个整数A是获胜者):A和B

    输出

    第1行:单个整数,表示可以确定的奶牛数量

    Sample Input

    5 5
    4 3
    4 2
    3 2
    1 2
    2 5
    

    Sample Output

    2
    
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int map[105][105], inf = 0x3f3f3f3f;
    int main()
    {
        int n, m;
        scanf("%d%d", &n, &m);
        memset(map, inf, sizeof(map));
        int x, y;
        for( int i = 0; i < m; i++ )
    	{
            scanf("%d%d", &x, &y);
            map[x][y] = 1;
            map[y][x] = -1;
        }
        for( int j = 1; j <= n; j++ )
            for( int i = 1; i <= n; i++ )
                for( int k = 1; k <= n; k++ )
    			{
                    if( map[i][j] == map[j][k] && ( map[i][j] == 1 || map[i][j] == -1 ) )
                        map[i][k] = map[i][j];
                }
        int ans = 0;
        for( int i = 1; i <= n; i++ )
    	{
            int sum = 0;
            for( int j = 1; j <= n; j++ )
    		{
                if( map[i][j] != inf )
                    sum++;
            }
            if( sum == n - 1 )
                ans++;
        }
        printf("%d", ans);
        return 0;
    }
    
    • 一头牛的等级,当且仅当它与其它N-1头牛的关系确定时确定
    • 于是我们可以将牛的等级关系看做一张图
    • 然后进行适当的松弛操作,得到任意两点的关系
    • 再对没一头牛进行检查
  • 相关阅读:
    用SQL SERVER取分组数据第一条:查出每个班级的成绩第一名
    [转]spring beans.xml
    [转]为什么要使用框架
    MySQL 5.6 for Windows 解压缩版配置安装
    [转]hql 语法与详细解释
    [转]slf4j + log4j原理实现及源码分析
    [转]最详细的Log4j使用教程
    yii2 checkbox 的使用实例
    Magento Order 状态详解
    yii2 设置多个入口文件
  • 原文地址:https://www.cnblogs.com/orange-233/p/12321102.html
Copyright © 2020-2023  润新知