并查集讲解

并查集讲解

  • 一、算法描述
  • 二、图示讲解
  • 三、代码示例
  • 四、例题练习

一、算法描述

并查集算法是一种用于处理不相交集合数据结构的算法。它经常被用来解决网络流问题、图的最小生成树问题等。在这篇博客中,我们将深入理解并查集算法,以及如何在实际编程中使用它。

首先,我们需要了解什么是并查集。并查集是一种数据结构,它可以用于管理一组不相交的集合。每个集合由一个根节点表示,集合中的所有其他节点都是该根节点的子节点。并查集的主要操作是合并和查找。

合并操作将两个集合合并成一个集合。查找操作返回给定元素所属的集合的根节点。

并查集的实现通常使用路径压缩和union by rank策略。路径压缩策略在查找操作时立即缩短元素到根节点的路径。union by rank策略在合并操作时使合并后的集合的根节点具有更高的优先级。

二、图示讲解

  1. 如图所示,有初始7个节点如下所示:
    在这里插入图片描述
  2. 已知给出一个无向图的几条边:[0,2],[0,5],[2,4],[1,6],[5,4],原始无向图如下图所示。
    在这里插入图片描述
  3. 现在根据并查集算法合并调整图结构,更直观的给出哪些点对可以到达。
  4. 首先按顺序处理给定的边集,先处理【0,2】.查找0和2的祖先节点,然后比较两者祖先节点的权重大小。这里0和2的祖先节点是本身,且当两者的秩相同,以右侧节点为父节点(个人习惯)。此时节点0的权重为1,节点2的权重为2。我这里权重指的是包括自身在内的子节点数

在这里插入图片描述

  1. 处理边【0,5】:先查找0的祖先节点为2,其权重为2 。5的祖先节点为5,权重1 。所以比较2和5的权重,因此将5添加为2的子节点。
    在这里插入图片描述
  2. 处理【2,4】:2的祖先节点为2,权重为3,4的祖先节点为4,权重为1 。故将4添加到2的子节点
    在这里插入图片描述
  3. 处理【1,6】:1的祖先节点为1,权重为1. 6的祖先为6,权重为1 。将1添加为6的子节点
    在这里插入图片描述
  4. 处理【5,4】:5的祖先节点为2,4的祖先节点为2,当两者祖先节点相同时,不进行合并操作。
  5. 所以最终的节点图如下所示:
    在这里插入图片描述
    此时,各集合处理完毕,如果要求不可到达点对数,就可以根据各集合根节点的权重也就是包括自身在内节点数进行计算,上面的例子中的不可到达点对数为:4×2 + 4×1 + 1*2 = 14

三、代码示例

接下来,我们将看一个简单的并查集的Java实现:

class UnionUtil{//用来存储图的结点public int [] arrays ;//存储节点的深度public int [] sizes;//构造方法,根据节点个数进行初始化public UnionUtil(int n){init(n);}//初始化方法public void init(int n){arrays = new int[n];sizes = new int[n];for(int i = 0 ; i<n ; i++){arrays[i] = i;sizes[i] = 1;}}//查找节点的祖先节点,及根节点public int find(int i){if(arrays[i] == i){return i;}else{// 压缩路径,直接将节点指向根节点arrays[i] = find(arrays[i]);return arrays[i];}}//合并节点public void union(int x,int y){int a = find(x),b = find(y);if(a != b){//比较根节点的深度,将深度小的添加到深度高的if(sizes[a] = sizes[b]){arrays[b] = a;sizes[a] += sizes[b];}else{arrays[a] = b;sizes[b] += sizes[a];}}}//获取节点的深度public int getSize(int x){return sizes[x];}
}

在这个实现中,find函数用于查找元素的根节点,union函数用于合并两个集合。arrays列表存储每个元素的根节点,size列表存储每个根节点的优先级。

四、例题练习

leetcode-2316. 统计无向图中无法互相到达点对数

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

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

相关文章

设计模式思维导图

ProcessOn思维导图链接

睿趣科技:抖音小店申请流程

随着移动互联网的发展&#xff0c;越来越多的人开始尝试通过开设网店来创业。抖音作为国内最受欢迎的短视频平台之一&#xff0c;也推出了自己的电商功能——抖音小店。那么&#xff0c;如何申请抖音小店呢?下面就为大家详细介绍一下抖音小店的申请流程。 首先&#xff0c;打开…

基于springboot实现CSGO赛事管理系统【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现CSGO赛事管理系统演示 摘要 CSGO赛事管理系统是针对CSGO赛事管理方面必不可少的一个部分。在CSGO赛事管理的整个过程中&#xff0c;CSGO赛事管理系统担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类的管理系统也在不断改进。本课题所设计…

Redis的五种常用(基本)数据类型

目录 1、Redis简介 2、五种常用&#xff08;基本&#xff09;数据类型 2.1 String 数据结构 ⭐常用用法 举例&#xff08;Linux版本&#xff09; 2.2 List 数据结构 ⭐常用用法 举例&#xff08;Linux版本&#xff09; 2.3 Set 数据结构 ⭐常用用法 举例&#xf…

youyeetoo R1卡片电脑(rk3588s)

