Tarjan算法的优点在于相对稳定,时间复杂度也比较居中,也很容易理解。

    下面详细介绍一下Tarjan算法的基本思路:

      1.任选一个点为根节点,从根节点开始。

      2.遍历该点u所有子节点v,并标记这些子节点v已被访问过。

      3.若是v还有子节点,返回2,否则下一步。

      4.合并v到u上。

      5.寻找与当前点u有询问关系的点v。

      6.若是v已经被访问过了,则可以确认u和v的最近公共祖先为v被合并到的父亲节点a。

  Tarjan(u) {//marge和find为并查集合并函数和查找函数for each(u,v) {     //访问所有u子节点vTarjan(v);     //继续往下遍历marge(u,v);    //合并v到u上标记v被访问过;}for each(u,e) {     //访问所有和u有询问关系的e如果e被访问过;u,e的最近公共祖先为find(e);}}

假设我们有一组数据 9个节点 8条边 联通情况如下:

 1--2,1--3,2--4,2--5,3--6,5--7,5--8,7--9 即下图所示的树

 设我们要查找最近公共祖先的点为9--8,4--6,7--5,5--3;

设f[]数组为并查集的父亲节点数组,初始化f[i]=i,vis[]数组为是否访问过的数组,初始为0;

模拟过程:

   取1为根节点,往下搜索发现有两个儿子2和3;

   先搜2,发现2有两个儿子4和5,先搜索4,发现4没有子节点,则寻找与其有关系的点;

   发现6与4有关系,但是vis[6]=0,即6还没被搜过,所以不操作;

发现没有和4有询问关系的点了,返回此前一次搜索,更新vis[4]=1;

表示4已经被搜完,更新f[4]=2,继续搜5,发现5有两个儿子7和8;

   先搜7,发现7有一个子节点9,搜索9,发现没有子节点,寻找与其有关系的点;

   发现8和9有关系,但是vis[8]=0,即8没被搜到过,所以不操作;

   发现没有和9有询问关系的点了,返回此前一次搜索,更新vis[9]=1;

   表示9已经被搜完,更新f[9]=7,发现7没有没被搜过的子节点了,寻找与其有关系的点;

   发现5和7有关系,但是vis[5]=0,所以不操作;

   发现没有和7有关系的点了,返回此前一次搜索,更新vis[7]=1;

表示7已经被搜完,更新f[7]=5,继续搜8,发现8没有子节点,则寻找与其有关系的点;

   发现9与8有关系,此时vis[9]=1,则他们的最近公共祖先为find(9)=5;

     (find(9)的顺序为f[9]=7-->f[7]=5-->f[5]=5 return 5;)

   发现没有与8有关系的点了,返回此前一次搜索,更新vis[8]=1;

表示8已经被搜完,更新f[8]=5,发现5没有没搜过的子节点了,寻找与其有关系的点;

发现7和5有关系,此时vis[7]=1,所以他们的最近公共祖先为find(7)=5;

   find(7)的顺序为f[7]=5-->f[5]=5 return 5;)

   又发现5和3有关系,但是vis[3]=0,所以不操作,此时5的子节点全部搜完了;

   返回此前一次搜索,更新vis[5]=1,表示5已经被搜完,更新f[5]=2;

   发现2没有未被搜完的子节点,寻找与其有关系的点;

   又发现没有和2有关系的点,则此前一次搜索,更新vis[2]=1;

表示2已经被搜完,更新f[2]=1,继续搜3,发现3有一个子节点6;

 搜索6,发现6没有子节点,则寻找与6有关系的点,发现4和6有关系;

 此时vis[4]=1,所以它们的最近公共祖先为find(4)=1;

 (find(4)的顺序为f[4]=2-->f[2]=2-->f[1]=1 return 1;)

 发现没有与6有关系的点了,返回此前一次搜索,更新vis[6]=1,表示6已经被搜完了;

更新f[6]=3,发现3没有没被搜过的子节点了,则寻找与3有关系的点;

发现5和3有关系,此时vis[5]=1,则它们的最近公共祖先为find(5)=1;

(find(5)的顺序为f[5]=2-->f[2]=1-->f[1]=1 return 1;)

发现没有和3有关系的点了,返回此前一次搜索,更新vis[3]=1;

更新f[3]=1,发现1没有被搜过的子节点也没有有关系的点,此时可以退出整个dfs了。

 经过这次dfs我们得出了所有的答案,有没有觉得很神奇呢?是否对Tarjan算法有更深层次的理解了呢?

copy的 键盘上的艺术家w

