平均距离

平均距离

时间限制: 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;
        //已知子节点个数后计算 
    }   
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值