題目鏈接:http://poj.org/problem?id=3687
思路:此題是要將排序小的1儘量排在最前面,而不是簡單的字典序最小
字典序最小3 2 4 1,若要1最靠前 3 4 1 2
注意:重邊。
#include<cstdio>
#include<cstring>
using namespace std;
const int num=205;
int maz[num][num],n,m,in[num],to[num],cnt,ans[num];
int topo()
{
cnt=n-1;
int i,j,t,f;
for(i=0;i<n;i++)
{
f=0;
for(j=n-1;j>=0;j--)
{
if(in[j]==0)
{
t=j;
in[j]--;
f=1;
to[cnt--]=j;
break;
}
}
if(f==0)
return 0;
for(j=0;j<n;j++)
if(maz[t][j]==1)
in[j]--;
}
return 1;
}
int main()
{
int i,a,b,t,s;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(maz,0,sizeof(maz));
memset(in,0,sizeof(in));
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
a--;b--;
if(maz[b][a]==0)
in[a]++;
maz[b][a]=1;
}
s=topo();
if(s==0)
printf("-1\n");
else
{
for(i=0;i<n;i++)
ans[to[i]]=i+1;
for(i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
}
return 0;
}