structedge { int v, w; }; voidsolve(){ int n, rt; cin >> n >> rt; vector<vector<edge>> e(n + 1); vector<int> mxlen(n + 1); int ans = 0; int sum = 0; for (int i = 1; i <= n - 1; i++) { int u, v, w; cin >> u >> v >> w; e[u].push_back({v, w}); e[v].push_back({u, w}); sum += w; } function<void(int, int)> dfs = [&](int u, int fa) { for (auto [v, w] : e[u]) { if (v == fa) continue; dfs(v, u); if (mxlen[u] < mxlen[v] + w) mxlen[u] = mxlen[v] + w; } deb(u, mxlen[u]); }; dfs(rt, rt); deb(rt, mxlen[rt]); ans = 2 * sum - mxlen[rt]; cout << ans << endl; }
voidsolve(){ int n, k, st, ed; cin >> n >> k >> st >> ed; vector<vector<int>> e(n + 1); vector<bool> vis(n + 1); vector<int> par(n + 1); vector<int> node; for (int i = 1; i <= k; i++) { int x; cin >> x; node.push_back(x); } node.push_back(ed); for (int i = 1; i <= n - 1; i++) { int u, v; cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } //------------------------------------ vector<int> dep(n + 1); function<void(int, int)> dfs = [&](int u, int fa) { for (auto v : e[u]) { if (v == fa) continue; dep[v] = dep[u] + 1; par[v] = u; deb(u, v); dfs(v, u); } deb(u, dep[u]); }; dfs(st, st); int ans = -dep[ed]; vis[st] = 1; for (auto x : node) { while (vis[x] == 0) { vis[x] = true; x = par[x]; ans += 2; } } cout << ans << endl; }