[bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
菜肴制作 bzoj-4010 HNOI-2015
题目大意:给定一张n个点m条边的有向图,求一个toposort,使得:(1)满足编号为1的点尽量在前;(2)满足(1)的情况下编号为2的点尽量在前,以此类推。
注释:$1\le n,m\le 10^5$,$1\le cases \le 3$。
想法:只需要先求字典序最大toposort,然后逆序输出即可。
简单的证明:字典序最大的toposort是将当前所有解锁的中编号最大的点放在首位,这样1就会自然而然排在最后。自然就会满足所有的条件。
更严格地,我们采用数学归纳法。
奠基:如上文,我们将可能放在1前面的都放在了1前面,逆序输出的话就会使得1的位置是可能情况下最靠前的,即满足(1)。
归纳假设:若前i个条件都会且仅会在最大拓扑序逆序的条件下被满足,那么对于第i+1点,在前i个点都满足题意的时候,当前解锁的点中如果没有i+1,不考虑。
如果有i+1:
当这些点中还有比i+1更小的点,由归纳假设,想满足前i个条件,只能先放比i大的点,所以比i+1小的点我们不理它们。
那么只考虑不小于i+1的点,我们期望满足条件(i+1)。
所以我们将所有比i+1大的点都先放出来,这样会最大限度地使i+1靠前。
直到当前解锁的点中i+1为最大者,我们才将它放出来。
这样的话,因为满足前i个条件的话我们不能解锁小于i+1的点。在这样的情况下我们又将所有可能放在i+1后面的点放在了i+1后面,所以i+1是在满足前i个条件下最靠前的。
这样我们就满足了条件(i+1)。
证毕。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 100010
using namespace std;
priority_queue<int>q;
int to[N],nxt[N],head[N],tot;
bool vis[N]; int num[N],cnt,ans[N],n,m;
inline void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
inline void original()
{
tot=cnt=0;
memset(head,0,sizeof head);
memset(num,0,sizeof num);
memset(vis,false,sizeof vis);
while(!q.empty()) q.pop();
}
bool flag;
void toposort()
{
while(!q.empty())
{
int x=q.top(); q.pop();
ans[++cnt]=x;
vis[x]=true;
for(int i=head[x];i;i=nxt[i])
{
num[to[i]]--;
if(!num[to[i]]) q.push(to[i]);
}
}
for(int i=1;i<=n;i++) if(!vis[i]) {flag=false; return; }
}
int main()
{
int cases; cin >> cases ;
while(cases--)
{
original();
cin >> n >> m ;
for(int x,y,i=1;i<=m;i++) scanf("%d%d",&x,&y),add(y,x),num[x]++;
flag=true;
for(int i=1;i<=n;i++)
{
if(num[i]) continue;
q.push(i);
}
toposort();
if(flag) for(int i=cnt;i>=1;i--) printf("%d ",ans[i]);
else printf("Impossible! ");
puts("");
}
}
/*
3
5 4
5 4
5 3
4 2
3 2
3 3
1 2
2 3
3 1
5 2
5 2
4 3
*/
小结:大胆假设,小心求证
[bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序的更多相关文章
- BZOJ4010 [HNOI2015]菜肴制作 【拓扑排序 + 贪心】
题目 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间 ...
- bzoj4010: [HNOI2015]菜肴制作(拓扑排序+贪心+堆)
这题不是求最小字典序...撕烤了半个小时才发现不对劲T T 这题是能让小的尽量前就尽量前,无论字典序...比如1能在2前面就一定要在2前面... 显然是要先拓扑排序,让小的尽量前转化成让大的尽量往后丢 ...
- BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...
- [BZOJ4010]:[HNOI2015]菜肴制作(拓扑排序)
题目传送门 题目描述 知名美食家小A被邀请至ATM大酒店,为其品评菜肴. ATM酒店为小A准备了N道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间 ...
- bzoj4010: [HNOI2015]菜肴制作【拓扑排序】
想到了一个分治方法,每一次尽量放小的那个,把它依赖的放在左边,不依赖的放在右边. TLE 80: #include <bits/stdc++.h> #define rep(i, a, b) ...
- BZOJ4010: [HNOI2015]菜肴制作
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...
- BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)
题意 题目链接 Sol 震惊,HNOI竟出NOI原题 直接在反图上贪心一下. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include& ...
- BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...
- 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序
[BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...
随机推荐
- 手动安装jar包到Maven本地仓库
接手别人的一个项目,Maven工程,导入后,某些jar包找不到,然后从同事那复制Maven本地仓库的文件夹到我的电脑,发现依旧找不到.问题大致总结为:本地maven仓库存在jar,但是依然报Missi ...
- NOI2015 软件包管理器(树链剖分+线段树)
P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...
- 34、JavaScript面向对象(内置构造函数&相关方法|属性|运算符&继承&面向对象)
一.面向对象 1.1 this的指向问题 要看清楚最终的函数调用者是谁. IIFE也被当做函数直接运行,IIFE的this都是window对象 函数的arguments是类数组对象,比如传入的第0项参 ...
- 百度地图JavaScript API获取用户当前经纬度和详细地理位置,反之通过详细地理位置获取当前经纬度
前言: 前端时间刚好使用了百度地图的js api定位获取用户当前经纬度并获取当前详细位置和通过当前用户详细地理位置换取用户当前经纬度坐标的功能,为了方便下次找起来方便一些自己在这里记录一下,希望也能够 ...
- Dex文件方法数超过65536怎么破?
你的应用中的Dex 文件方法数超过了最大值65536的上限,会提示你: UNEXPECTED TOP-LEVEL EXCEPTION:java.lang.IllegalArgumentExceptio ...
- canvas烟花锦集
canvas可以实现不同动画效果,本文主要记录几种不同节日烟花效果实现. 实现一 效果地址 html <canvas id="canvas"></canvas&g ...
- Apache服务器防范DoS
Apache服务器对拒绝服务攻击的防范主要通过软件Apache DoS Evasive Maneuvers Module 来实现.它是一款mod_access的替代软件,可以对抗DoS攻击.该软件可 ...
- 14、Scala类型参数
1.泛型类 2.泛型函数 3.上边界Bounds 4.下边界Bounds 5.View Bounds 6.Context Bounds 7.Manifest Context Bounds 8.协变和逆 ...
- Lvs Keepalive DR模式高可用配置
Lvs Keepalive DR模式配置 一.环境 #DIP# eth0:192.168.233.145#VIP# eth0:0 192.168.233.250/32 #RIP1:192.168.23 ...
- (转)Hibernate的一级缓存
http://blog.csdn.net/yerenyuan_pku/article/details/70148567 Hibernate的一级缓存 Hibernate的一级缓存就是指Session缓 ...