Kruskal算法(三)之 Java详解

在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。

例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。

克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。

基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。
具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止。

以上图G4为例,来对克鲁斯卡尔进行演示(假设,用数组R保存最小生成树结果)。

第1步:将边

此时,最小生成树构造完成!它包括的边依次是:。

根据前面介绍的克鲁斯卡尔算法的基本思想和做法,我们能够了解到,克鲁斯卡尔算法重点需要解决的以下两个问题:
问题一 对图的所有边按照权值大小进行排序。
问题二 将边添加到最小生成树中时,怎么样判断是否形成了回路。

问题一很好解决,采用排序算法进行排序即可。

问题二,处理方式是:记录顶点在”最小生成树”中的终点,顶点的终点是”在最小生成树中与它连通的最大顶点”(关于这一点,后面会通过图片给出说明)。然后每次需要将一条边添加到最小生存树时,判断该边的两个顶点的终点是否重合,重合的话则会构成回路。 以下图来进行说明:

在将

(01) C的终点是F。
(02) D的终点是F。
(03) E的终点是F。
(04) F的终点是F。

关于终点,就是将所有顶点按照从小到大的顺序排列好之后;某个顶点的终点就是”与它连通的最大顶点”。 因此,接下来,虽然

有了前面的算法分析之后,下面我们来查看具体代码。这里选取”邻接矩阵”进行说明,对于”邻接表”实现的图在后面的源码中会给出相应的源码。

1. 基本定义

EData是邻接矩阵边对应的结构体。

MatrixUDG是邻接矩阵对应的结构体。mVexs用于保存顶点,mEdgNum用于保存边数,mMatrix则是用于保存矩阵信息的二维数组。例如,mMatrix[i][j]=1,则表示”顶点i(即mVexs[i])”和”顶点j(即mVexs[j])”是邻接点;mMatrix[i][j]=0,则表示它们不是邻接点。

2. 克鲁斯卡尔算法

这里分别给出”邻接矩阵图”和”邻接表图”的克鲁斯卡尔算法源码。

Original: https://www.cnblogs.com/skywang12345/p/3711504.html
Author: 如果天空不死
Title: Kruskal算法(三)之 Java详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538864/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Maven安装和在IDEA配置Maven

    一、Windows安装Maven 1、下载Maven 这里需要注意:不要去官网下载最新的版本,因为会出现与IDEA不兼容的现象。 这里提供下载地址:https://archive….

    Java 2023年6月5日
    0110
  • 利尔达NT90的 CAT1模组 使用MQTT连接 onenet studio

    先添加产品 添加设备 MQ消息队列是什么用途?只是定时下发数据的?是发给第三方服务器的,比如设备上线,那么服务器就会收到一个推送消息 可以使用 psotman 这个软件,添加设备 …

    Java 2023年5月30日
    0100
  • 【】二次通告–Apache log4j-2.15.0-rc1版本存在绕过风险,请广大用户尽快更新版本

    【转载自360众测】 Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文…

    Java 2023年6月5日
    0103
  • SpringBoot 上下文获取注入的Bean

    import org.springframework.beans.BeansException; import org.springframework.context.Applic…

    Java 2023年5月30日
    093
  • 面试官:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??

    大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解 @Autowired后会出现如下警告 Field injection is not re…

    Java 2023年6月15日
    085
  • 【UML分析、建模与设计】我在工作时遇到UML

    一、前言 UML分析、建模与设计 来自现实世界中的概念的抽象描述方法(摘取自《UML面向对象分析、建模与设计(第2版)》) 就我对UML分析与建模技术的认知,最早可追溯至2019年…

    Java 2023年6月13日
    069
  • Mybatis的一级、二级缓存

    一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Sessio…

    Java 2023年6月13日
    088
  • java Filter过滤器例外URL设置

    在web.xml声明的一个filter中: > 可以看到url-pattern的设置里面过滤的url规则是/admin/*,如果要把/admin/login.do排除在过滤u…

    Java 2023年5月29日
    054
  • Java判定一个数值是否在指定的开闭区间范围内

    对于开闭区间,在数学中的表示方式通常为 () 和 [],小括号代表开放区间,中括号代表封闭区间,而它们的区别主要在于是否包含 = 等于号,开闭区间通常会分为以下一些情形: (1, …

    Java 2023年6月8日
    052
  • SpringBoot集成ffmpeg实现视频转码播放

    背景 之前构建过文件预览服务,对于视频部分前端播放组件限制只能为mp4格式,为了支持更多视频格式决定对方案进行升级,由于视频格式较多,针对每一种格式定制选择播放器不太现实,决定对视…

    Java 2023年6月15日
    072
  • 批量转换文件字符集

    操作步骤 先设置输入路径与输出路径 输入路径:需要被转换的文件路径 输出路径:转换后的文件储存路径 我没有写这个属性的交互操作,只是在第一行用字面量进行设置 如果输出路径的目录不存…

    Java 2023年6月15日
    079
  • Java UUID的底层原理

    UUID的几个核心特定: 全局时空唯一性固定长度128比特,也就是16字节(1 byte = 8 bit)分配速率极高,单机每秒可以生成超过1000万个UUID(实际上更高) UU…

    Java 2023年5月29日
    081
  • 戏说领域驱动设计(廿四)——资源库

    开讲资源库,这东西简单来说就是用于持久化或查询聚合的。注意!您需要与DAO分别:DAO操作的对象是数据实体;而资源仓库的目标是聚合(不存在通过资源库操作值对象的情况,值对象必须依赖…

    Java 2023年6月7日
    082
  • MyBatis:基本配置和使用

    添加依赖 <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisart…

    Java 2023年5月30日
    062
  • node-java的使用及源码分析

    上篇文章简单提了下node调用java的方法但也只属于基本提了下怎么输出helloworld的层度,这次将提供一些案例和源码分析让我们更好地了解如何使用node-java库。 前置…

    Java 2023年6月5日
    0106
  • quartz框架(五)-Trigger相关内容

    上篇博文,博主介绍了Job的相关内容。本篇博文,博主将介绍Trigger相关的内容。 Trigger是触发器的意思,它只定义Trigger相关属性的Get方法。一个Trigger只…

    Java 2023年6月7日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球