社区讨论

自己也不知道是什么写法的lca(得30pts)

P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lt5nf1nw
此快照首次捕获于
2024/02/28 18:23
2 年前
此快照最后确认于
2024/02/28 21:06
2 年前
查看原帖
C
#include<bits/stdc++.h>
using namespace std;
const int M = 500010;
int n, m, s, fa[22][M], dep[M];
vector<int> v[M];
void dfs(int x, int pre) {
	fa[0][x] = pre, dep[x] = dep[pre] + 1;
	for (int i = 0; i < v[x].size(); i++) {
		int y = v[x][i];
		if (y != pre) dfs(y, x);
	}
}
void Up(int &x, int step) {
	for (int i = 21; i >= 0; i--) {
		if (step & (1 << i)) x = fa[i][x];
	}
}
int LCA(int x, int y) {
	if (dep[x] < dep[y]) swap(x, y);
	Up(x, dep[x]-dep[y]);
	if (x == y) return x;
	for (int i = 21; i >= 0; i--) {
		if (fa[i][x] != fa[i][y])
			x = fa[i][x], y = fa[i][x];
	}
	return fa[0][x];
}
int main() {
	scanf("%d%d%d", &n, &m, &s);
	for (int i = 2; i <= n; i++) {
		int x, y; scanf("%d%d", &x, &y);
		v[x].push_back(y), v[y].push_back(x);
	}
	dfs(s, 0);
	for (int i = 1; i < 22; i++)
		for (int j = 1; j <= n; j++)
			fa[i][j] = fa[i - 1][fa[i - 1][j]];
	while(m--) {
		int a, b; scanf("%d%d", &a, &b);
		printf("%d\n", LCA(a, b));
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...