并查集模板-两个操作:合并集合和查询两个元素是否属于同一个集合

news2024/9/24 15:20:14

一、链接

836. 合并集合

二、题目

一共有 nn 个数,编号是 1∼n1∼n,最开始每个数各自在一个集合中。

现在要进行 mm 个操作,操作共有两种

  1. M a b,将编号为 aa 和 bb 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b询问编号为 aa 和 bb 的两个数是否在同一个集合中

输入格式

第一行输入整数 nn 和 mm。

接下来 mm 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。

输出格式

对于每个询问指令 Q a b,都要输出一个结果,如果 aa 和 bb 在同一集合内,则输出 Yes,否则输出 No

每个结果占一行。

数据范围

1≤n,m≤1051≤n,m≤105

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

输出样例:

Yes
No
Yes
难度:简单
时/空限制:1s / 64MB
总通过数:80710
总尝试数:127618
来源:模板题,AcWing
算法标签

挑战模式

三、题意

题目的意思比较简单,就是将两个元素合并到同一个集合,然后随便给定两个元素,判断这两个元素是否属于同一个集合

属于模板题目 

四、代码

#include<iostream>

using namespace std;

const int N=1e5+10;

int p[N];

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

int main()
{
    int n,m;
    
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
    }
    
    while(m--)
    {
        char op[2];
        int a,b;
        
        scanf("%s%d%d",op,&a,&b);
        if(op[0]=='M')
        {
            p[find(a)]=find(b);
        }
        else
        {
            if(find(a)==find(b))
            {
                printf("Yes\n");
            }
            else
            {
                printf("No\n");
            }
        }
    }
    
    return 0;
}

五、总结

