一、题面
二、分析
该题注意读题的时候有强调边的权值为非负(即可以为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 }