一开始题目意思理解错了,以为要求求出所有选手的排名关系,看了题解后,才知道只要满足题目给的次序即可,没有给的信息,可以不用管。
因此,问题就变成了拓扑排序的模板题。所谓的拓扑排序是相对于有向无圈图的顶点的一种排序,如果出现了从u到v的路径,那么排序后,v一定在u的后面。
基本操作就是,每次先找到入度为0的点,它肯定是它所在路径上的当前的最前面的点,输出。
然后删除它所出发的所有的边,重复上述操作,直到没有点,即可。
代码:
#include <cstdio>//只要满足已知信息即可
#include <cstring>
using namespace std;
const int N=505;
bool vis[N][N];
int in[N];
int n,m;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(in,0,sizeof(in));
memset(vis,false,sizeof(vis));
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(!vis[a][b])//判断重边
{
vis[a][b]=true;
in[b]++;
}
}
int p;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
p=j;
if(in[j]==0)
break;
}
in[p]=-1;
if(i!=n)
printf("%d ",p);
for(int j=1;j<=n;j++)
{
if(vis[p][j])
{
vis[p][j]=false;
in[j]--;
}
}
}
printf("%d\n",p);
}
return 0;
}