LCA(倍增)

本文深入解析了倍增LCA算法的实现细节,通过优化的C++代码展示了如何高效地计算任意两个节点的最近公共祖先。算法首先初始化二进制指数,然后使用深度优先搜索(DFS)遍历树来填充祖先矩阵,最后通过比较节点的祖先信息快速找到最近公共祖先。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学长讲的时候敲的LCA(倍增)代码 然后注释了一点点 

#pragma GCC optimize(2) //O2优化
// 倍增LCA 
//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<cstring>
 
using namespace std;
const int maxn = 1e4+10;
long long bit[maxn];
int depth[maxn];//结点i的深度 
int f[maxn][30];//结点i的第2^j个祖先结点 
vector<int> G[maxn];//图的邻接表表示
void init(){//二进制 
	bit[0] = 1;
	for(int i = 1;i <= 29;i ++)
	   bit[i] = (bit[i-1]<<1);
}
void dfs(int u,int par){
	depth[u] = depth[par] + 1;
	f[u][0] = par;//父节点 
	for(int i = 1;i <= 29;i ++)
		f[u][i] = f[f[u][i-1]][i-1];//i的第2^j个祖先 == i的第2^(j-1)个祖先的第2^(j-1)个祖先 (递推) 
		for(int i = 0;i < (int)G[u].size();i ++){//u相连的子结点 
			int v = G[u][i];
			if(v == par) continue;
			dfs(v,u);
		}
}
int lca(int a,int b){
	if(depth[a] < depth[b]) swap(a,b);
	int dif = depth[a] - depth[b];//深度差 
	for(int i = 29;i >= 0;i --){//更新结点更新深度差 
		if(dif >= bit[i]){
			a = f[a][i];
			dif -= bit[i];
		}
	}
	if(a == b) return a;
//  for(int i = lg[depth[a]-1];i >= 0;i --)  2^30 int 最大值 
	for(int i = 29;i >= 0;i --){
//若f[a][i] != f[b][i] 那么他俩必定还在公共祖先的子树里面 ,然后在深度可查找范围,不断更新a,b 
		if(depth[a] >= bit[i] && f[a][i] != f[b][i]){
			a = f[a][i];
			b = f[b][i];
		}
	}
	return f[a][0];
}
int main()
{	
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值