当前位置: 首页 > news >正文

【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】

目录😋

任务描述

相关知识

带权无向图

建立邻接矩阵

Prim算法

1. 算法基本概念

2. 算法背景与目标

3. 算法具体步骤

4. 算法结束条件与结果

测试说明

通关代码

测试结果


任务描述

本关任务:编写一个程序求图的最小生成树。

相关知识

为了完成本关任务,你需要掌握:

  1. 观察带权无向图
  2. 建立邻接矩阵
  3. Prim算法。
  • 带权无向图

针对带权无向图设计图的最小生成树,如下列图形。

img

  • 建立邻接矩阵

上述带权无向图对应的二维数组,根据它建立下列邻接矩阵:

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++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序求图的最小生成树。 相关知识 为了完成…...

Java(1)入门基础

1. Java简介 1.1 什么是Java Java 是一款由Sun Microsystems公司&#xff08;现为甲骨文公司Oracle Corporation的一部分&#xff09;的James Gosling及其团队在1995年发布的高级编程语言。同时&#xff0c;Java 是一种面向对象的语言&#xff0c;这意味着它允许开发者通过创…...

2024.1.5总结

今日不开心:这周本来想花点时间学习的&#xff0c;没想到全都花在刷视频&#xff0c;外出消费去了。 今日思考: 1.找对象这件事确实不能强求&#xff0c;顺其自然吧&#xff0c;单身和不单身&#xff0c;其实&#xff0c;各有各的利弊。在一次坐地铁的过程中&#xff0c;我一…...

【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、循环控制 / 跳转语句的使用 1. 循环控制语句&#xff08;for 循环&#xff09; 2. 循环控制语句&#xff08;while 循环&#xff09; 3. 跳转语句&#xff08;break 语句&#xff09; 4. 跳转语句&#xff08;continue 语句&…...

在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法

在调用 borrowObject 方法时&#xff0c;Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接&#xff0c;支持多路复用&#xff0c;即通过单个通道可以发送多…...

Linux中的tty和pts概念和区别

目录 1、什么是tty &#xff08;1&#xff09;tty的概念 &#xff08;2&#xff09;tty0 &#xff08;3&#xff09;tty1~6 2、什么是pts &#xff08;1&#xff09;pts的含义 &#xff08;2&#xff09;pts的具体解释 3、pts与 tty 设备的比较 4、设备文件的位置 1、什…...

【SOC 芯片设计 DFT 学习专栏 -- RTL 中的信号名和 Netlist 中的信号名差异】

Overview 本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异&#xff0c; 在 SoC设计中&#xff0c;RTL-to-Netlist映射 是从RTL&#xff08;Register Transfer Level&#xff09;代码转换为Netlist的过程。这通常涉及将用硬件描述语言&…...

机器学习经典算法——线性回归

目录 算法介绍 一元线性回归模型 多元线性回归模型 ​误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种…...

MLU上使用MagicMind GFPGANv1.4 onnx加速!

文章目录 前言一、平台环境准备二、环境准备1.GFPGAN代码处理2.MagicMind转换修改env.sh修改run.sh参数解析运行 3.修改后模型运行 前言 MagicMind是面向寒武纪MLU的推理加速引擎。MagicMind能将人工智能框架&#xff08;TensorFlow、PyTorch、Caffe与ONNX等&#xff09;训练好…...

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…...

【Flink CDC】Flink CDC的Schema Evolution表结构演变的源码分析和流程图

Flink CDC版本&#xff1a;3.2.1 说明&#xff1a;本文从SchemaOperator接收到&#xff0c;表结构变更事件开始&#xff0c;表结构变更事件应由source端产生&#xff0c;本文不讨论。 可以先看流程图&#xff0c;研究源码。 参考文章&#xff1a; Flink cdc3.0动态变更表结构—…...

【智能算法】改进蚁狮优化算法【matlab】

目录 1 主要内容 2 部分程序 3 程序结果 下载链接 1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型&#xff0c;即原始ALO算法的基础上添加了两种改进策略&#xff1a; - 改进1&#xff1a;将原先的间断性边界收缩因子变为连续性边界…...

swagger导出json

要将 Swagger(或者 OpenAPI)文档导出为 JSON 文件,通常有几种常见的方法,具体取决于你使用的 Swagger 工具(如 Swagger UI、Swagger Editor、Swagger Hub 等)。下面列出了几种常见的导出 JSON 文件的方法。 1. 通过 Swagger UI 导出 JSON 文件 如果你在使用 Swagger UI…...

Go语言的 的引用数据类型(Reference Data Types)核心知识

Go语言的引用数据类型&#xff08;Reference Data Types&#xff09;核心知识 引言 Go语言作为一种现代编程语言&#xff0c;因其简洁的语法、强大的并发支持以及丰富的标准库而受到广泛欢迎。在Go语言中&#xff0c;数据类型可以分为值类型和引用类型。本文将深入探讨Go语言…...

JAVA解析Excel复杂表头

废话不多说&#xff0c;直接上源码。前后端都有哦&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e; 能帮到你记得点赞收藏哦&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#…...

jmeter 中 BeanShell 预处理程序、JSR223后置处理程序使用示例

