正解:拓扑排序

解题报告:

传送门!

首先看到它这个约束就应该要想到拓扑排序辣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. Android学习之PopupWindow

    Android的对话框有两种:PopupWindow和AlertDialog. 详细说明如下: AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情: AlertDi ...

  2. php-fpm配置文件

    php-fpm配置文件 1.php-5.2的php-fpm <?xml version="1.0" ?> <configuration> <secti ...

  3. 例说hg(五)————创建repository

    本文由博主原创,转载请注明出处(保留此处和链接): IT人生(http://blog.csdn.net/robinblog/article/details/17933747) 有很多网站提供了免费的M ...

  4. Linux 下如何安装 .bin 文件

    拿到 .bin 文件,在文件所在目录下执行如下命令即可安装, ./your-file-name.bin 如果提示 “没有那个文件或目录” ,给它加上执行权限即可,执行如下命令, chmod +x ./ ...

  5. Excel中用countif和countifs统计符合条件的个数 good

    countif单条件统计个数   1 就以下表为例,统计总分大于(包含等于)400的人数. 2 在J2单元格输入公式=COUNTIF(I2:I22,">=400") 3 回车 ...

  6. window7下 cocos2dx android交叉编译环境部署小结

    上周被android交叉编译搞惨了,还好最后弄好了,写个小结以后备用吧. 步骤,1.下载cygwin的devel和shells模块 2. 2.设置环境变量 a.设置NDK_ROOT b.设置Path ...

  7. 23种设计模式之备忘录模式(Memento)

    备忘录模式确保在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定 ...

  8. nose测试中修改nose_html_reporting插件,使生成的html报告加入显示截图功能

    使用nose框架在测试WEB UI自动化时,使用了第三方插件nose-html-reporting,来生成HTML报告,nose-html-reporting具体使用参见管网https://pypi. ...

  9. eclipse使用maven打包时去掉测试类

    eclipse使用maven打包时去掉测试类 在pom.xml文件中增加如下配置: <plugin> <groupId>org.apache.maven.plugins< ...

  10. Fiddler实现手机的抓包(转载园友小坦克)

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的HTTP/HTTPS请求. Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook ...