1、介绍

并查集是一种树型数据结构,用于处理一些不相交集合的合并问题。

并查集主要操作有:

  (1)合并两个不相交集合;

  (2)判断两个元素是否属于同一个集合;

  (3)路径压缩;

2、常用操作

用father[i]表示元素i的父亲结点,例如:

用某个元素所在树的根节点表示该元素所在集合;

判断两个元素是否属于同一个集合的时候,只需要判断他们所在树的根节点是否一样即可;

也就是说,当我们合并两个集合的时候,只需要在两个根节点之间连边即可。

获取根节点代码:

 int findFather(int x){
if(father[x] == x)
return x;
else
return findFather(father[x]);
}

判断是否属于同一集合代码:

 bool judge(int x,int y){
int fx,fy;
fx = findFather(x);
fy = findFather(y);
return fx==fy;
}

合并不同元素到同一集合代码:

 void unionSet(int x,int y){
x = findFather(x);
y = findFather(y);
father[x] = y;
}

3、优化1——路径压缩

思想

每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快;

步骤

(1)找到根节点;

(2)修改查找路径上的所有结点,将他们都指向根节点;

例如查找下面并查集中的“20”,“9,10,20”均在查找路径上,则进行路径压缩

带路径压缩的查找算法代码

 int findFather(int x){
int r = x;
//get the root of x
while(father[r] != r)
r = father[r];
int i=x;
//update the nodes in searching path
while(i != r){
j = father[i];
father[i] = r;
i = j;
}
return r;
}

4、优化2-合并

思想

两个集合合并,也就是2棵树合并,为了降低合并后的树的深度,一般采取将深度小的树的树根作为深度大的树的树根的孩子节点。

策略

增加辅助空间记录树的深度。

合并代码:

 void unionSet(int x,int y){
x = findFather(x);
y = findFather(y);
if(x == y)
return ;
if(rank[x] > rank[y]){
father[y] = x;
}else{
if(rank[x] == rank[y])
rank[y]++;
father[x] = y;
}
}

5、并查集例题

5.1、HDOJ1232(畅通工程)

http://www.cnblogs.com/CheeseZH/archive/2012/05/13/2498073.html

5.2、HDOJ1272(小希的迷宫)

http://www.cnblogs.com/CheeseZH/archive/2012/05/25/2518639.html

6、并查集练习题

(1)银河英雄传说(NOI2002)

(2)食物链(NOI2001)

(3)Parity(ceoi99)

ZH奶酪:【数据结构与算法】并查集基础的更多相关文章

  1. 模板——最小生成树kruskal算法+并查集数据结构

    并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...

  2. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  3. 数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法

    算法复杂度主方法 有时候,我们要评估一个算法的复杂度,但是算法被分散为几个递归的子问题,这样评估起来很难,有一个数学公式可以很快地评估出来. 一.复杂度主方法 主方法,也可以叫主定理.对于那些用分治法 ...

  4. 数据结构和算法(Golang实现)(9)基础知识-算法复杂度及渐进符号

    算法复杂度及渐进符号 一.算法复杂度 首先每个程序运行过程中,都要占用一定的计算机资源,比如内存,磁盘等,这些是空间,计算过程中需要判断,循环执行某些逻辑,周而反复,这些是时间. 那么一个算法有多好, ...

  5. 近期公共祖先(LCA)——离线Tarjan算法+并查集优化

    一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...

  6. BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1123  Solved: 408 题目连接 http://w ...

  7. POJ1861 Network (Kruskal算法 +并查集)

    Network Description Andrew is working as system administrator and is planning to establish a new net ...

  8. [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树

    可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...

  9. 【HDU1232】畅通工程(并查集基础题)

    裸敲并查集,很水一次AC #include <iostream> #include <cstring> #include <cstdlib> #include &l ...

随机推荐

  1. 【洛谷】2324:[SCOI2005]骑士精神【IDA*】

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  2. Codeforces Round #248 (Div. 1) B. Nanami's Digital Board 暴力 前缀和

    B. Nanami's Digital Board 题目连接: http://www.codeforces.com/contest/434/problem/B Description Nanami i ...

  3. UVA 10177 Sqr/Rects/Cubes/Boxes?

    Problem J (2/3/4)-D Sqr/Rects/Cubes/Boxes? Input: standard input Output: standard output Time Limit: ...

  4. 《学习OpenCv》 笔记(1)

    P1-P17 废话 可跳过 不过讲了如何搭建环境,如果你没有搭建的话,可以查看我的另外一个博文,详细讲了如何构建OpenCv的编程环境 P19 开始编写第一个代码

  5. 通过IP获取所在城市

    <script type="text/javascript"> var map = new BMap.Map("allmap"); var poin ...

  6. linux基础环境部署

    Content 0.序 1.更新安装库 2.安装基础库 0.序 本文主要是记录php在 Centos下的安装配置 .文中如无特别说明.表示php-5.6.31代码目录. 1.更新安装库 $ yum u ...

  7. Git_远程仓库

    到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就有了,没看出Gi ...

  8. 使用DataGridView进行增删改查,并同步到数据库

    DataGridView控件具有极高的可配置性和可扩展性.它提供有大量的属性.方法和事件,能够用来对该控件的外观和行为进行自己定义.以下通过一个小样例来展示DataGridView进行增删改查,并同步 ...

  9. Microsoft Composition (MEF 2)

    This packages provides a version of the Managed Extensibility Framework (MEF) that is lightweight an ...

  10. Unity的界面排版: RectTransform

    看Unity3D文档像看国内教课书一样,一些概念,不懂的时候看还是不懂,明白了以后再看,好像也没有说错.好几个做Unity3D的朋友跟我吐槽过U3D的文档质量,相比Apple贴心的技术文档相去甚远. ...