zoukankan      html  css  js  c++  java
  • 【HDU2376】Average distance

    题意

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

    分析

    这个也算树形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
    ",ans/(1.0*((n-1)*n/2.0)));
        }
        return 0;
    }
    “Make my parents proud,and impress the girl I like.”
  • 相关阅读:
    《一个人的村庄》 ——刘亮程
    uva 11020
    Codeforces Round #190 (Div. 2) B. Ciel and Flowers
    hdu3308 线段树——区间合并
    线段树,区间更新
    vim 被墙
    ubuntu12.04 修复Grub2
    windows下mysql数据库忘记密码
    高性能的异步爬虫
    中间件
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9748610.html
Copyright © 2011-2022 走看看