传送门
感觉智商越来越不在线了,这么水的题没秒掉
一开始想的直接拿堆维护跑拓扑排序,后来发现看错题意了
然后就一直想怎么拿并查集去维护树的最小值,后来发现维护不了,又GG了
无奈之下看题解,这不就建个反图就没了吗,智商真的不在线
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int maxn=1e5+10;priority_queue<int>q;
int D,n,m,pre[maxn*2],cnt,in[maxn],nxt[maxn*2],h[maxn],ans[maxn],tot;
void add(int x,int y){pre[++cnt]=y,nxt[cnt]=h[x],h[x]=cnt;}
void topsort()
{
tot=0;
for(rg int i=1;i<=n;i++)if(!in[i])q.push(i);
while(!q.empty())
{
int x=q.top();q.pop();ans[++tot]=x;
for(rg int i=h[x];i;i=nxt[i])
if(!(--in[pre[i]]))q.push(pre[i]);
}
if(tot<n){printf("Impossible!
");return ;}
for(rg int i=tot;i;i--)printf("%d ",ans[i]);
printf("
");
}
int main()
{
read(D);
while(D--)
{
read(n),read(m),cnt=0,memset(h,0,sizeof h),memset(in,0,sizeof in);
for(rg int i=1,x,y;i<=m;i++)read(x),read(y),in[x]++,add(y,x);
topsort();
}
}