学懂最小生成树(克鲁斯卡尔算法)

2023-11-16

本节,小编将带大家了解最小生成树的第二种构成算法——克鲁斯卡尔算法(Kruskal algorithm) 

当然,对另一种算法感兴趣的朋友可以看看之前的这篇文章:学懂最小生成树(普里姆算法)

目录

一.实现原理

 二.代码实现


一.实现原理

克鲁斯卡尔算法的思想是:

将所有边从小到大排序,然后依照边从小到大将顶点链式连接起来,直到所有的顶点连成一条链。

原理图:

CSDN@就要宅在家

 二.代码实现

实现克鲁斯卡尔算法,我们需要准备两个“工具”,一是结构体数组,里头存放边和该边的两个顶点,用途是升序存放边;二是下标数组,用途是存放到到每个顶点的最小边的顶点下标。

以上图为例:

下标数组设为int vexlist[4];

最终里头存放的下标分别

vexlist[0] vexlist[1] vexlist[2] vexlist[3]
0 3 0 1

以vexlis[1]为例,意思就是到顶点b的最小边是d指向的。

上代码!

void MiniTree_kruskal(UND* u)//排序邻接矩阵所有边权值,从小到大放入克鲁斯卡尔数组
{
	MiniTree_K tm;
	int vexlist[MAXVEX];//建立顶点数组,用于标识个个顶点分量
	sort_K(*u, tm);//升序排序边
	for (int i = 0; i < u->vexnum; i++)//初始化下标数组
	{
		vexlist[i] = i;
	}
	for (int i = 0; i < u->arcnum; i++)//主循环
	{
		int v1 = Findvex(u, tm[i].head);//找这个边的头下标
		int v2 = Findvex(u, tm[i].tail);//找尾下标
		if (vexlist[v1] != vexlist[v2])
		{
			cout << tm[i].head << "->" << tm[i].tail << endl;//打印
			int k = vexlist[v2];//如果有的顶点已经与尾连接起来,将它的vexlist指向头,防止出现路径循环
			for (int j = 0; j < u->vexnum; j++)//找顶点是否与尾连起来
			{
				if (vexlist[j] == k)//如果与尾连起来,那该顶点与尾一起指向头
					vexlist[j] = vexlist[v1];
			}
		}
	}

}
void sort_K(UND u, MiniTree *tm)//排序
{
	int sub = 0;//
	for (int n = 0; n < u.arcnum; n++)//
	{
		int x = 0, y = 0, mininum = Maxnum;
		for (int i = 0; i < u.vexnum; i++)//
		{
			for (int j = 0; j < u.vexnum; j++)
			{
				if (u.form[i][j] < mininum)
				{
					x = i; 
					y = j;
					mininum = u.form[i][j];
				}
			}
		}
		tm[sub].head = u.list[x];
		tm[sub].tail = u.list[y];
		tm[sub].weight = u.form[x][y];
		u.form[x][y] = Maxnum;
		sub++;
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学懂最小生成树(克鲁斯卡尔算法) 的相关文章

随机推荐

  • Webpack配置Vue热更新

    Webpack配置Vue热更新 需要的包 cnpm i vue webpack webpack cli webpack dev server html webpack plugin clean webpack plugin style lo
  • 【正点原子MP157连载】第七章 认识HAL库-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1 实验平台 正点原子STM32MP157开发板 2 购买链接 https item taobao com item htm id 629270721801 3 全套实验源码 手册 视频下载地址 http www openedv com t
  • selenium4

    1 单选框和复选框 单选框 type radio 定位 gt 点击 判断是否被选中 元素 is selected 复选框 type checkbox 只选择一个 gt 同单选框一样 全选 定位所有复选框 遍历 判断是否被选中 点击 选择部分
  • java入门六:java基础终章

    1 static关键字 静态变量和类一起加载 final修饰后的类无法被继承 2 抽象类 abstract修饰符可以用来修饰方法也可以修饰类 如果修饰方法 那么该方法就是抽象方法 如果修饰类 那么该类就是抽象类 抽象类中可以没有抽象方法 但
  • Linux Shell程序设计(2)

    实验十一 Shell程序设计 2 一 实验要求 综合运用shell编程知识进行设计性编程 二 实验内容和实验步骤 1 实验内容 假设你作为某工厂生产管理员 需要负责统计各车间每天生产的产品数据 你的计算机安装了双硬盘 为了保证数据安全 你在
  • 【定位问题】Mybatis-plus的selectPage()分页查询不生效问题

    背景 项目需要从mybits切换到mubits plus 但是我在进行分页查询的时候 发现一直不生效 问题原因 添加监听器 配置如下 Configuration MapperScan com baomidou mybatisplus sam
  • parted创建硬盘分区并创建LVM

    目的 将两个三T的硬盘做成LVM sdc sdd 一 parted将硬盘进行分区 1 parted的命令方式 Parted 命令分为两种模式 命令行模式和交互模式 1 命令行模式 parted option device command 该
  • 【原创】第一个iOS应用程序

    摘要 第一个iOS应用程序 包括获取控件 绑定事件 设置属性等内容 iOS Objective C 目录 第一章 窗口与应用程序 第二章 添加视图 2 1 从nib文件初始化视图 2 2 使用脚本添加视图 第三章 添加子视图 3 1 通过x
  • 制作自己的 Kindle 电子书

    想象以下场景 你刚收到一台新的 Kindle Paperwhite 心中已然响起了轰轰烈烈的 我今年 或这个冬天 一定要阅读 100 本书 结果发现 想看的书 Amazon 上找不到 或者排版很糟糕 如何解决 自己动手做呗 准备工作 我使用
  • UE4 UI实现改键功能

    主要内容 本文主要讲解如何在UI中实现自定义按键的功能类似于游戏中的改键操作 用到的是UE4自带的第三人称案例 因为第三人称自带了小白人和几个按键绑定就不用再手动去设置 实现步骤 1 创建两个UMG用来展示UI效果 1 创建WBP Key
  • C++链表合并

    有l1和l2两个链表 这两个链表降序排列 把l2合并到l1中 并按降序排列 同时清空l2链表 例如l1 9 8 7 6 l2 12 11 10 5 4 3 2 1 合并后l1 12 11 10 9 8 7 6 5 4 3 2 1 l2 in
  • 【Android】利用intent启动浏览器

    文章目录 一 默认浏览器 二 指定浏览器 三 选择浏览器 一 默认浏览器 需要设置Action和Date属性 构造 Uri uri Uri parse https www baidu com Intent intent new Intent
  • SCADE Suite 状态机之变量隐式赋值

    SCADE Suite 状态机之变量隐式赋值 1 变量的隐式赋值 目的 简化模型设计 Last 只要没有显示赋值 便取上一周期的数值 Default 只要没有显示赋值 便取默认设置的数值 优先级更高 设置方法 2 定义变量的Last值 1
  • LeetCode 817:链表组件(计数)

    解法一 常规解法 建图 DFS 时间复杂度O n O n 空间复杂度因为需要存储图 所以是O n 这种方法是通解 对于所有图都适用 Definition for singly linked list struct ListNode int
  • lua元表以及元方法

    知微出凡 lua元表以及元方法 lua中的变量是没有数据类型的 值有类型 类型有八种nil number boolean string function thread userdata以及table Lua 中的每个值都可以有一个 元表 这
  • 62.[GIS基础]笛卡尔坐标系

    文章目录 笛卡尔坐标系 多坐标系 坐标系的嵌套 坐标变换 坐标系转换 转载请注明原始链接 http blog csdn net a464057216 article details 54578069 后续此博客不再更新 欢迎大家搜索关注微信
  • 基于粒子群算法(PSO)优化径向基神经网络(PSO-RBF)的分类预测。matlab代码,优化参数为扩散速度,采用交叉验证。多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 读取数据 res xlsread 数据集 xlsx 分析数据 num class length unique
  • 抛去容抗角度,从电容充放电角度理解RC低通滤波器

  • 和你一起从零开始写RISC-V处理器(2)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 上期回顾 一 正片开始 编写各个模块 pc reg模块 if模块 rom模块 if id模块 id模块 regs模块 id ex模块 ex模块 二 顶层模块搭建 三 测试文件
  • 学懂最小生成树(克鲁斯卡尔算法)

    本节 小编将带大家了解最小生成树的第二种构成算法 克鲁斯卡尔算法 Kruskal algorithm 当然 对另一种算法感兴趣的朋友可以看看之前的这篇文章 学懂最小生成树 普里姆算法 目录 一 实现原理 二 代码实现 一 实现原理 克鲁斯卡