树上倍增求 LCA 模板

void dfs(int x,int fa,int d){
	deep[x]=d;dp[x][0]=fa;
	for(int i=1;i<=lg2[deep[x]];++i){
		dp[x][i]=dp[dp[x][i-1]][i-1];
	}
	for(auto to: G[x]){
		if(to==fa){continue;}
		dfs(to,x,d+1);
	}
}
int lca(int x,int y){
	if(deep[x]<deep[y]){swap(x,y);}
	int d=deep[x]-deep[y];
	for(int i=0;i<20;++i){
		if((1<<i)&d){x=dp[x][i];}	
	}
	if(x==y){return x;}
	for(int i=19;i>-1;--i){
		if(dp[x][i]!=dp[y][i]){
			x=dp[x][i],y=dp[y][i];
		}
	}
	return dp[x][0];
}

```cpp
posted @ 2024-08-22 09:48  dongzhen  阅读(3)  评论(0编辑  收藏  举报