并查集是一种树形的数据结构,用于处理一些不相交集合的合并及查询问题。
主要操作:
(1)初始化:将每个点所在集合初始化为其自身;
(2)查找操作:查找元素所在集合,即查找根节点;
(3)合并操作:将两个元素所在集合合并为一个集合(根节点相连);
合并操作图解:
现有四个集合(这里以节点权值最小的作为根节点)如下:
将集合1和集合2合并,集合3和集合4合并:
查找操作图解:
路径压缩(优化:每查找一个节点的根节点时,将该节点的父节点指向根节点):
模板函数:
const int MAXN = 10005;
int f[MAXN];
void Init(int n)//初始化并查集
{
for(int i=0;i<=n;i++)
f[i]=i;
}
int Find(int x)//查找根节点
{
if(x==f[x])
return x;
return f[x]=Find(f[x]);//路径压缩
}
void Union(int x,int y)//合并x和y所在集合
{
x=Find(x);
y=Find(y);
if(x==y) //根节点相同说明已经在同一集合,无需操作
return;
if(x<y) //把权值小的根节点作为合并后的根节点
f[y]=x;
else
f[x]=y;
}