Cow Contest POJ - 3660
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个连续的实力,如果u的实力大于v的实力,就能打赢它,
然后给定m种关系,求最后能确定其排名的奶牛个数。
一个传递闭包问题。头一次解这种题目。谢谢大神的思路。
//Asimple #include <iostream> #include <algorithm> #define mod 100000 #define CLS(a, v) memset(a, v, sizeof(a)) #define debug(a) cout << #a << " = " << a <<endl #define dobug(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl using namespace std; typedef long long ll; const int maxn = 500+5;const int INF = (1 << 16);int n, m, num, T, k, len, ans, sum, x, y, z; int Map[maxn][maxn]; void solve(){ 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; /* 传递闭包 只有这个点和其余所有的点的关系都是确定的 这个点才是确定的 */ ans = 0; int j; for(int i=1; i<=n; i++) { for(j=1; j<=n; j++) { if( i==j ) continue; if( Map[i][j]==0 && Map[j][i]==0) break; } if( j>n ) ans ++; } cout << ans << endl; } void input() { ios_base::sync_with_stdio(false); while( cin >> n >> k ) { CLS(Map, 0); while( k -- ) { cin >> x >> y; Map[x][y] = 1; } solve(); } } int main(){ input(); return 0; }