非常妙的樹形dp:由於n很小,我們可以列舉每乙個點作為第乙個節點,計算其時間花費
那麼問題就轉化為對於給點節點求花費時間。
通過觀察,顯然我們會發現先傳給花費時間多的人更加合算,因為這樣可以最大限度的避免
乙個人還在辛苦的傳遞資訊,另乙個人卻悠閒的喝下午茶(霧)的局面
所以我們可以每次都記錄下對於乙個節點而言,它的所有子節點的時長,
並對其排序,排序後先傳給耗時最多的人,但這樣傳遞了之後,由於耗時最多的人最先被傳遞,
那麼這個本應耗時最多的人就不一定還是耗時最多的人了,因此我們要分別計算所有子節點
的耗時,並取max計入ans,最後dp陣列即代表一旦這個節點得知訊息,要多久才可以把訊息傳給 所有其他的人(除了傳給它的那個人),即完成任務。樹的結構保證了其正確性
why是ans=min(son[i]+cnt-i+1)?
因為這裡為了方便是從小到大排序,又因為是優先大的
cnt-i即為還有多少個才能到它,然後+1是因為高斯這個點資訊需要1的時間。
son[i]則是加上自身的時間
1 #include2using
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單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時...