拓撲排序 HNOI2015 菜餚製作

2022-05-20 22:30:35 字數 2852 閱讀 2371

知名美食家小 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製作,而這是無論如何也不可能滿足的,從而導致無解。 

30%的資料滿足n,m<=200,d<=3

70%的資料滿足n,m<=5000,d<=3

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

solution

看這題,想了會,發現時拓撲排序,欣喜的打完一交,wa了9個點.....

聽神犇們說是逆序拓撲,想了1小時才明白

其實也挺簡單,就是把邊全都反向,再優先佇列是大根堆  逆序輸出  就行了

原因:

正序排的時候,由於不知道每個點後面點的大小關係,所以排出來的不一定最優

由於給出的邊一定是從  大的  連向  小的,並且題目要求必須在滿足限制條件的前提,小的盡量在前面

既然正序排一定可以保證 大的在前面,那麼倒序排就一定保證小的  在前面

這樣的話,就倒序排,一定

正好可以保證小的一定在後面

1 #include2 #include3 #include4 #include5

#define ll long long

6#define mem(a,b) memset(a,b,sizeof(a))

7using

namespace

std;

8const

int n=100006;9

struct

son10

;13 son a1[n*2

];14

int first[n*2

],e;

15void addbian(int u,int

v)16

2122

intt;

23int

n,m,u,o;

24int

a[n],cnt,ind[n];

2526

void

chu()

2731

32 priority_queueq;

33void

tuopu()

3449}50

}5152int

main()

6566

tuopu();

6768

/*printf("cnt=%d\n",cnt);

69for(int i=1;i<=cnt;++i)

70printf("%d ",a[i]);

71printf("\n");

*/72

if(cnt

73 printf("

impossible!\n");

74else

7580}81

//while(1);

82return0;

83 }

code

HNOI2015 菜餚製作 思想 拓撲排序

題意 求乙個拓撲序列,保證以1 n的優先順序,每個數盡量排在前面 分析 顯然求字典序最小的拓撲序有問題,字典序列由每個位置的數字決定,可是這裡有乙個1 n的優先順序,就是說盡量要保證1在前,以此類推。如果說乙個元素,圖中不存在 與它深度相同 的元素的話,那麼它在拓撲序列中的位置一定是固定的,那麼我們...

HNOI2015 菜餚製作 題解(貪心 拓撲)

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

HNOI2015 菜餚製作 題解

傳送門 hnoi2015 菜餚製作 根據題目的描述,我們要做的首先是一步一步的分析 這個題肯定是拓撲排序無疑,因為要求的是滿足固定條件 有向圖的連邊 的某種排列,而難點就在於如何拓撲排序。根據題目的描述,我們首先想到的是根據字典序大小進行排序,那麼我們就舉例幾組資料來驗證一下是否正確,那麼先看下面這...