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

目录

  • 引言
  • 一、并查集概念
  • 二、并查集模板
  • 三、例题
    • 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.rhkb.cn/news/229587.html

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

相关文章

[GKCTF 2020]ez三剑客-eztypecho

[GKCTF 2020]ez三剑客-eztypecho 考点&#xff1a;Typecho反序列化漏洞 打开题目&#xff0c;发现是typecho的CMS 尝试跟着创建数据库发现不行&#xff0c;那么就搜搜此版本的相关信息发现存在反序列化漏洞 参考文章 跟着该文章分析来&#xff0c;首先找到install.php&#xf…

Unable to connect to Redis server

报错内容&#xff1a; Exception in thread "main" org.redisson.client.RedisConnectionException: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 175.24.186.230/175.24.186.230…

使用idea构建父子类springboot项目教程

第一步创建一个父类java项目&#xff08;最外层java项目&#xff09; 1.点击File 然后点击new 再点击Project 2.点击Maven 配置Java版本 再点击next 3.GroupId&#xff1a;包结构&#xff0c;ArtifactId&#xff1a;项目名称&#xff0c;填写完&#xff0c;点击next 4.点击…

IOS - 手机安装包 ipa 常见几种方式

安装 ipa 包的方法有很多中&#xff0c;可以通过不同的软件安装&#xff0c;本文只列出了常用的几种&#xff0c;做个简单的归纳整理 1、iTunes 安装 数据线连接手机之后&#xff0c;会自动连接iTunes&#xff0c;&#xff08;第一次连接的时候会提示是否信任此电脑&#xff0…

基于springboot的火锅店管理系统设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题动因 当前…

打造绿色饲养链:河南恩珅德农业引领可持续农业发

在河南恩珅德农业的引领下&#xff0c;可持续农业的概念得到了更进一步的实践和推动。其致力于打造绿色饲养链的努力&#xff0c;旨在通过创新的理念和科技手段&#xff0c;实现饲养业的可持续发展。本文将深入探讨河南恩珅德农业是如何引领可持续农业发展&#xff0c;打造绿色…

Selenium教程06:单选框+多选框+下拉框组件的示例练习

1.Radio单选框的示例用法&#xff0c;通过网页元素class和type属性多条件共同定位元素&#xff0c;模拟依次选中Android&#xff0c;Apple&#xff0c;Windows。 网页元素结构 <input type"radio" class"ivu-radio-input" name"ivuRadioGroup_170…

Flink-【时间语义、窗口、水位线】

1. 时间语义 1.1 事件时间&#xff1a;数据产生的事件&#xff08;机器时间&#xff09;&#xff1b; 1.2 处理时间&#xff1a;数据处理的时间&#xff08;系统时间&#xff09;。 &#x1f330;&#xff1a;可乐 可乐的生产日期 事件时间&#xff08;可乐产生的时间&…

240101-5步MacOS自带软件无损快速导出iPhone照片

硬件准备&#xff1a; iphone手机Mac电脑数据线 操作步骤&#xff1a; Step 1: 找到并打开MacOS自带的图像捕捉 Step 2: 通过数据线将iphone与电脑连接Step 3&#xff1a;iphone与电脑提示“是否授权“&#xff1f; >>> “是“Step 4&#xff1a;左上角选择自己的设…

石头剪刀布游戏 - 华为OD统一考试

OD统一考试 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 石头剪刀布游戏有 3 种出拳形状: 石头、剪刀、布。分别用字母 A,B,C 表示游戏规则&#xff1a; 出拳形状之间的胜负规则如下: A>B; B>C; C>A&#xff1b; 左边一个字母&#xff0c;…

04.MySQL的基本操作

MySQL的基本操作 一、连接和断开MySQL服务器1、通过系统服务器启动、停止MySQL服务器2、通过命令提示符&#xff08;DOS&#xff09;启动、停止MySQL服务器2.1 启动 MySQL 服务器&#xff1a;2.2 停止 MySQL 服务器&#xff1a;2.3 登录和退出mysql 二、创建和管理数据库2.1 创…

东信免驱系列身份证阅读器串口通讯协议解析示例,适用于单片机、ARM等系统开发集成使用

完整的一次读卡流程包括&#xff1a; 身份证寻卡 > 身份证选卡 > 身份证读卡&#xff0c;三个步骤 缺一不可&#xff08;见通讯协议&#xff09;。 寻卡&#xff1a;EA EB EC ED 04 00 B0 B4 BB 返回&#xff1a;EA EB EC ED 05 00 00 B0 B5 BB 选卡&#xff1a;EA …

【SpringBoot3】1.SpringBoot入门的第一个完整小项目(新手保姆版+教会打包)

目录 1 SpringBoot简单介绍1.1 SpringBoot是什么1.2 主要优点1.3 术语1.3.1 starter&#xff08;场景启动器&#xff09; 1.4 官方文档 2 环境说明3 实现代码3.1 新建工程与模块3.2 加入依赖3.3 主程序文件3.4 业务代码3.5 运行测试3.6 部署打包3.7 命令行运行 1 SpringBoot简单…

【Jasypt】SpringBoot配置文件加密

1、加密介绍 在yml配置文件中会存在一些敏感数据&#xff0c;比如用户名&#xff0c;密码&#xff0c;第三方应用的密钥等等。这些信息是以明文的形式出现在文件中&#xff0c;存在较大安全隐患。Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#…

小红书、抖音、视频号下载工具:随心管理个人作品集 | 开源日报 No.134

karanpratapsingh/system-design Stars: 20.6k License: NOASSERTION 这个项目是关于系统设计的。它提供了有关系统设计的课程内容&#xff0c;包括 IP、OSI 模型、TCP 和 UDP 等主题。该项目的核心优势和特点如下&#xff1a; 提供全面而高效的系统架构定义。从基础设施到数…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-6-元素定位大法-下篇

1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的定位方法的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下&#xff0c;在日常中很少用到或者很少见的定位&#xff0c;但是遇到了我们也要会&#xff0c;俗话说&#xf…

RKE安装k8s及部署高可用rancher之证书在外面的7层LB(nginx中) 7层负载均衡

一 了解 Rancher 1 推荐架构 安装 Rancher 的方式有两种&#xff1a;单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境&#xff0c;而且单节点安装和高可用集群安装之间不能进行数据迁移&#xff0c;所以推荐从一开始就使用高可用集群安装的方式安装 Ran…

视频融合云平台/智慧监控平台EassyCVR告警警告出错是什么原因?该如何解决?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

【webstorm中通过附加方式打开一个项目,这个项目本身有git,但是却看不到git的解决方法】

1、如图所示 设置-》版本控制-》未注册的根&#xff0c;选中后&#xff0c;再点加号&#xff0c;就可以了 2、如图所示 版本控制-》直接点加号-》选中项目路径&#xff0c;vcs选择git&#xff0c;点击确定就可以了

【QT搭建】搭建可以生成手机APP的环境

一.问题分析 1.在原来的QT版本上安装Android(不推荐) 此方法暂时未实践成功,记录调试过程,可跳过 如果原来安装过QT桌面级PC软件的,可能没有配置JDK和SDK就会在QT选项的设备栏目种看到报错的提示。 并且Kits的选项里面没有Android,所以解决的问题是,缺少Kit套件Andro…