訊息傳遞(樹形動規)

2021-08-10 02:39:38 字數 2177 閱讀 6114

p2018(樹形動規)

題目描述

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係:a是b的上級,b也是a的上級。

最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,任何乙個已經接到訊息的人,都可以把訊息告訴他的乙個直接上級或者直接下屬。

現在,你想知道:

1.到底需要多長時間,訊息才能傳遍整個巴蜀國的所有人?

2.要使訊息在傳遞過程中消耗的時間最短,可供選擇的人有那些?

輸入輸出格式

輸入格式:

輸入檔案的第一行為乙個整數n(n≤1000),表示巴蜀國人的總數,假如人按照1到n編上了號碼,國王的編號是1。第2行到第n行(共n-1行),每一行乙個整數,第i行的整數表示編號為i的人直接上級的編號。

輸出格式:

檔案輸出共計兩行:

第一行為乙個整數,表示最後乙個人接到訊息的最早時間。

第二行有若干個數,表示可供選擇人的編號,按照編號從小到大的順序輸出,中間用空格分開。

輸入輸出樣例

輸入樣例#1:

8 1

1 3

4 4

4 3

輸出樣例#1:

5 3 4 5 6 7

這個題首先我們可以看出來是一棵樹,而且我們可以發現這個題是可以轉移的,所以我們考慮樹形dp。

對於每乙個節點我們設定乙個陣列,dp[x]表示x節點「傳達」遍所有的子孫節點能需要的最小時間,根據樹形dp的基本套路,我們就肯定要從x的兒子節點去轉移x的dp值,所以考慮轉移方程。

對於乙個節點x,我們肯定是要先傳達給乙個較深的兒子,然後再依次傳達,所以我們在遍歷完畢x所有的兒子節點之後,我們就先對兒子節點的dp值(即遍歷每乙個兒子需要的時間)進行排序,dp值大的,就是花的時間長的那個兒子(稱為fir),我們就先走它,然後時間上就先加上這個兒子的時間。

如果下一大兒子節點(稱為nxt)的dp值恰好等於上乙個走過的兒子(fir),就說明我們傳達完fir和nxt的所有子樹需要的時間需要在fir花的時間的基礎上+1;如果nxt的dp值恰好小於fir,就說明在fir花的時間內我們能夠傳達完fir和nxt的所有子樹,以此類推。

具體到**上可能還需要大家畫畫圖理解一下。

while(p<=tp)

最後就是初始化,我們把所有的結點花費的時間先初始化為1,因為走到這個點傳遞時間就是1個單位。

2016 7 13 樹形動規

rmq演算法講完沒幾個小時,我們就開始了小紫中的一節 足見這個演算法很重要 樹形動歸 1.焦作一中資訊學oy 2.小黃 資訊學奧賽一本通 3.小紫 演算法競賽入門經典第二版 題型總結 來自資料1 1 加分二叉樹 區間動規 樹的遍歷 2 二叉蘋果樹 二叉樹上的動規 3 最大利潤 多叉樹上的動規 4 選...

訊息傳遞 樹形DP

非常妙的樹形dp 由於n很小,我們可以列舉每乙個點作為第乙個節點,計算其時間花費 那麼問題就轉化為對於給點節點求花費時間。通過觀察,顯然我們會發現先傳給花費時間多的人更加合算,因為這樣可以最大限度的避免 乙個人還在辛苦的傳遞資訊,另乙個人卻悠閒的喝下午茶 霧 的局面 所以我們可以每次都記錄下對於乙個...

codevs1378 選課 樹形動規

題目傳送門 這道題可以用多叉樹轉二叉樹的方法,左子樹為兒子,右子樹為同個父親的兄弟,這樣的話就可以很方便地寫出狀態轉移方程 f x v max f x v w x dp ch x 0 i dp ch x 1 v i 1 要注意的是,f x v 可能在之前已經計算過 比如f ch i 0 4 在f i...