实现并查集需要什么?
1.一个存储每个元素父亲的容器
2.一个查询每个元素祖先的函数
3.一个为元素添加祖先的函数
操作步骤
1.首先对pre容器进行初始化操作
使每个元素的祖先都是它自己,或者都初始化为-1
for(int i = 0 ;i <= pre.size()-1 ; i ++)
pre[i] = i;
2.查找某一个元素的祖先的函数实现
int find(int x)
{
while(pre[x] != x) // 循环找到顶
x = pre[x];
return x;
}
3.为元素添加祖先的函数的实现
void join(int x , int y)
{
int fx=find(x), fy=find(y); //先看看两个元素是不是同一个祖先的
if(fx != fy)
pre[fx]=fy; //不是的话就将两个元素串起来
}
并查集的优化 : 路径压缩(使每个元素的祖先是最年长的祖先)
int find(int x) //查找结点 x的根结点
{
if(pre[x] == x) return x; //递归出口:x的上级为 x本身,即 x为根结点
return pre[x] = find(pre[x]); //此代码相当于先找到根结点 rootx,然后pre[x]=rootx
}