『图论』LCA 最近公共祖先】的更多相关文章

概述篇 LCA (Least Common Ancestors) ,即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先. LCA 可分为在线算法与离线算法 在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入. 离线算法:指一开始就需要知道问题的所有输入数据,而在解决一个问题后立即输出结果. 算法篇 对于该问题,很容易想到的做法是从 u.v 分别回溯到根节点,然后这两条路径中的第一个交点即为 u.v 的最近公共祖先…
概述篇 LCA(Least Common Ancestors),即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先. LCA可分为在线算法与离线算法 在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入. 离线算法:指一开始就需要知道问题的所有输入数据,而在解决一个问题后立即输出结果. 算法篇 对于该问题,很容易想到的做法是从 u.v 分别回溯到根节点,然后这两条路径中的第一个交点即为 u.v 的最近公共祖先,在一…
http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm> #define mt(a,b) memset(a,b,sizeof(a)) using namespace std; const int inf=0x3f3f3f3f; class LCA { ///最近公共祖先 build_o(n*logn) query_o(1) typedef int typec…
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合. 3.点连…
Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000") #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include&…
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间.该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环. 你的任务是帮助该商人计算一下他的最短旅行时间. 输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目.下…
LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而且结果同样的节点用并查集合并. 2,分类.使每一个结点都落到某个类中,到时候仅仅要运行集合查询,就能够知道结点的LCA了. 对于一个结点u.类别有: 以u为根的子树.除类一以外的以f(u)为根的子树.除前两类以外的以f(f(u))为根的子树.除前三类以外的以f(f(f(u)))为根的子树-- 类一的…
LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan /*poj 1330 Nearest Common Ancestors 题意: 给出一棵大小为n的树和一个询问(u,v), 问(u,v)的近期公共祖先. 限制: 2 <= n <= 10000 思路: 离线tarjan */ #include<iostream> #include<…
LCA模板题https://www.luogu.com.cn/problem/P3379题意理解 对于有根树T的两个结点u.v,最近公共祖先LCA(u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能小.另一种理解方式是把T理解为一个无向无环图,而LCA(u,v)即u到v的最短路上深度最小的点.例如,对于下面的树,结点4和结点6的最近公共祖先LCA(T,4,6)为结点2. 那么这里提供四种思路. 1.暴力至上主义 首先计算出结点u和v的深度d1和d2.如果d1>d2,将u结点向上移动d1…
对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决.     这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O(n); 先介绍在线算法:     1) dfs:      对于图所示的树,我们从根节点1开始dfs,按照先序访问(不算完全的先序),那么它访问顺序就是1 -> 2 -> 4 -> 2 -> 5 -> 7 -> 5 -> 8 -> 5 -> 2 ->…