平均距离
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给定一棵树,求出任意两点之间的平均距离,如下图,平均值为(D01+ D02 + D03 + D04 + D12 +D13 +D14 +D23 +D24 +D34)/10 = (6+3+7+9+9+13+15+10+12+2)/10 = 8.6
输入
输入第一行,一个整数n;
接下来n-1行,每行三个整数a,b,c,表示连接节点a和b的边长为c,其中0<=a,b< n,0< c<=10000。
输出
输出两点之间的平均距离,输出小数点后三位。
样例输入
5
0 1 6
0 2 3
0 3 7
3 4 2
样例输出
8.600
提示
数据保证是一棵树。
对于40%的数据,2< n<=200;
对于60%的数据,2< n<=2000;
对于100%的数据,2< n<=20000;
思路
每一条边的贡献为:cnt[a]*cnt[b] *val;
同时cnt[a]+cnt[b]=n;
对于一棵树来说
cnt[a]即为a子树的cnt总和
如图
于是可以从跟开始遍历整棵树
void dfs(int x,int f){
cnt[x]=1;res=0;
for(int i=0;i<G[x].size();i++){
int to=G[x][i].t;
if(to!=f){
dfs(to,x);
//预处理子节点的个数
res+=cnt[to];
}
}cnt[x]+=res;
for(int i=0;i<G[x].size();i++){
int to=G[x][i].t,c=G[x][i].c;
if(to!=f)ans+=1ll*(n-cnt[to])*cnt[to]*c;
//已知子节点个数后计算
}
}