「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. win7开机启动项设置

    Windows系统自身就有启动项命令可以进行设置: 要说到修改启动项,当然首推Windows系统自带的“MSCONFIG”命令,XP等其他Windows系统用户使用方法是一模一样的. 1.点击“开始” ...

  2. 在Mac下安装MySQL

    在Mac下安装MySQL   最近开始将开发工具都转移到 Mac 上了,其中也会莫名其妙的遇到一些坑,不如干脆将整个流程都记录下来,方便以后查找. 下载与安装 首先进入 MySQL 官网,选择免费的C ...

  3. Lab1 ex1 物理页内存分配算法的实现

    调用流程如下 kern_init --> pmm_init-->page_init-->init_memmap--> pmm_manager->init_memmap 从 ...

  4. xinetd服务管理

    xinetd服务的管理文件都放在 /etc/xinetd.d目录内,我们可以编辑这个目录内的服务文件来开启和关闭服务.每个服务文件都有disable 这个行,如果把值改成yes就是禁用服务,如果是no ...

  5. cf round 480E The Number Games

    题意:给一棵树,点$i$的点权是$2^i$,你需要删掉$k$个点,使得剩下的点连通的情况下剩下的点权值和最大. $k \leq n \leq 10^6$ 如果考虑删哪些点,是不好考虑的,会出问题. 反 ...

  6. Maven常用命令备忘

    1. 修改版本号 mvn versions:set -DnewVersion=1.0.1-SNAPSHOT 2. <relativePath>的默认值是../pom.xml,如果没有配置, ...

  7. Python3 中 configparser 使用注意事项

    在使用configparser时候应注意: ①配置文件(ini文件)的存放位置:配置文件和调用文件放在同一个文件包下面. 使用read()函数读取并解析配置文件时,直接写配置文件(ini文件)的文件名 ...

  8. arcgis访问百度地图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 【JZOJ3214】【SDOI2013】方程

    ╰( ̄▽ ̄)╭ 给定方程 X1+X 2+-+Xn=m 我们对第 1.. n1 个变量 进行一些限制 : X1≤A1 X2≤A2 - Xn1 ≤An1 我们对第 n1+1.. n1+1.. n1+ n2 ...

  10. iOS - CAReplicatorLayer 的运用

    http://www.cocoachina.com/ios/20151230/14822.html 序 CAReplicatorLayer可以复制自己子层的layer,并且复制的出来的layer和原来 ...