并查集

并查集的定义
并查集是一种维护集合的数据结构。
支持合并和查找两个操作。
合并:合并两个集合
查找:判断两个元素是否在一个集合
并查集的实现
用一个数组 int father[N];
father[i]表示元素i的阜新节点。
father[i] = i 表示元素i为该集合的根结点,但对同一个集合来说只存在一个根节点,并将其作为所属集合的标识
例如:

father[1] = 1 //1是根节点
father[2] = 1 // 1是2的父亲结点
father[3] = 2 // 2是3的父亲结点
father[4] = 2 // 2是4的父亲结点

fatehr[5] = 5 //5是根结点
father[6] = 5 // 5是6的父亲结点

上例有两个集合,分别是以1和5为根结点的
并查集的基本操作
1.初始化

int father[N+1];
for(int i = 1;i <= N; i++){
	father[i] = i;
}

2.查找
查找操作就是对给定的结点寻找根结点的过程
递推代码:

//findFather函数返回元素x所在集合的根结点
int findFather (int x){
	while(x != father[x]){
		x = father[x];
	}
	return x;
}

递归实现:

int findFather(int x){
	if(x==futher[x]) return x;
	else return findFather(futher[x]);
}

3.合并
把一个集合的根结点的父亲指向另一个集合的根结点

void Union(int a, int b) {
	int faA = findFather(a);
	int faB = findFather(b);
	if(faA != faB){
		father[faA] = faB;
	}
}

一个重要性质:并查集产生的每一个集合都是一棵树
含路径压缩的代码

int find(int x){
   return x == fa[x] ? x : fa[x] = find(fa[x]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值