【算法】并查集

并查集是一种树形的数据结构,通常可以用于高效的合并多个集合和查询两个数是否属于同一个集合的情况。

其原理在于,把每个集合变成一棵树,树根的值就是整个集合的编号,通过查找两个数所在树根是否相同即可判断是否在同一个集合;将树根之间相连即可实现集合的合并。

其合并集合的效率远远高出普通的方式,近似O(1)

但是,集合怎么能变成树呢?为什么用这种结构效率很高呢?

我们以下面这道题为例

该题中提供了两种操作:合并区间和查询两个数是否在同一个集合中

根据题意我们知道一共有n个数,分别是1~n,最开始每个数独自存在一个集合中

虽然说是将集合变成树,实际上我们并不是在物理结构上真正的创建了一棵树,而是通过创建一个数组来存储每个节点的父亲,用该数组来连接不同的数形成树的结构,树根的父亲就是自己。

通过这种形式,我们就可以在数组中查询某个数的父亲,如果查询的结果正好等于该数,说明为根,否则不为根

光这么说不好理解,我们以上面的输入样例为例子,n为4,1~4分别代表4个集合,我们创建一个数组p来存储每个节点的父亲。

此时4个集合中都只有根节点,而我们要将根节点的父亲设置为自己,所以p[1]=1,p[2]=2,以此类推

具体代码为

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

接着看下一行的输入,M 1 2说明将1和2所在的集合合并,我们需要写一个find函数来找到这两个数的根,接着我们直接把1所在集合的根连接到2所在集合的根,即可完成集合的合并

find函数:

int find(int x) //找根节点+路径压缩
{
    if(p[x] != x) p[x] = find(p[x]); //优化:可以将路径上经过的数的父亲全部修改成根
    return p[x];
}

合并操作:

char c;
int a, b;
cin >> c >> a >> b;
if(c == 'M') p[find(a)] = find(b); //根节点相连--合并集合

就像图中这样,只需要将两棵树的根相连,就完成了集合的合并,复杂度为O(1)

(图中所画的树与题目无关) 

所以我们只需通过数组p就能逐步找到根节点并连接,就完成了集合的合并操作

接着我们跳到第四行输入,Q 1 2,也就是询问1和2是否在同一个集合中

对于该操作,我们直接使用find函数找到二者所在集合的根,如果根相等即为同一个集合

完整代码:

#include <iostream>
using namespace std;
#define N 100010

int n,m;
int p[N];

