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

并查集(基础+带权以及可撤销并查集后期更新)

并查集

并查集是一种图形数据结构,用于存储图中结点的连通关系。

每个结点有一个父亲,可以理解为“一只伸出去的手”,会指向另一个点,初始时指向自己。一个点的根节点是该点的父亲的父亲的..的父亲,直到某个点的父亲是自己(根)。

当两个点的根相同时,我们就说他们时同一类,或者是连通的。

如下:7,5,1,3,6的根都是3,所以他们是连通的。

2,4是连通的,而2,6不连通,因为他们的根不同。

找根的方法

如果当前点不是根,就返回父亲的根。否则就是自己

用递归的方法实现

int find(int x)

{

        if(pre[x]==x)retrun x;

        return find(pre[x]);

}

并查集的合并

在并查集中所有的操作都在根上,假如我要使x和y两个点合并,我们只需要将find(x)指向find(y)或者find(y)指向find(x);

pre[find(x)]=find(y);

假如我们要合并4和6两点,我们只需要将2指向3或将3指向2.

路径压缩

找根函数的复杂度最坏情况下会达到O(n),如果查询次数较多的话效率将会非常低下。

我们可以在找根的过程中,将父亲指向根,从而实现路径压缩,这样可以使得找根的总体时间的复杂度为O(log n)。如下图,执行一次root(7)之后,沿途的点都会直接指向根3

int  find(int x){

        return pre[x]=(pre[x]==x?x:find(pre[x]));//当前的这个点是否是根,是根的话直接输出x不是根的话,去寻中这个根

}

例题

蓝桥幼儿园

题目描述

蓝桥幼儿园的学生是如此的天真无邪,以至于对他们来说,朋友的朋友就是自己的朋友。

小明是蓝桥幼儿园的老师,这天他决定为学生们举办一个交友活动,活动规则如下:

小明会用红绳连接两名学生,被连中的两个学生将成为朋友。

小明想让所有学生都互相成为朋友,但是蓝桥幼儿园的学生实在太多了,他无法用肉眼判断某两个学生是否为朋友。于是他起来了作为编程大师的你,请你帮忙写程序判断某两个学生是否为朋友(默认自己和自己也是朋友)。

输入描述

第 11 行包含两个正整数N,M,其中 N 表示蓝桥幼儿园的学生数量,学生的编号分别为1∼N。

之后的第2∼M+1 行每行输入三个整数op,x,y:

  • 如果 op=1,表示小明用红绳连接了学生 x 和学生 y 。
  • 如果 op=2,请你回答小明学生 x 和 学生 y 是否为朋友。

输出描述

对于每个op=2 的输入,如果 x 和 y 是朋友,则输出一行 YES,否则输出一行 NO

输入输出样例

示例 1

输入

5 5 
2 1 2
1 1 3
2 1 3
1 2 3 
2 1 2

输出

NO
YES
YES

代码 

