題目鏈接: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 }