Cow Contest
-
描述
-
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.
-
输入
-
* 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
There are multi test cases.The input is terminated by two zeros.The number of test cases is no more than 20.
输出
-
For every case:
* Line 1: A single integer representing the number of cows whose ranks can be determined
样例输入
-
5 5 4 3 4 2 3 2 1 2 2 5 0 0
样例输出
-
2
弗洛伊德算法(可求最短路)求传递闭包问题。
#include <stdio.h> #include <string.h> #include <stdlib.h> int map[101][101], n; //map[i][j] = 1:i可打败j int floyd() { int i, j, k; for(k = 1; k <= n; k++) //floyd 求传递闭包 { for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { if(map[i][k] && map[k][j]) //传递 { map[i][j] = 1; } } } } return 0; } int main() { int m, i, j, winer, loser, sum, ans; while(scanf("%d%d", &n, &m) && (m+n)) { memset(map, 0, sizeof(map)); for(i = 0; i < m; i++) { scanf("%d%d", &winer, &loser); map[winer][loser] = 1; } floyd(); ans = 0; for(i = 1; i <= n; i++) { sum = 0; for(j = 1; j <= n; j++) { if(map[i][j] || map[j][i]) { sum++; } } if(sum == n-1) //若一个cow和其他cow都能分胜负, 则可判别等级 { ans++; } } printf("%d\n", ans); } }
-
* Line 1: Two space-separated integers: N and M