Cow Contest

时间:2023-03-09 07:01:05
Cow Contest

poj3660:http://poj.org/problem?id=3660

题意:一些奶牛之间进行编程比赛,每头牛都有一个编程能力。如果a的能力比b的能力高,则a总能打败b 。现在给你一些牛之间的比赛,以及相应的赢家。让你求出已经确定名牛的个数。

题解:只要求出这头牛与其他n-1头之间的关系就行了。如果关系确定,则说明该牛确定。自然想到弗洛伊德求传递闭包。然后求出不能确定的牛的数量,然后总牛数减去即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int map[][];
int n,m,u,v,counts;
const int INF=;
void Floyd(){
for(int k=;k<=n;k++){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i!=j&&i!=k&&k!=j&&map[i][k]+map[k][j]<map[i][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
map[i][j]=INF;
}
for(int i=;i<=m;i++){
scanf("%d%d",&u,&v);
map[u][v]=;
}
Floyd();
counts=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i!=j&&map[i][j]>=INF&&map[j][i]>=INF)
{counts++;
break;}
}
}
printf("%d\n",n-counts);
}
}