并查集学习笔记

并查集是一种用来管理数据分组状况的数据结构,可以进行合并操作,但无法进行分割。
并查集的结构
并查集也是用树形结构来实现的,但不是二叉树。每个数据,元素对应一个节点,每个组对应一棵树。

并查集的实现

并查集有几个基本操作初始化、查询树的根、合并x,y所属集合、判断x,y是否属于同一集合。

查询是查询树的根节点,两个数的根有共同的根节点,说明两个数属于同一组。

合并就是将一个树的根向另一个树的根连边,两棵树就变成一棵,两个组就合并成一个组了。

为了使并查集更加高效,采用一种路径压缩的方法,每次查询之后,若这个节点能找到根节点,那么就将这个节点直接连接到根节点。 


具体实现代码:

int par[MAX_N];//父亲结点 
int rank[MAX_N];//树的高度 
//初始化n个元素 
void init(int n){
	for(int i=0;i<n;i++){
		par[i]=i;
		rank[i]=0;
	}
}
//查找根节点 
int find(int x){
	if(par[x]==x)
		return par[x];
	else
		return par[x]=find(par[x]);
}
//合并X和Y所属的集合 
void unite(int x,int y){
	x=find(x);
	y=find(y);
	if(x==y)
		return;
	if(rank[x]<rank[y]){
		par[x]=y;
	}
	else{
		par[y]=x;
		if(rank[x]==rank[y])
			rank[x]++;
	}
}
//判断两个节点是否属于同一集合 
bool same(int x,int y){
	if(find(x)==find(y))
		return true;
	else
		return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值