弄懂并查集

本文详细介绍了并查集的概念及其实现过程,包括数据成员的初始化、find操作的路径压缩以及union操作的细节。通过并查集可以高效地处理集合合并问题,优化后的并查集在find和union操作中提升了性能。
摘要由CSDN通过智能技术生成

朋友圈

[M]

#并查集 详解并查集具体实现过程


力扣

并查集可以整合为一个struct

  • 数据成员: + parent【n】 + size【n】优化并查集时间:表示以i为节点的并查集的size===优化:将小size union 到大size上= + help【n】在find时记录结点路径上所有的结点:进行路径压缩 + number 表示有多少个并查集 注意初始化成员
public:
	int parent[n];
	int size[n];
	int help[n];
	int number=n;
	u(){
		for (int i = 0; i < n; i++) {
			parent[i] = i;
			size[i] = 1;
		}
	}
	u(){}
  • 成员函数: + find:找到根结点,同时进行路径压缩 
	int  find(int i) {
		int m = 0;
		while (parent[i] != i) {
			help[m++] = i;
			i = parent[i];
		}
		for (int k = m; k >= 0; k--)
			parent[help[k]] = i;//注意这里是help
		return i;
	}

  • union整合两个结点​
void unio(int i, int j) {
		int m = find(i); int n = find(j);
		if (find(i) != find(j)) {
			if (size[m] >= size[n]) {
				parent[n] = m;
				size[m] += size[n];
			}
			else {
				parent[m] = n;
				size[n] += size[m];
			}
		}
		number--;注意number改变
	}

最后根据题意返回数据即可

​​​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值