尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【笔记】最近公共祖先 Tarjan 算法

【笔记】最近公共祖先 Tarjan 算法
📅 发布时间:2026/6/19 2:24:46

该算法可以离线求最近公共祖先,大幅节省时间复杂度(\(O(n \log n)\)->\(O(n+m)\))。

缺点是如果题目要求强制在线那么就用不了了。

具体实现是这样的:把原树用双向边存起来,然后把每一对要求 LCA 的两个点在一个新图上存一个双向边(称为查询边)。

对原图进行一次 DFS 遍历,遍历过程中使用并查集存储每个节点的祖先。我们在遍历过程中往下遍历时节点的祖先是它本身,遍历完这个节点的子树后回溯时是它的父亲。回溯过程中遍历到以 \(v\) 为根的子树时,如果 \(i\) 节点恰好访问过,而并查集中存储的又正是 \(v\) 的最近祖先,那么 \(v\) 的最近祖先就恰好是两个点的最近公共祖先。将查询边中 \(v\) 到 \(i\) 节点的 LCA 设为并查集中存储 \(v\) 的祖先(即 \(v\) 的父亲)即可。

时间复杂度涉及 \(3\) 个要素,一个是 DFS 的时间复杂度 \(O(n)\),一个是并查集的初始化 \(O(n)\),一个是路径压缩优化过后的并查集时间复杂度 \(O(a(n))\),其中 \(a\) 表示的是阿克曼函数的反函数,增长极其缓慢,常数最大到 \(4\) 左右。总时间复杂度 \(O(n+m)\) 左右。去掉了倍增法的 \(\log\),但是常数会比倍增法大。

在 LCA 模板题中,可以看到两次提交差别非常大:

在线算法倍增:

离线算法 Tarjan:

可以注意到因为常数较大导致前面的小点跑得反而慢,但是后面的大点快了将近 2 倍。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=5e5+10;
struct Node{int to,nxt,LCA;
}e[2*maxn],q[2*maxn];
int n,m,s,D;
int tot,h[maxn],hq[maxn];
int fa[maxn];
bool vis[maxn];
void Add(int u,int v){tot++;e[tot].to=v;e[tot].nxt=h[u];h[u]=tot;
}
void Addq(int u,int v){tot++;q[tot].to=v;q[tot].nxt=hq[u];hq[u]=tot;
}
int Find(int x){if(fa[x]==x) return x;else return fa[x]=Find(fa[x]);
}
void tarjan(int u){fa[u]=u;vis[u]=1;for(int i=h[u];i!=-1;i=e[i].nxt){int v=e[i].to;if(!vis[v]){tarjan(v);fa[v]=u;}}for(int i=hq[u];i!=-1;i=q[i].nxt){int v=q[i].to;if(vis[v]){if(i%2==0) q[i-1].LCA=q[i].LCA=Find(v);else q[i+1].LCA=q[i].LCA=Find(v);}}
}
int main(){memset(h,-1,sizeof(h));memset(hq,-1,sizeof(hq));scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=n-1;i++){int x,y;scanf("%d%d",&x,&y);Add(x,y);Add(y,x);}	tot=0;for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);Addq(a,b);Addq(b,a);}tarjan(s);for(int i=1;i<=2*m;i+=2){printf("%d\n",q[i].LCA);}return 0;
}

相关新闻

  • Spring的DI依赖注入(配置文件方式)
  • Office Tool Plus v10.29.50 office安装激活一条龙
  • 如何编写优美的代码:从工匠到艺术家的修炼之路

最新新闻

  • 2026年6月青岛黄金奢侈品回收TOP7实力榜单|客观实测无拉踩,本地变现首选直接抄作业 - 薛定谔的梨花猫
  • 2026年6月19日海安大灯改装本地走访记:检测、装配和交车复查先核对哪几项 - Ayu8888
  • 天津手表回收避坑指南:实测5家正规门店,哪家更让人放心? - 名奢变现站
  • 武汉卖金不用出门!上门回收品牌深度测评,合扬无损耗计价登顶榜首 - 奢侈品交易观察员
  • 深入解析MC9S08DE60内存映射与寄存器配置:从原理到实战优化
  • pandas多维聚合生产实践:滚动窗口、分组展开与性能优化

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号