正解:拓扑排序

解题报告:

传送门!

首先看到它这个约束就应该要想到拓扑排序辣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. iOS开发--打印NSRange,CGRect等结构体

    使用对应的转换NSStringFromCGPoint   NSStringFromCGSize   NSStringFromCGRect  NSStringFromCGAffineTransform  ...

  2. U3D的控制

    做游戏少不了控制,但是一个成熟的游戏引擎,是不能简单仅仅获取键盘中或者遥感确定的按键来控制,要考虑到用户更改游戏按键的情况,当然也得考虑到不同设备的不通输入方式,比如U3D是可以运行在iphone上的 ...

  3. popupWindow 在指定位置上的显示

    先看效果图,免得浪费大家时间,看是不是想要的效果 . 直接上代码 ,核心方法. private void showPopupWindow(View parent) { if (popupWindow  ...

  4. [PyCharm] 设置自动启动时自动打开项目

    设置启动PyCharm时自动打开(或不打开)上次进行的项目: 选择 “Settings - General - Reopen last project on startup”,勾选该选项则启动时自动打 ...

  5. Linux下用C获取当前时间

    Linux下用C获取当前时间,具体如下: 代码(可以把clock_gettime换成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getNowTime() {  ti ...

  6. 深入浅出MFC——消息映射与命令传递(六)

    1. 消息分类: 2. 万流归宗——Command Target(CCmdTarget): 3. "消息映射"是MFC内建的一个信息分派机制.通过三个宏(DECLARE_MESSA ...

  7. react中的hoc和修饰器@connect结合使用

    在学习react-redux的时候,看到了修饰器这个新的属性,这个是es7的提案属性,很方便.于是我用@connect代替了connect(使用的时候需要配置,这里不赘述),省去了很多不必要的代码,但 ...

  8. springbatch---->springbatch的使用(七)

    这里我们讲述一下springbatch中关于step层面上面的数据共享技术.而对街的人影都浸染在一片薄荷的白色中,由于无声,都好像经过漂染,不沾人间烟火. step的数据共享 关于springbatc ...

  9. 五、K3 WISE 开发插件《K3 Wise 群发短信配置开发(一)之短信平台配置》

    开发环境:K/3 Wise 13.0 目录 一.创建短信数据库 二.配置短信接口 三.设置帐套关键字 四.查询短信余额 一.创建短信数据库 打开帐套管理: 账号默认为Admin,密码不填: 菜单“系统 ...

  10. 异常:Servlet class X is not a javax.servlet.Servlet

    使用Maven命令 mvn archetype:create 创建了一个简单的web项目.导入Eclipse运行时,报这样的异常信息: Servlet class X is not a javax.s ...