1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int maxn = 5e5 + 5; vector<int> g[maxn]; int n, m, s, dep[maxn], fa[maxn][21]; void dfs(int u, int p) { dep[u] = dep[p] + 1; fa[u][0] = p; for (auto v : g[u]) if (v != p) dfs(v, u); } int lca(int u, int v) { if (dep[u] < dep[v]) swap(u, v); for (int i = 20; i >= 0; i--) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i]; assert(dep[u] == dep[v]); // 断言 if (u == v) return u; for (int i = 20; i >= 0; i--) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i]; assert(fa[u][0] == fa[v][0]); return fa[u][0]; } int main() { scanf("%d%d%d", &n, &m, &s); for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } dfs(s, 0); for (int i = 1; i <= 20; i++) for (int u = 1; u <= n; u++) fa[u][i] = fa[fa[u][i-1]][i-1]; while (m--) { int u, v; scanf("%d%d", &u, &v); printf("%d\n", lca(u, v)); } return 0; }
- 1
信息
- ID
- 16
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 4
- 上传者