题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6446
一个图论题,跟数学有着很大的关系,推出关系式,这个题就很好写,推不出来就GG
#include<bits/stdc++.h>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 1e5 + 10;
const int MOD = 1e9 + 7;
struct node
{
int v, w;
}e;
long long int n,ans;
long long int sum[maxn],ne[maxn];
vector<node>vec[maxn];
void dfs(int root,int pre)
{
sum[root]=1;
for(int i=0;i<vec[root].size();i++)
{
node &m=vec[root][i];
int v=m.v;
int w=m.w;
if(v==pre)
{
continue;
}
dfs(v,root);
sum[root]+=sum[v];
sum[root]%=MOD;
ans+=(long long)(sum[v]*(n-sum[v])*w);
ans%=MOD;
}
}
void init()
{
ne[0] = 1;
for (int i = 1; i <maxn; i++)
{
ne[i]=ne[i-1]*i%MOD;
}
return ;
}
int main()
{
//freopen("C://input.txt", "r", stdin);
init();
while(scanf("%d",&n)!=EOF)
{
ans=0;
memset(sum,0,sizeof(sum));
for(int i=0;i<=n;i++)
{
vec[i].clear();
}
for(int i=1;i<n;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
e.v=y;
e.w=w;
vec[x].push_back(e);
e.v=x;
e.w=w;
vec[y].push_back(e);
}
dfs(1,0);
printf("%lld\n",ans*ne[n-1]%MOD*2%MOD);
}
return 0;
}