并查集(Disjoint Set)

news2024/9/24 17:55:58

目录

1.定义

2.初始化

3.查找

4.合并

4.1.按秩合并(启发式合并)

5.例题

题目描述

输入格式

输出格式

输入输出样例

说明/提示


1.定义

并查集,也称为不相交集合数据结构,是一种用于管理元素分组以及查找元素所属组的数据结构。

在并查集中,每个集合通常用一棵树来表示,其中树的根节点代表集合的代表元素。通过查找操作可以找到元素所属的集合,而通过合并操作可以将两个集合合并为一个集合。

顾名思义,并查集支持两种操作:

  • 合并(Union):合并两个元素所属集合(合并对应的树)
  • 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合

并查集在经过修改后可以支持单个元素的删除、移动;使用动态开点线段树还可以实现可持久化并查集。

注意:并查集无法以较低复杂度实现集合的分离。

2.初始化

用一个数组dsu[x]来存x的父节点。

例如:

此时dsu[1] = 1,dsu[6]=3等;

初始时,每个元素都位于一个单独的集合,表示为一棵只有根节点的树,方便起见,最开始每个元素的父节点为自己。

void init(int* fa) {
	for (int i = 1; i <= N; i++)fa[i] = i;
}

3.查找

根节点时集合的代表,查找就是找到元素所在集合的根。

1.如果父节点等于自己,则找到了根并返回。
2.如果还没找到根,则继续递归查找。

int find(int x) {
	if (fa[x] == x) return x;
	return find(fa[x]);
}

如果链式很长这种查找会很耗时,我们可以在返回的同时,将fa[x]的值修改为根节点,即将各节点的父节点都修改为根节点,也叫带路径的查找(路径压缩),这样可以加快以后的查找进程。

int find(int x) {
	if (fa[x] == x) return x;
	return fa[x] = find(fa[x]);
}

4.合并

把一个集合的根节点指向另一个集合的根节点。

void unionset(int x, int y) {//将x的根节点指向y的根节点
	fa[find(x)] = find(y);
}

在并查集中,将小集合的根节点指向大集合的根节点是一种优化策略,通常结合了按秩合并的思想。这个优化策略有助于保持并查集的平衡性,避免树过深,从而提高查找和合并操作的效率。以下是这种优化策略的一些优点:

  1. 平衡性: 将小树合并到大树上可以保持并查集的平衡性。通过始终将高度较小的树合并到高度较大的树上,可以避免出现极端情况下树的高度过高,从而降低了查找操作的时间复杂度。

  2. 减小树的高度: 通过将小树合并到大树上,可以减小整个并查集中树的高度。较低的树高度意味着在进行查找操作时需要遍历的节点数量更少,提高了查找操作的效率。

  3. 降低时间复杂度: 通过维护平衡的树结构,查找和合并操作的平均时间复杂度可以更接近于O(1),提高了整体的操作效率,减小树的高度可以减少下一次查询时的递归次数。

  4. 避免退化: 如果不进行优化,当按照树的深度进行合并时,可能会出现树的退化情况,即树的高度过高,导致操作的效率下降。

4.1.按秩合并(启发式合并)

把小集合的根节点指向大集合的根节点。

void unionset(int x, int y) {
	x = find(x);
	y = find(y);
	if (x == y)return;//在同一个集合不用合并
	if (siz[x] > siz[y])swap(x, y);//如果x的大小大于y的大小,交换,让x表示大集合,y表示小集合
	fa[x] = y;//再将x指向y
	siz[y] += siz[x];
}

算法竞赛按秩合并不常用,因为路径压缩足够好了,不用再用空间换时间。

5.例题

洛谷:P3367 【模板】并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。

接下来 M 行,每行包含三个整数 Z_{i},X_{i},Y_{i} 。

当 Z_{i} = 1 时,将 X_{i}​ 与 Y_{i} 所在的集合合并。

当 Z_{i} = 2 时,输出 X_{i}Y_{i} 是否在同一集合内,是的输出 Y ;否则输出 N 。

输出格式

对于每一个 Z_{i} = 2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。

输入输出样例

输入 #1复制

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

输出 #1复制

N
Y
N
Y

说明/提示

对于 30% 的数据,N≤10,M≤20。

对于 70% 的数据,N≤100,M≤10^{3}

