(转)LCA模板(倍增法)

插眼:点击查看

用法:求树上两个节点的公共祖先

代码:

const int N=1e5+100;

int n;//节点个数

int k=log2(n)+1;

int dp[N][20];//倍增法

int deep[N];//每个节点的深度

void dfs(int u,int fa)
{
	deep[u]=deep[fa]+1;
	dp[u][0]=fa;
	for(int i=1;i<=k;i++)
		dp[u][i]=dp[dp[u][i-1]][i-1];
	for(int i=0;i=0;i--)
		if(deep[a]-deep[b]>=(1<=0;i--)
		if(dp[a][i]!=dp[b][i])
		{
			a=dp[a][i];
			b=dp[b][i];
		}
	return dp[a][0];
}

 

你可能感兴趣的:(树链剖分)