题目地址:http://poj.org/problem?id=3660
思路:对于每个牛,设赢此牛的数为x,输此牛的数为y,若x+y==n-1则此牛的名次确定。则若x打败y,则x到y连一条边,则在关系图上,x能到达的点即为输于此牛的数目,能到达x的点即为赢此牛的数目。Floyd求解,枚举总点数是否为n-1即可。
#include<set>
#include<map>
#include<stack>
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=150;
int n,m;
int g[maxn][maxn];
int main()
{
memset(g,0,sizeof(g));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=1;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
g[i][j]=g[i][j]||(g[i][k]&&g[k][j]);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
int tot=0;
for(int j=1;j<=n;j++)
{
if(g[i][j]||g[j][i])
{
tot++;
}
}
if(tot==n-1) ans++;
}
printf("%d\n",ans);
return 0;
}