并查集
什么是并查集
并查集是一种管理数据所属集合的数据结构,用于处理不相交集合之间的合并(Union)和查询(Find)操作。
- 合并(Union):合并两个元素所属集合。通常是将一个元素的根节点连接到另一个元素的根节点上来实现。
- 查询(Find):查询某个元素所属集合,即查询某个元素的根节点。通常用来判断两个元素是否属于同一个集合。
初始化
初始的时候,每个元素都位于单独的集合,用元素自己作为根节点的父亲。
点击查看代码
int n;
vector<int> set(n);
for(int i = 0;i<n;i++)set[i] = i;
查询
当元素的根节点的父亲为自己时,找到查询元素所在集合的根节点。
点击查看代码
int find(int x)
{
while(set[x]!=x)
x = set[x];
return x;
}
合并
执行合并操作,需要将一个元素所在集合的根节点连接到另一个元素的根节点上。
点击查看代码
void unite(int a, int b)
{
if(find[a]==find[b])return;
set[find(a)] = find(b);
}
优化
为了提高效率,并查集通常会使用两种优化技术。
路径压缩
在查找的过程中,将经过的节点都连接到当前集合的根节点。

在需要频繁查找的场景下,路径压缩可以大大提高效率,但会造成节点大量修改。
点击查看代码
int find(int x)
{
if(set[x]!=x)
set[x] = find(set[x]);
return set[x];
}
启发式合并
合并时,选择节点较少的树或深度较小的树连接到另一颗树。
点击查看代码
void unite(int x, int y)
{
x = find(x),y = find(y);
if(x == y)return;
if(size[x] < size[y]) swap(x,y);
set[y] = x;
size[x] += size[y];
}
浙公网安备 33010602011771号