【BZOJ】【4010】【HNOI2015】菜肴制作
拓扑排序
这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前……
我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来。
但是连样例都过不了= =因为这样做是【字典序最小】,并不一定满足题目的条件(看样例就知道了,这样其实是早出队的元素编号尽量小,并不完全是编号小的早出队)
那么怎么搞呢?正着不行还不让我们反着来吗>_>
将所有边反向!搞逆拓扑序!这次我们让早出队的元素编号越大越好,也就是让编号越小的尽量靠后,因为在原序中靠前,就是在拓扑逆序中靠后。
然后就AC辣~
其实蒟蒻也不会证明……感性理解就是:对于编号小的元素,尽可能用编号比他大的进行拖延,让他晚出队,应该是有点贪心的思想吧= =
证明:http://zyfzyf.is-programmer.com/posts/89618.html
http://www.cnblogs.com/vb4896/p/4083650.html
P.S.这应该是这次胡策中最简单的一题了吧……反而放在C题的位置……
/**************************************************************
Problem: 4010
User: Tunix
Language: C++
Result: Accepted
Time:820 ms
Memory:4520 kb
****************************************************************/ //Huce #7 C
#include<queue>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*sign;
}
typedef long long LL;
const int N=,INF=~0u>>;
/*******************template********************/
int to[N<<],next[N<<],head[N],cnt;
void add(int x,int y){
to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
}
int n,m,du[N];
void init(){
n=getint(); m=getint();
cnt=; memset(head,,sizeof head);
memset(du,,sizeof du);
int x,y;
F(i,,m){
x=getint(); y=getint();
swap(x,y);
add(x,y); du[y]++;
}
}
int ans[N],tot;
void solve(){
priority_queue<int>Q;
F(i,,n) if (!du[i]) Q.push(i);
tot=;
while(!Q.empty()){
int x=Q.top(); Q.pop();
ans[++tot]=x;
for(int i=head[x];i;i=next[i]){
du[to[i]]--;
if (du[to[i]]==) Q.push(to[i]);
}
}
if (tot==n) {D(i,tot,) printf("%d ",ans[i]); puts("");}
else puts("Impossible!");
} int main(){
#ifndef ONLINE_JUDGE
freopen("C.in","r",stdin);
// freopen("output.txt","w",stdout);
#endif
int T=getint();
while(T--){
init();
solve();
}
return ;
}
4010: [HNOI2015]菜肴制作
Time Limit: 5 Sec Memory Limit: 512 MB
Submit: 267 Solved: 159
[Submit][Status][Discuss]
Description
知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴。
Input
第一行是一个正整数D,表示数据组数。
Output
输出文件仅包含 D 行,每行 N 个整数,表示最优的菜肴制作顺序,或
Sample Input
5 4
5 4
5 3
4 2
3 2
3 3
1 2
2 3
3 1
5 2
5 2
4 3
Sample Output
Impossible!
1 5 2 4 3
HINT
【样例解释】
Source
【BZOJ】【4010】【HNOI2015】菜肴制作的更多相关文章
- bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...
- BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...
- bzoj 4010 [HNOI2015]菜肴制作——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 和 bzoj 2535 差不多.因为当前怎么决策与该点后面连的点的标号情况有关,所以按 ...
- bzoj 4010: [HNOI2015]菜肴制作
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...
- bzoj 4010: [HNOI2015]菜肴制作【拓扑排序】
也就是给定有向图,求最小字典序的拓扑序,直接用小根堆就行(或者反着建图用大根堆) #include<iostream> #include<cstdio> #include< ...
- 4010: [HNOI2015]菜肴制作
拓扑排序+堆. 转自popoqqq神犇. 反向建图跑拓扑排序然后逆序输出. 为什么不能正的来呢,因为不知道选当前菜要先制作哪种菜. 逆序过来跑拓扑的话,也能保证满足限制条件编号小的在前面. 题外话:我 ...
- 【BZOJ】[HNOI2015]菜肴制作
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4010 要是考场上想不出,但是还是有一个分治的做法的嘛 做法就是反向连边,然后再反向输出字典 ...
- P3243 [HNOI2015]菜肴制作(拓扑排序)
P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...
- 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序
[BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...
- BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...
随机推荐
- 正确使用stl map的erase方法
先声明:下面的文章是针对windows的用法,因为std::map的erase函数的windows的实现版本是返回一个std::map的迭代器,但是STL标准里面的该函数的返回值确是: map.era ...
- firefox 扩展开发笔记(三):高级ui交互编程
firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...
- AngularJs记录学习04
<html> <head> <title>Angular JS Views</title> <script src="js/Angula ...
- [.NET]程序在线更新,力求通用
@微微一笑 :貌似是我的第一篇博客,在外流浪了很久很久,最终还是驻留在博客园混日子吧. 在线更新,想想自己做过的项目中都有这么一个功能.虽然比较简单,但是功能还是比较重要的.抽点时间写了一个在线更新程 ...
- C基础 数据序列化简单使用和讨论
前言 C中对序列化讨论少, 因为很多传输的内容都有自己解析的轮子. 对于序列化本质是统一编码, 统一解码的方式. 本文探讨是一种简单的序列化方案. 保证不同使用端都能解析出正确结果. 在文章一开始, ...
- DB2查询结果显示n行
在SQLserver中语法是这样的:select top n * from staff ,即可查询显示n行数据 但是在DB2中语法是这样的,感觉比较接近英语. select * from STAFF ...
- postgresql 函数 参数为复合类型
postgresql没有存储过程,但是函数功能很强大. 在近期开发的电商管理平台中,对于产品的类目管理,设计时有个属性字段,设为字符数组,但是EF不支持数组的操作,所以在添加和修改类目时,需要对属性的 ...
- 部分手机不能连PC adb
http://www.th7.cn/Program/java/201407/232139.shtml 1. 命令行中执行 android update adb [这一步的目的是产生下面第二步的路径和文 ...
- Erlang generic standard behaviours -- gen
在分析 gen_server (或者是gen_fsm )之前,首先应该弄明白,gen 这个module . -module(gen). -compile({inline,[get_node/1]}). ...
- Golang之ring.Ring的Link操作
ring.Ring 是一个环链. 其Link操作规则是: r.Link(s) => t = r.Next r.Next.Prev = s.Prev s.Prev.Next = r.Next r. ...