Description

知名美食家小A被邀请至ATM 大酒店,为其品评菜肴。

ATM酒店为小A准备了\(N\)道菜肴,酒店按照为菜肴预估的质量从高到低给予\(1\)到\(N\)的顺序编号,预估质量最高的菜肴编号为\(1\)。由于菜肴之间口味搭配的问题,某些菜肴必须在另一些菜肴之前制作,具体的,一共有\(M\)条形如“\(i\)号菜肴‘必须’先于\(j\)号菜肴制作”的限制,我们将这样的限制简写为\(< i,j>\)。现在,酒店希望能求出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量高的菜肴:也就是说,\((1)\)在满足所有限制的前提下,\(1\)号菜肴“尽量”优先制作;\((2)\)在满足所有限制,\(1\)号菜肴“尽量”优先制作的前提下,\(2\)号菜肴“尽量”优先制作;\((3)\)在满足所有限制,\(1\)号和\(2\)号菜肴“尽量”优先的前提下,\(3\)号菜肴“尽量”优先制作;\((4)\)以此类推。

例\(1\):共\(4\)道菜肴,两条限制\(<3,1>,<4,1>\),那么制作顺序是\(3,4,1,2\)。

例\(2\):共\(5\)道菜肴,两条限制\(<5,2>,<4,3>\),那么制作顺序是\(1,5,2,4,3\)。例\(1\)里,首先考虑\(1\),因为有限制\(<3,1>\)和\(<4,1>\),所以只有制作完\(3\)和\(4\)后才能制作\(1\),而根据\((3)\),\(3\)号又应“尽量”比\(4\)号优先,所以当前可确定前三道菜的制作顺序是\(3,4,1\);接下来考虑\(2\),确定最终的制作顺序是\(3,4,1,2\)。例\(2\)里,首先制作\(1\)是不违背限制的;接下来考虑\(2\)时有\(<5,2>\)的限制,所以接下来先制作\(5\)再制作\(2\);接下来考虑\(3\)时有\(<4,3>\)的限制,所以接下来先制作\(4\)再制作\(3\),从而最终的顺序是\(1,5,2,4,3\)。现在你需要求出这个最优的菜肴制作顺序。无解输出“Impossible!” (不含引号,首字母大写,其余字母小写)

Input

第一行是一个正整数\(D\),表示数据组数。

对于每组数据:

第一行两个用空格分开的正整数\(N\)和\(M\),分别表示菜肴数目和制作顺序限制的条目数。

接下来\(M\)行,每行两个正整数\(x,y\),表示“\(x\)号菜肴必须先于\(y\)号菜肴制作”的限制。(注意:\(M\)条限制中可能存在完全相同的限制)

Output

输出文件仅包含\(D\)行,每行\(N\)个整数,表示最优的菜肴制作顺序,或者”Impossible!”表示无解(不含引号)。

Sample Input

3

5 4

5 4

5 3

4 2

3 2

3 3

1 2

2 3

3 1

5 2

5 2

4 3

Sample Output

1 5 3 4 2

Impossible!

1 5 2 4 3

Hint

\(N,M \le 100000,D \le 3\)

Solution

