算法学习系列(十四):并查集

目录

  • 引言
  • 一、并查集概念
  • 二、并查集模板
  • 三、例题
    • 1.合并集合
    • 2.连通块中点的数量

引言

这个并查集以代码短小并且精悍的特点,在算法竞赛和面试中特别容易出,对于面试而言,肯定不会让你去写一两百行的代码,一般出的都是那种比较短的,而且还不好想考验思维的那种题,那并查集就将这两点全占了,所以重要性很大,而且竞赛的话也就是将多个知识点合并起来考察,这个也很可能成为一个点,所以话不多说就开始吧。

一、并查集概念

  • 并查集主要有两个作用:
    1.查询两个元素是否在同一集合中,时间复杂度近乎O(1)
    2.将两个集合合并

  • 初始化思路:首先有多个元素,它们最初每个集合只有它们自己,有个p[N]数组,p[i]代表 i 号结点的父结点的下标,p [i] = i

  • 合并思路:先查询它们各自的父结点a,b,然后让p [a] = b 意为a的父亲为b这样a所在的集合就与b所在的集合合并了,如下图所示
    在这里插入图片描述

  • 查询思路:查询自己的父结点是不是根结点,如果是返回,不是则继续递归再次查找父结点的父结点,最后返回根结点,这个是通过递归实现的,这里有个路径压缩的过程,就是最后一个是根结点就会返回,那么就把根结点赋给倒数第三层、第四层…,也就是让每一个结点都指向根结点,类似就是下图所示
    在这里插入图片描述

二、并查集模板

void init()
{for(int i = 1; i <= n; ++i) p[i] = i;
}int find(int x)  //查询编号为x的父结点
{if(p[x] != x) p[x] = find(p[x]);  //说明不是父结点,让当前结点指向父结点的父结点,也就是最终的根结点return p[x];  //返回父结点
}

三、例题

1.合并集合

一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m 个操作,操作共有两种:
M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;输入格式
第一行输入整数 n 和 m。
接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。输出格式
对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No。
每个结果占一行。数据范围
1≤n,m≤105输入样例:
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4输出样例:
Yes
No
Yes
#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;const int N = 1e5+10;int p[N];  //p[i]代表i的父节点的编号
int n, m;  //n个结点,m次询问void init()
{for(int i = 1; i <= n; ++i) p[i] = i;
}int find(int x)  //查询编号为x的父结点
{if(p[x] != x) p[x] = find(p[x]);  //说明不是父结点,让当前结点指向父结点的父结点,也就是最终的根结点 ,注意这里不能写成find(p[x])不然条件就一直没有变化return p[x];  //返回父结点
}int main()
{scanf("%d%d", &n, &m);init();while(m--){char op[2];int a, b;scanf("%s%d%d", op, &a, &b);if(!strcmp(op, "M")){a = find(a), b = find(b);  //找到a和b的根结点p[a] = b;  //让a指向b,意为a的父亲为b,那么a下的所有结点的父亲都是b}else{if(find(a) == find(b)) printf("Yes\n");  //如果两个结点的根结点相同,则在同一个集合else printf("No\n");}}return 0;
}

所有的用例都通过了
在这里插入图片描述
在这里插入图片描述

2.连通块中点的数量

给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。现在要进行 m 个操作,操作共有三种:
C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;
Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等;
Q2 a,询问点 a 所在连通块中点的数量;输入格式
第一行输入整数 n 和 m。
接下来 m 行,每行包含一个操作指令,指令为 C a b,Q1 a b 或 Q2 a 中的一种。输出格式
对于每个询问指令 Q1 a b,如果 a 和 b 在同一个连通块中,则输出 Yes,否则输出 No。
对于每个询问指令 Q2 a,输出一个整数表示点 a 所在连通块中点的数量每个结果占一行。数据范围
1≤n,m≤105输入样例:
5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5输出样例:
Yes
2
3
#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;const int N = 1e5+10;int p[N], cnt[N];  //来判断根结点所对应的集合的数量,只有根结点有意义
int n, m;int find(int x)
{if(x != p[x]) p[x] = find(p[x]);return p[x];
}int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i) p[i] = i;for(int i = 1; i <= n; ++i) cnt[i] = 1;while(m--){char op[5];int a, b;scanf("%s", op);if(!strcmp(op,"C")){scanf("%d%d", &a, &b);a = find(a), b = find(b);if(a == b) continue;p[a] = b;cnt[b] += cnt[a];}else if(!strcmp(op,"Q1")){scanf("%d%d", &a, &b);if(find(a) == find(b)) printf("Yes\n");else printf("No\n");}else{scanf("%d", &a);printf("%d\n", cnt[find(a)]);}}return 0;
}

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

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

相关文章

服务器的TCP连接限制:如何优化并提高服务器的并发连接数?

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列…

mysql基础-表操作

环境&#xff1a; 管理工具&#xff1a;Navicat 数据库版本&#xff1a;5.7.37 mysql的版本&#xff0c;我们可以通过函数&#xff0c;version()进行查看&#xff0c;本次使用的版本如下&#xff1a; 目录 1.管理工具 1.1创建表 1.2.修改表名 1.3.复制表 1.4.删除表 2…

python开发的app有哪些,python如何开发小软件

这篇文章主要介绍了python开发的app有哪些&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 Python 无处不在&#xff0c;可以说是现代的 C 编程语言&#xff0c;你可以在任何地…

54.网游逆向分析与插件开发-游戏增加自动化助手接口-项目需求与需求拆解

内容来源于&#xff1a;易道云信息技术研究院VIP课 项目需求&#xff1a; 为游戏增加VIP功能-自动化助手。自动化助手做的是首先要说一下背景&#xff0c;对于授权游戏来讲它往往年限都比较老&#xff0c;老游戏和新游戏设计理念是不同的&#xff0c;比如说老游戏基本上在10年…

easyx的窗口函数

文章目录 前言一、EasyX的颜色二、EasyX的坐标和设备1&#xff0c;EasyX的坐标2&#xff0c;EasyX的设备 三、窗口函数1&#xff0c;初始化窗口函数2&#xff0c;关闭绘图窗口3&#xff0c;设置窗口背景板颜色4&#xff0c;清空绘图设备 前言 easyx是针对c的图形库&#xff0c;…

360高级java面试真题

今年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验…

在kuboard页面配置harbor地址,配置私有仓库

点击项目-配置中心-密文&#xff0c;配置harbor地址 配置完仓库地址需要在对应的k8s master节点 worker节点&#xff0c;配置私有仓库地址要是不配置会报错 [rootk8smaster ~]# docker login 10.4.7.9:80/ -u admin -p Harbor12345 WARNING! Using --password via the CLI is…

第三代半导体SiC 专业术语及指标解释

SiC &#xff1a; 化合物半导体材料&#xff0c;第三代半导体材料代表&#xff0c;主要用于功率半导体领域 GaN &#xff1a; 化合物半导体材料&#xff0c;第三代半导体材料代表&#xff0c;主要用于高频射频领域 GaAs&#xff1a; 化合物半导体材料&#xff0c;第二…

使用spring boot实现异常的统一返回

在这个前后端分离的时代&#xff0c;一个 统一的数据格式非常重要。本次我们实现用spring boot实现一下返回给前端数据的统一格式&#xff0c;不再出现服务器500的错误。 新建一个spring boot项目&#xff0c;并导入knife4j的依赖。 写一个controller控制器&#xff0c;用来是…

数据结构:队列(链表和数组模拟实现)

目录 1.何为队列 2.链表模拟实现 2.1 节点和队列创建 2.2 初始化队列 2.3 入队操作 2.4 出队操作 2.5 遍历队列 2.6 获取队首和队尾元素 2.7 判断队列是否为空 2.8 完整实现 3. 数组模拟实现 3.1 创建队列 3.2 入队和出队操作 3.3 遍历队列 3.4 获取队首和队尾元…

数据转换的三剑客:Pandas 中 apply、map 和 applymap 方法的应用指南

数据转换的三剑客&#xff1a;Pandas 中 apply、map 和 applymap 方法的应用指南 ​ 在 Pandas 中&#xff0c;apply、map 和 applymap 是常用的数据转换和处理方法&#xff0c;它们为数据分析和数据处理提供了灵活的功能。这些方法可以根据具体的需求选择合适的方法进行操作。…

2023结婚成家,2024借势起飞

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

今晚咱们一起来场特别的技术跨年!!

▼最近直播超级多&#xff0c;预约保你有收获 今晚跨年直播&#xff1a;《LLM在电商推荐系统的应用案例实战》 —1— 今晚咱们来场技术跨年&#xff01; LLM 大模型无疑是2023年最重磅的技术&#xff0c;逐渐在各行各业产生了越来越重要的实质影响&#xff0c;2024年的钟声今晚…

uni-app引入vant表单(附源码)

新建项目 下载安装vant npm i vant main.js引入 import { Form } from vant; import { Field } from vant;Vue.use(Form); Vue.use(Field);代码引入 <van-form submit"onSubmit"><van-fieldclass"rePwd"v-model"username"name"请…

我的512天创作者纪念日总结:高效、高现

文章目录 512天创作者纪念日&#xff1a;2023年的12月31日CSDN的512天消息提醒第一篇文章&#xff0c;最后一篇文章总计847篇文章&#xff0c;每月发文分布512天&#xff0c;各专栏文章统计512天&#xff0c;互动总成绩 512天创作者纪念日&#xff1a;2023年的12月31日 2023年…

LabVIEW开发滚动轴承故障诊断系统

LabVIEW开发滚动轴承故障诊断系统 在工业自动化和机械维护领域&#xff0c;滚动轴承的故障诊断是至关重要的。开发了一个基于LabVIEW的振动信号分析系统。这一系统集成了先进的信号处理技术&#xff0c;如经验模式分解&#xff08;EMD&#xff09;、Morlet小波滤波器和隐Marko…

【LMM 004】LLaVA-RLHF:用事实增强的 RLHF 对齐大型多模态模型

论文标题&#xff1a;Aligning Large Multimodal Models with Factually Augmented RLHF 论文作者&#xff1a;Zhiqing Sun, Sheng Shen, Shengcao Cao, Haotian Liu, Chunyuan Li, Yikang Shen, Chuang Gan, Liang-Yan Gui, Yu-Xiong Wang, Yiming Yang, Kurt Keutzer, Trevor…

【Redis技术专区】「原理分析」探讨Redis6.0为何需要启用多线程

探讨Redis 6.0为何需要启用多线程 背景介绍开启多线程多线程的CPU核心配置IO多线程模式单线程处理方式多线程处理方式 为什么要开启多线程&#xff1f;充分利用多核CPU提高网络I/O效率响应现代应用需求 多线程实现启用多线程 最后总结 背景介绍 在Redis 6.0版本中&#xff0c;…

计算机网络(6):应用层

每个应用层协议都是为了解决某一类应用问题&#xff0c;而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。 应用层的具体内容就是规定应用进程在通信时所遵循的协议。 应用层的许多协议都是基于客户服务器方式。即使是对等通信方式&#x…