【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
目录😋
任务描述
相关知识
带权无向图
建立邻接矩阵
Prim算法
1. 算法基本概念
2. 算法背景与目标
3. 算法具体步骤
4. 算法结束条件与结果
测试说明
通关代码
测试结果
任务描述
本关任务:编写一个程序求图的最小生成树。
相关知识
为了完成本关任务,你需要掌握:
- 观察带权无向图
- 建立邻接矩阵
- Prim算法。
-
带权无向图
针对带权无向图设计图的最小生成树,如下列图形。

![]()
-
建立邻接矩阵
上述带权无向图对应的二维数组,根据它建立下列邻接矩阵:
int A[MAXV][MAXV];注意:INF表示无穷大,表示整数:32767
-
Prim算法
1. 算法基本概念
普里姆(Prim)算法是图论中用于求解最小生成树的一种经典的构造性算法,其核心思想是通过逐步挑选权值最小的边来构建出整个图的最小生成树。
2. 算法背景与目标
在一个连通无向图 中(其中 表示顶点集合, 表示边集合,每条边都带有相应的权值),最小生成树是一棵包含图 中所有顶点的无环连通子图,并且这棵子图所有边的权值之和是所有可能的生成树中最小的。Prim 算法就是为了高效地找出这样的最小生成树而设计的。
3. 算法具体步骤
第一步:初始化操作:
- 首先,任选图 中的一个顶点 ,将其放入集合 中,即 。此时,集合 表示已经被选入到正在构建的最小生成树中的顶点集合,而 就是尚未被选入的顶点集合。
- 接着,把顶点 到其他所有顶点(也就是 中的顶点)的所有边都作为初始的候选边。这些候选边将成为后续挑选最小权值边的基础,它们都有可能最终被选入最小生成树当中。
第二步:迭代过程(重复 次,其中 是图 中顶点的总数):
- 步骤①:挑选最小权值边并更新顶点集合
- 从当前的候选边集合中,仔细挑选出权值最小的那一条边。这条边是连接集合 中的顶点和 中的顶点的边。设这条权值最小边在 这一侧的顶点是 。
- 然后,将顶点 加入到集合 中,这意味着 已经被选入到正在构建的最小生成树里了。由于 已经被选中,为了避免后续重复考虑一些不合适的边以及保证生成树无环等性质,需要把和顶点 关联的其他边(也就是一端是 ,另一端在 中的边)从候选边集合中删除掉。
- 步骤②:修改候选边集合
- 接下来,需要考察当前 中的每一个顶点 ,去更新与之相关的候选边情况。对于每一个 ,如果存在边 ,并且这条边 的权值小于原来和 关联的候选边的权值(也就是之前被视为连接 到 中顶点的最小权值边),那么就用边 取代原来那条候选边,作为新的连接 到 中顶点的候选边。通过这样不断地更新候选边集合,能保证在每一轮迭代中,候选边始终是连接已选顶点集合 和未选顶点集合 的当前最优选择,从而逐步构建出最小生成树。
4. 算法结束条件与结果
当上述迭代过程重复了 次之后,此时集合 中已经包含了图 的所有 个顶点,而挑选出来的边就构成了图 的一棵最小生成树。整个过程通过不断挑选局部最优(权值最小)的边,最终实现了全局最优(生成树边权值总和最小)的目标。
例如:对于一个简单的连通无向图,有 5 个顶点 、、、、 ,各边有权值,若一开始选择顶点 作为 放入 中,然后按照 Prim 算法的步骤逐步挑选边、更新候选边以及加入新顶点,经过 4 次迭代后,就能得到该图的最小生成树,且这棵最小生成树的边权值总和是所有可能生成树中最小的。
测试说明
平台会对你编写的代码进行测试:
测试输入:(先输入图的顶点数和边数,再输入图的邻接矩阵。)
6 10 0 5 8 7 32767 3 5 0 4 32767 32767 32767 8 4 0 5 32767 9 7 32767 5 0 5 6 32767 32767 32767 5 0 1 3 32767 9 6 1 0
预期输出:
Prim算法求解结果: 边(0,5)权为:3 边(5,4)权为:1 边(0,1)权为:5. 边(1,2)权为:4 边(4,3)权为:5
开始你的任务吧,祝你成功!
通关代码
#include <bits/stdc++.h>using namespace std;//图的存储结构#define INF 32767 //定义∞#define MAXV 100 //最大顶点个数typedef char InfoType;// 邻接矩阵表示的图typedef struct {int edges[MAXV][MAXV]; // 邻接矩阵int n, e; // 顶点数和边数} MGraph;// 边的结构体typedef struct {int u; // 顶点uint v; // 顶点vint w; // 边(u, v)的权值} Edge;// 初始化图void InitGraph(MGraph &g) {for (int i = 0; i < MAXV; i++) {for (int j = 0; j < MAXV; j++) {g.edges[i][j] = INF;}}}// Prim算法void Prim(MGraph g, int start) {int lowcost[MAXV]; // 存储从U到V-U的边中最小权值int closest[MAXV]; // 存储V-U中与U最接近的顶点bool u[MAXV]; // 标记顶点是否已在U中// 初始化for (int i = 0; i < g.n; i++) {lowcost[i] = g.edges[start][i];closest[i] = start;u[i] = false;}u[start] = true; // 将起始顶点加入Ufor (int i = 1; i < g.n; i++) { // 需要加入n-1个顶点int min = INF;int k = -1;// 找到最小的边for (int j = 0; j < g.n; j++) {if (!u[j] && lowcost[j] < min) {min = lowcost[j];k = j;}}// 输出最小生成树的边cout << "边(" << closest[k] << "," << k << ")权为:" << min << endl;u[k] = true; // 将顶点k加入U// 更新lowcost和closestfor (int j = 0; j < g.n; j++) {if (!u[j] && g.edges[k][j] < lowcost[j]) {lowcost[j] = g.edges[k][j];closest[j] = k;}}}}int main() {MGraph g;int n, e;cin >> n >> e; // 输入顶点数和边数g.n = n;g.e = e;InitGraph(g);// 输入邻接矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cin >> g.edges[i][j];}}// 调用Prim算法cout << "Prim算法求解结果:" << endl;Prim(g, 0); // 从顶点0开始return 0;}
测试结果


