K.Search For Mafuyu
题意:求Kanade找到Mafuyu的最小数学期望,给定的是一棵树,开始的节点是1
每次往走有最小子树的大小的方向走即可,此时走的路径和最小
如 1-a,1-b 即为 min(2a+b,2b+a)贪心可知走最小的边
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iomanip>
using namespace std;
using ll = long long ;
ll ans;
const int N = 220;
vector<int>g[N];
int sz[N];
void dfs1(int x,int fa){
sz[x]=1;
for(auto &j:g[x]){
if(j==fa)continue;
dfs1(j,x);
sz[x]+=sz[j];
}
}
void dfs2(int x,int fa,int& now){
vector<pair<int,int>>u;
for(auto &j:g[x]){
if(j==fa)continue;
u.push_back({sz[j],j});
}
sort(u.begin(),u.end());
for(auto &t:u){
ans+=now++;
dfs2(t.second,x,now);
now++;
}
}
void solve()
{
int n;
cin>>n;
for(int i=0;i<=n;i++) sz[i]=0;
ans=0;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs1(1,-1);
int dep=1;
dfs2(1,-1,dep);
for(int i=0;i<=n;i++)g[i].clear();
cout<<fixed<<setprecision(9)<<((double)(ans)/(double)(n-1.0))<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}