package chsi;
import java.util.*;
public class chapter1 {static int []pre;//定义一个数组表示每个结点的根是指向谁的public static void main(String[] args) {// TODO Auto-generated method stubScanner scan=new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();pre=new int[n];//初始化prefor(int i=0;i<n;i++) pre[i]=i;//初始根都是指向它本身for(int i=0;i<m;i++) {int op=scan.nextInt();int x=scan.nextInt()-1;int y=scan.nextInt()-1;if(op==1) {union(x,y);}else {x=find(x);y=find(x);if(x==y) {System.out.println("YES");}else	System.out.println("No");}}}public static int find(int x) {if(pre[x]!=x) {pre[x]=find(pre[x]);}//表示当前结点不是我们的根节点return pre[x];}//先写一个find查询,路径压缩的方式public static void union(int x,int y) {x=find(x);y=find(y);if(x!=y) {pre[x]=y;}return;}}

 

相关文章:

并查集(基础+带权以及可撤销并查集后期更新)

并查集 并查集是一种图形数据结构&#xff0c;用于存储图中结点的连通关系。 每个结点有一个父亲&#xff0c;可以理解为“一只伸出去的手”&#xff0c;会指向另一个点&#xff0c;初始时指向自己。一个点的根节点是该点的父亲的父亲的..的父亲&#xff0c;直到某个点的父亲…...

基于 Java 的数据结构和算法 (不定期更新)

JavaIsBestLang 数据结构 Collection 是 Java 中的接口&#xff0c;被多个泛型容器接口所实现。在这里&#xff0c;Collection 是指代存放对象类型的数据结构。 ArrayList 函数名功能size()返回 this 的长度add(Integer val)在 this 尾部插入一个元素add(int idx, Integer …...

考研回忆录【二本->211】

备考时长差不多快一年半&#xff0c;从22年的11月底开始陆陆续续地准备考研&#xff0c;因为开始的早所以整个备考过程显得压力不是很大&#xff0c;中途还去一些地方旅游&#xff0c;我不喜欢把自己绷得太紧。虽然考的不是很好&#xff0c;考完我甚至都没准备复试&#xff0c;…...

【XCPC笔记】2023 (ICPC) Jiangxi Provincial Contest——ABCIJKL 做题记录

补题 赛后gym练习及补题&#xff0c;gym链接&#xff1a;2023 (ICPC) Jiangxi Provincial Contest – Official Contest 另外&#xff0c;D题我也打算找机会学习写下&#xff0c;C题的博弈论还需要好好理解&#xff0c;感觉都是比较有趣的数学问题 补题顺序如下 补题L [Zhang …...

猫头虎分享已解决Bug || **URLError (URL错误)** 全方位解析

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

如何使用极狐GitLab 启用自动备份功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何极狐GitLab 自…...

HTML/XML转义字符对照

特殊字符转义表 字符十进制转义字符"&quot;&&amp;<<<>>>不断开空格(non-breaking space) 最常用的转义字符列表 显示说明实体名称十进制编号半方大的空白&ensp;全方大的空白&emsp;不断行的空白格 <小于<<>大于&g…...

设计模式:组合模式示例

组合模式的典型例子通常涉及到树形结构的处理&#xff0c;下面是几个形象且易于理解的例子&#xff1a; 文件系统 在文件系统中&#xff0c;目录可以包含文件或者其他目录&#xff0c;但是从用户的角度来看&#xff0c;目录和文件都可以被“打开”或者“获取大小”。这里的目…...

普通情况和高并发时,Redis缓存和数据库怎么保持一致?

普通情况和高并发时&#xff0c;Redis缓存和数据库怎么保持一致&#xff1f; 普通情况思路 高并发时思路 Q&#xff1a;缓存和数据库怎么保持一致&#xff1f; A&#xff1a;绝对不可能保持一致的&#xff0c;在实际业务开发中&#xff0c;有一些方案可以做取舍。 实际业务中&a…...

Django -- 自动化测试

概述 测试是一种例行的、不可缺失的工作&#xff0c;用于检查你的程序是否符合预期。 测试可以划分为不同的级别。一些测试可能专注于小细节&#xff08;比如某一个模型的方法是否会返回预期的值&#xff1f;&#xff09;&#xff0c; 一些测试则专注于检查软件的整体运行是否…...

NodeJS 在Windows / Mac 上实现多版本控制

NodeJS 的多版本控制 本文介绍一下在 windows/MacOS 上 如何 切换和使用多个版本的 NodeJS。 Windows 本小节介绍一下在windows上管理不同版本的NodeJS。 nvm-windows 工具 nvm-windows 是在 windows 上管理 NodeJS 版本的一个工具。 它可以很方便的 下载、移除、查看、切…...

Web3 游戏周报(3.24-3.30)

【3.24-3.30】Web3 游戏行业动态&#xff1a; Web3 开发平台 Mirror World 在 Solana 上推出首个游戏 rollup 链 NFT 卡牌游戏 Parallel 完成 3,500 万美元融资&#xff0c;Solana Ventures 等参投 加密游戏开发公司 Gunzilla Games 完成 3,000 万美元融资 Telegram 游戏 No…...

算法思想1. 分治法2. 动态规划法3. 贪心算法4. 回溯法

目录 递归和动态的区别:空间和时间复杂度之争 递归空间复杂度低;动态时间复杂度第低...

SpringBoot+ECharts+Html 地图案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 此案例使用的地图是在ECharts社区中查找的&#xff1a;makeapie echarts社区图表可视化案例 2. 准备条件 在mysql中创建数据库echartsdb&#xff0c;数据库中创建表t_location_count表&#xff0c;表中设置两个…...

达梦数据库 优化

谁进行优化&#xff1f;优化什么&#xff1f; 优化不能仅从数据库方面考虑&#xff0c;比如&#xff0c;在存储达到数据库极限、应用涉及人员设计的代码稀巴烂的情况下&#xff0c;进行调优就是杯水车薪的效果。 涉及到优化人员&#xff1a; 数据库管理员应用程序架构师应用…...

数据如何才能供得出、流得动、用得好、还安全

众所周知&#xff0c;数据要素已经列入基本生产要素&#xff0c;同时成立国家数据局进行工作统筹。目前数据要素如何发挥其价值&#xff0c;全国掀起了一浪一浪的热潮。 随着国外大语言模型的袭来&#xff0c;国内在大语言模型领域的应用也大放异彩&#xff0c;与此同时&#x…...

idea开发 java web 酒店推荐系统bootstrap框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 java 酒店推荐推荐系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式…...

Linux——线程控制

目录 前言 一、线程创建 1.创建线程 2.线程传递结构体 3.创建多线程 4.收到信号的线程 二、线程终止 三、线程等待 四、线程分离 五、取消线程 六、线程库管理的原理 七、站在语言角度理解pthread库 八、线程的局部存储 前言 前面我们学习了线程概念和线程创建&…...

【Leetcode 347】,前k个高频元素,小根堆的调整

参考题解 题目&#xff1a;给定一个数组&#xff0c;输出 前k个高频元素。 思路&#xff1a; 遍历数组&#xff0c;建立小根堆&#xff08;小根堆的元素是元组&#xff08;num,freq&#xff09;&#xff0c;排序规则是每个元素的频率&#xff09;。 下面使用数组‘heap’&…...

【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

本文涉及的知识点 图论 分类讨论 本题同解 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 LeetCode3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 …...

VDisk技术详解:原理、应用与优化实践指南

VDisk技术详解&#xff1a;原理、应用与优化实践指南传统的桌面运维管理面临效率和成本控制的双重挑战&#xff0c;例如操作系统和应用部署繁琐、维护更新困难、资源利用率低等。VDisk&#xff08;虚拟磁盘&#xff09;技术通过将操作系统、应用程序和用户数据集中存储在服务器…...

SegFormer完全指南:10分钟快速掌握基于Transformer的语义分割

SegFormer完全指南&#xff1a;10分钟快速掌握基于Transformer的语义分割 【免费下载链接】SegFormer Official PyTorch implementation of SegFormer 项目地址: https://gitcode.com/gh_mirrors/se/SegFormer SegFormer是一个简单、高效且强大的语义分割方法&#xff0…...

AIO PathProb 时序概率路径系统

本文由&#xff08;拓世网络技术开发工作室&#xff09;技术支持&#xff0c;欢迎共同开发第一部分&#xff1a;伪代码 / 算法描述&#xff08;给算法/工程侧&#xff09;1. 全局定义&#xff08;状态与概率&#xff09;import numpy as npfrom dataclasses import dataclass# …...

TPS5430做正负电源,一接负载就烧芯片?我烧了10片才找到这个关键电容

TPS5430正负电源设计避坑指南&#xff1a;为什么Vin与负Vout之间必须加Cd电容&#xff1f; 当我在实验室里闻到第十颗TPS5430芯片烧毁的焦糊味时&#xff0c;终于意识到这个看似简单的正负电源设计背后藏着不为人知的设计陷阱。作为一款经典的DC-DC降压芯片&#xff0c;TPS5430…...

LLaMA-Factory推理性能优化指南:如何用vLLM和量化技术提升3倍吞吐量

LLaMA-Factory推理性能优化实战&#xff1a;从参数调优到量化部署 当你的LLaMA-Factory模型推理请求从每秒10次飙升到1000次时&#xff0c;服务器突然开始报警——显存爆满、响应延迟激增、API错误率直线上升。这不是灾难片的开场&#xff0c;而是每个AI工程师终将面对的性能瓶…...

避坑指南:Webots 2022a在Windows安装后,为什么打不开示例项目?手把手教你排查与修复

Webots 2022a Windows安装避坑指南&#xff1a;示例项目无法加载的终极解决方案 当你满怀期待地在Windows上安装好Webots R2022a&#xff0c;准备开始机器人仿真之旅时&#xff0c;却发现内置的示例项目一片空白或频繁报错——这种挫败感我深有体会。作为一款功能强大的机器人仿…...

2026年重庆桶装水工厂,这些经营要点与避坑指南你知道吗?

2026 年&#xff0c;在重庆经营桶装水工厂&#xff0c;面临不少挑战和机遇。重庆水木华桶装水厂家有多年相关经验&#xff0c;能帮你少走弯路。下面就为你分享经营要点和避坑指南。常见经营痛点很多桶装水工厂老板都有过这样的经历。水质把控不好&#xff0c;容易出现异味、浑浊…...

革新性B站用户分析工具:智能解析评论区用户背景的终极方案

革新性B站用户分析工具&#xff1a;智能解析评论区用户背景的终极方案 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分&#xff0c;支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker …...

春联生成模型-中文-base应用场景解析:图书馆数字文化服务实战

春联生成模型-中文-base应用场景解析&#xff1a;图书馆数字文化服务实战 1. 引言&#xff1a;传统文化与AI的碰撞 春节贴春联是中国延续千年的文化习俗&#xff0c;一副好春联不仅承载美好祝愿&#xff0c;更体现文化底蕴。如今&#xff0c;AI技术让这一传统焕发新生。在图书…...

Windows 11下xray安装全流程:从下载到配置证书的保姆级教程

Windows 11安全工具配置全指南&#xff1a;从零开始搭建本地测试环境 在数字化生活日益普及的今天&#xff0c;个人电脑安全越来越受到重视。对于技术爱好者而言&#xff0c;了解和使用专业安全工具不仅能提升自身防护能力&#xff0c;也是学习网络安全知识的重要途径。本文将详…...