「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」菜肴制作的更多相关文章

  1. 【LOJ】#2114. 「HNOI2015」菜肴制作

    题解 把所有边反向 从小到大枚举每个点,把每个点能到达的点挑出来,判完无解后显然是一个DAG,然后在上面求一个编号最大的拓扑序,把这些点全部标记为已选,把每次求得的拓扑序倒序输出 代码 #includ ...

  2. 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)

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

  3. loj #2116. 「HNOI2015」开店

    #2116. 「HNOI2015」开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的想法当然非 ...

  4. 【BZOJ】【4010】【HNOI2015】菜肴制作

    拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...

  5. bzoj4010【HNOI2015】菜肴制作

    4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MB Submit: 981  Solved: 480 [Submit][Statu ...

  6. LOJ #2116 Luogu P3241「HNOI2015」开店

    好久没写数据结构了 来补一发 果然写的时候思路极其混乱.... LOJ #2116 Luogu P3241 题意 $ Q$次询问,求树上点的颜色在$ [L,R]$中的所有点到询问点的距离 强制在线 询 ...

  7. 【HNOI2015】菜肴制作 - 拓扑排序+贪心

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...

  8. 「HNOI 2015」菜肴制作

    题目链接 戳我 \(Description\) 有若干限制,需要求一个\(1\)到\(n\)的排列,每个限制\((x,y)\)表示\(x\)必须在\(j\)之前,并要求所求的排列满足所有限制并让\(1 ...

  9. [loj2116]「HNOI2015」开店 动态点分治

    4012: [HNOI2015]开店 Time Limit: 70 Sec  Memory Limit: 512 MBSubmit: 2452  Solved: 1089[Submit][Status ...

随机推荐

  1. gin入门-1

    Gin框架介绍 1. 简介Gin框架介绍A. 基于httprouter开发的web框架.http://github.com/julienschmidt/httprouterB. 提供Martini风格 ...

  2. 洛谷P1965 转圈游戏 [2013NOIP提高组 D1T1][2017年6月计划 数论04]

    P1965 转圈游戏 题目描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 ...

  3. PhpStorm中如何配置SVN,详细操作方法 - 郑加全的博客 - CSDN博客

      登录|注册       郑加全的博客       目录视图 摘要视图 订阅 CSDN日报0711——<离开校园,入职阿里,开启新的程序人生>      征文 | 你会为 AI 转型么? ...

  4. 当spark遇见hbase

    一.使用sbt引入hbase依赖包 "org.apache.hbase" % "hbase-server" % "2.1.0", " ...

  5. Codeforces 113C

    题目链接 C. Double Happiness time limit per test 5 seconds memory limit per test 128 megabytes input sta ...

  6. linux开发脚本自动部署及监控

    linux开发脚本自动部署及监控 开发脚本自动部署及监控一.编写脚本自动部署反向代理.web.nfs:要求:1.部署nginx反向代理三个web服务,调度算法使用加权轮询: #!/bin/sh ngx ...

  7. BP神经网络分类应用

    DNA序列分类  作为研究DNA序列结构的尝试,提出以下对序列集合进行分类的问题:有20个已知类别的人工制造序列,其中序列标号1-10为A类,11-20为B类.请从中提取特征,构造分类方法,并用这些已 ...

  8. 【《Objective-C基础教程 》笔记】(八)OC的基本事实和OC杂七杂八的疑问

    一.疑问 1.成员变量.实例变量.局部变量的差别和联系,在訪问.继承上怎样表现. 2.属性@property 和 {变量列表} 是否同样.有什么不同. 3.类方法.类成员.类属性:实例方法.实例变量. ...

  9. 【风马一族_php】数组函数

    原文来自:http://www.cnblogs.com/sows/p/6045699.html (博客园的)风马一族 侵犯版本,后果自负  2016-11-09 15:56:26 数组 函数 php- ...

  10. Codeforces 442C

    题目链接 C. Artem and Array time limit per test 2 seconds memory limit per test 256 megabytes input stan ...