倍增求LCA

倍增法的核心在于预处理每个节点向上2^k步所能到达的祖先节点,其中k是非负整数。这样,当查询两个节点的LCA时,可以快速地将两个节点跳到同一深度,然后再一起向上跳,直到找到它们的LCA。

板子

#include<bits/stdc++.h>
using namespace std;
const int N=5e5;
int fa[N][20];
int dep[N];
int head[N],to[N],nxt[N];
int tot;
void add(int a,int b)
{
	nxt[++tot]=head[a];
	head[a]=tot;
	to[tot]=b;
}
void dfs(int u,int f)
{
	dep[u]=dep[f]+1;
	fa[u][0]=f;
	for(int i=1;i<=19;i++)
	{
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int i=head[u];i;i=nxt[u])
	{
		int v=to[i];
		if(v==f)
			continue;
		dfs(v,u);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])
		swap(x,y);			//x深度更大
	for(int i=19;i>=0;i--)	//走到同一层
	{
		if(dep[fa[x][i]]>=dep[y])
			x=fa[x][i];
	}
	if(x==y)
		return y;			//y是x祖先
	for(int i=19;i>=0;i--)
	{
		if(fa[x][i]!=fa[y][i])
			x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
int main()
{


	return 0;
}
posted @ 2025-02-26 14:09  流氓兔LMT  阅读(14)  评论(0)    收藏  举报