1. 程式人生 > >D. Minimum Diameter Tree Round #528 (Div. 2)【樹】

D. Minimum Diameter Tree Round #528 (Div. 2)【樹】

一、題面

題目連結

二、分析

該題注意讀題的時候有強調邊的權值為非負(即可以為0),此題就是求樹兩個葉子節點之間的最短距離。為了使兩個葉子節點之間的距離最短,那麼其實就是讓每個最後到葉子的那條路徑儘量去平攤更多的權值,因為只有這樣才能保證最長的哪個路徑值是最小的。相當於除了到葉子的路徑,其他路徑權值都是0。為什麼?因為假設其他路徑有權值,那麼經過這條路徑的兩個葉子之間的最大距離肯定不是所有情況中最小的。它除了要加到葉子的路徑權重還要加該路徑權重。

如果你認為可以給這兩個到葉子的路徑給儘量小的權重,那麼相當於打破了平衡,肯定會有更大的最大權重和路徑。

三、AC程式碼

 1
#include <bits/stdc++.h> 2 3 using namespace std; 4 const int MAXN = 1e5+4; 5 int Data[MAXN]; 6 7 int main() 8 { 9 int N, W; 10 while(scanf("%d %d", &N, &W)!=EOF) 11 { 12 int x, y, cnt = 0; 13 double ans; 14 memset(Data, 0, sizeof(Data)); 15 for
(int i = 1; i < N; i++) 16 { 17 scanf("%d %d", &x, &y); 18 Data[x]++; 19 Data[y]++; 20 } 21 for(int i = 1; i <= N; i++) 22 { 23 if(Data[i] == 1) 24 cnt++; 25 } 26 ans = W*1.0/cnt*2.0
; 27 printf("%.12f\n", ans); 28 } 29 return 0; 30 }
View Code