/* -*- coding: utf-8 -*- * * 872.cc: No.872 All Tree Path - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 200000; /* typedef */ typedef long long ll; typedef queue qi; typedef pair pii; typedef vector vpii; /* global variables */ vpii nbrs[MAX_N]; int cns[MAX_N], ps[MAX_N], pws[MAX_N], ss[MAX_N]; /* subroutines */ /* main */ int main() { int n; scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); u--, v--; nbrs[u].push_back(pii(v, w)); nbrs[v].push_back(pii(u, w)); } ps[0] = -1; qi q; q.push(0); while (! q.empty()) { int u = q.front(); q.pop(); int &up = ps[u]; vpii &nbru = nbrs[u]; for (vpii::iterator vit = nbru.begin(); vit != nbru.end(); vit++) { int &v = vit->first; if (v != up) { cns[u]++; ps[v] = u; pws[v] = vit->second; q.push(v); } } } for (int u = 0; u < n; u++) if (cns[u] == 0) q.push(u); ll sum = 0; while (! q.empty()) { int u = q.front(); q.pop(); int &up = ps[u]; ss[u]++; sum += (ll)pws[u] * ss[u] * (n - ss[u]); if (up >= 0) { ss[up] += ss[u]; if (--cns[up] == 0) q.push(up); } } printf("%lld\n", sum * 2); return 0; }