B - Cow Contest (floyd之传递闭包)
题意:给定m个胜负关系,求能确定多少个人的排名
思路:显然用floyd进行状态更新即可。
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int f[105][105];
int n,m;
void floyd(){ //有向图之floyd 传递闭包
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
if(f[i][k])
for(int j=1;j<=n;j++)
{
if(f[i][k]&&f[k][j]) f[i][j]=1;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
f[a][b]=1;
}
floyd();
int ans=0;
/* for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) printf("f[%d][%d]=%d\n",i,j,f[i][j]); */
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=1;j<=n;j++)
{
if(f[i][j]||f[j][i]) cnt++;
}
if(cnt==n-1) ans++;
}
printf("%d\n",ans);
return 0;
}