0pts WA 求助
查看原帖
0pts WA 求助
482347
ZZQF5677楼主2023/8/27 16:41
#include <bits/stdc++.h>
using namespace std;
// data
int n, q, F;
int d[600005];
int fa[600005][25];

// --- star
int head[600005];
struct Node {
	int v, nex;
} e[12000005]; // 双向建边!!! 
int ecnt;
void add(int u, int v) {
	ecnt++;
	e[ecnt].v = v;
	e[ecnt].nex = head[u];
	head[u] = ecnt;
}
// dfs
void dfs(int father, int root) {
	d[root] = d[father] + 1;
	fa[root][0] = father;
	for (int i = 1; i <= 19; i++) {
		fa[root][i] = fa[fa[root][i - 1]][i - 1];
	}
	for (int i = head[root]; i != 0; i = e[i].nex) {
		int v = e[i].v;
		if (v != father) {
			dfs(root, v);
		}
	}
	return;
}
// LCA
int LCA(int a, int b) {
	if (d[a] < d[b]) { // 最深的放在前面。 
		swap(a, b);
	}
	for (int i = 19; i >= 0; i--) {
		if (d[fa[a][i]] >= d[b]) {
			a = fa[a][i];
		}
	}
	if (a == b) {
		return a;
	}
	for (int i = 19; i >= 0; i--) {
		if (d[fa[a][i]] != d[fa[b][i]]) {
			a = fa[a][i];
			b = fa[b][i];
		}
	}
	return fa[a][0];
}
// main
int main() {
	//freopen("2.in", "r", stdin);
	//freopen("P3379_2.in", "r", stdin);
	//freopen("2.out", "w", stdout);
	cin >> n >> q >> F;
	for (int i = 1; i <= n - 1; i++) {
		int a, b;
		cin >> a >> b;
		add(a, b);
		add(b, a);
	}
	dfs(0, F);
	//cout << fa[3][1] << "\n";
	while (q--) {
		int a, b;
		cin >> a >> b;
		cout << LCA(a, b) << "\n";
	}
	return 0;
}
2023/8/27 16:41
加载中...