「HNOI2015」菜肴制作
「HNOI2015」菜肴制作
这道题想到了其实还挺水的,一开始我直接用小根堆拓扑然后就爆0了,然后我又用十万个堆搜索,T30,还是xkl告诉我要倒着拓扑。
首先要建反图,对于入度为0的点,较小的点先输出所以要优先拓扑大的点,这样就保证了大的点及其子树(其实并不是树,这样好理解点)都存在数组前面,再倒着输出即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<time.h>
#include<queue>
#define ma(x) memset(x,0,sizeof(x))
using namespace std;
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
}ed[100010];
int first[100010],num_e=1;
#define f(x) first[x]
int d;
int n,m,du[100010],ans[100010],cnt;
bool v[100010];
inline void add(int u,int v)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
n(num_e)=f(u);
f(u)=num_e;
}
bool ved[100010],ving[100010];
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("4.in","r",stdin);
// freopen("1.out","w",stdout); cin>>d;
while(d--)
{
ma(ed);ma(first);ma(du);ma(ans);ma(v);
cnt=0;num_e=1;
scanf("%d%d",&n,&m);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(b,a);
du[a]++;
}
priority_queue<int> q;
for(int i=1;i<=n;i++)
if(!du[i]){v[i]=1;q.push(i);}
if(q.empty()){puts("Impossible!");continue;}
while(q.size())
{
int k=q.top();q.pop();
ans[++cnt]=k;
for(int i=f(k);i;i=n(i))
if(!v[v(i)])
{
du[v(i)]--;
if(!du[v(i)])
{
v[v(i)]=1;
q.push(v(i));
}
} }
if(cnt!=n){puts("Impossible!");continue;}
for(int i=cnt;i;i--)
printf("%d ",ans[i]);puts("");
}
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define ma(x) memset(x,0,sizeof(x))
using namespace std;
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
}ed[];
int first[],num_e=;
#define f(x) first[x]
int d;
int n,m,du[],ans[],cnt;
bool v[];
int minn[];
bool pd=;
inline void add(int u,int v)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
n(num_e)=f(u);
f(u)=num_e;
}
priority_queue<int,vector<int>,greater<int> >q[],temm;
void dfs1(int x,int fa)
{
v[x]=;q[x].push(x);
for(int i=f(x);i;i=n(i))
if(v(i)!=fa)
{
if(!v[v(i)])dfs1(v(i),x);
temm=q[v(i)];
while(temm.size())
{
q[x].push(temm.top());
temm.pop();
}
}
}
bool ved[],ving[];
void dfs2(int x)
{
// cout<<x<<endl;
if(pd)return;
ving[x]=;
// cout<<q[x].size()<<endl;
// while(!q[x].empty()&&q[x].top()==x)q[x].pop();
// cout<<q[x].size()<<endl;
while(q[x].size())
{
while(!q[x].empty()&&q[x].top()==x)q[x].pop();
if(q[x].empty())break;
int k=q[x].top();q[x].pop();
// cout<<k<<endl;
if(ving[k]){pd=;return;}
if(!ved[k])dfs2(k);
}
ving[x]=;ved[x]=;
ans[++cnt]=x;
}
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout); cin>>d;
while(d--)
{
ma(ed);ma(first);ma(du);ma(ans);ma(v);ma(minn);ma(q);ma(ving);ma(ved);
pd=cnt=;num_e=;
scanf("%d%d",&n,&m);
int a,b;
for(int i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(b,a);
du[b]++;
}
for(int i=;i<=n;i++)
if(!v[i])dfs1(i,);
for(int i=;i<=n;i++)
if(!ved[i])dfs2(i);
/* for(int i=1;i<=n;i++)
{
printf("#%d:\n",i);
while(q[i].size())
{
cout<<q[i].top()<<endl;
q[i].pop();
}
}*/ if(pd){puts("Impossible!");continue;}
for(int i=;i<=cnt;i++)
printf("%d ",ans[i]);puts("");
}
}
附十万个堆代码
「HNOI2015」菜肴制作的更多相关文章
- 【LOJ】#2114. 「HNOI2015」菜肴制作
题解 把所有边反向 从小到大枚举每个点,把每个点能到达的点挑出来,判完无解后显然是一个DAG,然后在上面求一个编号最大的拓扑序,把这些点全部标记为已选,把每次求得的拓扑序倒序输出 代码 #includ ...
- 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)
[BZOJ4010][HNOI2015]菜肴制作(拓扑排序) 题面 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...
- loj #2116. 「HNOI2015」开店
#2116. 「HNOI2015」开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的想法当然非 ...
- 【BZOJ】【4010】【HNOI2015】菜肴制作
拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...
- bzoj4010【HNOI2015】菜肴制作
4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 981 Solved: 480 [Submit][Statu ...
- LOJ #2116 Luogu P3241「HNOI2015」开店
好久没写数据结构了 来补一发 果然写的时候思路极其混乱.... LOJ #2116 Luogu P3241 题意 $ Q$次询问,求树上点的颜色在$ [L,R]$中的所有点到询问点的距离 强制在线 询 ...
- 【HNOI2015】菜肴制作 - 拓扑排序+贪心
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...
- 「HNOI 2015」菜肴制作
题目链接 戳我 \(Description\) 有若干限制,需要求一个\(1\)到\(n\)的排列,每个限制\((x,y)\)表示\(x\)必须在\(j\)之前,并要求所求的排列满足所有限制并让\(1 ...
- [loj2116]「HNOI2015」开店 动态点分治
4012: [HNOI2015]开店 Time Limit: 70 Sec Memory Limit: 512 MBSubmit: 2452 Solved: 1089[Submit][Status ...
随机推荐
- webpack4进阶配置
移动端CSS px自动转换成rem 需要两步来实现: px2rem-loader 在构建阶段将px转换成rem lib-flexible 页面渲染时动态计算根元素的font-size值(手机淘宝开源库 ...
- SELECT (@i :=@i + 1)生成序列号
转载自https://blog.csdn.net/qq_27922171/article/details/86477544 同类别自动生成序列号:https://bbs.csdn.net/topics ...
- linux 关于网络接口及配置工具说明
在Linux操作系统中配置网络接口,一般是通过网络配置工具实现的,但最终目的还是通过网络配置工具来达到修改与网络相关的配置文件而起作用的.由此说来,我们配置网络可以直接修改配置文件. 比如网络网络接口 ...
- Codeforces 1150D(字符串dp)
反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 /* __ __ * ____| |_____| |____ * | | * | __ | * ...
- Leetcode622.Design Circular Queue设计循环队列
设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列的一个好处是 ...
- Javascript-随滚轮匀速滑动的浮动广告窗动画
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- Vue-- vue-preview(图片查看器)的使用步骤:
vue-preview的使用步骤: )下载 )配置:找到配置文件加入: { test: /vue-preview.src.*?js$/, loader: 'babel-loader' }, 在处理ur ...
- arcgis地图窗口操作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Spring Boot:Boot2.0版本整合Neo4j
前面介绍了Boot 1.5版本集成Neo4j,Boot 2.0以上版本Neo4j变化较大. 场景还是电影人员关系 Boot 2.0主要变化 GraphRepository在Boot2.0下不支持了,调 ...
- JS函数式编程 - 概念
最近在看Typescript,顺便看了一些函数式编程,然后半个国庆假期就没有了.做个笔记,分几个部分写吧. 最开始接触函数式编程的时候,第一个接触的概念就是高阶函数,和柯里化.咋一看,这不就是长期用来 ...