POJ 3660 Cow Contest

                                   Cow Contest
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7156   Accepted: 3957

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 ≤ 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

Source

 
 
给出n个点 , 然后m条边的有向图
每条边(u,v)表示u能够打败v。
最后要给所有人排一个名次
问有多少个人的名次的是可以确定的。
反正n只有100,就跑一次 bellman_ford.
然后只要i 能到达 j 的话, 都给它们连一条边。
然后统计一次出入度之和大于等于 n - 1 (不包括 i -> i ) 的点的个数即可。 
 
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <string>

using namespace std;
typedef long long LL;
const int N = 110;
const int inf = 1e7+7;
int n , m , dis[N][N] , in_cnt[N] , out_cnt[N];

void init_dis() {
    for( int i = 0 ; i <= n ; ++i ) {
        for( int j = 0 ; j <= n ; ++j ) {
            dis[i][j] = inf ;
        }
        dis[i][i] = 0 ;
    }
}

void check_dis() {
    for( int i = 1 ; i <= n ; ++i ) {
        for( int j = 1 ; j <= n ; ++j )
            if( dis[i][j] < inf )cout << dis[i][j] <<' ';
            else cout << "inf ";
        cout << endl;
    }
}

void run()
{
    int u , v ;
    init_dis();
    while( m-- ) {
        scanf("%d%d",&u,&v);
        dis[u][v] = 1 ;
    }
    for( int k = 1 ; k <= n ; ++k ) {
        for( int i = 1 ; i <= n ; ++i ) {
            for( int j = 1 ; j <= n ; ++j ){
                dis[i][j] = min( dis[i][j] , dis[i][k] + dis[k][j] );
            }
        }
    }
//    check_dis();
    memset( in_cnt , 0 , sizeof in_cnt );
    memset( out_cnt , 0 , sizeof out_cnt );
    for( int i =1 ; i <= n ; ++i ) {
        for( int j = 1 ; j <= n ; ++j ){
            if( i == j || dis[i][j] >= inf ) continue ;
            out_cnt[i]++ , in_cnt[j]++;
        }
    }
    int ans = 0 ;for( int i = 1 ; i <= n ; ++i ) if( in_cnt[i] + out_cnt[i] >= n - 1 ) ans++;
    printf("%d
",ans);
}

int main()
{
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
    #endif // LOCAL
    ios::sync_with_stdio(false);
    while( ~scanf("%d%d",&n,&m) ) run();
}
View Code
 
only strive for your goal , can you make your dream come true ?
原文地址:https://www.cnblogs.com/hlmark/p/4099004.html