「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 ...
随机推荐
- JS文字翻滚效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtm ...
- C++/CLI 创建WinForm程序
本文演示下用CLR创建一个简单的winform程序,IDE:VS2015 可以参考另一篇文章:http://blog.csdn.net/wcc27857285/article/details/7813 ...
- MVC的学习步骤
(1)搭建环境(2)如何完成Controller和 Model的映射(3)如何把值传给Controller(4)Controller如何把值传给viewer(5)异常处理(6)页面标签(7)文件上传( ...
- 为GitLab配置邮件服务
修改配置文件:/etc/gitlab/gitlab.rb ####################################################################### ...
- POJ 2031 Building a Space Station (prim裸题)
Description You are a member of the space station engineering team, and are assigned a task in the c ...
- PHP之文件目录基础操作方法
1.文件的属性信息获取 首先文件具有类型,在linux下边,有block(块设备,如磁盘分区.CD-ROM).char(以字符为输入的设备,如键盘.打印机).dir(目录类型,目录也是文件的一种).f ...
- 问题解决:在js中绑定onclick事件为什么不加括号,在html代码中必须要加?(转载)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- etree不存在解决方法
from lxml import html text=xxx//测试的html文本 etree = html.etree htmlDiv = etree.HTML(text) title = html ...
- DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS
原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0 ...
- 覆盖equals时请遵守通用约定
Object类中非final修饰的方法有equals().hashCode().toString().finalize().clone()1.equals()方法不需要被覆盖的情况:1)实例化的对象只 ...