数据结构-Prim算法构造无向图的最小生成树
引子:
无向图如果是一个网,那么它的所有的生成树中必有一颗生成树的边的权值之和是最小的,我们称
这颗权值和最小的树为:“最小生成树”(MST)。
其中,一棵树的代价就是树中所有权值之和。
而在现实中,最小生成树的概念可以用来解决很多实际问题,例如,在n个城市之间建立交通网,
那么哪一条路径是最短的呢?就可以用最小生成树来解决。
算法思想:
设G = (V,E)为以连通网,其中V为顶点集合,E为带权边集合。
设置两个新集合U和T:
U用于存放最小生成树的顶点,T用于存放最小生成树的边。
令集合的初值为:{u0}(假设构造最小生成树时,从顶点u0出发。)
集合T的初值为{}。
从所有u∈U,v∈V-U的边(u,v)中,选取最小权值的边(u0,v0),将顶点v0加入集合U中,将边
(u0,v0)加入集合T中。
如此不断重复,知道U = V,最小生成树构造完成,集合T中包含了最小生成树中的所有边。
分析算法可知:
为了实现Prim算法,需要一个辅助数组closedge以记录从U到V-U具有最小代价的边。
对于closedge数组需要包含两个域:
adjvex和lowcost,其中lowcost = 0表示若顶点v不在生成树上,用closedge.lowcost存放v与生成树
上的另一个顶点的序号所构成边的权值。
adjvex存放与该边相关联的生成树上的另一顶点的序号。
算法生成图
对于下面这个无向图例子来说:

算法的执行过程如下:


代码部分:
#include<stdio.h>
#define MAX 100
typedef struct Mgraph{char vertex[MAX];int arcs[MAX][MAX];int vexnum,arcnum;
}Mgraph;typedef struct Closedge{char adjvex[MAX];int lowcost[MAX];
}Closedge;int LocateVerTex(Mgraph *G,char v)
{int k;for(k=0;k<G->vexnum;k++)if(G->vertex[k] == v)return k;return -1;
}void CreateMgraph(Mgraph *G)
{int i,j,weight,adj1,adj2;char v1,v2;printf("请输入顶点数和边数:\n");scanf("%d %d",&G->vexnum,&G->arcnum);getchar();printf("请输入:{%d}个顶点:\n",G->vexnum);for(i=0;i<G->vexnum;i++)scanf("%c",&G->vertex[i]);getchar();printf("请输入:{%d}条边:(格式如下:v1 v2 权值).\n",G->arcnum);for(i=0;i<G->vexnum;i++){for(j=0;j<G->vexnum;j++){G->arcs[i][j] = 9999;}}for(i=0;i<G->arcnum;i++){scanf("%c %c %d",&v1,&v2,&weight);getchar();adj1 = LocateVerTex(G,v1);adj2 = LocateVerTex(G,v2);if(adj1 == -1 || adj2 == -1){printf("失败.\n");i = i - 1;continue;}else{G->arcs[adj1][adj2] = weight;G->arcs[adj2][adj1] = weight;printf("成功.\n");}}
}int MiniNum(Closedge *closedge,Mgraph *G)
{int j,p = 1,min = 999;for(j=0;j<G->vexnum;j++){if(closedge->lowcost[j] != 0 && closedge->lowcost[j] < min){min = closedge->lowcost[j];p = j;}}return p;
}void MiniTree_Prim(Mgraph *G,char u)
{int i,j,k,num;k = LocateVerTex(G,u);Closedge closedge;for(i=0;i<G->vexnum;i++){if(i!=k){closedge.adjvex[i] = u;closedge.lowcost[i] = G->arcs[k][i];}}closedge.lowcost[k] = 0;printf("最小生成树的各条边为:\n");for(i=1;i<G->vexnum;i++){k = MiniNum(&closedge,G);printf("边:<%c,%c>,权值为{%d}:\n",closedge.adjvex[k],G->vertex[k],closedge.lowcost[k]);closedge.lowcost[k] = 0;for(j=0;j<G->vexnum;j++){if(G->arcs[k][j] < closedge.lowcost[j]){closedge.adjvex[j] = G->vertex[k];closedge.lowcost[j] = G->arcs[k][j];}}}
}int main()
{Mgraph G;CreateMgraph(&G);MiniTree_Prim(&G,'A');return 0;
}
验证部分:

