HNOI2015菜肴制作
一开始,没想出来,先topsort判环,把impossible拿到手,然后划分联通块,对每个联通块跑一遍topsort,觉得可对了,然后被大样例教育明白了,知道自己的策略错在哪了。
接着在纸上疯狂手模样例,不停地换topsort的顺序和贪心的方法,然后发现一种可行的解法。
开大根堆,对反图跑topsort,然后倒序输出。
这是一种贪心的策略,通过上述操作,我们可以使不但大,而且限制多的不优秀点在最后输出,而小而且限制少的在前输出,既不违反规则,字典序又最小。
换另一种解释,题目要我们输出满足拓扑序的最小字典序,是两个可能矛盾的量,他们之间可能存在冲突,那我们就倒着来,找满足拓扑逆序的最大字典序,这两个量都可以否定一个数字出现在靠前位置,把它们先找出来,然后倒着输出,就可以了。
其实上述过程只用一个topsort就搞定了,但是博主略懒,以前的那个top判环没删,就直接用了,导致时间略长。大家还是自己去打打吧,就当复习topsort了。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
using namespace std;
int read(){
int sum=,f=;char x=getchar();
while(x<''||x>''){
if(x=='-') f=-;
x=getchar();
}while(x>=''&&x<=''){
sum=sum*+x-'';
x=getchar();
}return sum*f;
}
int T,n,m,du[],pos[],ans[],size[],du1[],cnt;
vector<int>edge[];
vector<int>lcc[];
vector<int>e[];
bool v[];
map<pair<int,int>,bool>mp[];
bool check(){
bool vis[];
memset(vis,,sizeof(vis));
queue<int>tops;
while(!tops.empty())
tops.pop();
for(int i=;i<=n;i++)
if(du[i]==){
tops.push(i);
vis[i]=;
// cout<<i<<" ";
}
while(!tops.empty()){
int x=tops.front();
tops.pop();
for(int i=;i<edge[x].size();i++){
int y=edge[x][i];
du[y]--;
if(du[y]==){
tops.push(y);
vis[y]=;
// cout<<y<<" ";
}
}
}//cout<<endl;
/* for(int i=1;i<=n;i++)
cout<<vis[i]<<" ";*/
for(int i=;i<=n;i++)
if(!vis[i]) return ;
return ;
}
void topsort(){
priority_queue<int>q;
for(int i=;i<=n;i++)
if(du1[i]==)
q.push(i);
while(!q.empty()){
int x=q.top();q.pop();ans[++ans[]]=x;
for(int i=;i<e[x].size();i++){
int y=e[x][i];
du1[y]--;
if(du1[y]==)
q.push(y);
}
}
}
int main(){
/*freopen("1.in","r",stdin);
freopen("1.out","w",stdout);*/
T=read();
while(T--){
n=read();m=read();
memset(ans,,sizeof(ans));
memset(du,,sizeof(du));
memset(v,,sizeof(v));
memset(du1,,sizeof(du1));
memset(e,,sizeof(e));
for(int i=;i<=n;i++) edge[i].clear();
for(int i=,x,y;i<=m;i++){
x=read();y=read();
if(mp[T][make_pair(x,y)]) continue;
mp[T][make_pair(x,y)]=;
edge[x].push_back(y);
// e[x].push_back(y);
e[y].push_back(x);
du[y]++;
du1[x]++;
}
if(check()){
puts("Impossible!");
continue;
}
topsort();
for(int i=n;i>=;i--)
printf("%d ",ans[i]);
putchar('\n');
}
return ;
}
略丑,勿看
HNOI2015菜肴制作的更多相关文章
- bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...
- BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...
- P3243 [HNOI2015]菜肴制作(拓扑排序)
P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...
- bzoj 4010 [HNOI2015]菜肴制作——贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 和 bzoj 2535 差不多.因为当前怎么决策与该点后面连的点的标号情况有关,所以按 ...
- 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序
[BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...
- BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...
- [HNOI2015]菜肴制作 题解(自带口胡证明)
[HNOI2015]菜肴制作 时间限制: 1 Sec 内存限制: 512 MB 题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...
- [HNOI2015]菜肴制作贪心的证明
[HNOI2015]菜肴制作贪心的证明 先吐槽一句为什么网上都没人证这个东西,我觉得一点也不显然啊... 判环不用说了,现在处理一个DAG.考虑按题意模拟:建反图(边从后选的点连向先选的点),每次找全 ...
- 【题解】[HNOI2015]菜肴制作(贪心+topo序)
[题解][HNOI2015]菜肴制作(贪心+topo序) 题意:请你构造一个排列\(p[i]\)使得对于数组\(arc[i]=p[i]\)的字典序最小,并且对于给定的有序数对\((u,v)\)保证你给 ...
- [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
菜肴制作 bzoj-4010 HNOI-2015 题目大意:给定一张n个点m条边的有向图,求一个toposort,使得:(1)满足编号为1的点尽量在前:(2)满足(1)的情况下编号为2的点尽量在前,以 ...
随机推荐
- HTTP缓存总结
在具体了解 HTTP 缓存之前先来明确几个术语:1.缓存命中率:从缓存中得到数据的请求数与所有请求数的比率.理想状态是越高越好.2.过期内容:超过设置的有效时间,被标记为“陈旧”的内容.通常过期内容不 ...
- 【js】clientY pageY screenY layerY offsetY的区别
clientY 指的是距离可视页面左上角的距离 pageY 指的是距离可视页面左上角的距离(不受页面滚动影响) screenY 指的是距离屏幕左上角的距离 layerY 指的是找到它或它父级元素中最近 ...
- JS基础_if练习一
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- warning C4819 的解决方法
编译VC++程序的时候出现如下提示警告: warning C4819: The file contains a character that cannot be represented in the ...
- 解决 Ubuntu 19 安装openjdk 8后与openjfx不兼容
小淘气放假了,孩子在上幼儿园的小朋友,报班也不能太变态嘛, 还是让他自己娱乐的时间多一点,但是现在在家的娱乐就是看电视,听说电视看多了越看越傻,就想方设法的给他找一点娱乐活动,把我闲置的树莓派给他装了 ...
- jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解
一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤. 二.类加载时机: 1 ...
- 1 sql server中添加链接服务器
1 链接到另一个sql server 的实例 exec sp_addlinkedserver @server= '服务器的地址',@srvproduct='SQL Server' go 分布式查询中 ...
- (转)JVM垃圾回收机制
一.技术背景 GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术 二.那些内存需要回收? JVM的内存结构包括五大区域:程序计数器.虚拟机栈.本地方法栈.堆区 ...
- 在Windows server 2019 Core 版本上安装SQL2016
安装系统后,通过网络等方式先把安装ISO的文件copy过来,虚拟机则用挂一个虚拟光驱即可,然后cd进入目录,执行以下命名即可安装核心服务了: Setup.exe /qs /ACTION=Install ...
- Visual Studio 添加 自定义 路径宏
在编辑VS工程包含路径和库路径时,有时需要添加第三方包的路径,比如c++ boost库, 为了协作的方便,不合适直接把本地绝对路径添加入工程设置,此时可以添加自定义路径宏, 然后参与协作的每个开发人员 ...