蓝桥杯出现过的基本算法---并查集

由于最近需要准备蓝桥杯的c++组比赛,所以特地整理出了一些在蓝桥杯中出现的算法,方便复习

并查集

1. 作用

在遇到一道题之后,我该如何判断该题需要使用到并查集呢?
首先我们应该先了解这个并查集是干什么的:
并查集是一种树形数据结构,用于处理一些不相交集合的合并及查询问题。也就是说,当题目中出现让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这个时候我们往往就需要考虑构建并查集。

2. 基本操作

并查集的基本操作有两种:1. 合并 2. 查询
合并即合并并查集中的两个集合,查询即查询任意并查集中的元素的所属集合。

3. 具体实现

首先我们需要创建一个并查集,建立一个数组:pre[]表示并查集 ,同时pre[i]表示元素i的父节点注意是父节点。
接下来我们需要对并查集进行初始化,由于每一个点就是一个集合,因此初始化的时候父节点就是自己本身。
然后我们进行查询操作,让每一个节点不断寻找自己的父节点,若此时自己的父节点就是自己,那么该节点为集合的根节点,返回该节点。
最后我们进行修改操作,合并两个集合,也就是合并两个集合的根节点,即pre[a] = b,其中a和b是两个元素的根节点。

4. 代码实现

初始化的模板:

for(int i = 1;i <= n;++i) pre[i] = i;

查询的模板

int Find(int a)
{
	while(a != root[a])
	{
		a = root[a];
	}
	return a;
} 

合并的模板:

void merge(int x,int y)
{
	int fx = Find(x);
	int fy = Find(y);
	if(fx != ft) root[fx] = fy;
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值