Tarjan算法(LCA)
来源:互联网 发布:沙盘是什么软件 编辑:程序博客网 时间:2024/05/13 06:51
Tarjan算法是解决离线LCA(即最近公共祖先)的高效方法。
【算法分析】
首先,Tarjan算法是基于DFS的搜索框架。对于当前节点u:
1,先建立一个由这个点构成的集合,然后对于u的每个孩子v:
对以v为根节点的子树进行搜索(即Tarjan(v))。搜索完后,这棵子树内的LCA询问都已经解决。然后,把当前子树所生成的集合与u合并。
2,把这个点记为已访问过。因为之前子树里的LCA已经解决,并且这个LCA一定不是u,所以,对于以u为根节点的子树里没有被计算过的LCA,其最近公共祖先就是v的当前祖先。
【时间复杂度】
这样做,DFS的时间为O(n),处理LCA为O(m)。所以,时间复杂度为O(n+m)。
扩展:求a,b的距离。
对于每次询问,其结果是dis(a) + dis(b) - 2 * dis(LCA(a,b))(其中dis(x)为x到root的距离)。因为:
图中,根节点到LCA(a,b)被dis(a)和dis(b)计算多了两次,所以要减回来。
经典例题:
HDU2586
0 0
- Tarjan算法(LCA)
- LCA (tarjan算法)
- URAL 1471(lca tarjan算法)
- LCA问题的Tarjan算法(POJ1330)
- [hdu 2586](LCA Tarjan算法)
- lca的tarjan算法(离线)
- [算法] LCA 最近公共祖先 (Tarjan)
- LCA 离线算法 tarjan
- lca---tarjan算法
- LCA&&Tarjan算法
- LCA的Tarjan算法
- LCA 离线tarjan算法
- LCA Tarjan离线算法
- LCA离线算法tarjan
- LCA---Tarjan算法
- LCA Tarjan算法理解
- LCA离线算法Tarjan
- LCA之TARJAN算法
- java 线程 同步与锁
- Caffe代码阅读11:absval_layer层的实现
- 格式化操纵算子
- 正则表达式基础
- iOS 通过运行时获取ivars,properties,class methods以及instance methods
- Tarjan算法(LCA)
- cf678E. Another Sith Tournament
- 关于UITableView的Cell复用谈谈我的一些心得
- 华为OJ 中级 字符串排序
- 产品经理要做好什么?
- Stanford CS231n深度学习与视觉-1学习笔记
- 什么是 MVC 模式?
- 1381硬币游戏
- 项目框架和项目架构