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

 

转载于:https://www.cnblogs.com/dybala21/p/10171450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值