概述
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
题意:
一场比赛的数据丢了,这个人给你比赛数据(有向图)让你计算有多少个cow的排名是可以准确得出的。输出准确得出cow的数量。
思路:
- 首先,反向建图,边权值默认初始为1(有连接的,无连接的初始为INF)。如图。
那么这样就行了吗?肯定不行,如果这样去跑一遍Floyd的话,是什么作用没有的。
这里有一个重要的结论(肯定都知道的):
如果能确定这个点的排名,这个点必然和其他的所有点又有关系,并不一定是直接关系
那这样是不是就知道怎么做了,我们只需要跑一遍Floyd就知道那些点有关系了。NO!!!!
试想一下,这个点如果和另一个有关系,我们只能建立有向图,那么上图2点永远和5点是永远不能有关系的。那么我们不放5->2置位1,2->5置位-1不就好了吗?。最后统计一下i这个点和哪些点有关系(就是两点间的值不是0)就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<algorithm>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define F1(i,a,b) for(int i=(a);i<(b);i++)
#define F2(i,a,b) for(int i=(a);i<=(b);i++)
#define F3(i,a,b) for(int i=(a);i>=(b);i--)
#define F4(i,a,b) for(int i=(a);i>(b);i--)
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define scll(x) scanf("%lld",&x)
#define mem(x,a) memset(x,a,sizeof x)
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int ,int> PII;
const int maxn = 1005;
int in[maxn];
int out[maxn];
int mp[maxn][maxn];
int N,M;
void Froyd(){
}
int main(){
while(scc(N,M)!=EOF){
mem(mp,INF);
for(int i=1;i<=N;i++) mp[i][i]=0;
for(int i=0;i<M;i++){
int v,u;
scc(v,u);
mp[u][v]=1;
mp[v][u]=-1;
}
Froyd();
int res=0,cnt=0;
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if((mp[i][k]==1 && mp[k][j]==1)){
// 模改一下Floyd,关系的传递性
mp[i][j]=1;
mp[j][i]=-1;
// 别忘了反向的关系
}
}
}
}
for(int i=1;i<=N;i++){
cnt=0;
for(int j=1;j<=N;j++){
// cout<<mp[i][j]<<" ";//可以吧这个和后面的cout<<endl;注释取消观察矩阵
if(mp[i][j]!=INF && mp[i][j]!=0){
cnt++;
}
}
//cout<<endl;
if(cnt==N-1) res++;
}
printf("%dn",res);
}
return 0;
}
最后
以上就是孤独墨镜为你收集整理的POJ-3660 Cow Contest(Floyd最短路变形)的全部内容,希望文章能够帮你解决POJ-3660 Cow Contest(Floyd最短路变形)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复