当前位置: 首页 > article >正文

并查集

1.并查集原理在一些应用问题中需要将n个不同的元素划分成一些不相交的集合。开始时每个元素自成一个单元素集合然后按一定的规律将归于统一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集union-find set。比如某公司今年校招全国总招生10人西安招4人成都招3人武汉招3人10个人来自不同的学校起先互不认识每个学生都是一个独立的小团体现给这些学生进行编号{1,2,3,4,5,6,7,8,9}给以下数组用来存储该小集体数组中的数字代表该小集合中具有成员的个数。毕业后学生们要去公司上班每个地方的学生自发组织成小分队一起上路于是西安学生小分队s1{0,6,7,8}成都学生小分队s2{1,4,9}武汉学生小分队s3{2,3,5}就相互认识了10个人形成了三个小团体假设0,1,2分别担任队长负责大家的出行。一趟火车之旅后每个小分队成员就互相熟悉成为一个朋友圈从上图可以看出编号6,7,8同学属于0号小分队该小分队中有4人包含队长0编号4和9的同学属于1号小分队该小分队有3人包含队长1编号为3和5的同学属于2号小分队该小分队有3人包含队长2。仔细观察数组内情况可以得出以下结论数组的下标对应集合元素的编号。数组中如果为负数负数代表根数字代表该集合中元素个数数组中如果为非负数代表该元素双亲在数组中的下标。在公司工作一段时间后西安小分队中8号同学与成都小分队1号同学奇迹的走在了一起两个小圈子的学生相互介绍最后成为了一个小圈子现在0集合有7个人2集合有3个人总共两个朋友圈。通过以上例子可知并查集一般可以解决以下问题1.查找元素属于那个集合沿着数组表示树形关系以上一直找到根树中元素为负数的位置2.查看两个元素是否属于同一个集合沿着数字表示的树形关系往上一直找到树的根如果根相同表明在同一个集合否则不在3.将两个集合归并成一个集合将两个集合中的元素合并将一个集合名称改成另一个集合的名称。4.集合的个数遍历数组数组中元素为负数的个数即为集合的个数。2. 并查集的模拟实现#pragma once #includeiostream #includevector using namespace std; class UnionFind { public: UnionFind(int n) : _v(n, -1) //用n个数初始化 {} int FindRoot(int index) { int root x; while (_v[root] 0) { root _v[root];//数组中存的就是当前数的父亲节点 } //路径压缩 while(_v[x] 0) { int parent _v[x]; _v[x] root; x parent; } return root; } void Union(int x1, int x2)//合并 { int root1 FindRoot(x1); int root2 FindRoot(x2); if(root1 root2) return; if(abs(_v[root1]) abs(_v[root2])) //控制数据量小的往大的集合合并 { swap(root1, root2); } _v[root1] _v[root2]; //根节点加等上当前节点的值 _v[root2] root1; //当前节点的值指向父亲 } size_t SetCount()//有多少棵树 { size_t count 0; for (size_t i 0; i _v.size(); i) { if (_v[i] 0) count; } return count; } private: vectorint _v; };3.与并查集相关的题LCR 116. 省份数量 - 力扣LeetCodeclass UnionFind { public: UnionFind(int n) : _v(n, -1) //用n个数初始化 {} int FindRoot(int index) { while (_v[index] 0) { index _v[index];//数组中存的就是当前数的父亲节点 } return index; } void Union(int x1, int x2) { int root1 FindRoot(x1); int root2 FindRoot(x2); if (root1 ! root2) { _v[root1] _v[root2]; //根节点加等上当前节点的值 _v[root2] root1; //当前节点的值指向父亲 } } size_t SetCount()//有多少棵树 { size_t count 0; for (size_t i 0; i _v.size(); i) { if (_v[i] 0) count; } return count; } private: vectorint _v; }; class Solution { public: int findCircleNum(vectorvectorint isConnected) { UnionFind u(isConnected.size()); for(int i 0; i isConnected.size(); i) { for(int j 0; j isConnected[0].size(); j) { if(isConnected[i][j] 1) { u.Union(i, j);//相连就合并这两个城市 } } } return u.SetCount(); } };990. 等式方程的可满足性 - 力扣LeetCode下面使用并查集第一次循环先把所有的树给找到然后第二次循环判断它们是否在同一个树里面。class Solution { public: bool equationsPossible(vectorstring equations) { vectorint ufs(26, -1); auto findroot [ufs](int x) { while(ufs[x] 0) x ufs[x]; return x; }; for(int i 0; i equations.size(); i) { if(equations[i][1] ) { int root1 findroot(equations[i][0] - a); int root2 findroot(equations[i][3] - a); if(root1 ! root2) { ufs[root1] ufs[root2]; ufs[root2] root1; } } } for(int i 0; i equations.size(); i) { if(equations[i][1] !) { int root1 findroot(equations[i][0] - a); int root2 findroot(equations[i][3] - a); if(root1 root2) { return false; } } } return true; } };

