題意:求乙個拓撲序列,保證以1~n的優先順序,每個數盡量排在前面
分析:顯然求字典序最小的拓撲序有問題,字典序列由每個位置的數字決定,可是這裡有乙個1~n的優先順序,就是說盡量要保證1在前,以此類推。
如果說乙個元素,圖中不存在「與它深度相同」的元素的話,那麼它在拓撲序列中的位置一定是固定的,那麼我們考慮兩個深度相同的元素a,b(編號a前面的一句話:字典序列由每個位置的數字決定,這樣導致了逆向序列的字典序變大了。
所以演算法已經浮出水面:反向建邊,求字典序最大的拓撲序列,再反向輸出即可。
實現起來並不難,思路複雜,馬後炮一波…
另外的證明:
反著拓撲排序時,如果有一次沒有選擇最大的那乙個,則設當時最大的是
a,選的是a,
(a>a)
。則假設最終序列為
(s1)a(s2)a(s3)
,那麼顯然可以把a放到
a後面,變成
(s1)(s2)aa(s3)
,使得答案更優。
#include#include#include#include#include#includeusing namespace std;
const int lim = 100005;
int n , m , du[lim] , ans[lim];
vectoredge[lim];
map> mp;
void addedge(int a , int b)
void toposort()
} if(ans[0] != n) puts("impossible!");
else }
void clear()
int main()
toposort();
} return 0;
}
HNOI2015 菜餚製作 題解
傳送門 hnoi2015 菜餚製作 根據題目的描述,我們要做的首先是一步一步的分析 這個題肯定是拓撲排序無疑,因為要求的是滿足固定條件 有向圖的連邊 的某種排列,而難點就在於如何拓撲排序。根據題目的描述,我們首先想到的是根據字典序大小進行排序,那麼我們就舉例幾組資料來驗證一下是否正確,那麼先看下面這...
拓撲排序 HNOI2015 菜餚製作
知名美食家小 a被邀請至atm 大酒店,為其品評菜餚。atm 酒店為小 a 準備了 n 道菜餚,酒店按照為菜餚預估的質量從高到低給予1到n的順序編號,預估質量最高的菜餚編號為1。由於菜餚之間口味搭配的問題,某些菜餚必須在另一些菜餚之前製作,具體的,一共有 m 條形如 i 號菜餚 必須 先於 j 號菜...
HNOI2015 菜餚製作 題解(貪心 拓撲)
知名美食家小 a被邀請至atm 大酒店,為其品評菜餚。atm 酒店為小 a 準備了 n 道菜餚,酒店按照為菜餚預估的質量從高到低給予 1到n的順序編號,預估質量最高的菜餚編號為1。由於菜餚之間口味搭配的問題,某些菜餚必須在另一些菜餚之前製作,具體的,一共有 m 條形如 i 號菜餚 必須 先於 j 號...