这个题目必须反向建图,这个我只能举个反例说明,但是没有办法证明。
#include<algorithm>
#include<iostream>
#include<stdio.h>
bool grid[202][202],tag[202];
int top[202],ball[202];
int main()
{
int cases;
int i,j,k,M,N,a,b;
bool flag;
scanf("%d",&cases);
while(cases--)
{
memset(grid,0,sizeof(grid));
memset(top,0,sizeof(top));
memset(ball,0,sizeof(ball));
memset(tag,0,sizeof(tag));//标识结点是否已经被用
scanf("%d%d",&N,&M);
for(i=0;i<M;i++)//反向建图
{
scanf("%d%d",&a,&b);
grid[a][b]=1;
top[b]++;
}
for(i=1;i<=N;i++)
{
flag=0;
for(j=1;j<=N;j++)
if(!top[j]&&!tag[j])//此结点没有被用,且没有结点指向它
{
flag=1;
tag[j]=1;
break;
}
if(flag)
{
for(k=1;k<=N;k++)//去掉与j为出度的边
if(grid[j][k])
top[k]--;
ball[i]=j;
}
else
break;
}
if(flag)//若存在这样一个序列
{
// for(i=1;i<=N;i++)
// printf("%d ",ball[i]);
// printf("/n");
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
if(ball[j]==i)
break;
printf("%d ",j);
}
printf("/n");
}
else//若序列不存在
printf("-1/n");
}
return 0;
}