社区讨论
求解
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m5x6u1am
- 此快照首次捕获于
- 2025/01/15 08:53 去年
- 此快照最后确认于
- 2025/11/04 11:36 4 个月前
CPP
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int n, m, s, u, v, i, e[500010][25],b[500010];
vector<int> f[500010];
void dfs(int x, int fa) {
b[x] = b[fa] + 1;
e[x][0] = fa;
for (int i = 1; i <= 20; i++) e[x][i] = e[e[x][i - 1]][i - 1];
for (int i = 0; i < f[x].size(); i++)
if (f[x][i] != fa) dfs(f[x][i], x);
}
int lca(int x, int y) {
if (b[x] < b[y]) swap(x, y);
int h = b[x] - b[y];
for (int i = 20; i >= 0; i--)
if (h & (1 << i)) x = e[x][i];
if (x == y) return x;
for (int i = 0; i <= 20; i++)
if (e[x][i] != e[y][i]) x = e[x][i], y = e[y][i];
return e[x][0];
}
int main() {
cin >> n >> m >> s;
for (i = 1; i < n; i++) cin >> u >> v, f[u].push_back(v), f[v].push_back(u);
dfs(s, 0);
while (m--) {
cin >> u >> v;
cout << lca(u, v)<<"\n";
}
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...