#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> buildGraph(int n, const vector<pair<int, int>>& edges) {
vector<vector<int>> g(n + 1);
for (auto [u, v] : edges) {
g[u].push_back(v);
g[v].push_back(u);
}
return g;
}
vector<int> getParents(int root, const vector<vector<int>>& g) {
int n = g.size() - 1;
vector<int> par(n + 1, -1);
queue<int> q;
q.push(root);
par[root] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : g[u]) {
if (par[v] == -1) {
par[v] = u;
q.push(v);
}
}
}
return par;
}
set<int> getSteinerNodes(int root, const vector<int>& targets, const vector<int>& par) {
set<int> nodes;
nodes.insert(root);
for (int t : targets) {
while (t != 0) {
nodes.insert(t);
if (t == root) break;
t = par[t];
}
}
return nodes;
}
int main() {
int n = 8;
vector<int> targets = {5, 6};
vector<pair<int, int>> edges = {
{1, 2}, {2, 5}, {2, 3}, {2, 6},
{1, 4}, {4, 7}, {7, 8}
};
auto g = buildGraph(n, edges);
auto par = getParents(1, g);
auto steinerNodes = getSteinerNodes(1, targets, par);
// Each edge traversed twice (down and back)
int result = 2 * (steinerNodes.size() - 1);
cout << result << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8dmVjdG9yPGludD4+IGJ1aWxkR3JhcGgoaW50IG4sIGNvbnN0IHZlY3RvcjxwYWlyPGludCwgaW50Pj4mIGVkZ2VzKSB7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGcobiArIDEpOwogICAgZm9yIChhdXRvIFt1LCB2XSA6IGVkZ2VzKSB7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2sodik7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICByZXR1cm4gZzsKfQoKdmVjdG9yPGludD4gZ2V0UGFyZW50cyhpbnQgcm9vdCwgY29uc3QgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgZykgewogICAgaW50IG4gPSBnLnNpemUoKSAtIDE7CiAgICB2ZWN0b3I8aW50PiBwYXIobiArIDEsIC0xKTsKICAgIHF1ZXVlPGludD4gcTsKICAgIHEucHVzaChyb290KTsKICAgIHBhcltyb290XSA9IDA7CiAgICAKICAgIHdoaWxlICghcS5lbXB0eSgpKSB7CiAgICAgICAgaW50IHUgPSBxLmZyb250KCk7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICBmb3IgKGludCB2IDogZ1t1XSkgewogICAgICAgICAgICBpZiAocGFyW3ZdID09IC0xKSB7CiAgICAgICAgICAgICAgICBwYXJbdl0gPSB1OwogICAgICAgICAgICAgICAgcS5wdXNoKHYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcjsKfQoKc2V0PGludD4gZ2V0U3RlaW5lck5vZGVzKGludCByb290LCBjb25zdCB2ZWN0b3I8aW50PiYgdGFyZ2V0cywgY29uc3QgdmVjdG9yPGludD4mIHBhcikgewogICAgc2V0PGludD4gbm9kZXM7CiAgICBub2Rlcy5pbnNlcnQocm9vdCk7CiAgICAKICAgIGZvciAoaW50IHQgOiB0YXJnZXRzKSB7CiAgICAgICAgd2hpbGUgKHQgIT0gMCkgewogICAgICAgICAgICBub2Rlcy5pbnNlcnQodCk7CiAgICAgICAgICAgIGlmICh0ID09IHJvb3QpIGJyZWFrOwogICAgICAgICAgICB0ID0gcGFyW3RdOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlczsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbiA9IDg7CiAgICB2ZWN0b3I8aW50PiB0YXJnZXRzID0gezUsIDZ9OwogICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBlZGdlcyA9IHsKICAgICAgICB7MSwgMn0sIHsyLCA1fSwgezIsIDN9LCB7MiwgNn0sIAogICAgICAgIHsxLCA0fSwgezQsIDd9LCB7NywgOH0KICAgIH07CiAgICAKICAgIGF1dG8gZyA9IGJ1aWxkR3JhcGgobiwgZWRnZXMpOwogICAgYXV0byBwYXIgPSBnZXRQYXJlbnRzKDEsIGcpOwogICAgYXV0byBzdGVpbmVyTm9kZXMgPSBnZXRTdGVpbmVyTm9kZXMoMSwgdGFyZ2V0cywgcGFyKTsKICAgIAogICAgLy8gRWFjaCBlZGdlIHRyYXZlcnNlZCB0d2ljZSAoZG93biBhbmQgYmFjaykKICAgIGludCByZXN1bHQgPSAyICogKHN0ZWluZXJOb2Rlcy5zaXplKCkgLSAxKTsKICAgIGNvdXQgPDwgcmVzdWx0IDw8IGVuZGw7CiAgICAKICAgIHJldHVybiAwOwp9