优先选最小值并不是直接建图进行拓扑排序,优先选最小值不同于求拓扑排序的最小字典序。
思路:反向建图,优先选取最大值进行拓扑排序,最后倒序输出数组(或者记录的时候可以倒着记录,最后正着输出)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const int maxn=1e5+5;
struct edgeP{
int to,next;
}e[maxn*10];
int a[maxn],cnt=1,in[maxn],N,M;
int head[maxn],ans=1;
void add(int x,int y){
e[ans].to=y;
e[ans].next=head[x];
head[x]=ans++;
}
void tuopu()
{
priority_queue<int > q;
while(!q.empty()) q.pop();
for(int i=1;i<=N;i++)
if(!in[i]) q.push(i);
while(!q.empty()){
int x=q.top();
q.pop();
a[cnt--]=x;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
in[y]--;
if(!in[y]) q.push(y);
}
}
}
int main()
{
int T,x,y;
scanf("%d",&T);
while(T--){
ans=1;
memset(head,0,sizeof(head));
scanf("%d%d",&N,&M);
memset(in,0,sizeof(in));
for(int i=0;i<M;i++){
scanf("%d%d",&x,&y);
add(y,x);
in[x]++;
}
cnt=N;
tuopu();
if(cnt!=0){
printf("Impossible!\n");
}else{
for(int i=1;i<=N;i++){
printf("%d",a[i]);
if(i!=N) printf(" ");
else printf("\n");
}
}
}
return 0;
}