LCA模板求助
查看原帖
LCA模板求助
342868
qfpjm楼主2022/5/11 18:50

样例过不了

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 500000;
int n, m, s;
int tot, head[MAXN], to[MAXN], nxt[MAXN];
int dep[MAXN], f[MAXN][22];

void add(int x, int y)
{
	nxt[++ tot] = head[x];
	head[x] = tot;
	to[tot] = y;
}

void init(int x, int fa)
{
	dep[x] = dep[fa] + 1;
	for (int i = 0 ; i <= 21 ; i ++)
	{
		f[x][i + 1] = f[f[x][i]][i];
	}
	for (int i = head[x] ; i ; i = nxt[i])
	{
		int y = to[i];
		if (y == fa)
		{
			continue;
		}
		f[y][0] = x;
		init(y, x);
	}
}

int lca(int a, int b)
{
	if (dep[a] < dep[b])
	{
		swap(a, b);
	}
	for (int i = 21 ; i >= 0 ; i --)
	{
		if (dep[f[a][i]] >= dep[b])
		{
			a = f[a][i];
		}
	}
	if (a == b)
	{
		return a;
	}
	for (int i = 21 ; i >= 0 ; i --)
	{
		if (f[a][i] != f[b][i])
		{
			a = f[a][i];
			b = f[b][i];
		}
	}
	return f[a][0];
}

int main()
{
	memset(head, -1, sizeof(head));
	cin >> n >> m >> s;
	for (int i = 1 ; i < n ; i ++)
	{
		int x, y;
		cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	init(s, 0);
	while (m --)
	{
		int a, b;
		cin >> a >> b;
		cout << lca(a, b) << endl;
	}
}
2022/5/11 18:50
加载中...