#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> bfs(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;
// build parent pointers from root so we can trace paths back later
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> getPath(int root, vector<int> targets, const vector<int>& par) {
set<int> res;
res.insert(root);
// walk up from each target to root and grab everything in between
for (int t : targets) {
res.insert(t);
while (t != root && t != 0) {
t = par[t];
res.insert(t);
}
}
return res;
}
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 = bfs(1, g);
// start and end at 1
auto nodes = getPath(1, targets, par);
int cost = nodes.size() == 1 ? 0 : 2 * (nodes.size() - 1);
// or try starting at n and ending at 1
// this means we have to visit n, so add it to our targets
auto targets2 = targets;
if (find(targets2.begin(), targets2.end(), n) == targets2.end()) {
targets2.push_back(n);
}
auto nodes2 = getPath(1, targets2, par);
// calculate how far n is from the root
// if we start at n and end at 1, we save traversing this path back
int dist = 0;
int u = n;
while (u != 1 && u != 0) {
u = par[u];
dist++;
}
int cost2 = nodes2.size() == 1 ? 0 : 2 * (nodes2.size() - 1) - dist;
cout << min(cost, cost2) << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8dmVjdG9yPGludD4+IGJ1aWxkR3JhcGgoaW50IG4sIGNvbnN0IHZlY3RvcjxwYWlyPGludCwgaW50Pj4mIGVkZ2VzKSB7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGcobiArIDEpOwogICAgZm9yIChhdXRvIFt1LCB2XSA6IGVkZ2VzKSB7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2sodik7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICByZXR1cm4gZzsKfQoKdmVjdG9yPGludD4gYmZzKGludCByb290LCBjb25zdCB2ZWN0b3I8dmVjdG9yPGludD4+JiBnKSB7CiAgICBpbnQgbiA9IGcuc2l6ZSgpIC0gMTsKICAgIHZlY3RvcjxpbnQ+IHBhcihuICsgMSwgLTEpOwogICAgcXVldWU8aW50PiBxOwogICAgcS5wdXNoKHJvb3QpOwogICAgcGFyW3Jvb3RdID0gMDsKICAgIAogICAgLy8gYnVpbGQgcGFyZW50IHBvaW50ZXJzIGZyb20gcm9vdCBzbyB3ZSBjYW4gdHJhY2UgcGF0aHMgYmFjayBsYXRlcgogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBpbnQgdSA9IHEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGZvciAoaW50IHYgOiBnW3VdKSB7CiAgICAgICAgICAgIGlmIChwYXJbdl0gPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBhclt2XSA9IHU7CiAgICAgICAgICAgICAgICBxLnB1c2godik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFyOwp9CgpzZXQ8aW50PiBnZXRQYXRoKGludCByb290LCB2ZWN0b3I8aW50PiB0YXJnZXRzLCBjb25zdCB2ZWN0b3I8aW50PiYgcGFyKSB7CiAgICBzZXQ8aW50PiByZXM7CiAgICByZXMuaW5zZXJ0KHJvb3QpOwogICAgCiAgICAvLyB3YWxrIHVwIGZyb20gZWFjaCB0YXJnZXQgdG8gcm9vdCBhbmQgZ3JhYiBldmVyeXRoaW5nIGluIGJldHdlZW4KICAgIGZvciAoaW50IHQgOiB0YXJnZXRzKSB7CiAgICAgICAgcmVzLmluc2VydCh0KTsKICAgICAgICB3aGlsZSAodCAhPSByb290ICYmIHQgIT0gMCkgewogICAgICAgICAgICB0ID0gcGFyW3RdOwogICAgICAgICAgICByZXMuaW5zZXJ0KHQpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXM7Cn0KCmludCBtYWluKCkgewogICAgaW50IG4gPSA4OwogICAgdmVjdG9yPGludD4gdGFyZ2V0cyA9IHs1LCA2fTsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gZWRnZXMgPSB7CiAgICAgICAgezEsIDJ9LCB7MiwgNX0sIHsyLCAzfSwgezIsIDZ9LCAKICAgICAgICB7MSwgNH0sIHs0LCA3fSwgezcsIDh9CiAgICB9OwogICAgCiAgICBhdXRvIGcgPSBidWlsZEdyYXBoKG4sIGVkZ2VzKTsKICAgIGF1dG8gcGFyID0gYmZzKDEsIGcpOwogICAgCiAgICAvLyBzdGFydCBhbmQgZW5kIGF0IDEKICAgIGF1dG8gbm9kZXMgPSBnZXRQYXRoKDEsIHRhcmdldHMsIHBhcik7CiAgICBpbnQgY29zdCA9IG5vZGVzLnNpemUoKSA9PSAxID8gMCA6IDIgKiAobm9kZXMuc2l6ZSgpIC0gMSk7CiAgICAKICAgIC8vIG9yIHRyeSBzdGFydGluZyBhdCBuIGFuZCBlbmRpbmcgYXQgMQogICAgLy8gdGhpcyBtZWFucyB3ZSBoYXZlIHRvIHZpc2l0IG4sIHNvIGFkZCBpdCB0byBvdXIgdGFyZ2V0cwogICAgYXV0byB0YXJnZXRzMiA9IHRhcmdldHM7CiAgICBpZiAoZmluZCh0YXJnZXRzMi5iZWdpbigpLCB0YXJnZXRzMi5lbmQoKSwgbikgPT0gdGFyZ2V0czIuZW5kKCkpIHsKICAgICAgICB0YXJnZXRzMi5wdXNoX2JhY2sobik7CiAgICB9CiAgICBhdXRvIG5vZGVzMiA9IGdldFBhdGgoMSwgdGFyZ2V0czIsIHBhcik7CiAgICAKICAgIC8vIGNhbGN1bGF0ZSBob3cgZmFyIG4gaXMgZnJvbSB0aGUgcm9vdAogICAgLy8gaWYgd2Ugc3RhcnQgYXQgbiBhbmQgZW5kIGF0IDEsIHdlIHNhdmUgdHJhdmVyc2luZyB0aGlzIHBhdGggYmFjawogICAgaW50IGRpc3QgPSAwOwogICAgaW50IHUgPSBuOwogICAgd2hpbGUgKHUgIT0gMSAmJiB1ICE9IDApIHsKICAgICAgICB1ID0gcGFyW3VdOwogICAgICAgIGRpc3QrKzsKICAgIH0KICAgIAogICAgaW50IGNvc3QyID0gbm9kZXMyLnNpemUoKSA9PSAxID8gMCA6IDIgKiAobm9kZXMyLnNpemUoKSAtIDEpIC0gZGlzdDsKICAgIAogICAgY291dCA8PCBtaW4oY29zdCwgY29zdDIpIDw8IGVuZGw7CiAgICAKICAgIHJldHVybiAwOwp9