BZOJ4010 HNOI2015 菜餚製作

2021-08-16 10:12:54 字數 1571 閱讀 7431

標籤:拓撲排序

題目傳送門

知名美食家小 a被邀請至atm 大酒店,為其品評菜餚。 atm 酒店為小 a 準備了 n 道菜餚,酒店按照為菜餚預估的質量從高到低給予1到n的順序編號,預估質量最高的菜餚編號為1。

由於菜餚之間口味搭配的問題,某些菜餚必須在另一些菜餚之前製作,具體的,一共有 m 條形如」i 號菜餚』必須』先於 j 號菜餚製作「的限制,我們將這樣的限制簡寫為

第一行是乙個正整數d,表示資料組數。 接下來是d組資料。 對於每組資料: 第一行兩個用空格分開的正整數n和m,分別表示菜餚數目和製作順序限制的條目數。 接下來m行,每行兩個正整數x,y,表示」x號菜餚必須先於y號菜餚製作「的限制。(注意:m條限制中可能存在完全相同的限制)

輸出檔案僅包含 d 行,每行 n 個整數,表示最優的菜餚製作順序,或者「impossible!「表示無解(不含引號)。

3

5 45 4

5 34 2

3 23 3

1 22 3

3 15 2

5 24 3

153

42impossible!1

5243

【樣例解釋】

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

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

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

反向建邊跑拓撲排序!

#include

#include

#include

#include

#include

#include

#include

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define dep(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

#define reg(x) for(int i=last[x];i;i=e[i].next)

using namespace std;

inline ll read()

while(ch>='0'&&ch<='9')

return

x*f;

}const int maxn=1e5+6;

priority_queue que;

struct edgee[maxn<<1];

int du[maxn],last[maxn],n,t,m,cnt,ans[maxn];

void insert(int u,int v);last[u]=cnt;

}int main()

int now=0;

rep(i,1,n)if(!du[i])que.push(i);

while(!que.empty())

}if(now==n)else puts("impossible!");

}return

0;}

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...