1.并查集:实现两种操作,第一种是将两个元素合并到一个集合(改变一个元素的根节点指向另一个元素的根节点即可),第二种是查询给定的两个元素是否属于同一个集合(判断这两个数的根节点是否相同

2.所以核心就是在根节点上进行操作

3.数据范围是1e5,可以给每一个数据分配一个下标,表示节点,也就是代码里面的初始化操作

for(int i=1;i<=n;i++)
{
    p[i]=i;
}

注意这里要从1开始循环,因为题目给的数据从1到n 

4.p[]数组现在下标等于数值,给定一个数值可以找到具体的结点是哪一个,因为题目的特殊性质(只需要实现查询两个元素是否属于同一个集合,只需要输出yes/no),所以我们可以进一步优化,让每一个结点直接指向根节点,也就是p[]直接等于根节点的数值,假设根节点是p[3]=3,属于同一个集合的还有,4,5,6,7,那么有p[4],p[5],p[6],p[7]都等于3

5.路径压缩说的就是把所有节点都指向根节点:实现的代码就是这一行:

if(p[x]!=x)
{
    p[x]=find(p[x]);
}

迭代的思想,只有根节点的下标等于本身数值,其他的结点的数值都不等于下标(这里是指经过合并操作之后的,初始化之后所有结点,下标都等于数值,也可以理解成最开始有n个根节点,合并操作之后,会把结点的数值进行修改),节点的数值等于根节点的数值,下标表示的是原来这个数字。只有下标和数值相等了,才会返回数值,也就是返回根节点

6.把两个元素合并到同一个集合:让a的根节点指向b的根节点,把a的根节点也修改一遍,那么相应的,所有以a为根节点的结点,都要发生改变,实现的代码是这一行

p[find(a)]=find(b);

find(a)找到的是a的根节点的数值,根据根节点数值和下标相等,p[find(a)]表示的是纯正的根节点,比如p[3]=3这种根节点,把另一个元素的根节点的数值赋给这个元素,表示的是把根节点换了,以前a的根节点现在以前把a的根节点当作根节点的,现在把b的根节点当作根节点,反正就是find函数里面迭代,一直找到下标等于数值的才会停止 

7.查询两个元素是否属于同一个集合:直接看他们的根节点是否相等就好了。

8.本质其实挺简单的,但是理解代码感觉还是有些难度,比较绕,既然是模板题目,记住算法思路和写法,然后可以熟练的默写出来就可以了。

六、精美图片

 

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

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

相关文章

在 aosp 中启用 Material You design

作者&#xff1a;Mr_万能胶 近期研究了一下如何在 aosp 中启用 Material You design&#xff0c;在把踩过的坑记录一下&#xff0c;方便后续有厂商可以快速集成。 本文基于 aosp 最新代码&#xff0c;版本号为 Android 13&#xff0c;并使用 Cuttlefish 快速验证。 Material …

消息队列项目(3)

Message 存储 由于 Message 以后会是一个比较庞大的数据, 放在数据库里并不合适, 因此我们要将它放在二进制文件中 因为 Message 和 Queue 是捆绑在一起的, 因此我们将目录名设置成 QueueName, 然后这些目录是存储在之前的 data 里 就像这样: 在 testQueue 中有包含两个文件…

LeetCode 0021. 合并两个有序链表

【LetMeFly】21.合并两个有序链表 力扣题目链接&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/ 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l…

-bash: fork: retry: Resource temporarily unavailable 问题解决

错误提示&#xff1a; -bash: fork: retry: Resource temporarily unavailable 错误分析&#xff1a;之前已经出现过这种资源限制的报错提醒&#xff0c;然后整个系统可用的连接数就已经用完了&#xff0c;无法使用工具来获取系统信息&#xff0c;所以将运行的任务脚本kill后开…

Cesium引入vite + vue3

下载Cesium yarn add cesium下载cesium-vite 插件 yarn add vite-plugin-cesium使用 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import WindiCSS from vite-plugin-windicss import cesium from vite-plugin-cesium; //引入插件…

Stephen Wolfram:嵌入的概念

The Concept of Embeddings 嵌入的概念 Neural nets—at least as they’re currently set up—are fundamentally based on numbers. So if we’re going to to use them to work on something like text we’ll need a way to represent our text with numbers. And certain…

如何制作网红小和尚视频

文章目录 写在前面需要用到的工具制作过程制作一张自己喜欢的底图制作爆款文案将文案转为语音使用底图和语音生成动画去除水印使用剪映生成视频 写在后面 写在前面 最近我尝试制作小和尚的视频&#xff0c;使用了一些AI技术&#xff0c;制作成本相对较低。这次经历让我感受到了…

工厂模式(C++)

定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦&#xff0c;手段:虚函数)到子类。 应用场景 在软件系统中&#xff0c;经常面临着创建对象的工作;由于需求的变化&#xff0c;需要创建的对象的具体类…

c语言——计算一串字符的长度

//计算一串字符的长度 //在main函数中输出一个字符&#xff0c;并且计算出该字符的长度。 #include<stdio.h> #include<stdlib.h> int length(char *s){int i0;while(*s!\0){i;s;}return i;} int main() {int len;char str[20];printf("输入字符串&#xff1a…

215. 数组中的第K个最大元素(快排+大根堆+小根堆)

题目链接&#xff1a;力扣 解题思路&#xff1a; 方法一&#xff1a;基于快速排序 因为题目中只需要找到第k大的元素&#xff0c;而快速排序中&#xff0c;每一趟排序都可以确定一个最终元素的位置。 当使用快速排序对数组进行降序排序时&#xff0c;那么如果有一趟排序过程…

大数据课程G2——Hbase的基本架构

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Hbase的基本架构&#xff1b; ⚪ 掌握Hbase的读写流程&#xff1b; ⚪ 掌握Hbase的设计与优化&#xff1b; 一、基本架构 1. HRegion 1. 在HBase中&#xff0c;会…

林大数据结构【2019】

关键字&#xff1a; 哈夫曼树权值最小、哈夫曼编码、邻接矩阵时间复杂度、二叉树后序遍历、二叉排序树最差时间复杂度、非连通无向图顶点数&#xff08;完全图&#xff09;、带双亲的孩子链表、平衡二叉树调整、AOE网关键路径 一、判断 二、单选 三、填空 四、应用题

【C++】右值引用

文章目录 右值引用值得形式返回对象的缺陷移动语句移动赋值 右值引用 能够取地址、能够被修改的被称之为左值。 不能够取地址、不能够被修改、以及将亡值被称之为右值。 普通类型的变量&#xff0c;因为有名字&#xff0c;可以取地址&#xff0c;都认为是左值。const修饰的常量…

MyBatis查询数据库(4)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 终于到了MyBatis最后一篇&#xff0c;这篇讲的是动态SQL的使用。 复杂情…

docker配置远程连接端口

配置docker 配置远程连接端口 vi /lib/systemd/system/docker.servicesystemctl daemon-reload && systemctl restart docker firewall-cmd --zonepublic --add-port2375/tcp --permanenthttp://node2:2375/version

【类和对象】基础知识

目录 一、类的定义 定义方式一&#xff1a;定义与声明都在类中 定义方式二&#xff1a;定义与声明分离 二、类的实例化&&类对象存储方式 类的实例化 类对象存储模式 三、this指针 一、类的定义 定义方式一&#xff1a;定义与声明都在类中 #include<iostream&…

深入学习 Redis - 谈谈你对 Redis 的 RDB、AOF、混合持久化的了解吧?

目录 一、Redis 是怎么存储数据的&#xff1f; 二、Redis 具体是按照什么样的策略来实现持久化的&#xff1f; 2.1、RDB&#xff08;Redis Database&#xff09; 2.1.1、触发机制 2.1.2、bgsave 命令处理流程 2.1.3、RDB 文件的处理 2.1.4、演示效果 1&#xff09;手动执…

GEE:谐波模型在遥感影像中的应用(季节性变化的拟合与可视化)

作者:CSDN @ _养乐多_ 谐波模型是一种常用的工具,用于拟合和分析影像数据中的周期性和季节性变化。本文将介绍如何使用Google Earth Engine平台实现谐波模型,通过对Landsat影像进行处理和拟合,展示季节性变化的拟合结果,并通过图表和地图可视化展示数据。 谐波模型是一种…

《Java-SE-第二十九章》之Synchronized原理与JUC常用类

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

OpenAI 已为 GPT-5 申请商标,GPT-4 发布不到半年,GPT-5 就要来了吗?

据美国专利商标局&#xff08;USPTO&#xff09;信息显示&#xff0c;OpenAI已经在7月18日申请注册了“GPT-5”商标。 在这份新商标申请中&#xff0c;OpenAI将“GPT-5”描述为一种“用于使用语言模型的可下载计算机软件”。 继GPT-4发布之后&#xff0c;它预计将成为OpenAI下一…