trajan 算法 离线求lca相关推荐

  1. wyh的商机(tarjan离线求lca)

    时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 一天,你们wyh学长和你们zhl学长玩一个 ...

  2. 树上倍增求LCA及例题

    先瞎扯几句 树上倍增的经典应用是求两个节点的LCA 当然它的作用不仅限于求LCA,还可以维护节点的很多信息 求LCA的方法除了倍增之外,还有树链剖分.离线tarjan ,这两种日后再讲(众人:其实是你 ...

  3. 牛客 - 牛半仙的妹子Tree(按询问分块+RMQ求LCA)

    题目链接:点击查看 题目大意:给出一棵有 n 个节点的树,需要执行 m 次操作: 1 x:点 x 被染色,且随后每一秒染色的区域都会向外扩展一个单位 2 x:清空所有的染色 3 x:问点 x 是否被染 ...

  4. 洛谷 - P3379 【模板】最近公共祖先(LCA)(RMQ求LCA/Tarjan求LCA)

    题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各 ...

  5. 树上倍增求LCA详解

    LCA(least common ancestors)最近公共祖先 指的就是对于一棵有根树,若结点z既是x的祖先,也是y的祖先(不要告诉我你不知道什么是祖先),那么z就是结点x和y的最近公共祖先. 定 ...

  6. 【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

    题干: 网络管理员管理大型网络.该网络由N台计算机和成对计算机之间的M链路组成.任何一对计算机都通过连续的链接直接或间接连接,因此可以在任何两台计算机之间转换数据.管理员发现某些链接对网络至关重要,因 ...

  7. POJ 1986:Distance Queries(倍增求LCA)

    http://poj.org/problem?id=1986 题意:给出一棵n个点m条边的树,还有q个询问,求树上两点的距离. 思路:这次学了一下倍增算法求LCA.模板. dp[i][j]代表第i个点 ...

  8. 求 LCA 的三种方法

    (YYL: LCA 有三种求法, 你们都知道么?) (众神犇: 这哪里来的傻叉...) 1. 树上倍增 对于求 LCA, 最朴素的方法是"让两个点一起往上爬, 直到相遇", &qu ...

  9. 【数据结构】最小瓶颈路 加强版(Kruskal重构树RMQ求LCA)

    题目描述 给定一个 n 个点 m 条边的无向连通图,编号为 1 到 n ,没有自环,可能有重边,每一条边有一个正权值 w . 给出 q 个询问,每次给出两个不同的点 u 和 v ,求一条从 u 到 v ...

  10. 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA

    例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...

最新文章

  1. 微软企业库4.1学习笔记(三)企业库迁移和并行使用,以及企业库的扩展
  2. Oracle 密码文件
  3. FFmpeg获取DirectShow设备数据(摄像头,录屏)
  4. JAVA 排序工具类
  5. 用python写一个telnet另一台电脑并开启某个应用程序_Python-Anaconda的安装和配置
  6. 量子计算机迷宫,工程杰作诞生可编程的光学量子计算机
  7. java类加载体系,Java类加载体系
  8. 超清晰的 DNS 原理入门指南 (资源)
  9. 物联网中大数据的挑战有哪些
  10. cvErode() 形态腐蚀(可多次)
  11. vue input失焦事件
  12. twitter开源_30位开源社区经理将在Twitter上关注
  13. Python数据分析入门笔记5——数据预处理之异常值
  14. R语言安装TSA包(windows) 2020年5月
  15. 计算机桌面工作提醒,如何在电脑桌面显示工作提醒?电脑上有什么好用的桌面工作提醒便签吗...
  16. 阿里云物联网平台专用工具详细说明
  17. 聚类之K-means分析以及优缺点
  18. 【CSDN软件工程师能力认证学习精选】 什么是前端工程化?
  19. 房产中介小程序定制开发功能方案
  20. 2022年广东省安全员C证第三批(专职安全生产管理人员)考试题模拟考试题库及在线模拟考试

热门文章

  1. Excel如何按照单元格背景颜色排序
  2. 习题--答案--22/6/8
  3. RTOS 诊断和错误检查
  4. 干货 | 携程Elasticsearch数据同步实践
  5. 【面经】携程数据仓库面经
  6. 网页编程html报错502,Nginx将不会使用自定义502错误页面
  7. OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
  8. html鼠标悬停显示箭头,Tippy.js 玩转鼠标悬停提示信息
  9. 从细节入手为您的客户创造价值
  10. 2017广州大学计算机组成原理,广州大学松田学院计算机组成原理复习题(仅供参考).doc...