正解:拓扑排序

解题报告:

传送门!

首先看到它这个约束就应该要想到拓扑排序辣QwQ

首先想到的应该是用优先队列代替队列,按照节点编号排序

然后也很容易被hack:<5,1> 正解应为5,1,2,3,4 但是上面这个想法的结果是2,3,4,5,1

那就想要不优化一下趴,按照能到达的点为第一关键字,自己点的编号为第二关键字排序呢

还是布星,,,<5,2><5,4><2,1><4,3><3,1> 正解应为5,2,1,4,3,但是上面这个想法的结果是4,3,1,5,2

哦对了,这道题要,仔细理解一下题意,,,并不是要字典序最小的昂(看上面两个都看得出来QwQ)只是要小的数尽量放在前面

所以考虑,反着做

就贪心地想,可以想到大的数尽量放后边,因为大的放得很后面前面就有更多的位置放比较小的数嘛,从后往前安排,每次只考虑最后一位,放上合法的编号最大的数就好了

然后思考怎么样是合法的呢,就是要放在它后面的数都已经放完了就可以放它了,它就是合法的了嘛,就是出度=0的时候就是合法的辣

另外,显然在拓扑的时候要把所有出边指向它的点的出边数量--嘛,那为了方便枚举点,就直接在建边的时候建反边就好

所以就反向建边拓扑排序倒叙输出就欧克辣!

听说这个是拓扑排序常见套路呢,,,?只是不知道我的学习总结要咕到哪天辣,,,如果以后写拓扑排序学习笔记什么的时候想起来辣这个点就还是cue一下昂qwq

然后有一个结论记下$QwQ$:

如果有一个排列$p$,满足若干偏序关系$p_i\leq p_j$,最小化$p^{-1}$的字典序的话,就$i->j$连边,跑一个最小拓扑序

如果是要最小化$p$的字典序,就跑反向图的最大拓扑序,再反过来

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define ll long long
#define gc getchar()
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i) const ll N=+;
ll out[N],head[N],n,m,edge_cnt,as[N],as_cnt;
struct ed{ll to,nxt;}edge[N];
priority_queue<ll>Q; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch<'' || ch>''))ch=gc;
if(ch=='-')ch=gc,y=;
while(''<=ch && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ll x,ll y){edge[++edge_cnt]=(ed){y,head[x]};head[x]=edge_cnt;++out[y];}
il void topsort()
{
rp(i,,n)if(!out[i])Q.push(i);
while(!Q.empty())
{
ll nw=Q.top();Q.pop();as[++as_cnt]=nw;
for(rg ll i=head[nw];i;i=edge[i].nxt)if(!--out[edge[i].to])Q.push(edge[i].to);
}
if(as_cnt<n)return void(printf("Impossible!\n"));
rp(i,,as_cnt)printf("%lld ",as[n-i+]);printf("\n");
} int main()
{
freopen("cyzz.in","r",stdin);freopen("cyzz.out","w",stdout);
ll T=read();
while(T--)
{
edge_cnt=;as_cnt=;memset(head,,sizeof(head));memset(out,,sizeof(out));
n=read();m=read();rp(i,,m){ll x=read(),y=read();ad(y,x);}
topsort();
}
return ;
}

然后代码在这儿,记得清零什么的昂

洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心的更多相关文章

  1. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序

    题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...

  2. 洛谷 P3243 [HNOI2015]菜肴制作 题解

    每日一题 day60 打卡 Analysis 这道题一看就感觉是个拓扑排序,但因为按字典序最小的排序会有问题(见第三个样例)主要原因是每次选择有后效性,而从后往前就不会存在这个问题,因为每个子任务都是 ...

  3. [LOJ2114][HNOI2015]-菜肴制作-拓扑排序+贪心

    <题面> 一个蒟蒻的痛苦一天 在今天的节目集训中,麦蒙将带领大家学习9种错误的解题策略 $15\%$算法(看两个就往下走吧) 1> puts("Impossible!&qu ...

  4. 洛谷P3243 [HNOI2015]菜肴制作 (拓扑排序/贪心)

    这道题的贪心思路可真是很难证明啊...... 对于<i,j>的限制(i必须在j之前),容易想到topsort,每次在入度为0的点中选取最小的.但这种正向找是错误的,题目要求的是小的节点尽量 ...

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

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

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

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

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

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

  8. 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆

    题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...

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

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

随机推荐

  1. 【RF库Collections测试】Reverse List

    Name:Reverse ListSource:Collections <test library>Arguments:[ list_ ]Reverses the given list i ...

  2. python cookie

    http://www.jayconrod.com/posts/17/how-to-use-http-cookies-in-python

  3. SaltStack salt-run 命令

    salt-run 常见用法如下: salt-run manage.up # 查看在线的minion salt-run manage.down # 查看不在线的minion salt-run manag ...

  4. 判断App整体处于前台还是后台

    1.通过RunningTaskInfo类判断(需要额外权限): 复制代码代码如下: /** *判断当前应用程序处于前台还是后台 */ public static boolean isApplicati ...

  5. 《C++标准程序库》笔记之三

    本篇博客笔记顺序大体按照<C++标准程序库(第1版)>各章节顺序编排. ---------------------------------------------------------- ...

  6. link常用的作用

    1 引入样式 2设置网页标题上面图标

  7. 原创:超简单!windows配置NDK开发环境使用JNI

    前段时间看android版的opencv的配置教程时,看到了它的NDK配置方法,感觉简单又不会出错!!! 1.下载NDK,设置NDK路径: 在windows的系统环境变量中添加NDK的路径,环境变量名 ...

  8. Windows进程间共享内存通信实例

    Windows进程间共享内存通信实例 抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保 ...

  9. Linq-string判断忽略大小写

    Coupon203Play play = dbContext.Coupon203Plays.Where(u => u.VerifyCode.Equals(verifyCode,StringCom ...

  10. 【EF框架】使用params参数传值防止SQL注入报错处理

    通过SqlParameter传时间参数,代码如下: var param = new List<SqlParameter>(); param.Add(new SqlParameter(&qu ...