POJ3660:Cow Contest(Floyd传递闭包)
Posted heyuhhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ3660:Cow Contest(Floyd传递闭包)相关的知识,希望对你有一定的参考价值。
Cow Contest
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 16941 | Accepted: 9447 |
题目链接: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个人,m场比赛,然后给出m场比赛的胜负关系,问有多少只牛能确定它们自己的名次。
题解:
这个题有点像拓扑排序,但是只用拓扑序并不能保证结果的正确性。
其实解这个题我们只需要发现这样一个关系就好了,若一只牛的名次能够被确定,那么它赢它的牛和它赢的牛个数之和为n-1。
利用这个关系,我们floyd传递闭包预处理一下,然后判断一下数量关系就好了。
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <queue> using namespace std; typedef long long ll; const int N = 105, M = 4505; int n,m; int mp[N][N]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); mp[u][v]=1; } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ mp[i][j]=(mp[i][j]|(mp[i][k]&mp[k][j])); } } } int ans=0; for(int i=1;i<=n;i++){ int win=0,lose=0; for(int j=1;j<=n;j++){ if(mp[i][j]) win++; if(mp[j][i]) lose++; } if(win+lose==n-1) ans++; } cout<<ans; return 0; }
以上是关于POJ3660:Cow Contest(Floyd传递闭包)的主要内容,如果未能解决你的问题,请参考以下文章
POJ-3660.Cow Contest(有向图的传递闭包)