LCA离线算法tarjan
2014-08-05 21:20
225 查看
LCA算法:
LCA(Least Common Ancestor),是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。
LCA算法有在线算法也有离线算法,所谓的在线算法就是实时性的,比方说,给你一个输入,算法就给出一个输出,就像是http请求,请求网页一样。给一个实时的请求,就返回给你一个请求的网页。而离线算法则是要求一次性读入所有的请求,然后在统一得处理。而在处理的过程中不一定是按照请求的输入顺序来处理的。说不定后输入的请求在算法的执行过程中是被先处理的。
本文先介绍一个离线的算法,就做tarjan算法。这个算法是基于并查集和DFS的。Dfs的作用,依次对树中的每一个节点进行处理。而并查集的作用就是当dfs每访问完(注意,这里是访问完)到一个点的时候,就通过并查集将这个点,和它的子节点链接在一起构成一个集合,也就是将并查集中的pnt值都指向当前节点。这样就把树中的节点分成了若干个的集合,然后就是根据这些集合的情况来对输入数据来进行处理。
比方说当前访问到的节点是u,等u处理完之后呢,ancestor[u]就构成了u的集合中的点与u点的LCA,而ancestor[fa[u]]就构成了,u的兄弟节点及其兄弟子树的集合中点与u的LCA,而ancestor[fa[fa[u]]]就构成了u的父亲节点的兄弟节点及其兄弟子树的集合中的点与u的LCA。然后依次类推,这样就构成了这个LCA的离线算法。
ancestor表示的是当前节点集合的祖先。
LCA(Least Common Ancestor),是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。
LCA算法有在线算法也有离线算法,所谓的在线算法就是实时性的,比方说,给你一个输入,算法就给出一个输出,就像是http请求,请求网页一样。给一个实时的请求,就返回给你一个请求的网页。而离线算法则是要求一次性读入所有的请求,然后在统一得处理。而在处理的过程中不一定是按照请求的输入顺序来处理的。说不定后输入的请求在算法的执行过程中是被先处理的。
本文先介绍一个离线的算法,就做tarjan算法。这个算法是基于并查集和DFS的。Dfs的作用,依次对树中的每一个节点进行处理。而并查集的作用就是当dfs每访问完(注意,这里是访问完)到一个点的时候,就通过并查集将这个点,和它的子节点链接在一起构成一个集合,也就是将并查集中的pnt值都指向当前节点。这样就把树中的节点分成了若干个的集合,然后就是根据这些集合的情况来对输入数据来进行处理。
比方说当前访问到的节点是u,等u处理完之后呢,ancestor[u]就构成了u的集合中的点与u点的LCA,而ancestor[fa[u]]就构成了,u的兄弟节点及其兄弟子树的集合中点与u的LCA,而ancestor[fa[fa[u]]]就构成了u的父亲节点的兄弟节点及其兄弟子树的集合中的点与u的LCA。然后依次类推,这样就构成了这个LCA的离线算法。
ancestor表示的是当前节点集合的祖先。
int find(int x) { if(pra[x]==x)return x; return pra[x]=find(pra[x]); } int unite(int a,int b) { int x = find(a); int y = find(b); pra[y] = x; } void LCA(int parent) { pra[parent] = parent; //当访问到一个点的时候,先将其自己形成一个集合 ancestor[find(parent)] = parent; for(int i=0;i<=child[parent].size();i++) { LCA(child[parent][i]); //依次对子节点进行访问。 unite(parent,child[parent][i]); //在处理完后,将子节点的集合链接到父节点 ancestor[find(child[parent][i])] = parent;//将这个集合的祖先设置成parent,同时起到了压缩路径的作用 } vis[parent] = true; if( parent = first && vis[second] ) //这里的first和second主要针对的是查询的每次操作时输入的两个数。 ans = ancestor[find(second)] ; if( parent = second && vis[first] ) ans = ancestor[find(first)]; }
相关文章推荐
- Tarjan离线算法求最近公共祖先(LCA)
- poj 1968 Distance Queries LCA Tarjan 离线算法
- LCA的离线算法(Tarjan)与在线算法(RMQ)详解
- POJ 1330 Nearest Common Ancestors 【LCA·Tarjan离线算法】
- poj 3529 Network 双连通分连 动态求桥的数目 + tarjan离线算法求LCA
- (算法)Tarjan离线算法解决LCA问题 (附POJ 1470 Closest Common Ancestors 代码)
- LCA问题的Tarjan离线算法 + POJ 1470
- [图论] LCA(最近公共祖先)Tarjan 离线算法
- LCA最近公共祖先问题(Tarjan离线算法)
- 最近公共祖先LCA Tarjan 离线算法
- POJ 1330 Nearest Common ancesters(LCA,Tarjan离线算法)
- LCA的离线算法Tarjan.
- LCA最近公共祖先(tarjan离线算法)
- LCA最近公共祖先的离线算法(Tarjan)和在线算法(ST)
- LCA最近公共祖先 Tarjan离线算法
- LCA的Tarjan离线算法
- 最小公共祖先(LCA)离线算法_Tarjan c++实现
- 最形象的讲解,让你一次学会什么叫LCA离线算法tarjan
- 图论 LCA离线算法 Tarjan
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan