简介
前置知识:树
并查集(Union-Find Set),也被称为不相交集合数据结构,是一种非常高效的数据结构,主要用于处理一些不相交集合的合并及查询问题。它在解决图的连通分量、最小生成树等问题时尤为重要。
并查集是由一片森林组成的,每棵树都是并查集的一个连通块。
操作:
- 合并,合并两个节点所在的集合
- 查询,查询该节点的根节点
C++实现
简约数组风格实现
#include <iostream>
#define MAXN 100005
int parent[MAXN]; //记录父亲节点
int find(int x)
{
if(parent[x]!=x)
{
parent[x] = find(parent[x]); //顺带压缩路径
}
return parent[x];
}
void unionset(int x, int y) //合并x所在集合和y所在集合
{
x = find(x);
y = find(y);
if(x==y) {return ;}
parent[x] = y;
}
int main()
{
int n;
std::cin>>n;
for(int i = 0; i<n; i++)
{
parent[i] = i; //初始化parent数组
}
}
类风格实现
#include <iostream>
#include <vector>
class dsu{
public:
std::vector<int> parent;
dsu(int size): parent(size) {
for(int i = 0; i<size; i++)
{
parent[i] = i; //通过构造函数初始化
}
}
int find(int x)
{
if(parent[x]!=x)
{
parent[x] = find(parent[x]);
}
return parent[x];
}
void unionset(int x, int y)
{
x = find(x); y = find(y);
if(x==y) {return ;}
parent[x] = y;
}
};
int main()
{
int n;
std::cin>>n;
dsu set(n); //实例化
int x,y;
std::cin>>x>>y;
set.unionset(x, y); //合并
}
补充
除此之外还可以维护并查集中连通块的大小等等信息,可以自行添加数组,并且修改unionset等函数