[BZOJ4010]菜肴制作 拓扑排序+堆
来源:互联网 发布:linux怎么重启网卡 编辑:程序博客网 时间:2024/06/05 02:12
我一开始就理解成求字典序最小的方案。。。然后果断建图拓扑排序,每次删入度为0的点的时候优先删编号最小的点。。。
先说说这种错误的做法,这种做法并不能保证题目中的最优性,比如当前1号点入度不为0,按照要求,应该把能走到1的所有点(限制1的点)都删去再删1,才能保证1最前,但假如此时2号点入度为0,而2并不能走到1,如果先删2就耽误了删1。怎么办呢?我们发现这样只保证了字典序最小,不能满足题目要求,但我们使编号大的点尽量后删,即假如x不限制y(y < x),x一定比y后删。也就是保证了在合法情况下,第一大的尽量后删,满足之后保证第二大的尽量后删,以此类推。
是不是很像题目条件反过来啊。。。于是建反图,求出字典序最大的拓扑序,倒叙输出即可。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<vector>using namespace std;const int maxn=100010;int n,m,rd[maxn],ans[maxn];priority_queue <int> a;struct edge{ int t; edge *next;}*con[maxn];int read(){ int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();} return x;}void ins(int x,int y){ edge *p=new edge; p->t=y; p->next=con[x]; con[x]=p;}int main(){ int ca=read(); while(ca--) { n=read();m=read(); for(int i=1;i<=n;i++) con[i]=NULL; memset(rd,0,sizeof(rd)); memset(ans,0,sizeof(ans)); for(int i=1;i<=m;i++) { int x=read(),y=read(); ins(y,x); rd[x]++; } for(int i=1;i<=n;i++) if(rd[i]==0) a.push(i); bool sol=1; for(int i=1;i<=n;i++) { if(a.empty()) {puts("Impossible!");sol=0;break;} ans[i]=a.top(); a.pop(); for(edge *p=con[ans[i]];p!=NULL;p=p->next) { rd[p->t]--; if(rd[p->t]==0) a.push(p->t); } } if(sol) { for(int i=n;i>=1;i--) printf("%d ",ans[i]); puts(""); } } return 0;}
阅读全文
0 0
- [BZOJ4010]HNOI2015菜肴制作|拓扑排序+堆
- [BZOJ4010]菜肴制作 拓扑排序+堆
- [BZOJ4010][HNOI2015]菜肴制作(拓扑排序+堆)
- 【拓扑+堆】BZOJ4010(HNOI2015)[菜肴制作]题解
- 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)
- bzoj4010 [HNOI2015]菜肴制作(拓扑排序+贪心)
- bzoj4010 [HNOI2015]菜肴制作 拓补排序+堆
- 【bzoj4010】【HNOI2015】【菜肴制作】【堆+图论】
- 【BZOJ4010】【HNOI2015】菜肴制作
- BZOJ4010【HNOI2005】菜肴制作
- 【HNOI2015】【BZOJ4010】菜肴制作
- bzoj4010: [HNOI2015]菜肴制作
- bzoj4010【HNOI2015】菜肴制作
- bzoj4010: [HNOI2015]菜肴制作
- BZOJ4010: [HNOI2015]菜肴制作
- 【bzoj4010】[HNOI2015]菜肴制作
- [bzoj4010][HNOI2015]菜肴制作
- BZOJ 4010 HNOI2015 菜肴制作 拓扑排序+堆
- BZOJ3504: [Cqoi2014]危桥
- 高并发限流
- ionic升级遇到的错误:webpackJsonp is not defined
- 四、Ubuntu PCL、OpenCV 安装以及简单使用
- 基于framebuffer(fb)的驱动分析
- [BZOJ4010]菜肴制作 拓扑排序+堆
- 法规及
- 802.11帧格式
- 调用系统成功失败函数
- 最好的前端源码教程,html5、css3,js,bootsrap,query,前端全栈教程视频、文档、软件
- 树和二叉树(二)
- GPL 和BSD和Apache之间的区别和联系
- apache如何设置缓存
- Android WebView 播放微信视频的设置