Kruskal算法(二)之 C++详解

在含有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用于保存顶点,mVexNum是顶点数,mEdgNum是边数;mMatrix则是用于保存矩阵信息的二维数组。例如,mMatrix[i][j]=1,则表示”顶点i(即mVexs[i])”和”顶点j(即mVexs[j])”是邻接点;mMatrix[i][j]=0,则表示它们不是邻接点。

2. 克鲁斯卡尔算法

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

Original: https://www.cnblogs.com/skywang12345/p/3711500.html
Author: 如果天空不死
Title: Kruskal算法(二)之 C++详解

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

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

(0)

大家都在看

  • VC++之自定义消息

    用户可以自定义消息,在应用程序中主动发出,这种消息一般用于应用程序的某一部分内部处理。 实例说明: 当用户按键盘上的光标上移键时,程序发送用户自定义消息,在对应的消息响应函数中弹出…

    C++ 2023年5月29日
    061
  • 【转载】C++中替代sprintf的std::ostringstream输出流详解

    一、简单介绍 ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中。ostringstream类通常用于执行C风格的串流的输出操作,格式化字符…

    C++ 2023年5月29日
    045
  • CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

    bash;collapse:true;;gutter:true; cmake_minimum_required(VERSION 3.11.2)</p> <p&gt…

    C++ 2023年5月29日
    060
  • 80%学生的困惑,学完C/C++之后学什么?

    大家好,最近不少小伙伴问我,说是学院最近教完了C/C++之后就没有相关的语言课开设了,陷入了一个迷茫期,不知道后面应该学些什么,来向我请教。 一直以来问我这个问题的小伙伴还不少,我…

    C++ 2023年5月29日
    068
  • Android JNI之C/C++层调用JAVA

    从C/C++层调用JAVA层代码步骤: 1. 在JAVA类中创建java方法和本地方法 public class TestNdk{ int a;//本示例中将被修改的JAVA变量 …

    C++ 2023年5月29日
    052
  • !! vc C++ VS2017检查内存泄漏具体到某一行代码

    VLD工具可以用来检查VS C++程序的内存泄露。 VLD官网:https://kinddragon.github.io/vld/ 官网不方便下载的,可以用我的链接:https:/…

    C++ 2023年5月29日
    044
  • VC++.net 整合开发环境使用技巧

    VC++.net 整合开发环境使用技巧 在下面我将会以条目的形式为大家描述VC.net2003的各项使用技巧,你完全可以挑选你感兴趣的内存来看,甚至不看都无所谓哈,只求你的一点支持…

    C++ 2023年5月29日
    057
  • 聊聊 C++ 和 C# 中的 lambda 玩法

    这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 C11&#x6807;&#x51C6; 加进去的,也就是 2011 年,相比 C# 2007 …

    C++ 2023年5月29日
    053
  • Windows11搭建c/c++开发环境

    有了”c/c++”分类下的前边那些”基本概念1-9″以及”Windows上的gcc”的铺垫,终于可以搭建开发…

    C++ 2023年5月29日
    073
  • C++11 并发指南六( <atomic> 类型详解二 std::atomic )

    C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍) 一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::at…

    C++ 2023年5月29日
    0109
  • 关于C++ const 的全面总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。 Const 是C++中常用的类型修饰…

    C++ 2023年5月29日
    041
  • C++11 列表初始化

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于…

    C++ 2023年5月29日
    049
  • 2022年第十三届蓝桥杯C++B组国赛思路以及部分代码

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    C++ 2023年5月29日
    046
  • C/C++标准新特性简介

    参考文档 C语言的起源发展 C语言诞生于1972年,美国贝尔实验室。作者为:Dennis MacAlistair Ritchie(丹尼斯·里奇) & Kenneth Lan…

    C++ 2023年5月29日
    077
  • C++ 回调函数详解

    1、什么是回调函数回调函数本质上也是普通函数,只是调用机制有所区别——首先通过传参的形式将该函数的地址传递给其他函数,然后在其他函数中通过函数指针调用该函数。在其他函数中通过函数指…

    C++ 2023年5月29日
    072
  • EclipseC++学习笔记-10 warnings being treated as errors,,error: format ‘%u’ expects argument of type

    增加选项All Options增加-Wformat=0 本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。另外建了几个QQ技术群:2、全栈技…

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