首页 > 其他 > 详细

并查集

时间:2020-06-09 22:45:39      阅读:54      评论:0      收藏:0      [点我收藏+]

并查集是一种用来管理元素分组情况的数据结构,并查集可以高效的进行如下操作。

●  查询元素a和元素b是否属于同一组。

●  合并元素a和元素b所在的组。

首先初始化,n个节点来表示n个元素,最开始没有边

void init(int n){
	for(int i=1;i<=n;i++){
		par[i]=i;
		rank[i]=0;
		
	}

 接着需要查询树的根,我们知道per[son]=father,其中son是子节点,father是父节点,我们用per[i]指向的是其父节点,其中根节点per[root]==root。

int find(int x){
	if(par[x]==x) return x;
	else return par[x]=find(par[x]);\\进行状态压缩
}

 然后我们可以对不同集合进行合并,对于每棵树,记录这棵树的高度(rank),合并时rank小的连相rank大的边。

void unite(int x,int y){
	x=find(x);
	y=find(y);
	if(x==y) return ;
	else{
		if(rank[x]<rank[y]){
			par[x]=y;
		}else{
			par[y]=x;
			if(rank[x]==rank[y])	rank[x]++;
		}
	}
}

 在此我们可以通过find()返回的根节点可知,若返回的根节点一样,则再同一集合,反之,不再同一集合

bool same(int x,int y){
	return find(x)==find(y);
}

 

并查集

原文:https://www.cnblogs.com/kksk/p/13081240.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!