思维很慢,很慢。这题主要就是求一个 线段 两边的顶点数。
/*
树:O(n)求每一条线段两边的顶点数
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
const LL mod = 1e9+7;
int n;
int e[N], f[N];
vector<pair<int, int> > G[N];
void dfs(int u, int fa){
for(int i = 0;i < G[u].size();i++){
pair<int,int> v = G[u][i];
f[v.second] = 1;
if(v.first != fa){
dfs(v.first, u);
for(int j = 0;j < G[v.first].size();j++)
{ pair<int,int> vson = G[v.first][j];
if(vson.first != u)
f[v.second] += f[vson.second];
}
}
}
}
LL p[N];
void init(){
p[1] = 1;
for(int i = 2;i <= N-5;i++)
p[i] = 1ll * p[i-1] * i % mod;
}
int main(){
init();
while(~scanf("%d", &n)){
for(int i = 1;i <= n;i++)
G[i].clear();
memset(f, 0 ,sizeof(f));
for(int i = 1;i < n;i++)
{ int u ,v;
scanf("%d%d%d", &u, &v, &e[i]);
G[u].push_back(make_pair(v, i));
G[v].push_back(make_pair(u, i));
}
dfs(1, -1);
LL ans = 0;
for(int i = 1;i < n;i++)
ans = (ans+ 1ll*e[i]*f[i]*(n-f[i])) % mod;
printf("%lld\n", ans*2%mod*p[n-1]%mod);
}
return 0;
}