洛谷P3243 HNOI2015 菜餚製作

2021-08-30 23:58:59 字數 1151 閱讀 6498

題目傳送門

這道題看上去就知道是拓撲排序,再一看題,應該是求字典序最小的合法方案,所以貪心的找當前入度為0的編號最小的點就行了。

恭喜,你掉到坑里了。

其實我一開始就是這麼做的,後來在測樣例第三組資料的時候炸掉了,這組資料就可以卡掉這個貪心 (這樣例還真良心啊) 。

我們不妨反著考慮,最後一位放合法的最大值(設為x

xx)顯然是最優的,因為這樣可以讓小於x

xx的數更加往前,而大於x

xx的數因為x

xx的位置已經確定了所以在哪都沒有影響。填完最後一位後,再考慮倒數第二位、倒數第三位……最後到第一位,我們就會發現,答案反序過來就是字典序最大的序列,所以我們建立反圖,然後貪心的找字典序最大的拓撲序列,再反向輸出就好了。

貼**

#include

#include

#include

#include

using

namespace std;

const

int n=

100010

;struct node

//因為用了結構體所以要過載運算子

}a[n]

;int t,m,n,top,ans[n]

,h[n]

,pre[n]

,to[n]

;bool vis[n]

;priority_queueq;

void

ins(

int u,

int v)

intmain()

for(

int i=

1;i<=n;i++

)q.push

(a[i]);

while

(!q.

empty()

)//如果當前入度最小的點的入度大於0,說明無解

vis[x]

=true

;ans[

++ans[0]

]=x;

for(

int i=h[x]

;i;i=pre[i])}

if(!f)printf

("impossible!\n");

else

//反向輸出

}return0;

}

洛谷P3243 HNOI2015 菜餚製作

題目 菜餚製作 思路 拓撲排序 注意這裡不是輸出字典序最小的方案。讀入時反向連邊,對這張反圖拓撲排序時要把佇列改為優先佇列,再反向輸出結果。includeusing namespace std define maxn 100000 int n,m vectorg maxn 5 int du maxn...

題解 P3243 HNOI2015 菜餚製作

這道題看起來就是個裸的拓撲排序,抄上模板就能ac。上面這種想法一看就不現實,然鵝我第一次還真就這麼寫了,然後被隨意hack。我們需要注意一句話 現在,酒店希望能求出乙個最優的菜餚的製作順序,使得小 a能盡量先吃到質量高的菜餚 這句話什麼意思呢?看上去它是說想要乙個字典序最小的排列,但我們可以發現,題...

P3243 HNOI2015 菜餚製作 拓撲排序

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