导航

并查集

Posted on 2022-06-21 23:21  wuqiu  阅读(15)  评论(0编辑  收藏  举报

实现并查集需要什么?

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 
}

并查集的实际应用