算法笔记之并查集

Posted FHenryh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记之并查集相关的知识,希望对你有一定的参考价值。

并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。

一、并查集的定义

并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。

并查集,顾名思义,支持以下两种操作操作:

  • 并(Union):把两个不相交的集合合并为一个集合。

  • 查(Find):查询两个元素是否在同一个集合中。

二、并查集的实现

并查集往往用树来存,使用 \\(f\\) 数组表示每个节点的父节点,初始 \\(f_i=i\\),即认自己为父亲,

那么我们就可以得到这样的一颗树:

查询

查询 \\(x\\) 的根节点就是找到其祖先。

int f[N];
int find(int x)

	if(f[x]==x)return x;
	return find(f[x]);

但这样会有一个问题:当数据很大时,树的深度会很高,所以我们需要压缩路径。

我们可以在查询的过程中,让 \\(x\\) 认自己的祖先为父亲,那么就可以大大缩小深度。

优化代码如下:

int f[N];
int find(int x)

	if(f[x]==x)return x;
	return f[x]=find(f[x]);

\\[这个人颓废去了,n年后再更 \\]

算法复习之并查集

并查集是一种以树结构建立的能够高效处理分组问题中合并,查找操作的数据结构

支持三种基本操作:建立,查询,合并

实现:

 1 #include<iostream>
 2 using namespace std;
 3 const int maxn=10000;
 4 int a[maxn],heigh[maxn],par[maxn];
 5 void init(int n)
 6 {
 7     for(int i=0;i<n;i++)
 8     {
 9             par[i]=i;
10             heigh[i]=1;
11     }
12 }
13 int findPar(int x)
14 {
15     if(x==par[x])
16     return x;
17     //递归求父亲,并直接连向根,路径压缩 
18     else
19     return par[x]=fin(par[x]);
20 }
21 void connect(int x,int y)
22 {
23     x=findPar(x);
24     y=findPar(y);
25     if(x==y)
26     return ;
27     //如果父亲不相等,比较高度,合并
28     if(heigh[x]<heigh[y])
29     {
30         par[x]=y;
31     } 
32     else{
33         par[y]=x;
34         if(heigh[x]==heigh[y])
35         heigh[x]++;
36     }
37 }

 

以上是关于算法笔记之并查集的主要内容,如果未能解决你的问题,请参考以下文章

算法(第四版)之并查集(union-find算法)

数据结构之并查集

hiho14 无间道之并查集图论--并查集

数据结构之并查集

0050数据结构之并查集

HDU 5652 图论之并查集