并查集是一种维护集合的数据结构
支持以下两个操作:
①合并
②查找
基本操作:
1、初始化
一开始,每个元素都是独立的一个集合,因此需要令所有father[i]等于i
for(int i=1;i<=N;i++)
{
father[i]=i;
}
2、查找
由于规定同一个集合中只存在一个根结点,因此查找操作就是对
给定的结点寻找其根结点的过程
int findFather(int x)
{
while(x!=father[x])
{
x=father[x];
}
return x;
}
递推
递归
int findFather(int x)
{
if(x==father[x])
return x;
else
return findFather(father[x]);
}
3、合并
①判断是否属于同一集合
②吧一个根结点的父亲指向另一根结点
【一个性质】
在合并的过程中,只对两个不同的集合进行合并,如果两个元素在
相同的集合中,就不会对它们进行操作
这就保证了在同一个集合中一定不会产生环
即并查集产生的每一个集合都是一棵树
3、路径压缩
int findFather(int x)
{
int a=x;
while(x!=father[x])
{
x=father[x];
}
while(a!=father[a])
{
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
int findFather(int v)
{
if(v==father[v])
return v;
else
{
int F=findFather(father[v]);
father[v]=F;
return F;
}
}