一个比较慢的算法。
反向拓扑,从大到小枚举。
#include <cstdio>
#include <cstring>
using namespace std;
int cas,n,m,cnt,v[205],ans[205];
bool map[205][205];
int main()
{
scanf("%d",&cas);
while(cas--)
{
memset(map,0,sizeof(map));
memset(v,0,sizeof(v));
memset(ans,0,sizeof(n));
scanf("%d%d",&n,&m);
cnt=n;
for(int i=1;i<=m;i++)
{
int F,T;
scanf("%d%d",&F,&T);
if(!map[T][F])
map[T][F]=1,v[F]++;
}
for(int i=n;i>=1;i--)
for(int j=n;j>=1;j--)//当前可选的最大标签
if(!v[j])
{
v[j]--;
cnt--;
ans[j]=i;
for(int k=n;k>=1;k--)
if(map[j][k])
v[k]--;
break;
}
if(cnt)
printf("-1\n");
else
{
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
}
}
}