1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#include <cstdlib> #include <iostream> using namespace std; #define MAXN 500500 #define int long long int n, root, dp[MAXN], ans, fa[MAXN]; bool vis[MAXN]; struct { int v, w; edge *next; } pool[MAXN << 1], *h[MAXN], *cnt = pool; inline void addedge(int u, int v, int w) { edge *p = ++cnt, *q = ++cnt; p->v = v, p->w = w, p->next = h[u], h[u] = p; q->v = u, q->w = w, q->next = h[v], h[v] = q; } inline void dfs(int u) { int v; vis[u] = true; for(edge *p = h[u]; p; p = p->next) if(!vis[v = p->v]) { fa[v] = u, dfs(v); dp[u] = max(dp[u], dp[v] + p->w); } for(edge *p = h[u]; p; p = p->next) if((v = p->v) != fa[u]) ans += (dp[u] - dp[v] - p->w); } signed main() { int u, v, w; scanf("%lld%lld", &n, &root); for(int i = 1; i < n; i++) { scanf("%lld%lld%lld", &u, &v, &w); addedge(u, v, w); } dfs(root); printf("%lldn", ans); return 0; }
|
近期评论