简介&#xff1a; youyeetoo R1 是风火轮科技专为AIOT市场设计的嵌入式主板(SBC)&#xff0c;体积小但功能强大&#xff0c;搭载瑞芯微旗舰级RK3588s 八核64位处理器&#xff0c;8nm 制程&#xff0c;主频高达2.4GHz&#xff0c;集成ARM Mali-G610 MP4 GPU&#xff0c;内置6 To…

「必看」一分钟学会!Steam账号注册全攻略!

Steam账号注册详细教程&#xff0c;你值得拥有&#xff01;&#x1f4a5; &#x1f44b; Hello各位亲爱的小伙伴们&#xff01;今天我要给大家带来的是一份超详细的Steam账号注册教程&#xff0c;让你轻松成为Steam世界的合法居民&#xff01;&#x1f389;&#x1f389; 1️…

2023版 STM32实战11 SPI总线读写W25Q

SPI全称 英文全称&#xff1a;Serial peripheral Interface 串行外设接口 SPI特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 全双工(收发可同时进行) -4- 通信只能由主机发起(一主,多从机) 开发使用习惯和理解 -1- CS片选一般配置为软件控制 -2- 片选低电平有效,从…

开源博客项目Blog .NET Core源码学习(4:生成验证码)

开源博客项目Blog中的后台管理登录界面中支持输入验证码&#xff08;如下图所示&#xff09;&#xff0c;本文学习并记录项目中验证码的生成及调用方式。   博客项目中调用VerifyCode类生成验证码&#xff0c;该类位于App.Framwork项目中&#xff0c;命名空间为App.Framwork…

基于Java的线上花店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Redis数据类型

Redis数据类型 文章目录 Redis数据类型0.基本命令&#xff08;1&#xff09;key操作命令(2)注意 1.字符串&#xff08;String&#xff09;&#xff08;1&#xff09;set key value&#xff08;2&#xff09;mset /mget&#xff08;3&#xff09;getrange/setrange&#xff08;4…

I/O模型之非阻塞IO

简介 五种IO模型   阻塞IO   非阻塞IO   信号驱动IO   IO多路转接    异步IO 代码书写 非阻塞IO 再次理解IO 什么是IO&#xff1f;什么是高效的IO&#xff1f; 为了理解后面的一个问题&#xff0c;我们首先要再重新理解一下什么是IO 在之前的网络介绍中&#xff…

C算法:输入一个数n,输出1到n之间所有的质数

需求&#xff1a; 写一个函数&#xff0c;输入一个数n&#xff0c;输出1到n之间所有的质数。&#xff08;注&#xff1a;质数又称素数。一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数。&#xff09; 输入样例&#xff1a; 10 …

又是一年1024程序员日

程序员节是每年的10月24日&#xff0c;这是一个特殊的节日&#xff0c;旨在庆祝和表彰程序员们对科技和社会的贡献。作为技术领域的从业者&#xff0c;程序员们在现代社会中扮演着重要的角色&#xff0c;他们致力于编写、测试和维护软件代码&#xff0c;为我们的生活带来了无数…

【原创】解决Kotlin无法使用@Slf4j注解的问题

前言 主要还是辟谣之前的网上的用法&#xff0c;当然也会给出最终的使用方法。这可是Kotlin&#xff0c;关Slf4j何事&#xff01;&#xff1f; 辟谣内容&#xff1a;创建注解来解决这个问题 例如&#xff1a; Target(AnnotationTarget.CLASS) Retention(AnnotationRetentio…

【Excel】WPS单元格快速转换表格字母大小写

使用WPS Office打开表格&#xff0c;选择需要处理的单元格或单元格区域。 依次点击「会员专享」选项卡 —>「智能工具箱」。 再点击「格式」—>「大小写」&#xff0c;选择一种大小写转换方式即可。

Hadoop3教程(三十):(生产调优篇)纠删码

文章目录 &#xff08;155&#xff09;纠删码原理纠删码原理纠删码相关命令纠删码策略解释 &#xff08;156&#xff09;纠删码案例实操参考文献 &#xff08;155&#xff09;纠删码原理 纠删码原理 默认情况下&#xff0c;一个文件在HDFS里会保留3个副本&#xff0c;以此提高…

uniapp map polygons 区域填充色(fillColor)在ios显示正常,但在安卓手机显示是黑色的,怎么解决?

uniapp map polygons 区域填充色&#xff08;fillColor&#xff09;在ios显示正常&#xff0c;但在安卓手机显示是黑色的,怎么解决&#xff1f; <MapPage :longitude"item.centerCoord[0]" :latitude"item.centerCoord[1]":polygons"[{ points: it…

Qt作业九

1、思维导图 2、作业 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTimerEvent> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

JAVA入门总结回顾

1.常用的DOS命令&#xff1a;DOS窗口常用命令-CSDN博客 2.检查jdk是否安装成功&#xff1a;在cmd中输入java -version或者java或者javac。出现相应的对应显示内容。 3.JDK&#xff0c;JRE之间的关系&#xff1a;JDK是JAVA的开发工具包&#xff0c;JRE是JAVA的的运行环境。JRE…

09 创建型模式-建造者模式

1.建造者模式介绍&#xff1a; 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不 同的表示。 2.建造者模式要解决的问题 建造者模式可以将部件和其组装过程分开&am…