图论---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头牛的关系确定时确定
  • 于是我们可以将牛的等级关系看做一张图
  • 然后进行适当的松弛操作,得到任意两点的关系
  • 再对没一头牛进行检查

猜你喜欢

转载自www.cnblogs.com/orange-233/p/12321102.html