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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include <cstdio>
inline int max(const int x, const int y) {return x > y ? x : y;} struct Edge {int to, nxt, w;} e[200005]; int a[100005], head[100005], fa[100005], tot; int f[100005], g[100005], gg[100005], son[100005][2], mx[100005][2]; int Ans[100005], w[100005]; inline void AddEdge(int u, int v, int w) { e[++ tot].to = v, e[tot].w = w, e[tot].nxt = head[u], head[u] = tot; } inline void upd(int u, int v, int tmp) { if (tmp > mx[u][0]) { mx[u][1] = mx[u][0], son[u][1] = son[u][0]; mx[u][0] = tmp, son[u][0] = v; } else if (tmp > mx[u][1]) mx[u][1] = tmp, son[u][1] = v; } void dfs(int u) { int tmp; for (int i = head[u]; i; i = e[i].nxt) if (e[i].to != fa[u]) { int v = e[i].to; fa[v] = u, w[v] = e[i].w, dfs(v); g[u] += max(g[v] - 2 * e[i].w, 0); f[u] += max(g[v] - 2 * e[i].w, 0); upd(u, v, max(f[v] - e[i].w, 0) - max(g[v] - 2 * e[i].w, 0)); } f[u] += a[u] + mx[u][0], g[u] += a[u]; }
void dfs2(int u) { for (int i = head[u]; i; i = e[i].nxt) if (e[i].to != fa[u]) { int f2 = 0, g2 = 0, ans = 0, tmp = 0, v = e[i].to; g2 = g[u] - max(g[v] - 2 * e[i].w, 0); if (son[u][0] == v) f2 = f[u] + mx[u][1] - max(f[v] - e[i].w, 0); else f2 = f[u] - max(g[v] - 2 * e[i].w, 0); ans = f[v] + max(g2 - 2 * e[i].w, 0), g[v] += max(g2 - 2 * e[i].w, 0); tmp = max(f2 - e[i].w, 0) - max(g2 - 2 * e[i].w, 0); ans -= mx[v][0]; upd(v, u, max(f2 - e[i].w, 0) - max(g2 - 2 * e[i].w, 0)); ans += mx[v][0]; Ans[v] = f[v] = ans, dfs2(v); } }
int main() { int T, kase = 0; scanf("%d", &T); while (T --) { tot = 0; int n; scanf("%d", &n); for (int i = 1; i <= n; ++ i) scanf("%d", a + i); for (int i = 1; i <= n; ++ i) f[i] = g[i] = head[i] = mx[i][0] = mx[i][1] = son[i][0] = son[i][1] = 0; for (int i = 1; i < n; ++ i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); AddEdge(u, v, w), AddEdge(v, u, w); } dfs(1); for (int i = 1; i <= n; ++ i) gg[i] = g[i]; printf("Case #%d:\n%d\n", ++ kase, f[1]); dfs2(1); for (int i = 2; i <= n; ++ i) printf("%d\n", Ans[i]); } return 0; }
|