并查集c++实现代码

简介

前置知识:树

并查集(Union-Find Set),也被称为不相交集合数据结构,是一种非常高效的数据结构,主要用于处理一些不相交集合的合并及查询问题。它在解决图的连通分量、最小生成树等问题时尤为重要。

并查集是由一片森林组成的,每棵树都是并查集的一个连通块。

操作

  • 合并,合并两个节点所在的集合
  • 查询,查询该节点的根节点

C++实现

简约数组风格实现

#include <iostream>
#define MAXN 100005
int parent[MAXN];   //记录父亲节点


int find(int x)
{
	if(parent[x]!=x)
	{
		parent[x] = find(parent[x]); //顺带压缩路径
	}
	return parent[x];
}

void unionset(int x, int y) //合并x所在集合和y所在集合
{
	x = find(x);
	y = find(y);
	if(x==y) {return ;}
	parent[x] = y; 
}

int main()
{
	int n;
	std::cin>>n;
	for(int i = 0; i<n; i++)
	{
		parent[i] = i; //初始化parent数组
	}
}

类风格实现

#include <iostream>
#include <vector>

class dsu{
public:
	std::vector<int> parent;

	dsu(int size): parent(size) {
		for(int i = 0; i<size; i++)
		{
			parent[i] = i;  //通过构造函数初始化
		}
	}
	int find(int x)
	{
		if(parent[x]!=x)
		{
			parent[x] = find(parent[x]);
		}
		return parent[x];
	}
	void unionset(int x, int y)
	{
		x = find(x); y = find(y);
		if(x==y) {return ;}
		parent[x] = y;
	}
};

int main()
{
	int n;
	std::cin>>n;
	dsu set(n);     //实例化
	int x,y;
	std::cin>>x>>y;
	set.unionset(x, y); //合并
}

补充

除此之外还可以维护并查集中连通块的大小等等信息,可以自行添加数组,并且修改unionset等函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值