当前位置: 首页 > news >正文

最近公共祖先 (LCA)

\(update : 2025/10/28\)

最近公共祖先, 即 \(LCA\) (\(Least\; Common\; Ancestor\)), 顾名思义, 用于在一棵树中求两个点的最近公共祖先

方法有很多, 效率和码量各有千秋

倍增法

很经典的 \(lca\) 求法, 主要是好理解, 好打, 复杂度不优

复杂度

时间 : \(O(n \log n)\) 预处理, \(O(\log n)\) 单次查询

空间 : \(O(n \log n)\)

原理

基于倍增的方法, 记录每个节点的 \(2^k\) 级祖先, 查询时先将两节点跳到同一高度, 随后一起向上查询祖先

小优化

可以预处理出 \(\log\) 的数组, 随后通过一些小技巧来减少枚举次数

这个优化只是常数级别

\(code\)

这个代码主要是便于理解, 但是常数巨大

//May all the beauty be blessed.
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int n,m,s;
vector<int> a[500010];
int f[500010][35],dis[500010];void dfs(int x,int fa){ //遍历图 dis[x]=dis[fa]+1;f[x][0]=fa;for(int i=1;i<=30;i++){ //处理 f[x][i]=f[f[x][i-1]][i-1];}for(auto i:a[x]){if(fa==i) continue;dfs(i,x);}
}int lca(int x,int y){if(dis[x]<dis[y]) swap(x,y);for(int i=30;i>=0;i--){ //先跳到同一高度 if(dis[f[x][i]]>=dis[y]) x=f[x][i];}if(x==y) return x; //特判 for(int i=30;i>=0;i--){ //一起跳父亲 if(f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m>>s;for(int i=1;i<n;i++){int u,v;cin>>u>>v;a[u].push_back(v);a[v].push_back(u);}dfs(s,0);while(m--){int u,v;cin>>u>>v;cout<<lca(u,v)<<'\n';}
}
/**/

这是我跑的最快的倍增

//May all the beauty be blessed.
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,m,s,f[500010][30],d[500010],lg[500010];
vector<int> a[500010];
void dfs(int x,int fa){f[x][0]=fa;d[x]=d[fa]+1;for(int i=1;i<=lg[d[x]];i++) f[x][i]=f[f[x][i-1]][i-1];for(auto i:a[x]) if(i!=fa) dfs(i,x);
}
int lca(int x,int y){if(d[x]<d[y]) swap(x,y);while(d[x]>d[y]) x=f[x][lg[d[x]-d[y]]-1];if(x==y) return x;for(int i=lg[d[x]]-1;i>=0;i--){if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];}return f[x][0];
}
signed main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m>>s;for(int i=1;i<n;i++){int x,y;cin>>x>>y;a[x].push_back(y);a[y].push_back(x);}for(int i=1;i<=n;i++) lg[i]=lg[i-1]+(1<<lg[i-1]==i);dfs(s,0);while(m--){int x,y;cin>>x>>y;cout<<lca(x,y)<<'\n';}
}

\(dfs\)

待补

树剖法

待补

例题

P3379 【模板】最近公共祖先(LCA)

http://www.jsqmd.com/news/24497/

相关文章:

  • ChatGPT API集成测试自动化框架的实践与成效汇报
  • [题解]【MX-S8】梦熊 CSP-S 2025 模拟赛
  • 2025四川碳晶板品牌
  • 详细介绍:求余运算和数学模运算的知识了解
  • 基于蚁群算法解决车辆路径问题(VRP)的MATLAB实现
  • 2025 年工业除湿机,恒温恒湿机,精密空调,除湿加湿一体机厂家最新推荐,产能、专利、环保三维数据透视
  • 从手动到全自动:我们如何用Dify重构了API回归测试流程
  • 2025 年管道除湿机,中央除湿机,新风除湿机,变频除湿机厂家最新推荐,产能、专利、环保三维数据透视
  • 2025年10月中国管理咨询公司推荐榜:五强数据对比
  • 条码识别插件 quaggaJS - microsoft
  • 2025年10月中国管理咨询公司推荐榜:金蓝盟领衔六强对比评测
  • 基于3GPP LTE标准的信道仿真模型
  • 2025 年灵巧手厂家最新推荐榜,技术实力与市场口碑深度解析,筛选高适配性与长耐用性优质品牌
  • Dify工作流实战:一键自动生成测试报告并推送钉钉,我每天白赚1小时
  • CF2043D Problem about GCD
  • 2025年10月智能工厂规划咨询公司排行:五家对比一目了然
  • 【2025-10-27】干就是了
  • 2025年10月智能工厂规划咨询公司推荐:客观评价榜及指标对比
  • 2025年10月智能工厂规划咨询公司推荐:热门对比榜五强深度解析
  • 2025 年 10 月 ups 发电机租赁,静音发电机租赁,发电机租赁附近,附近发电机租赁公司最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 2025 年 10 月 2 小时应急发电机租赁,山东发电机租赁,大型发电机租赁公司最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 2025年10月数字化咨询公司推荐:五强榜单与实战对比 .
  • 2025年10月精益制造咨询公司推荐榜:五强实测排行
  • 2025年10月精益制造咨询公司推荐:榜单揭晓与选型思路
  • 2025 年移动发电机租赁,大型发电机租赁,柴油发电机租赁公司最新推荐,聚焦资质、案例、售后的五家机构深度解读
  • 2025年10月绩效管理咨询公司推荐:五强榜单与选择指南
  • Java前后端分离架构的实践与优化路径
  • 2025年10月数字化咨询公司推荐:五强榜单与实战对比
  • 基于STM32F103C8T6的SPI通信程序实现
  • 2025年10月降本增效咨询公司推荐:实力榜与数据对比