考试的时候打的\(70'\)做法,即从小到大依次确定可以放置的最前的位置。复杂度\(O(n^{2})\)。

正解的做法很简单,却并不好像,好像跟NOI2010航空管制很像。

将图反连,我们从小到大确定每个最前的位置,即在反top序中从小到大最后的位置。我们还是topsort,只是每次取出的点是所有入度为\(0\)的标号最大的点。这要的贪心 ,我们就可以保证编号小的尽可能的在后面。最后将top序反着输出即可。

#include<iostream>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std; #define maxn (100010)
int d[maxn],side[maxn],next[maxn*2],toit[maxn*2],ans[maxn],cnt,n,m; inline void add(int a,int b) { next[++cnt] = side[a]; side[a] = cnt; toit[cnt] = b; ++d[b]; } struct cmp { inline bool operator ()(const int &a,const int &b) { return a>b; } };
set <int,cmp> S; inline bool topsort()
{
int tot = 0;
for (int i = 1;i <= n;++i) if (!d[i]) S.insert(i);
while (!S.empty())
{
int now = *S.begin(); S.erase(S.begin());
ans[++tot] = now;
for (int i = side[now];i;i = next[i]) if (!--d[toit[i]]) S.insert(toit[i]);
}
return tot == n;
} int main()
{
freopen("4010.in","r",stdin);
freopen("4010.out","w",stdout);
int T; scanf("%d",&T);
while (T--)
{
scanf("%d %d",&n,&m);
for (int i = 1,a,b;i <= m;++i) scanf("%d %d",&a,&b),add(b,a);
if (!topsort()) printf("Impossible!");
else for (int i = n;i;--i) printf("%d ",ans[i]);
puts("");
memset(side,0,4*(n+1));
memset(d,0,4*(n+1));
cnt = 1;
}
fclose(stdin); fclose(stdout);
return 0;
}

BZOJ 4010 菜肴制作的更多相关文章

  1. bzoj 4010 [HNOI2015]菜肴制作——贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4010 和 bzoj 2535 差不多.因为当前怎么决策与该点后面连的点的标号情况有关,所以按 ...

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

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

  3. bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

    题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...

  4. BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )

    把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...

  5. [BZOJ 4010][HNOI 2015] 菜肴制作

    4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 1776  Solved: 889[Submit][Status ...

  6. bzoj 4010: [HNOI2015]菜肴制作

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

  7. 【BZOJ 4010】 [HNOI2015]菜肴制作

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

  8. BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...

  9. 拓扑排序 最大字典序+优先队列 BZOJ 4010

    http://www.lydsy.com/JudgeOnline/problem.php?id=4010 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory ...

随机推荐

  1. RedHat7搭建MongoDB

    yum安装MongoDB 添加MongoDB源# vi /etc/yum.repos.d/mongodb-org-3.0.repo [mongodb-org-3.0] name=MongoDB Rep ...

  2. JDK自带方法实现RSA数字签名

    JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA 其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle) --20151126 ...

  3. PHP一个最简单的CMS内容管理系统

    博客是一般程序员的入手戏,写得好写不好,有没有兴趣,逻辑性够不够都从这个里面入手 我现在摒弃前台.重点讲解下如何开发一个简单的CMS系统所需要的步骤: 1.清楚流程 1--------登录后台 2-- ...

  4. Spring中 bean定义的parent属性机制的实现分析

    在XML中配置bean元素的时候,我们常常要用到parent属性,这个用起来很方便就可以让一个bean获得parent的所有属性 在spring中,这种机制是如何实现的?     对于这种情况 tra ...

  5. CI笔记6 json 传值

    CI3.x 使用json,配合easyui, 其实很简单,走了很多的弯路, 首先在ci的控制器重,建立2个方法,一个用于显示加载view,一个用于echo json,就可以了. 需要注意的是,在ci的 ...

  6. Twisted介绍

    Twisted诞生于2000年初,作者为Glyph,目的是为了开发网络游戏. Twisted的历史 Glyph开始采用Java多线程,来开发Twisted Reality,结果多线程使得开发变得复杂, ...

  7. winpcap 发送接收速率

    总体情况: 在不修改winpcap源码的情况下,发包.收包最大速率3包/ms. 收包几个api的速率: 1. m_fp = pcap_open_live(adapter->name, 65536 ...

  8. php 单引号与双引号区别

    一.单引号与双引号区别 1." "双引号里面的字段会经过编译器解释,然后再当作HTML代码输出. 2.' '单引号里面的不进行解释,直接输出. 从字面意思上就可以看出,单引号比双引 ...

  9. 速卖通api--发起授权

    <? $reqURL_onLine = "https://gw.api.alibaba.com/openapi/http/1/system.oauth2/getToken/494739 ...

  10. 过滤HTML

    过滤HTML public static string NoHTML(string html){ string[] strArray2 = new string[] { "font" ...