并查集(竞赛)

一、模型建立

本质就是一个数组,数组的下标对应节点的编号,数组的值对应对应编号的节点的父节点。规定根节点的父节点是自己。

规定三个集合的根节点分别是1 4 6

二、并查集操作并实现

并查集主要操作:查找一个节点的父节点,判断两个节点是不是在一个集合,合并两个节点所在的两个集合。

这里的第二第三个操作是基于第一个查找父节点的,但是查找父节点的操作有一个路径优化,所以最后再讲。

1、判断两个节点是不是在一个集合

看看两个节点的父节点是不是相同就行了。

bool issame(int x, int y)
{return find(x) == find(y);
}

2、合并两个节点所在的两个集合

让两个节点的父节点合并,即一个父节点是另一个父节点的父节点。

void U(int x, int y)
{int root1 = find(x);int root2 = find(y);a[root1] = root2;
}

3、查找一个节点的父节点

根据数组特性,只要不是数值等于下标,那就不是父节点,还需要找数值的父节点,即找当前节点的父亲的父亲。

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

但是如果一开始的结构是近似单支树,那么每次查找的效率就会降低成O(N)

路径压缩:在遍历到根节点之后,回溯时把回溯过程中经历到的孩子节点的父节点全部修改成根节点,这样就压缩成了2层。

int find(int x)
{if (a[x] == x)return x;// 路径压缩:根的后代的父节点直接改成根return a[x] = find(a[x]);
}

三、例题

P3367 【模板】并查集 - 洛谷

#include "bits/stdc++.h"
using namespace std;
const int N = 2 * 1e5 + 10;
int a[N];
// 查找
int find(int x)
{if (a[x] == x)return x;// 路径压缩:根的后代的父节点直接改成根return a[x] = find(a[x]);
}
// 合并
void U(int x, int y)
{int root1 = find(x);int root2 = find(y);a[root1] = root2;
}// 判断
bool issame(int x, int y)
{return find(x) == find(y);
}int main()
{int n, m;cin >> n >> m;// 1.初始化所有点是单独一个集合,根是自己for (int i = 1; i <= n; i++)a[i] = i;while (m--){int op, x, y;cin >> op >> x >> y;if (op == 1)U(x, y);elseissame(x, y) == true ? cout << "Y" << endl : cout << "N" << endl;}return 0;
}

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

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

相关文章

Leetcode 刷题笔记1 图论part04

leetcode 110 字符串接龙 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…

从扩展黎曼泽塔函数构造物质和时空的结构-7

有了先前关于电荷之间吸引和排斥关系的频率分析图&#xff0c;我们可以按照类似的方法&#xff0c;对磁场做一样的分析&#xff0c;即分析磁体同极相斥&#xff0c;异极相吸的本质。 我们知道上图得以成立的原因在于磁感线&#xff0c;如下图所示的排布方式&#xff0c; 磁体的…

AI比人脑更强,因为被植入思维模型【18】万物系统思维模型

把事物看成链&#xff0c;看成网&#xff0c;看成生态。 定义 万物系统思维模型是一种将宇宙万物视为一个相互关联、相互作用的整体系统的思维方式。它强调从系统的角度去认识、分析和解决问题&#xff0c;认为系统中的各个要素之间存在着复杂的相互关系&#xff0c;这些关系不…

Qt-Q_ENUM宏和QMetaEnum类

Q_ENUM是一个宏定义&#xff0c;它的作用是将一个枚举类型注册到元对象系统&#xff0c;从而能够通过QMetaEnum类获得一些关于enum类型的一些信息&#xff0c;例如获取enum类型的名称字符串&#xff0c;enum值和字符串互相转换&#xff0c;enum类型保存在QVariant中&#xff0c…

MongoDB 配合python使用的入门教程

MongoDB 入门教程 1. 安装 MongoDB 首先&#xff0c;你需要在你的机器上安装MongoDB。你可以从 MongoDB官网 下载并安装 Community 版本。安装完成后&#xff0c;启动MongoDB服务。 # 在Linux/Mac上启动MongoDB mongod# 在Windows上&#xff0c;你可以通过Windows服务启动Mo…

【云馨AI-大模型】大模型的开发和应用中,Python、PyTorch和vLLM关系概括

说明 1. Python 定位&#xff1a;基础编程语言。作用&#xff1a;Python 是大模型生态系统的核心语言&#xff0c;几乎所有深度学习框架&#xff08;如 PyTorch、TensorFlow&#xff09;和工具链&#xff08;如 vLLM&#xff09;都通过 Python 接口提供服务。特点&#xff1a…

西门子200smart之modbus_TCP(做主站与第三方设备)通讯

西门子200smart做MODBUS_TCP主站通讯,只有一个指令。设置相关参数即可完成读写操作。整 个过程非常复杂,操作非常严谨。此次,我们使用汇川EASY系列PLC做从站,完成演示。关于汇川案例的演示,详见汇川EASY系列之以太网通讯(MODBUS_TCP做从站)-CSDN博客 关于主站和从站的介…

