题意:给n只牛然后通过比赛可以知道一些输赢关系,通过这些输赢关系确定能判断几个人的位次
题解:一个对最短路的应用,如果我们知道一个人和n-1个人有关系,呢么我们肯定知道这个人的位次
注意点: 对于floyd()的三层for循环顺序我其实没怎么明白,但是就那么写2-->1,1--->3,2--->3
按这样的顺序写应该没错
AC代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
//cow contest
#define inf 0x3f3f3f3f
#define maxn 115
int Map[maxn][maxn];
int n,m;
void floyd()
{
//for(int i=1;i<=)
//memset(Map,inf,sizeof(Map));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
if(Map[j][i]==Map[i][k]&&Map[i][k]!=inf)
Map[j][k]=Map[j][i];
}
}
}
}
int main()
{
//int n,m;
while(~scanf("%d %d",&n,&m))
{
int u,v,ans=0;
memset(Map,inf,sizeof(Map));
for(int i=1;i<=m;i++)
{
scanf("%d %d",&u,&v);
Map[u][v]=1;
Map[v][u]=-1;
}
floyd();
for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=1;j<=n;j++)
{
if(Map[i][j]!=inf)
sum++;
}
if(sum==n-1)
ans++;
}
printf("%d\n",ans);
}
}