「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 ...
随机推荐
- Tomcat中startup.bat启动无效
error: Linux下启动和关闭tomcat报错,如下图所示: 而在windows下用cmd启动startup.bat也会报如上的错误: Neither the JAVA_HOME nor the ...
- C++ std::map用法简介
#include "map" //引入头文件 初始化: std::map <int, std::string> _map1; //初始化 //c++11中引入的,可以直 ...
- Leetcode12.Integer to Roman整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...
- cf round 480E The Number Games
题意:给一棵树,点$i$的点权是$2^i$,你需要删掉$k$个点,使得剩下的点连通的情况下剩下的点权值和最大. $k \leq n \leq 10^6$ 如果考虑删哪些点,是不好考虑的,会出问题. 反 ...
- Hdu 4920矩阵乘法(内存访问的讲究)
题目链接 Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K ( ...
- 杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动
ylbtech-杨柳絮-Info:春天将不再漫天飞“雪”,济源治理杨柳絮在行动 1.返回顶部 1. 天气暖和了,连心情都是阳光的.然而,在这美好的时刻,漫天飞舞的杨柳絮,甚是煞风景.<ignor ...
- 安装 cx_Oracle
1.下载 oracle client instant 和 sdk, 全部解压到 /opt/instantclient_11_2/ http://www.oracle.com/technetwor ...
- Rol租车网项目总结
现在自行车的租聘如此火爆,我们是否需要加入这个浩浩荡荡的行列? 相比起现在ofo共享单车,摩拜单车.而我们的竞争力在何处? 如何能让我们的项目脱颖而出? 而我们的Rol租车网为什么要叫Rol呢? Ri ...
- jquery 日期和时间的逻辑,比较大小
HTML:<ul> <li> <span>到达</span> <img class="date-s" src="/p ...
- Directx11教程(35) 纹理映射(5)
原文:Directx11教程(35) 纹理映射(5) 到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShader ...