树上两点的最近公共祖先-Tarjan_LCA离线算法
2014-10-19 23:38
218 查看
/* *算法引入: *树上两点的最近公共祖先; *对于有根树的两个结点u,v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u,v的祖先且x的深度尽可能大; *对于x来说,从u到v的路径一定经过点x; * *算法思想: *Tarjan_LCA离线算法; *Tarjan算法基于dfs的框架,对于新搜到的一个结点,首先创建由这个结点构成的集合,再对当前结点的每个子树进行搜索; *每搜索完一棵子树,则可确定子树内的LCA询问都已解决,其他的LCA询问的结果必然在这个子树之外; *这时把子树所形成的集合与当前结点的集合合并,并将当前结点设为这个集合的祖先; *之后继续搜索下一棵子树,直到当前结点的所有子树搜完; * *这时把当前结点也设为已被检查过的,同时可以处理有关当前结点的LCA询问; *如果有一个从当前结点到结点v的询问,且v已经被检查过; *则由于进行的是dfs,当前结点与v的最近公共祖先一定还没有被检查; *而这个最近公共祖先的包含v的子树一定已经搜索过了,那么这个最近公共祖先一定是v所在集合的祖先; * *算法步骤: *对于每一个结点: *(1)建立以u为代表元素的集合; *(2)遍历与u相连的结点v,如果没有被访问过,对于v使用Tarjan_LCA算法,结束后将v的集合并入u的集合; *(3)对于与u有关的询问(u,v),如果v被访问过,则结果就是v所在集合的代表元素; * *算法示例: *HDU2586(How far away?) * *题目大意: *求树上任两点间的距离; * *算法思想: *先dfs一遍,求出到根节点的dis; *对于某个询问,求u和v的lca,然后res[i]=d[u]+d[v]-2*d[lca(u,v)]; * **/
相关文章推荐
- 树上两点的最近公共祖先-Tarjan_LCA离线算法
- LCA(最近公共祖先)离线算法Tarjan
- POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan
- POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)
- tarjan离线算法-LCA最近公共祖先算法模板(详细)
- LCA最近公共祖先问题(Tarjan离线算法)
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan
- hihocoder 1067 最近公共祖先·二(tarjan LCA 离线算法O(n))
- [图论] LCA(最近公共祖先)Tarjan 离线算法
- Tarjan离线算法求最近公共祖先(LCA)
- LCA(最近公共祖先)离线算法Tarjan+并查集
- 最近公共祖先LCA Tarjan 离线算法
- 中石油5909: 货物运输(LCA树上两点最近公共祖先) SDWC 2018 day5
- POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan
- [笔记]LCA 最近公共祖先---tarjan离线算法
- LCA最近公共祖先 Tarjan离线算法
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan
- LCA最近公共祖先(tarjan离线算法)
- Tarjan离线算法求最近公共祖先(LCA)
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586