相关文章:
数据结构-Prim算法构造无向图的最小生成树
引子: 无向图如果是一个网,那么它的所有的生成树中必有一颗生成树的边的权值之和是最小的,我们称 这颗权值和最小的树为:“最小生成树”(MST)。 其中,一棵树的代价就是树中所有权值之和。 而…...
MFC串口通信(SerialPort)
目录 1、SerialPort类的介绍和使用: (1)、SerialPort类的功能介绍 (2)、SerialPort类提供接口函数的介绍 1)、InitPort函数 2)、控制串口监视线程函数 3)、获取事件,…...
Vim基本使用操作
前言:作者也是初学Linux,可能总结的还不是很到位 Linux修炼功法:初阶功法 ♈️今日夜电波:美人鱼—林俊杰 0:21━━━━━━️💟──────── 4:14 …...
【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--作业
0. 题目 1. T1 逆深度参数化时的特征匀速模型的重投影误差 参考常鑫助教的答案:思路是将i时刻的观测投到world系,再用j时刻pose和外参投到j时刻camera坐标系下,归一化得到预测的二维坐标(这里忽略了camera的内参,逆深…...
Naocs配置中心配置映射List、Map、Map嵌套List等方式
一、配置映射List 1、常规逐个配置方式,示例如下: 代码: @Data @Configuration @ConfigurationProperties(prefix = "list-json-str") public class ConfListByJsonStr implements Serializable, InitializingBean {@ApiModelProperty("映射结果集")…...
如何通过CRM系统进行销售机会管理?
销售机会管理是在销售过程中对潜在客户的精细化管理,销售机会管理的本质是公司用于管理销售机会通用的工具和方法。对于希望建立长期客户关系的现代销售团队来说,CRM客户管理系统是必不可少的工具。那企业如何通过CRM系统进行销售机会管理? …...
解决idea启动tomcat控制台中文乱码
#1.tomcat日志中文乱码# 如图这种情况,一般在idea用tomcat跑一个web项目启动后tomcat日志在控制台打印出来会出现中文乱码的情况 解决方案1:tomcat的日志配置文件的编码修改,找到tomcat安装目录conf下的logging.properties,encod…...
vscode + cmake + opencv example
nice try on macos CMakeLists.txt cmake_minimum_required(VERSION 3.20) #添加OPENCV库 #指定OpenCV版本,代码如下 #find_package(OpenCV 3.3 REQUIRED) #如果不需要指定OpenCV版本,代码如下 find_package(OpenCV REQUIRED)#添加OpenCV头文件 includ…...
day57【动态规划】647.回文子串 516.最长回文子序列
文章目录 647. 回文子串516.最长回文子序列 647. 回文子串 力扣题目链接 代码随想录讲解 题意:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的…...
分享vmware和Oracle VM VirtualBox虚拟机的区别,简述哪一个更适合我?
VMware和Oracle VM VirtualBox虚拟机的区别主要体现在以下几个方面: 首先两种软件的安装使用教程如下: 1:VMware ESXI 安装使用教程 2:Oracle VM VirtualBox安装使用教程 商业模式:VMware是一家商业公司,而…...
YOLOV5模型运行
1安装包 如果已经有了torch-cuda环境直接在环境下 pip install -r requirements.txt 2解决报错代码 raise ImportError("Failed to initialize: {0}".format(exc)) from exc ImportError: Failed to initialize: Bad git executable. The git executable must be …...
@Autowired和@Resource注解的区别和联系
直接看原文 原文链接: 【精选】Autowired和Resource注解的区别和联系【精选】 ------------------------------------------------------------------------------------------------------------------------------- 先说联系 联系 Autowired和Resource注解都是作为bean…...
设计模式类型
创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系…...
Android修行手册-实现利用POI将图片插入到Excel中(文末送书)
点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…...
低功耗工业RFID设备应用
随着工业自动化的迅速发展,RFID技术也在工业领域得到了广泛的应用,在近距离非接触读写应用时,常常利用低功耗的工业RFID设备来进行识别,下面我们将详细介绍低功耗工业RFID设备的应用。 低功耗工业RFID设备具有功耗低、体积小、重量…...
# Oracle 库常见问题排查
Oracle 库常见问题排查 文章目录 Oracle 库常见问题排查查询数据库的相关信息查看正在执行的语句杀掉正在执行的sql查看未提交的事务查看锁表 查询数据库的相关信息 查看正在执行的语句 SELECT s.sid, s.serial#, s.username, s.status, s.sql_id, s.sql_child_number, sq.sq…...
矩阵乘积的迹对矩阵求导
说明 有时候为了输入方便,B和都代表B的转置。 矩阵的在线计算有个网站可以参考:Matrix Calculus dtr(AB)/dAB 下面用一个例子来证明。 dtr(ABA)/dAABAB 下面用一个例子来证明: 因为我们要求ABA的迹,所以为了简便,我们…...
IP 地址冲突检测工具
IP 冲突是一个术语,用于表示同一网络或子网中尝试使用相同 IP 地址的两个或多个设备的状态,这可能会导致发往特定主机的通信与其他主机混淆,因为两者都使用相同的 IP,为了避免这种情况,某些主机在发生 IP 冲突时会失去…...
js树形数组遍历练习,扁平化、格式化、获取节点父级
1.树形数组扁平化 数组扁平化的方式很多,这里主要是用递归处理,除此之外还有正则、扩展运算符等等 const list [{name:1,id:1,children:[{name:11,id:11,children:[{name:111,id:111}]},{name:12},]},{name:2,id:2,children:[{name:21,id:21,children:…...
c语言贪吃蛇项目的实现
ncurse的引入 ncurse的概念 ncurse(new curses)是一套编程库,它提供了一系列的函数,以便使用者调用它们去生成基于文本的用户界面。 ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。ncurses用得最多的地方是…...
医学图像分割模型‘瘦身’实战:如何用UNet++的深度监督功能,在推理速度与精度间找到最佳平衡点
医学图像分割模型优化实战:UNet深度监督与剪枝策略全解析 在医疗AI领域,实时性和准确性往往是一对难以调和的矛盾。临床医生需要快速获取分割结果辅助诊断,而放射科图像的高精度要求又让模型复杂度居高不下。UNet通过创新的嵌套架构和深度监督…...
《作妖计》通天塔副本速通技巧:手把手教你配置如来、多宝幻化增伤流
《作妖计》通天塔&副本极限增伤流实战手册:从幻化配置到怒气微操 在《作妖计》的高阶PVE玩法中,通天塔和灭神殿副本一直是检验玩家阵容深度与策略理解的试金石。当常规的装备强化、武将升星已经无法突破当前瓶颈时,一套精准的增伤体系往往…...
AI换脸能骗过亲妈?老马跟你聊聊可信AI的生死线
《人工智能AI之计算机视觉:从像素到智能》 模块五:未来与生态——多模态、产业与思维升维(认知拓展) 第 21 篇 老马问你个让你心里咯噔一下的问题: 你有没有在某个微信群里,看到过一段让你目瞪口呆的视频?比如某个平时不苟言笑的企业家,突然在视频里大放厥词;或者某…...
MYSQL——基础知识(元数据)
目录 前言 一、SQL 元数据 二、information_schema:MySQL 的元数据宝库 三、information_schema 核心表详解与实战 四、其他获取元数据的方式 五、在应用程序中使用元数据 六、总结:元数据的价值 前言 在数据库的世界中,元数据&#…...
中兴光猫配置解密工具:3步解锁隐藏网络功能,实现完全控制
中兴光猫配置解密工具:3步解锁隐藏网络功能,实现完全控制 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 想要彻底掌控家中光猫的隐藏功能吗&#…...
15分钟完成黑苹果配置:OpCore-Simplify智能自动化工具终极指南
15分钟完成黑苹果配置:OpCore-Simplify智能自动化工具终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而头…...
【功能安全C++生死线】:3个未加volatile的变量,如何让某风电主控系统在-40℃下静默失效?
更多请点击: https://intelliparadigm.com 第一章:【功能安全C生死线】:3个未加volatile的变量,如何让某风电主控系统在-40℃下静默失效? 在风电主控系统的功能安全认证(IEC 61508 SIL3 / ISO 26262 ASIL…...
【YOLOv11】062、YOLOv11模型硬件感知优化:针对特定硬件架构的优化
上周在部署YOLOv11到边缘设备时遇到了一个典型问题:在服务器上推理速度能达到30FPS的模型,搬到Jetson Orin上直接掉到了8FPS。更诡异的是,GPU利用率始终上不去,CPU倒是忙得不行。盯着nvidia-smi看了半天才反应过来——这模型压根没跟硬件对上话。 硬件不是黑盒子 很多人把…...
SQLx:一款优秀的异步 SQL 工具库
SQLx:一款优秀的异步 SQL 工具库 传统 ORM 工具会引入冗余抽象,而原生 SQL 操作又容易出现运行时错误。SQLx 作为 Rust 生态中备受推崇的 SQL 工具库,以编译时 SQL 验证为核心卖点,兼顾异步支持、轻量等特性,解决了上述…...
Docker运行AI代码到底安不安全?:3类高危逃逸场景复现+4层加固策略(附可落地的yaml模板)
更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术对比评测报告 在 AI 模型快速迭代与第三方代码频繁集成的背景下,安全可靠的沙箱执行环境成为关键基础设施。Docker 提供的轻量级容器化沙箱机制&#x…...
