程序员人生 网站导航

【BZOJ4010】【HNOI2015】菜肴制作

栏目:php教程时间:2015-06-19 08:44:50

链接:

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45365831"); }

题解:

把所有入度为0的点入优先队列,每次取出标号最大的,并将此点取走后入度为0的点入优先队列,最后反序输出。

代码:

#include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 #define M 101000 using namespace std; struct Eli { int v,next; }e[M]; int head[N],cnt,d[N]; inline void add(int u,int v) { d[v]++; e[++cnt].v=v; e[cnt].next=head[u]; head[u]=cnt; } priority_queue<int>q; int ans[N],n,m; int main() { freopen("test.in","r",stdin); int i,j,k; int a,b,c; int g;for(scanf("%d",&g);g--;) { memset(head,0,sizeof head); memset(d,0,sizeof d); scanf("%d%d",&n,&m); cnt=0; while(m--) { scanf("%d%d",&a,&b); add(b,a); } m=0; for(i=1;i<=n;i++)if(!d[i])q.push(i); while(!q.empty()) { ans[++m]=q.top(),q.pop(); for(i=head[ans[m]];i;i=e[i].next) if(!--d[e[i].v])q.push(e[i].v); } if(m!=n)puts("Impossible!"); else {while(m)printf("%d ",ans[m--]);puts("");} } }
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