您的位置:首页 > 其它

POJ 3660 Cow Contest (Floyd 传递闭包判连通)

2015-02-09 01:04 483 查看
Cow Contest
Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 7311Accepted: 4045
Description

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 ≤ N; A ≠ 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

Source
USACO 2008 January Silver

题目链接:http://poj.org/problem?id=3660

题目大意:n个人m个关系,a b表示a胜b,问有多少人的名次确定

题目分析:先根据胜负关系建图,map[a][b]表示a名次在b之前,名次具有传递性,也就是如果a胜b,b胜c则a的名次一定在c之前,所以建图完跑一遍Floyd,然后根据点的度数,若度数为n-1,说明其他人与他的关系都确定,则他的名次就可以确定了

#include <cstdio>
#include <cstring>
int m, n, map[105][105], d[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(map[i][k] && map[k][j])
                    map[i][j] = 1;
}

void cal()
{
    for(int i = 1; i<= n; i++)
    {
        for(int j = 1; j<= n; j++)
        {
            if(map[i][j])
            {
                d[i] ++;
                d[j] ++;
            }
        }
    }
}

int main()
{
    int a, b, ans = 0;
    memset(map, 0, sizeof(map));
    memset(d, 0, sizeof(d));
    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; i++)
    {
        scanf("%d %d", &a, &b);
        map[a][b] = 1;
    }
    Floyd();
    cal();
    for(int i = 1; i <= n; i++)
        if(d[i] == n - 1)
            ans ++;
    printf("%d\n", ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: