本文是对http://noalgo.info/476.html的一点理解,特别是对其中

int father[mx];  //节点的父亲
int ancestor[mx]; //已访问节点集合的祖先

这两个数组作用的解释;

首先必须明确,并查集重建的树跟原来的树并不一样;

还是借用该文章的例子:

Tarjan算法是基于DFS(深度优先搜索), 图中的树深度优先遍历的顺序应该是:

->->->->->->->

但作者却说,节点的处理顺序为:

->->->->->->->

其实, 这里第一种顺序是我们处理查询请求的顺序,例如我们遍历到5, 则我们可以获得 5与5之前的所有已经遍历过的节点即(5,4) (5,7)的查询结果;

第二种顺序则是我们建立并查集的顺序

关键代码如下:

 void Tarjan(int x) //Tarjan算法求解LCA
{
for (int i = ; i < tree[x].size(); i++)
{
Tarjan(tree[x][i]); //访问子树
unionSet(x, tree[x][i]); //将子树节点与根节点x的集合合并,这里是并查集处理节点x
ancestor[findSet(x)] = x;//合并后的集合的祖先为x
}
vs[x] = ; //标记为已访问, 这里是DFS遍历节点x
for (int i = ; i < query[x].size(); i++) //与根节点x有关的查询
if (vs[query[x][i]]) //如果查询的另一个节点已访问,则输出结果
printf("%d和%d的最近公共祖先为:%d\n", x,
query[x][i], ancestor[findSet(query[x][i])]);
}

两者顺序不同的原因在于下面的第6行和第9行代码,我们在还未遍历父节点的时候,处理第一个子树后,父节点就已经在并查集内了;例如我们还没有遍历节点1,在遍历节点4后,就会处理节点4与其父节点1的合并;

下面,我们来慢慢建立并查集的树;

第一步:

遍历过的元素{4}, 集合[4]{4}->4

第二步:

集合{4}与父节点{1}按秩合并, 合并后的集合为{4,1},集合代表元素为4,即father[4] = 4, father[1] = 4; 集合{4,1}的公共祖先为1,ancestor[4] = 1; 即这个集合的代表元素并不是它的公共祖先

第三步:

遍历过的元素有{4,7}, 有两个集合[4]{4,1}和[7]{7},  ([]里面的元素为代表元素,{}的元素为集合内的所有元素), 此时, 若查询(7,4), 则4已经遍历过, 访问4所在集合的代表元素为 father[4],  集合4的公共祖先为ancestor[father[4]]

第四步:

遍历过的元素有{4,7,5}, 集合[7]{7}合并集合[5]{5}为[7]{7,5}, ancestor[7] = 5

.....

遍历完根节点的第一棵子树后, 集合[7]{4,1,5,7} 与根节点集合[0]{0}合并为[7]{0,1,4,5,7}, 即father[0]=7, 同时更新集合的公共祖先ancestor[7]=0;

最后遍历过的元素{4,7,5,1,2,6,3,0}, 集合为[7]{4,7,5,1,2,6,3,0}, ancestor[7] = 0

为方便理解,最后的图是没有经过路径压缩的, 实际上应该是所有元素的父节点皆为集合代表元素7

并查集实现Tarjan算法的更多相关文章

  1. upc组队赛14 Communication【并查集+floyd /Tarjan】

    Communication 题目描述 The Ministry of Communication has an extremely wonderful message system, designed ...

  2. 普林斯顿算法(1.3)并查集(union-find算法)——本质就是一个数 下面的子树代表了连在一起的点

    转自:https://libhappy.com/2016/03/algs-1.3/ 假设在互联网中有两台计算机需要互相通信,那么该怎么确定它们之间是否已经连接起来还是需要架设新的线路连接这两台计算机. ...

  3. 最小生成数(并查集)Kruskal算法

    并查集:使用并查集可以把每个连通分量看作一个集合,该集合包含连通分量的所有点.这两两连通而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分,只有属于和不属于的区别.#define N 100 ...

  4. hdu5441 并查集+克鲁斯卡尔算法

    这题计算 一张图上 能走的 点对有多少个  对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #inc ...

  5. Union-Find(并查集): Quick union算法

    Quick union算法 Quick union: Java implementation Quick union 性能分析 在最坏的情况下,quick-union的find root操作cost( ...

  6. Union-Find(并查集): Quick find算法

    解决dynamic connectivity的一种算法:Quick find Quick find--Data sturcture 如果两个objects是相连的,则它们有相同的array value ...

  7. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  8. K:Union-Find(并查集)算法

    相关介绍:  并查集的相关算法,是我见过的,最为之有趣的算法之一.并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.其相关的实现代码较为简短,实现思想也 ...

  9. tarjan算法求LCA

    tarjan算法求LCA LCA(Least Common Ancestors)的意思是最近公共祖先,即在一棵树中,找出两节点最近的公共祖先. 这里我们使用tarjan算法离线算法解决这个问题. 离线 ...

随机推荐

  1. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  2. filezilla无法启动传输及严重文件传输错误

    filezilla无法启动传输 严重文件传输错误 文件夹权限不够,修改之. 你的空间或服务器已经满了,请空下回收站或者扩容. 文件正在被占用,关闭后传输 ​

  3. UVa 11149 矩阵的幂(矩阵倍增法模板题)

    https://vjudge.net/problem/UVA-11149 题意: 输入一个n×n矩阵A,计算A+A^2+A^3+...A^k的值. 思路: 矩阵倍增法. 处理方法如下,一直化简下去直到 ...

  4. vc 导出函数/调用

    loader(exe): #include "stdafx.h" #include <Windows.h> #include <stdio.h> #defi ...

  5. VS2012 创建 WebService

    1.文件——新建——项目——Visual C#——Web——ASP.NET 空 Web 应用程序. 2.右键项目——添加——新建项——Web——Web 服务. 3.按 F5 启动调试,浏览器将显示接口 ...

  6. 最新版本的Struts2+Spring4+Hibernate4三大框架整合(截止2014-10-15,提供源码下载)

    一. 项目名称:S2316S411H436 项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 + Quartz2.2.1 源代码下载地址: 基本版:ht ...

  7. 安装webpack命令环境

    1.通过cnpm安装webpack命令环境,如图 2.安装完后查看webpack的版本,如图

  8. PHP函数前面添加@的作用

    @是PHP提供的错误信息屏蔽的专用符号. 比如在一个函数前使用@ @mysql_query 不会出现Warning, 而原来mysql_query 在遇到错误时会在页面上访提示Warning. @是可 ...

  9. Java 注解(Annotation)秒懂,你可以这样学,

    文章开头先引入一处图片. 这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我个人比较尊敬老罗的.至于为什么放这张图,自然是为本篇博文服务,接下来我自会说明.好了,可以开始今天的博文了. Anno ...

  10. mysql 查看表信息

    desc 表名; 查看表结构信息 show create table 表名; 查询建表详细信息 select COLUMN_NAME,COLUMN_TYPE,COLUMN_COMMENT from i ...