POJ-3660 Cow Contest( 最短路 )
题目链接:http://poj.org/problem?id=3660
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
题目大意:有N头牛,评以N个等级,各不相同,先给出部分牛的等级的高低关系,问最多能确定多少头牛的等级
解题思路:一头牛的等级,当且仅当它与其它N-1头牛的关系确定时确定,于是我们可以将牛的等级关系看做一张图,然后进行适当的松弛操作,得到任意两点的关系,再对没一头牛进行检查即可
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 6 using namespace std; 7 8 int map[105][105], INF = 0x3f3f3f3f; 9 10 int main(){ 11 ios::sync_with_stdio( false ); 12 13 int n, m; 14 cin >> n >> m; 15 memset( map, INF, sizeof( map ) ); 16 17 int x, y; 18 for( int i = 0; i < m; i++ ){ 19 cin >> x >> y; 20 map[x][y] = 1; //x战胜y 21 map[y][x] = -1; //y败于x 22 } 23 24 for( int j = 1; j <= n; j++ ) 25 for( int i = 1; i <= n; i++ ) 26 for( int k = 1; k <= n; k++ ){ 27 if( map[i][j] == map[j][k] && ( map[i][j] == 1 || map[i][j] == -1 ) ) //进行松弛 28 map[i][k] = map[i][j]; 29 } 30 31 int ans = 0; 32 for( int i = 1; i <= n; i++ ){ 33 int sum = 0; 34 for( int j = 1; j <= n; j++ ){ 35 if( map[i][j] != INF ) 36 sum++; 37 } 38 if( sum == n - 1 ) 39 ans++; 40 } 41 42 cout << ans << endl; 43 44 return 0; 45 }