加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

【BZOJ4010】【HNOI2015】菜肴制作

发布时间:2020-12-13 20:44:30 所属栏目:PHP教程 来源:网络整理
导读:链接: #include stdio.h int main(){ puts ( "转载请注明出处[vmurder]谢谢" ); puts ( "网址:blog.csdn.net/vmurder/article/details/45365831" );} 题解: 把所有入度为0的点入优先队列,每次取出标号最大的,并将此点取走后入度为0的点入优先队列,最后

链接:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读