int find(int x) //找根节点+路径压缩
{
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
        p[i] = i; //根的父节点=自己
    for(int i = 0;i < m;i++)
    {
        char c;
        int a, b;
        cin >> c >> a >> b;
        if(c == 'M') p[find(a)] = find(b); //根节点相连--合并集合
        else
        {
            if(find(a) == find(b)) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 常见设置问题

OutOfMemoryError IDEA 第一次运行项目时&#xff0c;会报错误 - java.lang.OutOfMemoryError: Java heap space / insufficient memory&#xff0c;解决办法是&#xff1a; 将图示部分由默认的 700 改为 2048。 import * 工程lint检查时不允许使用import *&#xff0c;IDE…

容器监控与日志管理

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Docker监控工具 二、容器日志工具docker logs 三、第三方日志工具 四、容器日志驱动 五、示例 5.1、查看容器中运行的进程的信息 5.2、查看…

小红书·电商运营课:小红书开店流程,小红书电商如何运营(18节视频课)

课程目录 第1节课:学习流程以及后续实操流程注意事项 第2节课:小红书店铺类型解析以及开店细节 第3节课:小红书电商运营两种玩法之多品店铺解析 第4节课:小红书电商运营两种玩法之单品店铺解析 第5节课:选品课(多品类类目推荐) 第6节课:选品课(多品类类目推荐) 第7节课:…

中东电商Noon测评Hepsiburada贺百狮,Souq,Temu,Nice One,MEIG如何自己养号补单?

养买家号进行中东跨境电商测评&#xff0c;是一个需要细心和技术的过程&#xff0c;特别是在不同的电商平台上Noon&#xff08;Namshi&#xff09;、Hepsiburada&#xff08;贺百狮&#xff09;、Souq&#xff08;亚马逊&#xff09;、Nice One、MEIG、Wadi、Temu。需要搭建完整…

严肃处理!光伏巨头被罚2.3亿 | 百能云芯

5月7日&#xff0c;江苏阳光股份有限公司&#xff08;600220 SH&#xff0c;以下简称“ST阳光”&#xff09;公告称&#xff0c;其控股股东江苏阳光集团有限公司&#xff08;以下简称“阳光集团”&#xff09; 近日收到中国证监会《行政处罚事先告知书》&#xff0c;阳光集团涉…

BUU-[极客大挑战 2019]Http

考察点 信息收集 http构造请求数据包 题目 解题步骤 参考文章&#xff1a;https://zhuanlan.zhihu.com/p/367051798 查看源代码 发现有一个a标签&#xff0c;但是οnclick"return false"就是点击后不会去跳转到Secret.php的页面 所以我就自己拼接url http://no…

什么是IP跳变?

IP 跳跃&#xff08;也称为 IP 跳动&#xff09;的概念已引起使用代理访问网站的用户的极大关注。但 IP 跳跃到底是什么&#xff1f;为什么它对于各种在线活动至关重要&#xff1f; 在本文中&#xff0c;我们将深入探讨 IP 跳跃的世界&#xff0c;探索其实际应用、用例、潜在问…

《中阿科技论坛(中英文)》是什么级别的期刊?是正规期刊吗?

问题解答 问&#xff1a;《中阿科技论坛&#xff08;中英文&#xff09;》是核心期刊吗&#xff1f; 答&#xff1a;不是&#xff0c;但是正规期刊 问&#xff1a;《中阿科技论坛&#xff08;中英文&#xff09;》是什么级别期刊&#xff1f; 答&#xff1a;省级 主管单位…

嵌入式学习70-复习(wireshark使用和http协议)

--------------------------------------------------------------------------------------------------------------------------------- wireshark 1.sudo wireshark 2.选择 any &#xff0c; 3.搜索 http/tcp 54 为 发送的数据包 58 回复的数据包 请求报文 请求报文…

视频资源汇聚平台常见的几种接入方式

视频资源汇聚平台 视频汇聚平台可以实现海量资源的接入、汇聚、存储、处理、分析、运维等&#xff0c;平台具备轻量化接入能力&#xff0c;可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP、ONVIF、RTMP、FLV、WEBSOCKET等&#xff0c;以及厂家私有协议与SDK接…

示例九、红外接收模块

通过以下几个示例来具体展开学习,了解红外接收模块原理及特性&#xff0c;学习红外接收模块的应用&#xff08;干货版&#xff09;&#xff1a; 示例九、红外接收模块 ino文件源码&#xff1a; //Arduino C demoIRrecv irrecv(4); decode_results results; unsigned long key…

459.重复的子字符串

给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 示例 1: 输入: "abab"输出: True解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba&q…

Sql Server 2016数据库定时备份

一、 配置备份计划任务 选中“维护计划“--右键--“维护计划向导” 完成

Java --- 集合(1)--- 带你了解Collection接口以及三种遍历方式

引言&#xff1a;本期博客摘选黑马程序员与Java从入门到精通&#xff0c;如果有不准确的地方还请指出&#xff0c;另外也感谢各位大佬点击进来观看。 目录 一.什么是集合&#xff1f; 二.单列集合的体系结构&#xff1a; 三.Collection接口的使用&#xff1a; 四.Collection…

FreeRTOS事件组

什么是事件标志组? 事件标志位 :表明某个事件是否发生,联想:全局变量 flag 。通常按位表示,每一个位表示一个事件(高8 位不算) 事件标志组 是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。 事件标志组本质是一个 16 位或 32 位无符号的数据类型…

交通数据三维可视化呈现与可视化分析系统开发(附程序源码)

目录 01 系统介绍 02 功能介绍 文件管理功能 模型研究 可视化分析功能 今天分享一套“交通数据三维可视化呈现与可视化分析系统”&#xff0c;并开放程序源代码下载&#xff0c;内容涉及开源空间数据库的使用、三维引擎的二次开发、矢量和栅格数据管理、交通流量分析模型框…

龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场 下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构&#xff1a; 接下来是我仅代表我个人提出的一些疑问与解答&#xff1a; 1、俩动物以图片的形式显示&#xff1f; 其实在这里两个动物类就像标签一样 标签组件是什么&#xff1f;用于短文本字符串…

【深度学习实战(35)】数据处理之数据增强(不修改标签)

一、简介 不需要修改标签的数据增强有变明&#xff0c;变暗&#xff0c;hsv增强&#xff0c;color增强&#xff0c;cutout&#xff0c;模拟太阳光&#xff0c;雨水&#xff0c;雾等。 二、 代码 import random import numpy as np import os.path import cv2 from PIL impor…

发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词

✨ 1: vocode 用AI通过声音与用户进行实时交流 Vocode是一个旨在帮助开发者快速构建基于声音的大型语言模型&#xff08;LLM&#xff09;应用程序的开源库。简单来说&#xff0c;如果你想要开发一个能够通过声音与用户进行实时交流的应用&#xff0c;比如电话机器人、语音助手…

三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…