并查集算法(超好理解)

并查集是一种数据结构,用于处理元素分组问题。主要功能包括合并集合和查询元素是否属于同一集合。本文通过实例介绍了如何使用并查集,包括合并操作和查询操作,并提供了相关编程题目的描述和输入输出样例,帮助读者深入理解并查集的工作原理。
摘要由CSDN通过智能技术生成

所谓并查集算法,就是用于解决一些元素分组的问题。它管理一系列不相交的集合,并查集一般有两种功能:
合并(Union):把两个不相交的集合合并为一个集合。
查询(Find):查询两个元素是否在同一个集合中。

这样说大家可能还是有点不太理解,通俗的来讲,就是来判断多个节点之间是否有相同的根节点,如果没有相同的根节点,那就说明他们之间不是同一组数据,也就是说他们之间没有一个路径可以相互到达
如下图中:
在这里插入图片描述
B,D,E有相同的根节点A,那就说明他们是同一组元素,也就说明他们之间可以相互到达(图像中的箭头只是说明其父亲节点,图本身为无向图),右图也是同理。
那么如果我想将A组和H组合并该怎么办呢,相信聪明的你已经知道了,那就是将A变成H的根节点,或者将H变成A的根节点,如下图所示:
在这里插入图片描述
这样的话是不是就变成了同一组元素了?
结合题目和代码,相信大家一定能掌握这个算法。
首先声明一下,parent数组和rank数组
1.
parent数组用于存放该元素的父亲节点的下标,如下图中:首先将数组元素全置为-1,如果该元素没有父亲节点,就为-1,比如1元素,当有父亲节点时,比如4的父亲节点是2,那么parent【4】=2;

在这里插入图片描述
2.
rank数组用来存放当前树的高度,引入该数组就是为了让树的高度小一些,这样程序的运行速率更快。

来看第一个模板题:
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式
第一行包含两个整数 N,M,表示共有 N 个元素和 M 个操作。
接下来 M 行,每行包含三个整数 z,x,y
当z=1时,将x与y所在的集合合并
当z=2时,输出x与y是否在同一个集合中,是的输出 Y ;否则输出 N
输入输出样例
输入
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出
N
Y
N
Y

#include<bits/stdc++.h>
using namespace std;
const int maxa=1e4+10;
int parent[maxa];
int rank[maxa];

int find_root(int x)//找x节点的根节点,当parent[x]不是-1,就说明他有父亲节点,则继续向上查找.
{
   
	int x_root=x;
	while(parent[x_root]!=-1)
	{
   
		x_root=parent[x_root];
	}
	return x_root;
}

int unio(int x,int y,int rank[])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值