相关文章:
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
目录😋 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务:编写一个程序求图的最小生成树。 相关知识 为了完成…...
Java(1)入门基础
1. Java简介 1.1 什么是Java Java 是一款由Sun Microsystems公司(现为甲骨文公司Oracle Corporation的一部分)的James Gosling及其团队在1995年发布的高级编程语言。同时,Java 是一种面向对象的语言,这意味着它允许开发者通过创…...
2024.1.5总结
今日不开心:这周本来想花点时间学习的,没想到全都花在刷视频,外出消费去了。 今日思考: 1.找对象这件事确实不能强求,顺其自然吧,单身和不单身,其实,各有各的利弊。在一次坐地铁的过程中,我一…...
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、循环控制 / 跳转语句的使用 1. 循环控制语句(for 循环) 2. 循环控制语句(while 循环) 3. 跳转语句(break 语句) 4. 跳转语句(continue 语句&…...
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接,支持多路复用,即通过单个通道可以发送多…...
Linux中的tty和pts概念和区别
目录 1、什么是tty (1)tty的概念 (2)tty0 (3)tty1~6 2、什么是pts (1)pts的含义 (2)pts的具体解释 3、pts与 tty 设备的比较 4、设备文件的位置 1、什…...
【SOC 芯片设计 DFT 学习专栏 -- RTL 中的信号名和 Netlist 中的信号名差异】
Overview 本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异, 在 SoC设计中,RTL-to-Netlist映射 是从RTL(Register Transfer Level)代码转换为Netlist的过程。这通常涉及将用硬件描述语言&…...
机器学习经典算法——线性回归
目录 算法介绍 一元线性回归模型 多元线性回归模型 误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析,来确定两种或两种…...
MLU上使用MagicMind GFPGANv1.4 onnx加速!
文章目录 前言一、平台环境准备二、环境准备1.GFPGAN代码处理2.MagicMind转换修改env.sh修改run.sh参数解析运行 3.修改后模型运行 前言 MagicMind是面向寒武纪MLU的推理加速引擎。MagicMind能将人工智能框架(TensorFlow、PyTorch、Caffe与ONNX等)训练好…...
VulnHub—potato-suncs
使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato,就想着爆破一下密码 hydr…...
【Flink CDC】Flink CDC的Schema Evolution表结构演变的源码分析和流程图
Flink CDC版本:3.2.1 说明:本文从SchemaOperator接收到,表结构变更事件开始,表结构变更事件应由source端产生,本文不讨论。 可以先看流程图,研究源码。 参考文章: Flink cdc3.0动态变更表结构—…...
【智能算法】改进蚁狮优化算法【matlab】
目录 1 主要内容 2 部分程序 3 程序结果 下载链接 1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型,即原始ALO算法的基础上添加了两种改进策略: - 改进1:将原先的间断性边界收缩因子变为连续性边界…...
swagger导出json
要将 Swagger(或者 OpenAPI)文档导出为 JSON 文件,通常有几种常见的方法,具体取决于你使用的 Swagger 工具(如 Swagger UI、Swagger Editor、Swagger Hub 等)。下面列出了几种常见的导出 JSON 文件的方法。 1. 通过 Swagger UI 导出 JSON 文件 如果你在使用 Swagger UI…...
Go语言的 的引用数据类型(Reference Data Types)核心知识
Go语言的引用数据类型(Reference Data Types)核心知识 引言 Go语言作为一种现代编程语言,因其简洁的语法、强大的并发支持以及丰富的标准库而受到广泛欢迎。在Go语言中,数据类型可以分为值类型和引用类型。本文将深入探讨Go语言…...
JAVA解析Excel复杂表头
废话不多说,直接上源码。前后端都有哦~~~~~~~~ 能帮到你记得点赞收藏哦~~~~~~~&#…...
jmeter 中 BeanShell 预处理程序、JSR223后置处理程序使用示例
1. 各个组件如何新建的? 2. "http请求" 组件内容样例: "消息体数据" 源码: {"task_tag": "face_detect","image_type": "base64","extra_args": [{"model"…...
我的创作纪念日——《惊变128天》
我的创作纪念日——《惊变128天》 机缘收获日常成就憧憬 机缘 时光飞逝,转眼间,我已在这条创作之路上走过了 128 天。回顾起 2024 年 8 月 29 日,我满怀忐忑与期待,撰写了第一篇技术博客《讲解LeetCode第1题:两数之和…...
vuedraggable 选项介绍
vuedraggable 是基于 SortableJS 的 Vue 组件,提供了丰富的选项来定制拖拽行为。以下是 vuedraggable 常用的选项和它们的详细说明: 常用选项介绍 group 配置拖拽分组。多个列表可以共享同一个分组,允许它们之间的项目互相拖拽。 group: { na…...
微信小程序获取后端数据
在小程序中获取后端接口数据 通常可以使用 wx.request 方法,以下是一个基本示例: // pages/index/index.js Page({data: {// 用于存储后端返回的数据resultData: [] },onLoad() {this.fetchData();},fetchData() {wx.request({url: https://your-backe…...
ThreadLocal` 的工作原理
ThreadLocal 的工作原理: ThreadLocal 是 Java 提供的一个类,它用于为每个线程提供独立的变量副本。也就是说,多个线程访问同一个 ThreadLocal 变量时,每个线程看到的值都是不同的,相互隔离,互不干扰。 T…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
