[简介] LCA(T,u,v):在有根树T中,询问一个距离根最远的结点x,使得x同时为结点u.v的祖先. RMQ(A,i,j):对于线性序列A中,询问区间[i,j]上的最值.见我的博客---RMQ ---- ST(Sparse Table)算法. [LCA算法] 解决LCA问题有多种算法,一种是离线的 Tarjan算法 ,还有在线的倍增法 ,还有就是转换为RMQ问题的在线算法. [LCA转化为RMQ] (一)对有根树T进行DFS,将遍历到的结点按照顺序记下,我们将得到一个长度为2N – 1的序列…
lca问题是最近公共祖先问题,一般是针对树结构的.现在有两种方法来解决这样的问题 1. On-line algorithm 用比较长的时间做预处理.然后对每次询问进行回答. 思路:对于一棵树中的两个节点,假设是u和v.我们要找到他们的最近的一个祖先,那么我们可以这样找,首先判断他们是不是一辈儿的人,也就是说他们的深度是不是一样的,如果一个较深(u),一个较浅(v).我们可以不断的找较深的节点的祖先,直到u和v的深度一致.如果此时u和v重合了,那么u(v)就是他们的最近公共最先,如果不重合,这时,…
基于深度的LCA算法:  对于两个结点u.v,它们的深度分别为depth(u).depth(v),对于其公共祖先w,深度为depth(w),u需要向上回溯depth(u)-depth(w)步,v需要depth(v)-depth(w)步. 因此,只需要u,v中深度较大的向上移,直到 depth(u)=depth(v) && 此时指向一个结点. 因此,求出LCA的时间复杂度为O(depth(u)+depth(v)):   求深度,只需要进行一次遍历,O(n). 如果是完全二叉树的话,相当于深度…
给定一棵树求任意两个节点的公共祖先 tarjan离线求LCA思想是,先把所有的查询保存起来,然后dfs一遍树的时候在判断.如果当前节点是要求的两个节点当中的一个,那么再判断另外一个是否已经访问过,如果访问过的话,那么它的最近公共祖先就是当前节点祖先. 下面是tarjan离线模板: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; struct Edge { i…
POJ.1330 Nearest Common Ancestors (LCA 倍增) 题意分析 给出一棵树,树上有n个点(n-1)条边,n-1个父子的边的关系a-b.接下来给出xy,求出xy的lca节点编号. LCA裸题,用倍增思想. 代码总览 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define nmax 80520 #define demen…
摘要: 本文主要介绍了解决LCA(最近公共祖先问题)的两种算法,分别是离线Tarjan算法和在线算法,着重展示了在具体题目中的应用细节. 最近公共祖先是指对于一棵有根树T的两个结点u和v,它们的LCA(T,u,v)表示一个结点x,满足x是u和v的公共祖先且x深度尽可能的大(也即最近). 求最近公共祖先有两种方法:一种是离线求解算法,也就是将询问全部存起来,处理完之后一次回答所有询问:另一种方法就是在线求解算法,对于每次询问,动态地回答. 离线算法Tarjan Tarjan算法就是利用深度优先搜索…
POJ 1330 Nearest Common Ancestors 题意:最近公共祖先的裸题 思路:LCA和ST我们已经很熟悉了,但是这里的f[i][j]却有相似却又不同的含义.f[i][j]表示i节点的第2j个父亲是多少   这个代码不是我的,转自 邝斌博客 /* *********************************************** Author :kuangbin Created Time :2013-9-5 9:45:17 File Name :F:\2013AC…
一.前人种树 博客:浅谈LCA的在线算法ST表 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 题解博客:http://www.cnblogs.com/Missa/archive/2012/10/01/2709889.html 代码: /* * LCA (POJ 1330) * 在线算法 DFS + ST */ const int MAXN = 10010; int rmq[2*MAXN];//rmq数组,就是欧拉序列对应的深度序列 struct ST {…
题目链接:http://poj.org/problem?id=1330 A rooted tree is a well-known data structure in computer science and engineering. An example is shown below: In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. N…
Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19728   Accepted: 10460 Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:    In the figure, e…