题意:编号为1-N的奶牛参加比赛,告诉我们m场比赛结果试问有几头奶牛的排名可以确定。
题解:其实就是一个传递闭包的模板题,用Floyd把所有有联系的比赛结果串在一起。
Ac 代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+5;
int rp[maxn][maxn]; //rp[i][j]=1表示编号为i的奶牛战胜编号为j的奶牛;
int n,m,u,v;
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(rp[i][k]&&rp[k][j]) //求传递闭包;
{
rp[i][j]=1;
}
}
}
}
// 可以打印处理过的rp数组帮助理解;
/* for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<rp[i][j]<<" ";
}
cout<<endl;
}*/
int ans=0,j;
for(int i=1;i<=n;i++)
{
for( j=1;j<=n;j++)
{
if(i==j) continue;
if(rp[i][j]==0&&rp[j][i]==0) break;
}
if(j>n) ans++;
}
printf("%d\n",ans);
}
int main()
{
scanf("%d%d",&n,&m);
memset(rp,0,sizeof rp);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
rp[u][v]=1;
}
floyd();
return 0;
}