题目大意:一群牛比胜负,然后balabala,然后给你一堆关系,让你求出能够判断出名次的牛的个数。
算法思路:这道题主要的用的是传递闭包,然后只要判断该牛的入度和出度之和等于n-1,就说明该牛能判断出名次。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAXN 105
int n,m,a,b,res;
int p[MAXN][MAXN],in[MAXN],out[MAXN],flag[MAXN];
bool visited[MAXN],tmp[MAXN][MAXN];
queue<int>que;
int main()
{
while(true)
{
res=0;
memset(p,0,sizeof(p));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(visited,false,sizeof(visited));
memset(tmp,0,sizeof(tmp));
scanf("%d%d",&n,&m);
if(n==0&&m==0)
break;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
p[a][b]=1;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(p[i][k]&&p[k][j])
p[i][j]=1;
}
}
}
//int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(p[i][j])
{
out[i]++;
in[j]++;
}
}
}
for(int i=1;i<=n;i++)
{
if((in[i]+out[i])==n-1)
res++;
}
printf("%d\n",res);
}
return 0;
}