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
| vector<int>dep(n + 1); constexpr int M = 20; vector<array<int, M>>f(n + 1); auto dfs = [&](auto &&self, int u, int fa) -> void{ for(auto &v : adj[u]){ if(v == fa) continue; dep[v] = dep[u] + 1; f[v][0] = u; for(int i = 1; i < M; i++) f[v][i] = f[f[v][i - 1]][i - 1]; self(self, v, u); } };
auto lca = [&](int x, int y) -> int{ if(dep[x] < dep[y]) swap(x, y); for(int i = M - 1; i >= 0; i--) if(dep[f[x][i]] >= dep[y]) x = f[x][i]; if(x == y) return x; for(int i = M - 1; i >= 0; i--) if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i]; return f[x][0]; };
dep[s] = 1; dfs(dfs, s, 0);
|