缓存设计模式

缓存设计模式&#xff08;Cache Design Pattern&#xff09;是一种用于存储和管理频繁访问数据的技术&#xff0c;旨在提高系统性能、降低数据库或后端服务的负载&#xff0c;并减少数据访问延迟。以下是几种常见的缓存设计模式&#xff0c;并用 Python Redis 进行示例代码实现…

Java算法队列和栈经常用到的ArrayDeque

主要是记录一下add&#xff0c;push&#xff0c;poll这三个常用api&#xff0c;因为这三个就是栈和队列一念之差的关键 1.add(E e) 方法 ​作用&#xff1a;将元素添加到双端队列的尾部​&#xff08;等价于 addLast(E e)&#xff09;。​行为&#xff1a; ​成功时&#xff1…

机器学习——一元线性回归(算法实现与评估)

一元线性回归是统计学中最基础的回归分析方法&#xff0c;用于建立两个变量之间的线性关系模型。 1. 模型表达式 一元线性回归的数学模型为&#xff1a; &#xff1a;因变量&#xff08;预测值&#xff09;&#xff1a;自变量&#xff08;输入变量&#xff09;&#xff1a;回…

Ubuntu下用QEMU模拟运行OpenBMC

1、前言 在调试过程中&#xff0c;安装了很多依赖库&#xff0c;具体没有记录。关于kvm&#xff0c;也没理清具体有什么作用。本文仅记录&#xff0c;用QEMU成功的将OpenBMC跑起来的过程&#xff0c;做备忘&#xff0c;也供大家参考。 2、环境信息 VMware Workstation 15 Pro…

Gradle/Maven 本地仓库默认路径迁移 (减少系统磁盘占用)

Gradle 配置环境变量 GRADLE_USER_HOME&#xff0c;如D:/.gradle同时将 %userprofile%/.gradle 移动到配置路径 Maven 修改settings.xml文件&#xff0c;localRepository同时将 %userprofile%/.m2/repository 移动到配置路径 IDEA默认用的bundle maven, 路径为安装目录下 p…

MinGW与使用VScode写C语言适配

压缩包 通过网盘分享的文件&#xff1a;MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面&#xff0c;从上数第4个&#xff0c;点击扩展&#xff08;以下通此&#xff09; 搜索---Chinese--点击---安装--o…

【C++初阶】从零开始模拟实现vector(含迭代器失效详细讲解)

目录 1、基本结构 1.1成员变量 1.2无参构造函数 1.3有参构造函数 preserve()的实现 代码部分&#xff1a; push_back()的实现 代码部分&#xff1a; 代码部分&#xff1a; 1.4拷贝构造函数 代码部分&#xff1a; 1.5支持{}初始化的构造函数 代码部分&#xff1a; …

Java实习生面试题(2025.3.23 be)

一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令&#xff0c;它们的主要区别在于渲染策略&#xff1a;v-if 会根据条件决定是否编译元素&#xff0c;而 v-show 则始终编译元素&#xff0c;只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…

stm32标准库开发需要的基本文件结构

使用STM32标准库&#xff08;STM32 Standard Peripheral Library&#xff0c;SPL&#xff09;开发时&#xff0c;项目中必须包含一些必要的文件&#xff0c;这些文件确保项目能够正常运行并与MCU硬件交互。以下详细说明&#xff1a; 一、标准库核心文件夹说明 使用标准库开发S…

学生管理系统(需求文档)

需求&#xff1a; 采取控制台的方式去书写学生管理系统 分析&#xff1a; 初始菜单&#xff1a; “----------欢迎来到java学生管理系统----------” “1:添加学生” “2&#xff1a;删除学生” “3&#xff1a;修改学生” “4&#xff1a;查询学生” “5&#xff1a;…

Java算法OJ(13)双指针

目录 1.前言 2.正文 2.1快乐数 2.2盛最多水的容器 2.3有效的三角形的个数 2.4和为s的两个数 2.5三数之和 2.6四数之和 3.小结 1.前言 哈喽大家好吖&#xff0c;今天继续加练算法题目&#xff0c;一共六道双指针&#xff0c;希望能对大家有所帮助&#xff0c;废话不多…

SpringBoot分布式定时任务实战:告别重复执行的烦恼

场景再现&#xff1a;你刚部署完基于SpringBoot的集群服务&#xff0c;凌晨3点突然收到监控告警——优惠券发放量超出预算两倍&#xff01;检查日志发现&#xff0c;两个节点同时执行了定时任务。这种分布式环境下的定时任务难题&#xff0c;该如何彻底解决&#xff1f; 本文将…

MySQL 设置允许远程连接完整指南:安全与效率并重

一、为什么需要远程连接MySQL&#xff1f; 在分布式系统架构中&#xff0c;应用程序与数据库往往部署在不同服务器。例如&#xff1a; Web服务器&#xff08;如NginxPHP&#xff09;需要连接独立的MySQL数据库数据分析师通过BI工具直连生产库多服务器集群间的数据同步 但直接…