[算法] LCA 最近公共祖先 (Tarjan)
来源:互联网 发布:主人网络关闭了怎么办 编辑:程序博客网 时间:2024/06/07 13:24
今天让我们来看看LCA算法中的一个离线算法Tarjan
首先,我们必须先明确什么是LCA,也就是最近公共祖先。对于有根树上的两个结点u、v,最近公共祖先LCA(u,v)表示一个结点x,满足x是u、v的公共祖先且x的深度尽可能大,也就是离u、v最近的公共祖先(这不是废话?)。
那么什么是LCA的Tarjan算法呢?
利用并查集优越的时空复杂度,我们可以实现LCA问题的
其实我认为这个算法就是将当前子树的情况全部处理完,然后在将子树合并即可得到最终答案
Tarjan算法优点:令人眼红时间复杂度
Tarjan算法缺点:如果题目要求强制在线操作(比如说查询一个修改一个什么值),而你又只会Tarjan算法的话,那么你就BOOM~了
基本思路:
下面详细介绍一下Tarjan算法的基本思路:
1.任选一个点为根节点,将当前节点son设置为根节点
2.遍历该点son所有子节点to
3.若是to有子节点,递归将to作为当前节点u,进行操作2,退出时将to的父亲标记为当前节点son
4.将当前节点son标记为访问过
5.寻找与当前节点son有询问关系的点x
6.若x已经被访问过,则可以确认son和x的最近公共祖先为find(x)。find操作等价于并查集find操作,可以加上路径压缩。
int find(int x) { //和并查集的操作一致(顺便路径压缩) if(x==f[x]) return x; else return f[x]=find(f[x]);}
伪代码:
void Tarjan(int fa,int son) { for(int i=当前节点son的儿子) { Tarjan(son,i); f[i]=son; } vis[son]=true; for(int i=与当前节点son有询问关系的点) if(vis[to]) ans=find(i); return ;}
多说无益,让我们来看图(其实上面都是废话):
这是一棵有5个节点的树
举以下经典例子:
2-3
1-3
模拟过程:
1.当前节点:
2.当前节点:
3.当前节点:
4.当前节点:
5.当前节点:
6.当前节点:
7.当前节点:
8.当前节点:
9.当前节点:
10.退出
结果:0 1
到这里我们的模拟就结束了!
你学懂了么?
是不是对Tarjan算法有了更深的认识了呢?
题库-题解(未完待续):
CodeVS 2370 小机房的树 传送门 题解
有任何问题的可以在博客下留言或者私信我, 我看到就将会回复
From:Chlience
- [算法] LCA 最近公共祖先 (Tarjan)
- LCA最近公共祖先(tarjan离线算法)
- 最近公共祖先LCA:Tarjan算法
- 最近公共祖先LCA Tarjan算法
- 最近公共祖先LCA Tarjan算法
- 最近公共祖先LCA Tarjan算法
- 最近公共祖先LCA:Tarjan算法
- LCA(最近公共祖先)Tarjan算法
- 最近公共祖先LCA--Tarjan算法
- Tarjan算法求LCA(最近公共祖先)
- Tarjan离线算法求最近公共祖先(LCA)
- Tarjan离线算法求最近公共祖先(LCA)
- LCA(最近公共祖先)tarjan算法学习笔记
- 最近公共祖先LCA:Tarjan算法(介绍1)
- 最近公共祖先LCA:Tarjan算法(介绍2)
- Tarjan离线算法求最近公共祖先(LCA)
- [图论] LCA(最近公共祖先)Tarjan 离线算法
- Tarjan算法求LCA(最近公共祖先)
- 指针数组和数组指针的详细解答
- 数组
- [最大流]BZOJ 1711: [Usaco2007 Open]Dining吃饭 题解
- HBase 通过 Maven 用 Java API 进行增删查put/get/delete
- 两个数的对比
- [算法] LCA 最近公共祖先 (Tarjan)
- 起点
- [USACO FEB14]奶牛的十项全能
- Unity与Android的交互之项目结构
- NOIP2017提高组 模拟赛20(总结)
- LeetCode-82-Remove Duplicates from Sorted List II 链表
- Error:Some file crunching failed, see logs for details
- 系统结构、文件寻址、文件管理、正则表达式
- Day_9.23-9.24