倍增递推求LCA板子

int dep[maxn];//存u的深度
int fa[maxn][50];//存从u向上跳pow(2,i)的祖先节点
//流程:1.dfs创建st表 
//2.利用st表求LCA 
vector<int>e[maxn];
void dfs(int u,int father){
	dep[u]=dep[father]+1;
	fa[u][0]=father;
	for(int i=1;i<=19;i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int v:e[u]){
		if(v!=father)dfs(v,u);
	}
} 
int lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	
	for(int i=19;i>=0;i--){
		if(dep[fa[u][i]]>=dep[v]){
			u=fa[u][i]; 
		}
		if(u==v)return v;	
	}
	for(int i=19;i>=0;i--){
		if(fa[u][i]!=fa[v][i]){
			u=fa[u][i];v=fa[v][i];
		}
	}
	return fa[u][0];
}
posted @ 2025-03-15 17:16  Marinaco  阅读(34)  评论(0)    收藏  举报
//雪花飘落效果