码迷,mamicode.com
首页 > 其他好文 > 详细

【HDU2376】Average distance

时间:2018-10-06 22:11:45      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:tin   col   init   ...   set   代码   int   pre   --   

题意

求树上每两点之间的距离之和的平均值。

分析

这个也算树形dp吗??我在专题里做到的,感觉完全不是啊...

去求两点的距离是很困难的,所以我们就求边的贡献吧。这个思路好像经常用到诶。

求出每个点的子树大小,对于(u,v,w)这样一条边,它的价值就是它左边的节点数*它右边的节点数*边权,即siz[v]*(n-siz[v])*w

精度要注意一下..

代码

#include<bits/stdc++.h>
using namespace std;
#define N 10100
int t,n,cnt;
double ans;
int siz[N],first[N];
struct email
{
    int u,v,w;
    int nxt;
}e[N*4];
inline void add(int u,int v,int w)
{
    e[++cnt].nxt=first[u];first[u]=cnt;
    e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;
}
inline void init()
{
    cnt=0;ans=0.0;
    memset(first,0,sizeof(first));
    memset(siz,0,sizeof(siz));
}

void dfs(int u,int fa)
{
    siz[u]=1;
    for(int i=first[u];i;i=e[i].nxt)
    {
        int v=e[i].v,w=e[i].w;
        if(v==fa)continue;
        dfs(v,u);
        siz[u]+=siz[v];
        ans=ans+1.0*siz[v]*(n-siz[v])*w;
    }
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        init();
        scanf("%d",&n);
        for(int i=1;i<n;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);add(v,u,w);
        }
        dfs(0,-1);
        printf("%.7f\n",ans/(1.0*((n-1)*n/2.0)));
    }
    return 0;
}

 

【HDU2376】Average distance

标签:tin   col   init   ...   set   代码   int   pre   --   

原文地址:https://www.cnblogs.com/NSD-email0820/p/9748610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!