1. 各个组件如何新建的&#xff1f; 2. "http请求" 组件内容样例&#xff1a; "消息体数据" 源码&#xff1a; {"task_tag": "face_detect","image_type": "base64","extra_args": [{"model"…...

我的创作纪念日——《惊变128天》

我的创作纪念日——《惊变128天》 机缘收获日常成就憧憬 机缘 时光飞逝&#xff0c;转眼间&#xff0c;我已在这条创作之路上走过了 128 天。回顾起 2024 年 8 月 29 日&#xff0c;我满怀忐忑与期待&#xff0c;撰写了第一篇技术博客《讲解LeetCode第1题&#xff1a;两数之和…...

vuedraggable 选项介绍

vuedraggable 是基于 SortableJS 的 Vue 组件&#xff0c;提供了丰富的选项来定制拖拽行为。以下是 vuedraggable 常用的选项和它们的详细说明&#xff1a; 常用选项介绍 group 配置拖拽分组。多个列表可以共享同一个分组&#xff0c;允许它们之间的项目互相拖拽。 group: { na…...

微信小程序获取后端数据

在小程序中获取后端接口数据 通常可以使用 wx.request 方法&#xff0c;以下是一个基本示例&#xff1a; // pages/index/index.js Page({data: {// 用于存储后端返回的数据resultData: [] },onLoad() {this.fetchData();},fetchData() {wx.request({url: https://your-backe…...

ThreadLocal` 的工作原理

ThreadLocal 的工作原理&#xff1a; ThreadLocal 是 Java 提供的一个类&#xff0c;它用于为每个线程提供独立的变量副本。也就是说&#xff0c;多个线程访问同一个 ThreadLocal 变量时&#xff0c;每个线程看到的值都是不同的&#xff0c;相互隔离&#xff0c;互不干扰。 T…...

.NET 事件模式举例介绍

.NET 事件模式&#xff1a;实现对象间松耦合通信 在软件开发中&#xff0c;对象之间的通信是一个常见且重要的问题。.NET 框架提供了一种标准化的事件模式&#xff0c;用于解决对象间的通信问题&#xff0c;实现松耦合的交互方式。今天&#xff0c;我们就通过一个简单的例子来…...

matlab 2024a ​工具箱Aerospsce Toolbox报错​

Matlab R2024a中Aerospsce Toolbox报错 警告&#xff1a;Aerospace Toolbox and Aerospace Blockset licenses are required in ‘built-in/Spacecraft Dynamics’ 找到安装路径\MATLAB\R2024a\licenses文件夹license_****_R2024a.lic 里面工具箱名称出错&#xff0c;手动修改…...

springboot的test模块使用Autowired注入失败

springboot的test模块使用Autowired注入失败的原因&#xff1a; 注入失败的原因可能是用了junit4的包的Test注解 import org.junit.Test;解决方法&#xff1a;再加上RunWith(SpringRunner.class)注解即可 或者把Test由junit4改成junit5的注解&#xff0c;就不用加上RunWith&…...

AI图片售卖:是暴利新风口还是虚幻泡沫?哪些平台适合售卖AI图片

还记得去年大火的Midjourney吗&#xff1f;今年4月&#xff0c;Midjourney又发布了备受期待的V7版本&#xff0c;带来了更高的图像质量和创新功能。使用Midjourney、Stable Diffusion、DALLE等AI图片生成工具&#xff0c;创作者只需输入关键词即可获得高质量的原创图片。这一变…...

【Java学习笔记】包装类

包装类&#xff08;Wrapper&#xff09; 1. 介绍 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型 --> 包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法 2. 分类和继承关系 基本数据类型包装类父类booleanBooleanObjectc…...

Ubuntu20.04启动python的虚拟环境

如果你使用 mkvirtualenv 来创建虚拟环境&#xff0c;说明你已经安装了 virtualenvwrapper&#xff0c;这是一个用于管理 Python 虚拟环境的工具。 激活虚拟环境 要激活你使用 mkvirtualenv 创建的虚拟环境&#xff0c;按照以下步骤操作&#xff1a; 1.确保已经安装了 virtu…...

数据库密码加密

数据库密码加密 添加jar包构建工具类具体使用优缺点 添加jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>构建工具类 public class PasswordUtil …...

【WPF】WPF 项目实战:用ObservableCollection构建一个可增删、排序的管理界面(含源码)

&#x1f4a1;WPF 项目实战&#xff1a;构建一个可增删、排序的光源类型管理界面&#xff08;含源码&#xff09; 在实际的图像处理项目中&#xff0c;我们经常需要对“光源类型”进行筛选或管理。今天我们来一步步构建一个实用的 WPF 界面&#xff0c;实现以下功能&#xff1…...

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…...

玄机-日志分析-IIS日志分析

1.phpstudy-2018站点日志.(.log文件)所在路径&#xff0c;提供绝对路径 2.系统web日志中状态码为200请求的数量是多少 3.系统web日志中出现了多少种请求方法 4.存在文件上传漏洞的路径是什么(flag{/xxxxx/xxxxx/xxxxxx.xxx} 5.攻击者上传并且利用成功的webshell的文件名是什…...