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
| #include <bits/stdc++.h>
const int kMaxN = 5e4 + 5;
int n; int64_t ans = 1e18, sz[kMaxN], f[kMaxN]; int a[kMaxN], p[kMaxN], dep[kMaxN], wson1[kMaxN], wson2[kMaxN]; std::vector<int> G[kMaxN];
void dfs1(int u, int fa) { sz[u] = a[u], p[u] = fa, dep[u] = dep[fa] + 1; for (auto v : G[u]) { if (v == fa) continue; dfs1(v, u); sz[u] += sz[v], f[u] += f[v] + sz[v]; if (sz[v] >= sz[wson1[u]]) wson2[u] = wson1[u], wson1[u] = v; else if (sz[v] >= sz[wson2[u]]) wson2[u] = v; } }
int64_t dfs2(int u, int fa, int64_t now, int64_t sum, int pos) { int v = wson1[u]; if (v == pos || sz[wson2[u]] > sz[v]) v = wson2[u]; if (sz[v] * 2 > sum) return std::min(now, dfs2(v, u, now + (sum - sz[v] * 2), sum, pos)); else return now; }
void dfs3(int u, int fa) { for (auto v : G[u]) { if (v == fa) continue; for (int j = u; j; j = p[j]) sz[j] -= sz[v]; ans = std::min(ans, dfs2(v, u, f[v], sz[v], v) + dfs2(1, 0, f[1] - f[v] - (int64_t)(dep[v] - 1) * sz[v], sz[1], v)); for (int j = u; j; j = p[j]) sz[j] += sz[v]; dfs3(v, u); } }
void dickdreamer() { std::cin >> n; for (int i = 1; i < n; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v), G[v].emplace_back(u); } for (int i = 1; i <= n; ++i) std::cin >> a[i]; dfs1(1, 0), dfs3(1, 0); std::cout << ans << '\n'; }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|