POJ3660 传递闭包———floyd算法

时间:2022-06-19 19:30:27

POJ3660 Cow Contest

题目链接:http://poj.org/problem?id=3660

题意:农名约翰有些奶牛,约翰通过让他们决斗来决定他们的排名,约翰让这些奶牛一对一打完一定的局数之后,问有哪些奶牛的排名是可以确定的(注:a打得过b,b打得过c,则a打得c)

根据题意我们明白当一个奶牛和其他的所有奶牛都存在胜负关系的时候,他的排名就是确定的。

思路:利用floyd算法,传递闭包,算出可达矩阵。然后在每一行去查询该点和其他所有的点的联系是不是n-1。

代码:

//Author: xiaowuga
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=;
using namespace std;
typedef long long LL;
int n,m;
int p[N][N]={};
void floyd(){
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
p[i][j]=p[i][j]||p[i][k]&&p[k][j];
}
int main(){
cin>>n>>m;
for(int i=;i<m;i++){
int a,b;
cin>>a>>b;
p[a][b]=;
}
floyd();
int ct=;
for(int i=;i<=n;i++){
int c=;
for(int j=;j<=n;j++){
if(i==j) continue;
if(p[i][j]||p[j][i]) c++;
}
if(c==n-) ct++;
}
cout<<ct<<endl;
return ;
}