Tarjan求LCA总结】的更多相关文章

题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 5 5 4 3 1 2 4 5…
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v][k] = anc[anc[v][k - 1]][k - 1]  (从v向上2k步即为从v向上2(k - 1)步再向上2(k - 1)步) 求出其他anc[v][k]的值 lca(u, v)函数寻找u和v的lca, 首先把u和v调整到一个高度.如果此时u和v重合,那么这就是我们要找的lca,如果他…
LCA问题算是一类比较经典的树上的问题 做法比较多样 比如说暴力啊,倍增啊等等 今天在这里给大家讲一下tarjan算法! tarjan求LCA是一种稳定高速的算法 时间复杂度能做到预处理O(n + m),查询O(1) 它的主要思想是dfs和并查集 1.输入数据,找出根节点(或输入的)并将图存起来 2.输入需要查找的每一对点(两个点),也存起来(也存成图) 3.从根节点开始向它的每一个孩子节点进行深搜 4.同时开一个bool类型的数组记录此节点是否搜索过 5.搜索到p节点时先将p标记为已经搜索过了…
LCA问题有多种求法,例如倍增,Tarjan. 本篇博文讲解如何使用Tarjan求LCA. 如果你还不知道什么是LCA,没关系,本文会详细解释. 在本文中,因为我懒为方便理解,使用二叉树进行示范. LCA是什么,能吃吗? LCA是树上最近公共祖先问题. 最近公共祖先就是树上有两个结点,找一个结点,是他们的公共祖先,并且离他们两个结点最近. 例如这是一棵树: 树上 4,7 两个结点的 LCA 就是 2 了. 1 虽然也是他们的公共祖先,但并不是最近的. 再举个例子,8,5 的祖先是 5.8,6 的…
                                                                                                                                                         ----代码都是  HDU 2586  "How far away" 为例     倍增求LCA 树上倍增法. 设F[x,k] 表示x的2的k次方辈祖先,即 由x向上走2的k次方到达的…
The traffic network in a country consists of N cities (labeled with integers from 1 to N) and N-1 roads connecting the cities. There is a unique path between each pair of different cities, and we know the exact length of each road. Write a program th…
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 5 5 4 3 1 2 4 5…
基本思想 把要求的点对保存下来,在dfs时顺带求出来. 方法 将每个已经遍历的点指向它回溯的最高节点(遍历它的子树时指向自己),每遍历到一个点就处理它存在的询问如果另一个点已经遍历,则lca就是另一个点指向的点.否则跳过 例如在下图中询问4,5和4,3的lca,遍历顺序为1,2,4,5,3 遍历到4时,各个点的指向如图 处理询问4,5和4,3.发现3和5没有遍历,跳过 回溯到3,然后遍历5. 发现4遍历过了,4,5的lca为2 然后回溯到1,遍历3 发现4遍历过了,4,3的lca为1 具体每个点…
LCA,最近公共祖先,这是树上最常用的算法之一,因为它可以求距离,也可以求路径等等 LCA有两种写法,一种是倍增思想,另一种是Tarjan求法,我们可以通过一道题来看一看, 题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要花费一个游戏币. 参加游戏的人三人一组,开始的时候,所有人员均任意分散在各个等待点上(每个点同时允许多个人等待),每个人均带有…
Tarjan算法向上标记法:从x向上走到根节点,并标记所有经过的点从y向上走到根节点,当第一次遇到已标记的节点时,就找到了LCA(x, y)对于每个询问,向上标记法的时间复杂度最坏为O(n) 在深度遍历的任意时刻,我们将树中的节点分成三类:1.我们已经访问了,但是我们还没有回溯的节点标记为12.我们访问过并且已经回溯到的,标记为23.没有访问过的节点对于正在访问的节点x,他的父节点是标记为1的.若y是已经访问并且回溯的节点,则LCA(x, y)就是由y向上走,遇到的第一个标记为1的节点.我们很容…