POJ 3660 Cow Contest

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 ≤ AN; 1 ≤ BN; AB), 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

Ideas: This question is used to build the topology diagram, build relationships with each other point by point Freud. If you can determine the relationship between this point and all other points, then it is clear ranking points, otherwise it can not establish a relationship - unable to determine rankings (own drawing).
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
using namespace std;
#define ll long long

const int inf = 0x3f3f3f3f;
int n, m, dis[100+8][100+8];

int main()
{
    int a, b;
    memset(dis, 0, sizeof(dis));
    scanf("%d%d", &n, &m);
    for(int i = 0; i<m; i++)
    {
        scanf("%d%d", &a, &b);
        dis[a][b] = 1;
        dis[b][a] = -1;
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            for(int k = 1; k <= n; k++)
                if(dis[j][i] == dis[i][k] && dis[j][i])
                {
                    dis[j][k] = dis[i][k];
                }
    int ans = 0, sum;
    for(int i = 1; i <= n; i++)
    {
        sum = 0;
        for(int j = 1; j <= n; j++)
            if(dis[i][j] != 0)
                sum++;
        if(sum == n-1)ans++;
    }
    printf("%d\n", ans);
    return 0;
}

 

Guess you like

Origin www.cnblogs.com/RootVount/p/11209617.html