【BZOJ4010】【HNOI2015】菜肴制作

前端之家收集整理的这篇文章主要介绍了【BZOJ4010】【HNOI2015】菜肴制作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

链接

#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,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("");} } }

猜你在找的PHP相关文章