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;
}