并查集

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

●  查询元素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);
}

 

posted @ 2020-06-09 22:09  高级牛头人  阅读(167)  评论(0编辑  收藏  举报