Cow Contest
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描述
-
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
题目大意:给你n,m表示n位大牛,有m对能力比较关系,表示a能打败b。问你最后几个人的排名可以确定。
解题思路:首先用floyd传递闭包,然后枚举统计排名可以确定的人数。某大牛的排名确定,则应该有他与其他n-1个人关系确定,败或赢。#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int maxn=120; int d[maxn][maxn]; void floy(int n){ int i,j,k; for(k=1;k<=n;k++){ for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ d[i][j]=d[i][j]||(d[i][k]&&d[k][j]); } } } } int work(int n){ int ret=0,sum,k,i,j; for(k=1;k<=n;k++){ sum=0; for(i=1;i<=n;i++){ if(i==k) continue; if(d[k][i]){ sum++; } if(d[i][k]){ sum++; } } if(sum==n-1) ret++; } return ret; } int main(){ int n,m,i,j,k,a,b; while(scanf("%d%d",&n,&m)!=EOF&&(n+m)){ memset(d,0,sizeof(d)); for(i=0;i<m;i++){ scanf("%d%d",&a,&b); d[a][b]=1; } floy(n); printf("%d ",work(n)) ; } return 0; }