【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…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
