我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4010

对于这道题,比较麻烦的是他要求的并不是完全字典序最小的一个序列,而是满足序号从小到大尽量要靠前。所以这就不能直接每次拓扑排序直接取最小值了,也许较大值取出来后就可以取更小的值了呢。

比如\(2\)号菜必须在\(5\)号菜后面处理,\(3\)号菜必须在\(4\)号菜后面处理。那么直接按字典序最小就是\(1,4,3,5,2\)了,而题意要求的却是\(1,5,2,4,3\)。

既然这个东西这么麻烦使我们无法很快的判断出哪个值应该放在前面,那么我们就不去想哪个值放在前面了嘛。我们就去想,较大的值是不是应该放在更后面。

结果发现还真是这样,那么我们就直接倒着做,每次取可取值里最大的值放在后面就行了,拓扑排序加堆优化就\(Over\)了。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn=1e5+5; int n,m,tot,cnt,x,y;
int deg[maxn],ans[maxn];
int now[maxn],pre[maxn],son[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void clear() {
cnt=tot=0;
memset(now,0,sizeof(now));
memset(deg,0,sizeof(deg));
} void add(int a,int b) {
pre[++tot]=now[a];
now[a]=tot;son[tot]=b;
deg[b]++;
} struct Heap {
int tot;
int node[maxn]; void ins(int x) {
node[++tot]=x;
int pos=tot;
while(pos>1) {
if(node[pos]>node[pos>>1])
swap(node[pos],node[pos>>1]),pos>>=1;
else break;
}
} int pop() {
int res=node[1];
node[1]=node[tot--];
int pos=1,son=2;
while(son<=tot) {
if(son<tot&&node[son|1]>node[son])son|=1;
if(node[son]>node[pos])
swap(node[son],node[pos]),pos=son,son=pos<<1;
else break;
}
return res;
}
}T; void work() {
for(int i=1;i<=n;i++)
if(!deg[i])T.ins(i);
while(T.tot) {
int u=T.pop();
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!(--deg[v]))T.ins(v);
ans[++cnt]=u;
}
}//拓扑排序加大根堆优化 void print_ans() {
for(int i=n;i>1;i--)
printf("%d ",ans[i]);
printf("%d\n",ans[1]);//输出也要倒着
} int main() {
int T=read();
while(T--) {
n=read(),m=read();clear();
for(int i=1;i<=m;i++)
x=read(),y=read(),add(y,x);//y要比x后制作,所以y向x连边
work();
if(cnt!=n)puts("Impossible!");//cnt不等于n说明有环,就GG了
else print_ans();
}
return 0;
}

BZOJ4010:[HNOI2015]菜肴制作的更多相关文章

  1. [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序

    菜肴制作 bzoj-4010 HNOI-2015 题目大意:给定一张n个点m条边的有向图,求一个toposort,使得:(1)满足编号为1的点尽量在前:(2)满足(1)的情况下编号为2的点尽量在前,以 ...

  2. BZOJ4010: [HNOI2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  3. BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...

  4. BZOJ4010 [HNOI2015]菜肴制作 【拓扑排序 + 贪心】

    题目 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间 ...

  5. [BZOJ4010]:[HNOI2015]菜肴制作(拓扑排序)

    题目传送门 题目描述 知名美食家小A被邀请至ATM大酒店,为其品评菜肴. ATM酒店为小A准备了N道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间 ...

  6. bzoj4010: [HNOI2015]菜肴制作【拓扑排序】

    想到了一个分治方法,每一次尽量放小的那个,把它依赖的放在左边,不依赖的放在右边. TLE 80: #include <bits/stdc++.h> #define rep(i, a, b) ...

  7. bzoj4010: [HNOI2015]菜肴制作(拓扑排序+贪心+堆)

    这题不是求最小字典序...撕烤了半个小时才发现不对劲T T 这题是能让小的尽量前就尽量前,无论字典序...比如1能在2前面就一定要在2前面... 显然是要先拓扑排序,让小的尽量前转化成让大的尽量往后丢 ...

  8. BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)

    题意 题目链接 Sol 震惊,HNOI竟出NOI原题 直接在反图上贪心一下. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include& ...

  9. 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序

    [BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...

  10. bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

    题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...

随机推荐

  1. 记录-spring MultipartFile 文件上传

    注意:以下上传和下载方法未必完全正确,不同浏览器效果不同,建议不要使用IE /** * 简单的文件上传 * @author:qiuchen * @createTime:2012-6-19 * @par ...

  2. 移动端meta viewport

    <meta name="viewport" content=" width=device-width, user-scalable=no, initial-scal ...

  3. 原来还有cookie-free domain这么回事

    cookie-free domain的解释:在请求下载静态小图片.静态小文件的时候,浏览器会把它当成普通请求一样,在request的header信息里附加cookie信息. 但实际上,99.99%的静 ...

  4. Action三种编写方式

    1.     创建普通类不实现接口与继承类 2.     实现Action接口 3.     继承ActionSupport类(常用)

  5. 丢失vcruntime140.dll

    我在php7安装yaf时报了标题所提示的错误信息. 解决方案是:下载vc++2015 并安装 链接如下:https://www.microsoft.com/zh-cn/download/confirm ...

  6. linux 8 -- 管道组合Shell命令进行系统管理

    二十. 通过管道组合Shell命令获取系统运行数据: 1.  输出当前系统中占用内存最多的5条命令:     #1) 通过ps命令列出当前主机正在运行的所有进程.     #2) 按照第五个字段基于数 ...

  7. html5 canvas做的图表插件

    用highchart的时候发现它是用svg来画图的,那么用canvas来做怎么样的. 以前做AS图表插件的时候,绘制图画主要用容器的Graphics对象来绘制,而canvas的context和Grap ...

  8. shiro3

    1 shiro介绍 1.1 什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi ...

  9. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  10. 【leetcode刷题笔记】Largest Rectangle in Histogram

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...