并查集

并查集是一种多叉树,用于处理一些不相交集合的合并与查询问题。

初始化

每个结点单独作为一个集合。

查询

求元素所在集合的代表元素,即根结点。

合并

将两个元素所在的集合合并为一个集合。

合并之前,应先判断两个元素是否属于同一集合,用上面的查询来实现。

实现流程

动态集合中每一个元素由一个对象来表示,设x表示一个对象,并查集的实现需要如下操作:

MAKE(X)

建立一个新的集合,由于各集合是分离的,要求x没有在其他集合中出现过。

UNION(X,Y)

将包含x和y的动态集合合并为一个新的集合,假定在此操作前这两个集合是分离的。

所得集合的代表是Sx∪Sy的某个成员。

FIND(X)

返回包含x的集合的代表。

路径压缩

将元素的父亲指针全部指向根节点。

总结

初始化,

for(i=1;i<=n;i++)father[i]=i;

每个元素属于单独的一个集合,以自己作为根结点。

寻找根结点编号并压缩路径,

int find(int x){ 
	if(father[x]!=x) 
   father[x]=find(father[x]);
   return father[x];
   }

合并两个集合,

void unionn(int x,int y){
	x=find(x);
	y=find(y);
	father[y]=x; 
	}

判断元素是否属于同一集合,

bool judge(int x,int y){
	x=find(x);
   y=find(y);
   if(x==y)  
		return true;
	else 
		return false;
	}

并非原创,仅是整理,请见谅

posted @ 2022-05-27 17:39  Audrey_Hall  阅读(54)  评论(0)    收藏  举报