30分求助,悬114514关
查看原帖
30分求助,悬114514关
778382
wch666楼主2025/2/6 13:47
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 5;
int n, m, s;
int dep[maxn], f[maxn][50];
vector<int> vec[maxn];
void add(int u, int v)
{
	vec[u].push_back(v);
}
void dfs(int u, int fa)
{
	for(auto v : vec[u])
	{
		if(v != fa)
		{
			dep[v] = dep[u] + 1;
			f[v][0] = u;
			dfs(v, u);
		}
	}
}
int lca(int a, int b)
{
	if(a == b)
		return a;
	if(f[a][0] == f[b][0])
		return f[a][0];
	if(dep[a] < dep[b])
		swap(a, b);
	while(dep[a] > dep[b])
		a = f[a][__lg(dep[a] - dep[b])];
	if(a == b)
		return a;
	if(f[a][0] == f[b][0])
		return f[a][0];
	for(int j = __lg(n); j >= 0; j--)
	{
		if(f[a][j] != f[b][j])
		{
			a = f[a][j];
			b = f[a][j];
		}
	}
	return f[a][0];
}
int main()
{
	cin>>n>>m>>s;
	for(int i = 1; i < n; i++)
	{
		int u, v;
		cin>>u>>v;
		add(u, v);
		add(v, u);
	}
	dfs(s, 0);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= 20; j++)	
			f[i][j] = f[f[i][j - 1]][j - 1];
	while(m--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		printf("%d\n", lca(a, b));
	}
	return 0;
}
2025/2/6 13:47
加载中...