bzoj4010:[HNOI2015]菜肴制作

传送门

感觉智商越来越不在线了,这么水的题没秒掉
一开始想的直接拿堆维护跑拓扑排序,后来发现看错题意了
然后就一直想怎么拿并查集去维护树的最小值,后来发现维护不了,又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();
	}
}
原文地址:https://www.cnblogs.com/lcxer/p/10567936.html