题意:
解法:
显然直径一定是两个叶子之间的路径,叶子是树中度数为1的点.
为了使得直径最小,最优解是将k均摊给与叶子相连的边上,其他边全部赋值为0.
设度数为1的点有cnt个,那么答案为2*k/cnt,乘2是因为直径会经过两个被赋值的边.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=1e6+5;
int d[maxm];
int n,k;
void solve(){
cin>>n>>k;
for(int i=1;i<n;i++){
int a,b;cin>>a>>b;
d[a]++;
d[b]++;
}
int cnt=0;
for(int i=1;i<=n;i++){
if(d[i]==1){
cnt++;
}
}
double ans=2.0*k/cnt;
printf("%.6f\n",ans);
}
signed main(){
solve();
return 0;
}