标签: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; }
标签:tin col init ... set 代码 int pre --
原文地址:https://www.cnblogs.com/NSD-email0820/p/9748610.html