訊息傳遞 樹形DP

2022-04-30 00:57:20 字數 1509 閱讀 6861

非常妙的樹形dp:由於n很小,我們可以列舉每乙個點作為第乙個節點,計算其時間花費

那麼問題就轉化為對於給點節點求花費時間。

通過觀察,顯然我們會發現先傳給花費時間多的人更加合算,因為這樣可以最大限度的避免

乙個人還在辛苦的傳遞資訊,另乙個人卻悠閒的喝下午茶(霧)的局面

所以我們可以每次都記錄下對於乙個節點而言,它的所有子節點的時長,

並對其排序,排序後先傳給耗時最多的人,但這樣傳遞了之後,由於耗時最多的人最先被傳遞,

那麼這個本應耗時最多的人就不一定還是耗時最多的人了,因此我們要分別計算所有子節點

的耗時,並取max計入ans,最後dp陣列即代表一旦這個節點得知訊息,要多久才可以把訊息傳給 所有其他的人(除了傳給它的那個人),即完成任務。樹的結構保證了其正確性

why是ans=min(son[i]+cnt-i+1)?

因為這裡為了方便是從小到大排序,又因為是優先大的

cnt-i即為還有多少個才能到它,然後+1是因為高斯這個點資訊需要1的時間。

son[i]則是加上自身的時間

1 #include2

using

namespace

std;

3#define ac 1100

4#define acway 2500

5#define r register int

6#define d printf("line in %d\n",__line__);

7intn;8

inthead[ac],next[acway],date[acway],tot;

9int ans[ac],minn=int_max,f[ac];//

use用來儲存每個節點的兒子(dfs中臨時儲存)

10 inline int

read()

1117

18 inline void add(int f,int

w)19

2324void upmax(int &a,int

b)25

2829

void upmin(int &a,int

b)30

3334

void dfs(int x,int

fa)3546}

47 sort(son+1,son+cnt+1

);48

for(r i=1;i<=cnt;i++) upmax(f[x],son[i]+cnt-i+1

);49}50

51void

pre()

5260}61

62void

work()

6371 printf("

%d\n

",minn+1);//

還包括告訴別人的時間

72for(r i=1;i<=n;i++)

73if(ans[i]==minn) printf("

%d "

,i);74}

7576

intmain()

77

訊息傳遞(樹形動規)

p2018 樹形動規 題目描述 巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係 a是b的上級,b也是a的上級。最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行...

洛谷 P2018 訊息傳遞 樹形dp 貪心

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係 a是b的上級,b也是a的上級。最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...

樹形dp 貪心思維 訊息傳遞(洛谷 P2018)

題目描述 巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係 a是b的上級,b也是a的上級。最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時...