相关文章:

并查集

1.并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于统一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问…...

Meta计划5月裁员约10%,约8000人受影响,此前AI领域投资巨大

Meta新一轮裁员:约8000人将告别据彭博社公布的Meta首席人力官珍妮尔盖尔(Janelle Gale)的备忘录显示,Meta计划在5月裁员约10%,这意味着约8000人将被裁。同时,盖尔还表示,Meta还将关闭约6000个招…...

从RAG到搜广推:两个方向如何两手抓

研一升研二,时间还相当充裕。你现在的方向很对,继续把项目做深做透,同时拓展一下搜推广的知识面,明年找实习问题不大。现在大部分公司的LLM业务岗,说白了,干的还是SFT和RAG那点事,顶多加个Agent…...

从机械爪到智能体:构建感知-决策-执行闭环的机器人系统实践

1. 项目概述:从“机械爪”到“智能体”的进化最近在开源社区里,一个名为“AgentR1/Claw-R1”的项目引起了我的注意。这个名字本身就很有意思,它像是一个代号,又像是一个产品迭代的标识。乍一看,“Claw-R1”很容易让人联…...

TensorFlow损失函数详解:从基础到高级应用

1. 损失函数基础概念解析在机器学习的世界里,损失函数(Loss Function)就像是导航系统中的指南针,它告诉模型当前的表现距离目标还有多远。作为TensorFlow框架的核心组件之一,损失函数直接决定了模型优化的方向和效率。…...

颜色科学避坑指南:CIE Lab转sRGB时,你的D65白点参数设置对了吗?

颜色科学避坑指南:CIE Lab转sRGB时,你的D65白点参数设置对了吗? 在数字图像处理领域,颜色空间的转换看似简单,实则暗藏玄机。许多开发者和设计师都曾遇到过这样的困惑:明明按照标准公式实现了从CIE Lab到sR…...

SpringBoot+MyBatis-Plus多数据源实战:从原理到分布式事务

一、多数据源架构设计 说到多数据源,很多人第一反应是配置多个DataSource,然后根据业务场景手动选择。这种方式有两个问题: 代码侵入性强,每个方法都要判断用哪个数据源 事务管理混乱,Spring的@Transactional只能管理单个数据源 更好的方案是使用Spring提供的AbstractRou…...

告别复制粘贴!用STM32CubeMX HAL库高效控制蓝桥杯G431开发板8个LED(附流水灯代码)

STM32CubeMX HAL库实战:G431开发板LED高级控制技巧 第一次接触STM32G431开发板时,我像大多数初学者一样,直接在main函数里写满了GPIO控制代码。直到参加蓝桥杯比赛前夕,才发现这种写法在复杂项目里简直就是灾难——每次修改灯效都…...

PHP源码开发用一体机合适吗_集成硬件局限性说明【操作】

不推荐PHP开发用一体机——因U系CPU与焊死8GB内存导致调试卡顿、Docker/WSL2兼容差、USB外设支持弱,仅适合纯写小项目。PHP开发用一体机行不行?看这三点就清楚能跑,但不推荐——除非你只写小项目、不调试、不连真服务器、不碰 Docker 或 CLI …...

KV Cache:大模型推理加速核心技术

KV Cache:大模型推理加速核心技术📝 本章学习目标:通过本章学习,你将全面掌握"KV Cache:大模型推理加速核心技术"这一核心主题,建立系统性认知。一、引言:为什么这个话题如此重要 在人…...

ESP32蓝牙音频终极指南:如何用简单代码实现专业级音乐接收器和发送器

ESP32蓝牙音频终极指南:如何用简单代码实现专业级音乐接收器和发送器 【免费下载链接】ESP32-A2DP A Simple ESP32 Bluetooth A2DP Library (to implement a Music Receiver or Sender) that supports Arduino, PlatformIO and Espressif IDF 项目地址: https://g…...

Android16进阶之Equalizer.getProperties调用流程与实战(三百零二)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…...

Android16进阶之Equalizer.usePreset调用流程与实战(三百零一)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…...

SDUT-python实验四编程题

7-1 sdut-ASCII码排序输入N个字符后,按各字符的ASCII码从小到大的顺序输出这N个字符。输入格式:输入数据有多组,每组占一行,有N个字符组成。输出格式:对于每组输入数据,输出一行,字符中间用一个空格分开。输入样例:Inp…...

Go 的 maps.Copy:复制个 Map,居然也能又这么多坑

以前复制 Map 要写 for 循环,现在一行搞定。但别高兴太早,踩坑姿势不对,照样翻车~🤔 为什么需要 maps.Copy? 在 Go 1.21 之前,复制一个 Map 的"标准姿势"是这样的: // &am…...

ngx_epoll_add_event