对于 100% 的数据,1≤N≤10^{4},1≤M≤2×10^{5},1≤X_{i}​,Y_{i}≤N,Z_{i}∈{1,2}。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10001;
int fa[N];
int find(int x) {
	if (fa[x] == x) return x;
	return fa[x] = find(fa[x]);
}
void unionset(int x, int y) {
	fa[find(x)] = find(y);
}
void f(int x, int y) {
	if (find(x) == find(y))cout << "Y" << endl;
	else cout << "N" << endl;
}
void solve() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) fa[i] = i;
	int z, x, y;
	while (m--) {
		cin >> z >> x >> y;
		if (z == 1) {
			unionset(x, y);
		}
		else f(x, y);
	}
}
int main() {
	ios::sync_with_stdio;
	cin.tie(0);
	cout.tie(0);
	solve();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Julia语言中的元编程

在 Julia 语言中&#xff0c;元编程&#xff08;Metaprogramming&#xff09;可以生成或操作其他代码。这种技术允许程序员在编译时或运行时动态地创建、修改或分析代码&#xff0c;从而增强语言的功能和灵活性&#xff0c;以宏&#xff08;Macros&#xff09;、表达式和符号&a…

【python报错】Intel MKL FATAL ERROR: Cannot load mkl/../../../libmkl_rt.so.2.

python报错&#xff1a; Intel MKL FATAL ERROR: Cannot load mkl/../../../libmkl_rt.so.2.在切换旧版numpy版本的时候&#xff0c;出现了这个报错&#xff0c;表现就是将numpy切换到<1.24的版本的时候&#xff0c;只要import numpy就弹出以上报错。 尝试了网上的各种方法…

【Go语言】Go语言中的流程控制

Go语言中的流程控制 流程控制主要用于设定计算执行的顺序&#xff0c;简历程序的逻辑结果&#xff0c;Go语言的流程控制语句与其他语言类似&#xff0c;支持如下几种流程控制语句&#xff1a; 条件语句&#xff1a;用于条件判断&#xff0c;对应的关键字有if、else和else if&a…

STM32-ADC一步到位学习手册

1.按部就班陈述概念 ADC 是 Analog-to-Digital Converter 的缩写&#xff0c;指的是模拟/数字转换器。它将连续变量的模拟信号转换为离散的数字信号。在 STM32 中&#xff0c;ADC 具有高达 12 位的转换精度&#xff0c;有多达 18 个测量通道&#xff0c;其中 16 个为外部通道&…

搜索算法(算法竞赛、蓝桥杯)--DFS单词接龙

1、B站视频链接&#xff1a;B20 DFS 单词接龙_哔哩哔哩_bilibili 题目链接&#xff1a;[NOIP2000 提高组] 单词接龙 - 洛谷 #include <bits/stdc.h> using namespace std; const int N25; int n,ans; int used[N];//每个单词的使用次数 string word[N];void dfs(string…

姓名若有孤寡数,极不利婚姻!

易经云“同声相应&#xff0c;同气相求”&#xff0c;一个人的名字会形成一个磁场&#xff0c;在个人的生活当中会影响到自己的方方面面&#xff0c;如运势、事业工作、桃花运等&#xff0c;同时也会影响自己的感情婚姻哦。 峰民曾经在办公室接待了一位女士&#xff0c;看了她…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题&#xff08;十分十分的巧妙&#xff09;&#xff1a; 显然我们应该一行一行放&#xff0c;又竖的会对下一行产生影响&#xff0c;我们令横着放为0&#xff0c;竖着放的上方为1. 对于下一行&#xff0c;前一行放1的下面为0&#xff0c;但是会出现…

C++:内存管理|new和delete

创作不易&#xff0c;感谢三连支持&#xff01; 一、内存分布 为什么需要内存管理呢&#xff1f;&#xff1f;因为我们在程序的运行过程中会需要各种各样的数据&#xff0c;而我们根据数据的不同存储在不同的区域里面&#xff0c;是为了更高效地处理数据。而C语言相比Java来说…

知识图谱1——neo4j

2024年要搞知识图谱&#xff0c;因此没有办法&#xff0c;只能将我之前固守的JDK1.8&#xff0c;升级到JDK21&#xff0c;因为JDK21也是LTS版本&#xff0c;neo4j高版本就不支持JDK8&#xff0c;因此没有办法&#xff0c;只有升级了。写这篇只是一个搭建笔记&#xff0c;我的初…

【Qt学习】QSpinBox 与 QDateTimeEdit 控件 的介绍与实例()

文章目录 QSpinBox1.1 介绍1.2 实例使用 - &#xff08;模拟点餐-功能扩充&#xff09;1.3 资源文件 2. QDateTimeEdit2.1 介绍2.2 使用&#xff08;计算时间差值 / 间隔&#xff09;daysTo() 与 secsTo() 2.3 资源文件 QSpinBox 1.1 介绍 对于QSpinBox&#xff0c;我们可以查…

OSI七层模型/TCP四层模型

协议&#xff1a; 协议是双方共同指定的一组规则&#xff0c;在网络通信中表示通信双方传递数据和解释数据的一组规则。 从A上传文件到服务器B,需要在A和B之间制定一个双方都认可的规则&#xff0c;这个规则就叫文件传输协议&#xff0c;该协议是ftp协议的一个初级版本&#…

JavaScript练手小技巧:一文看懂<script>标签的 ansyc 和 defer

<script>标签的 ansyc 和 defer 属性。只对外部加载 JS 文件有效。 <script src"js/app.js" async></script> <script src"js/app.js" defer></script> 普通加载 js&#xff08;同步加载&#xff09;&#xff1a;会打断 …

uview2中上传文件和若依前后端分离配合的代码

uview2中的上传文件需要配合着自己后端的上传的代码 uview2 代码&#xff1a; uploadFilePromise(url) {return new Promise((resolve, reject) > {// 后续自己封装let a uni.uploadFile({//自己的请求路径url: that.$baseURL /uploadAvater, //上传的文件filePath: tha…

leetcode hot100 每日温度

在本题中&#xff0c;我们是通过单调栈来解决的&#xff0c;因为我们采用了栈的数据结构&#xff0c;并且&#xff0c;栈内存储的元素是单调的。 本题我们考虑&#xff0c;将气温数组元素的下标存入栈中&#xff0c;首先初始化要把0放入&#xff0c;0是下标的意思。然后我们拿…

诊所门诊电子处方软件操作教程及试用版下载,医务室处方笺管理系统模板教程

诊所门诊电子处方软件操作教程及试用版下载&#xff0c;医务室处方笺管理系统模板教程 一、前言 以下软件程序教程以 佳易王诊所电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;点击基本信息设置——处方配…

【JavaEE进阶】 代理模式

文章目录 &#x1f343;前言&#x1f38b;什么叫代理模式&#x1f334;静态代理&#x1f38d;动态代理&#x1f6a9;JDK动态代理&#x1f6a9;CGLIB动态代理 ⭕总结 &#x1f343;前言 前面对Spring AOP的详细使用进行了介绍&#xff0c;这篇博客博主将详细讲解一下Spring AOP…

使用统一功能完善图书管理系统

目录 一、前提 二、实现强制登陆传统方式 三、拦截器 1、概念 2、拦截器 &#xff08;1&#xff09;定义拦截器 &#xff08;2&#xff09;注册拦截器 &#xff08;3&#xff09;运行 3、使用拦截器实现强制登陆 4、DispatcherServlet源码解析 四、适配器模式 1、适…

深入剖析k8s-控制器思想

引言 本文是《深入剖析Kubernetes》学习笔记——《深入剖析Kubernetes》 正文 控制器都遵循K8s的项目中一个通用的编排模式——控制循环 for {实际状态 : 获取集群中对象X的实际状态期望状态 : 获取集群中对象X的期望状态if 实际状态 期望状态 {// do nothing} else {执行…

协议-http协议-基础概念03-http状态码-http特点-http性能-压缩和分块传输-范围请求

参考来源&#xff1a; 极客时间-透视HTTP协议(作者&#xff1a;罗剑锋)&#xff1b; 01-状态码分类 开头的 Version 部分是 HTTP 协议的版本号&#xff0c;通常是HTTP/1.1&#xff0c;用处不是很大。后面的 Reason 部分是原因短语&#xff0c;是状态码的简短文字描述&#xff…

【计算机网络_应用层】TCP应用与相关API守护进程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 相关使用接口2. 代码实现2.1 日志组件2.2 Server端2.3 Client端2.3 bug解决 3. 守…