WA 0pts求调
查看原帖
WA 0pts求调
503074
SoapMactavish楼主2023/8/28 11:32
#include <bits/stdc++.h>
#define MAXN 500005
using namespace std;
struct Edge {
	int to, nxt;
} edge[MAXN << 1];
int head[MAXN], ecnt;
void add(int u, int v) {
	edge[++ecnt].to = v;
	edge[ecnt].nxt = head[u];
	head[u] = ecnt;
}
int depth[MAXN], f[MAXN][22];
void dfs(int u, int fa) {
	depth[u] = depth[fa] + 1;
	f[u][0] = fa;
	for (int i = 1; (1 << i) < depth[u]; i++) {
		f[u][i] = f[f[u][i - 1]][i - 1];
	}
	for (int i = head[u]; i; i = edge[i].nxt) {
		if (edge[i].to == fa) {
			continue;
		}
		dfs(edge[i].to, u);
	}
}
int LCA(int u, int v) {
	if (depth[u] < depth[v]) {
		swap(u, v);
	} 
//	cout << "E:" << u << ' ' << v << ' ' << depth[u] << ' ' << depth[v] << endl; 
	for (int i = 20; i >= 0; i--) {
		if (depth[u] - depth[v] >= (1 << i)) {
			u = f[u][i];
		}
//		cout << "R3:" << depth[u] << ' ' << depth[v] << endl;
	}
//	cout << "EE:" << u << ' ' << v << endl;
	if (u == v) {
		return u;
	}
	for (int i = 20; i; i--) {
		if (f[u][i] != f[v][i]) {
			u = f[u][i], v = f[v][i];
		}
	}
//	cout << "EEE:" << u << ' ' << v << endl;
	return f[u][0];
}
int main() {
	int n, m, root;
	scanf("%d%d%d", &n, &m, &root);
	for (int i = 1; i < n; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		add(x, y), add(y, x);
	}
	dfs(root, 0);
	for (int i = 1; i <= m; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		printf("%d\n", LCA(x, y));
	}
	return 0;
}
2023/8/28 11:32
加载中...