【题解】[HNOI2015]菜肴制作(贪心+topo序)

题意:请你构造一个排列\(p[i]\)使得对于数组\(arc[i]=p[i]\)的字典序最小,并且对于给定的有序数对\((u,v)\)保证你给出的排列\(u\)早于\(v\)出现。

结论:\(u->v\)连边的反图的最大拓扑序的reverse

证明:这个排列的合法性是显然的,因为是topo序。下证不存在一个更优排列\(p[]\)使得\(arc[]\)字典序更小。

考虑反证,假设存在一个更优排列\(p'[]\)比我们如上算法得到的\(p[]\)要更优。

不妨假设\(p\not = p'\)

下证\(r'=\mathrm{reverse}(p')\)必然是反图拓扑序的一组解,否则\(p'\)必不是一组合法解。

证明:显然

由于\(p'\)满足了题意条件,也就是满足\(u\)在\(v\)前出现,那么将\(r'\),就满足\(u\)在\(v\)后出现。所以\(r'\)将是一组反图拓扑序合法解。

所以\(r'\)可以跑反图拓扑序得到,设\(r=\mathrm{reverse}(p)\)。设\(\min i,\mathrm{s.t.} arc[i]>arc'[i]\),那么肯定更优

不会证明了记住套路吧

这是一类题,要你通过构造排列\(p\)使得\(\mathrm{arc}\ p\)的字典序最小。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define DEBUG(s)
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(!isdigit(c))f|=c==45,c=getchar();
while(isdigit(c)) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} vector<vector<int> > e;
vector<int> dr,ans;
priority_queue<int,vector<int>,greater<int> > q;
int n,m;
inline void add(const int&fr,const int&to){
//DEBUG(fr); DEBUG(to);
e[to].push_back(fr); ++dr[fr];
} inline void work(){
n=qr(); m=qr();
e.clear(); e.resize(n+1); dr.clear(); dr.resize(n+1); ans.clear();
//DEBUG(n); DEBUG(m);
for(int t=1;t<=n;++t) if(dr[t]) cerr<<"wa";
for(int t=1,x,y;t<=m;++t){
x=qr(),y=qr();
add(y,x);
}
for(int t=1;t<=n;++t) if(!dr[t]) q.push(t);
while(q.size()){
int now=q.top();
q.pop();
//DEBUG(now);
ans.push_back(now);
for(const auto&t:e[now])
if(--dr[t]==0)
q.push(t);
}
if((int)ans.size()!=n) return puts("Impossible!"),void();
for(const auto&t:ans)
printf("%d ",t);
putchar('\n');
} int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
//freopen("debug.out","w",stderr);
int T=qr();
while(T--) work();
return 0;
}

【题解】[HNOI2015]菜肴制作(贪心+topo序)的更多相关文章

  1. [HNOI2015]菜肴制作贪心的证明

    [HNOI2015]菜肴制作贪心的证明 先吐槽一句为什么网上都没人证这个东西,我觉得一点也不显然啊... 判环不用说了,现在处理一个DAG.考虑按题意模拟:建反图(边从后选的点连向先选的点),每次找全 ...

  2. BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )

    把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...

  3. bzoj 4010 [HNOI2015]菜肴制作——贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 和 bzoj 2535 差不多.因为当前怎么决策与该点后面连的点的标号情况有关,所以按 ...

  4. [HNOI2015]菜肴制作 题解(自带口胡证明)

    [HNOI2015]菜肴制作 时间限制: 1 Sec  内存限制: 512 MB 题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...

  5. BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...

  6. BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心

    BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...

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

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

  8. P3243 [HNOI2015]菜肴制作(拓扑排序)

    P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...

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

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

随机推荐

  1. laravel 队列重启

    我在job中写了邮件发送 ,线下环境测试是无问题的 ,现在放到线上出现了问题. 问题描述: 部分时候邮件功能可用,部分时间邮件功能不可用. 邮件功能不可用的时候,job发送失败,失败原因是无发送人,打 ...

  2. 2019-8-31-dotnet-通过-WMI-拿到显卡信息

    title author date CreateTime categories dotnet 通过 WMI 拿到显卡信息 lindexi 2019-08-31 16:55:58 +0800 2019- ...

  3. @总结 - 10@ Miller-Rabin素性测试与Pollard-Rho因数分解

    目录 @1 - 素性测试:Miller-Rabin算法@ @1.1 - 算法来源@ @1.2 - 算法描述@ @1.3 - 算法实现@ @2 - 因数分解:Pollard-Rho算法@ @2.0 - ...

  4. Android的headerView和emptyView共存问题

    今天做项目的时候,准备优化下ListView相关的东西,于是乎,需要做一个当列表无数据时,空的提醒页面.这个自然想到的是ListView的setEmptyView()方法,于是顺手就写了,可是,当我为 ...

  5. python特性(八):生成器对象的send方法

    生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send方法有一个参 ...

  6. selenium webdriver学习(七)------------如何处理alert、confirm、prompt对话框( 转)

    selenium webdriver学习(七)------------如何处理alert.confirm.prompt对话框 博客分类: Selenium-webdriver alertpromptc ...

  7. QQ 第三方登录

  8. js切割字符串

    var time_str= '2019-9-10 13:18:20'; var t = time_str.substr(2,8);   console.log(t);   输出  19-9-10

  9. scrapdy部署爬虫项目

    原文:https://blog.csdn.net/JLaiRen/article/details/82902321 scrapyd安装 打开命令行工具输入命令:pip install scrapyd ...

  10. git如何移除某文件的版本控制

    1:还没有加到版本控制中 (1)还没有git  add 在   .gitignore中添加 (2)已经git add 先   git  rm  -r  --cached   文件 在   .gitig ...