1 定义 ngx_epoll_add_event 函数 定义在 ./nginx-1.24.0/src/event/modules/ngx_epoll_module.cstatic ngx_int_t ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { int op;uint32_t events, prev;ngx_event_t …...

小升初英语衔接轻创业,KISSABC 落地全拆解

小升初英语衔接是一个家长付费意愿强、决策周期相对较短的细分市场。小学高年级家长对孩子的英语水平有清醒认知,知道初中英语和小学英语的难度差距,愿意为有效的衔接方案买单。对于想切入教育赛道的创业者来说,锁定这个群体是一个需求明确、…...

海康威视访客系统API避坑指南:从权限下发失败到动态二维码生成的5个常见问题

海康威视访客系统API实战避坑手册:5个高频故障的诊断与修复 对接海康iSC平台访客系统时,一线工程师常会遇到各种"诡异"问题:明明调用了接口却权限不下发、动态二维码生成后扫码无效、访客刷脸始终无法开门。这些问题往往消耗大量排…...

SpringMVC5.0

Spring留言板实现预期结果可以发布并显示点击提交后,显示并清除输入框并且再次刷新后,不会清除下面的缓存约定前后端交互接口Ⅰ 发布留言 url : /message/publish . param(参数) : from,to,say . return : true / false .Ⅱ 查询留言 url : /message/get…...

第四章-09-练习案例:有几个偶数

1.题目2.代码# 09-练习案例:有几个偶数 cnt 0 for i in range(1,100) :if i % 2 0 :cnt 1print(cnt)...

AD9850/AD9851模块PCB设计要点与STM32驱动实战:从原理图到可调信号发生器

1. AD9850/AD9851模块核心原理与选型指南 第一次接触DDS信号发生器时,我被AD9850芯片的精度震撼到了——用STM32驱动这个小模块,竟然能输出0.0291Hz分辨率的信号。这相当于在125MHz的时钟基准下,实现了比普通晶振高数百万倍的频率控制精度。A…...

机器学习中强弱学习器的原理与实践应用

1. 集成学习中的强弱学习器解析在机器学习领域,我们经常听到"强学习器"和"弱学习器"这两个术语。作为从业十多年的数据科学家,我发现很多初学者对这些概念的理解停留在表面。今天,我将从实践角度深入剖析这对核心概念&am…...

CUDA 13.0与Jetson Thor平台:边缘计算新纪元

1. CUDA 13.0与Jetson Thor平台概览NVIDIA最新发布的CUDA 13.0工具包为Jetson Thor SoC带来了革命性的升级,这标志着边缘计算和嵌入式GPU开发进入了一个新纪元。作为一名长期从事GPU加速开发的工程师,我认为这次更新最令人振奋的是它彻底改变了Arm生态系…...

互联网大厂 Java 求职面试:音视频场景中的技术问答

互联网大厂 Java 求职面试:音视频场景中的技术问答 在这篇文章中,我们将模拟一场互联网大厂的 Java 求职面试,场景设定为音视频领域,面试官是一位严肃的技术专家,而候选人燕双非则是一位搞笑的程序员。通过三轮的问答&…...

GBDT概率模型在空气污染预测中的应用实践

1. 项目背景与核心价值空气污染预测一直是环境科学和公共健康领域的重要课题。传统预测方法往往只能给出确定性结果,而概率预测模型则能提供更丰富的风险信息。这个项目构建的概率预测模型,能够量化未来出现污染天气的可能性,为决策者提供更科…...

【空管供配电】通过指导材料看空管供配电整体解决方案——空管STS方案

第一篇空管供电方案跳转链接(点这里) 第二篇空管UPS方案跳转链接(点这里) STS三大隐藏要求:空管供电安全的关键细节 STS(静态转换开关)是空管供电系统实现"不间断"切换的核心设备&…...

Switch手柄连接PC的终极指南:用BetterJoy实现完美适配

Switch手柄连接PC的终极指南:用BetterJoy实现完美适配 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.com/…...

解决Windows窗口调试难题的WinSpy++实战指南:高级窗口探查与属性修改技术深度解析

解决Windows窗口调试难题的WinSpy实战指南:高级窗口探查与属性修改技术深度解析 【免费下载链接】winspy WinSpy 项目地址: https://gitcode.com/gh_mirrors/wi/winspy Windows窗口调试是桌面应用开发中的常见挑战,开发者经常面临窗口属性获取困…...

数据结构初涉----顺序表

有了我们之前共同学习的C做基础,我们本文开始学习数据结构,本文先从数据结构的基础-----顺序表开始介绍。顺序表的出现顺序表的基层原理其实就是数组,但是数组用来存放数据可以,遇到插入数据,删除数据这些操作时&#…...

PatchTST论文精读与复现:手把手带你理解‘时间序列的64个词’

PatchTST论文精读与复现:手把手带你理解"时间序列的64个词" 当Transformer架构在NLP和CV领域大放异彩时,时间序列预测领域却长期被传统统计方法和浅层神经网络主导。直到2023年PatchTST的出现,才真正打破了这一僵局。这篇来自顶级学…...