HDU2376Average distance
Posted nsd-email0820
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2376Average 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; }
以上是关于HDU2376Average distance的主要内容,如果未能解决你的问题,请参考以下文章
HDU2376Average distance(树形dp|树上任意两点距离和的平均值)