BZOJ4010 HNOI2015 菜餚製作

2022-05-03 23:18:13 字數 2332 閱讀 1757

知名美食家小 a被邀請至atm 大酒店,為其品評菜餚。 

atm 酒店為小 a 準備了 n 道菜餚,酒店按照為菜餚預估的質量從高到低給予

1到n的順序編號,預估質量最高的菜餚編號為1。由於菜餚之間口味搭配的問題,

某些菜餚必須在另一些菜餚之前製作,具體的,一共有 m 條形如「i 號菜餚『必須』

先於 j 號菜餚製作」的限制,我們將這樣的限制簡寫為。現在,酒店希望能求

出乙個最優的菜餚的製作順序,使得小 a能盡量先吃到質量高的菜餚:也就是說,

(1)在滿足所有限制的前提下,1 號菜餚「盡量」優先製作;(2)在滿足所有限制,1

號菜餚「盡量」優先製作的前提下,2號菜餚「盡量」優先製作;(3)在滿足所有限

制,1號和2號菜餚「盡量」優先的前提下,3號菜餚「盡量」優先製作;(4)在滿

足所有限制,1 號和 2 號和 3 號菜餚「盡量」優先的前提下,4 號菜餚「盡量」優

先製作;(5)以此類推。 

例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!」 (不含引號,

首字母大寫,其餘字母小寫) 

第一行是乙個正整數d,表示資料組數。 

接下來是d組資料。 

對於每組資料: 

第一行兩個用空格分開的正整數n和m,分別表示菜餚數目和製作順序限

制的條目數。 

接下來m行,每行兩個正整數x,y,表示「x號菜餚必須先於y號菜餚製作」

的限制。(注意:m條限制中可能存在完全相同的限制) 

輸出檔案僅包含 d 行,每行 n 個整數,表示最優的菜餚製作順序,或

者」impossible!」表示無解(不含引號)。 

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

1 5 3 4 2

impossible!

1 5 2 4 3

【樣例解釋】 

第二組資料同時要求菜餚1先於菜餚2製作,菜餚2先於菜餚3製作,菜餚3先於

菜餚1製作,而這是無論如何也不可能滿足的,從而導致無解。 

100%的資料滿足n,m<=100000,d<=3。 

可以發現答案是反向圖的最大字典序拓撲序列的反序列。

設有兩個合法序列a,b。如果a的字典序比b大,設a[i]>b[i],則b[i]在a中的位置肯定比b[i]在b中的位置靠後,即a優於b。

然後這道題的格式要求好奇葩。

#include#include

#include

#include

#include

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

using

namespace

std;

inline

intread()

const

int maxn=100010

;int n,m,e,first[maxn],next[maxn],to[maxn],in

[maxn];

void addedge(int u,int

v) priority_queue

q;intans[maxn],cnt;

void

init()

void

solve()

}if(cnt!=n) printf("

impossible!");

else dwn(i,n,1) printf("

%d "

,ans[i]);

puts(

"");

}int

main()

view code

BZOJ4010 HNOI2005 菜餚製作

分析 這應該比較明顯是個拓撲排序。序號小的要放前面,但是會受到後面很多菜的限制。其實序號小的優先考慮和序號大的最後考慮應該是差不多的。不知道科不科學,求大神指正 把圖中的邊全部反向,拓撲 堆維護剩下的節點中度為0且序號最大的。把得到的序列反向輸出。include include using name...

HNOI2015 BZOJ4010 菜餚製作

description 知名美食家小 a被邀請至atm 大酒店,為其品評菜餚。atm 酒店為小 a 準備了 n 道菜餚,酒店按照為菜餚預估的質量從高到低給予 1到n的順序編號,預估質量最高的菜餚編號為1。由於菜餚之間口味搭配的問題,某些菜餚必須在另一些菜餚之前製作,具體的,一共有 m 條形如 i 號...

bzoj4010 HNOI2015 菜餚製作

題目鏈結 題意 給出一張無向圖要求出乙個拓撲序列滿足1的位置最靠前 在保證上面的條件下使2的位置最靠前 在保證上面的條件下使3的位置最靠前 solution 構造逆拓撲序,套個堆每次選出編號最大的加入答案,輸出答案時從後往前輸出。有點難想,但是腦補一下還是ok的。bzoj4010 include i...