http://acm.timus.ru/problem.aspx?space=1&num=1371
树形DP 不过一遍DFS 就能可以
需要注意的 是 N=50000 时 需要用 long long 或者 unsigned int
还有超栈的话 需要 自己可一个较大的栈区
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<algorithm>
using namespace std;
#pragma comment(linker,"/STACK:1000000000,1000000000")
#define LL long long
const int INF=0x3f3f3f3f;
const int N=50005;
struct node
{
int next;
LL numnode;
LL selft;
LL ans;
}head[N];
int I;
struct tt
{
int j,next,t;
}side[N*2];
void build(int i,int j,int t)
{
side[I].j=j;
side[I].t=t;
side[I].next=head[i].next;
head[i].next=I++;
}
void dfs(int x,int pre)
{
head[x].selft=0;
head[x].numnode=0;
head[x].ans=0;
for(int t=head[x].next;t!=-1;t=side[t].next)
{
int l=side[t].j;
if(l!=pre)
{
dfs(l,x);
LL w=head[l].numnode*(LL)(side[t].t)+head[l].selft;
head[x].ans+=head[l].ans;
head[x].ans+=(head[x].numnode*w);
head[x].ans+=(head[x].selft*head[l].numnode);
head[x].selft+=w;
head[x].numnode+=head[l].numnode;
}
}
++head[x].numnode;
head[x].ans+=head[x].selft;
}
int main()
{
//freopen("data.txt","r",stdin);
unsigned int n;
while(cin>>n)
{
for(unsigned int i=1;i<=n;++i)
head[i].next=-1;
I=0;
for(unsigned int i=1;i<n;++i)
{
int l,r,t;
scanf("%d %d %d",&l,&r,&t);
build(l,r,t);
build(r,l,t);
}
dfs(1,-1);
double temp=(n*(n-1)/2);
printf("%.4lf\n",double(head[1].ans)/temp);
}
return 0;
}