408数据结构-图的应用1-最小生成树 自学知识点整理
前置知识:图的遍历
图的应用是408初试历年考查的重点。不过一般而言,这部分内容直接以算法设计题形式考查的可能性极小,更多的是结合图的实例来考查算法的具体操作过程,要求掌握的是手推模拟给定图的各个算法执行过程。此外,还需对给定模型建立相应的图去解决问题。
最小生成树
知识点回顾:图的基本概念-生成树
一个连通图的生成树包含图的所有顶点,并且只含尽可能少的边。对于生成树来说,若砍去(减少)它的一条边,则会使生成树变成非连通图;若给它增加一条边,则会形成图中的一条回路(环)。
对于一个带权连通无向图 G G G,生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。权值之和最小的那棵生成树称为 G G G的最小生成树( M i n i m u m − S p a n n i n g − T r e e Minimum-Spanning-Tree Minimum−Spanning−Tree, M S T MST MST)。
最小生成树的性质
- 若图 G G G中存在权值相同的边,则 G G G的最小生成树可能不唯一,即最小生成树的树形可能不唯一。当图 G G G中的各边权值互不相等时, G G G的最小生成树是唯一的;若无向连通图 G G G的边数比顶点数少 1 1 1,即 G G G本身是一棵树时,则图 G G G的最小生成树就是其本身;只有连通图才有生成树,非连通图只有生成森林。
- 虽然最小生成树可能不唯一,但其对应的边的权值之和总是唯一的,并且是最小的。
- 最小生成树的边数为顶点数减 1 1 1。(树的性质)
注意:最小生成树中所有边的权值之和最小,不代表任意两个顶点之间的路径是最短路径。
构造最小生成树有多种算法,但大多数算法都利用了最小生成树的下列性质:假设 G = ( V , E ) G=(V,E) G=(V,E)是一个带权连通无向图, U U U是顶点集 V V V的一个非空子集。若 ( u , v ) (u,v) (u,v)是一条具有最小权值的边,其中 u ∈ U , v ∈ V − U u∈U, v∈V-U u∈U,v∈V−U,则必存在一棵包含边 ( u , v ) (u,v) (u,v)的最小生成树。
基于该性质的最小生成树算法主要有 P r i m Prim Prim算法和 K r u s k a l Kruskal Kruskal算法,它们都是基于贪心算法的策略,即通过多个局部最优解得到全局最优解。408初试中,需要掌握这两个算法的本质含义和基本思想,并能够手动模拟推演出其算法的实现步骤。
王道书上给出了一个通用的最小生成树算法的伪代码:
GENERIC_MST(G) {T=NULL;while T 未形成一棵生成树;do 找到一条最小代价边(u,v)并加入T后不会产生回路;T=T∪(u,v);
}
P r i m Prim Prim算法
P r i m Prim Prim(普里姆)算法的执行非常类似于寻找图的最短路径的 D i j k s t r a Dijkstra Dijkstra算法(下一节会讲)。
P r i m Prim Prim算法构造最小生成树的过程如下图 6.15 6.15 6.15所示(王道考研408数据结构2025 - P241)。初始时选取图中任一顶点(如顶点 1 1 1)加入树 T T T,此时树中只含有一个顶点,之后选择一个与当前 T T T中顶点集合距离最近的顶点,并将该顶点和相应的边加入 T T T,每次操作后 T T T中的顶点数和边数都增加 1 1 1。以此类推,直至图中所有的顶点都并入 T T T,得到的 T T T就是最小生成树。
(图片来自王道考研408数据结构2025)

P r i m Prim Prim算法的步骤如下:
- 假设 G = { V , E } G= \{V,E\} G={V,E}是连通图,其最小生成树 T = ( U , E T ) T=(U,E_T) T=(U,ET), E T E_T ET是最小生成树中边的集合。
- 初始化:向空树 T = ( U , E T ) T=(U,E_T) T=(U,ET)中添加图 G = ( V , E ) G=(V,E) G=(V,E)的任意一个顶点 u 0 u_0 u0,使 U = { u 0 } U=\{u_0\} U={u0}, E T = ∅ E_T=\emptyset ET=∅。
- 循环(重复下列操作直至 U = V U=V U=V):从图 G G G中选择满足 { ( u , v ) ∣ u ∈ U , v ∈ V − U } \left \{ \left ( u,v \right ) \mid u \in U, v \in V-U \right \} {(u,v)∣u∈U,v∈V−U}且具有最小权值的边 ( u , v ) (u,v) (u,v),加入树 T T T,置 U = U ∪ { v } U = U \cup \left \{ v \right \} U=U∪{v}, E T = E T ∪ { ( u , v ) } E_T = E_T \cup \left \{ \left ( u,v \right ) \right \} ET=ET∪{(u,v)}。
王道书上给出的 P r i m Prim Prim算法简单实现的伪代码如下,感兴趣的读者可以尝试完善之:
void Prim(G, T){T=∅; //初始化空树U={w}; //添加任意一个顶点wwhile((V-U)!=∅){ //若树中不含全部顶点设(u,v)是使u∈U与v∈(V−U),且权值最小的边T=T∪{(u,v)}; //边归入树U=U∪{v}; //顶点归入树}
}
P r i m Prim Prim算法的时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^2) O(∣V∣2),不依赖于 ∣ E ∣ |E| ∣E∣,因此它适用于求解稠密图的最小生成树。虽然采用其他方法能改进 P r i m Prim Prim算法的时间复杂度,但增加了实现的复杂性。
相关例题:PTA 7-50 畅通工程之局部最小花费问题(传送门)
K r u s k a l Kruskal Kruskal算法
与 P r i m Prim Prim算法从顶点开始扩展最小生成树不同, K r u s k a l Kruskal Kruskal(克鲁斯卡尔)算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。
K r u s k a l Kruskal Kruskal算法构造最小生成树的过程如下图 6.16 6.16 6.16所示(王道考研408数据结构2025 - P241)。初始时为只有 n n n个顶点而无边的非连通图 T = { V , { } } T = \left \{ V,\left \{ \right \} \right \} T={V,{}},每个顶点自成一个连通分量。然后按照边的权值由小到大的排序,不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在 T T T中不同的连通分量上(使用并查集判断这两个顶点是否属于同一棵集合树),则将此边加入 T T T,否则舍弃此边而选择下一条权值最小的边。以此类推,直至 T T T中所有顶点都在一个连通分量上。
(图片来自王道考研408数据结构2025)

知识点回顾:并查集
K r u s k a l Kruskal Kruskal算法的步骤如下:
- 假设 G = { V , E } G= \{V,E\} G={V,E}是连通图,其最小生成树 T = ( U , E T ) T=(U,E_T) T=(U,ET)。
- 初始化: U = V U=V U=V, E T = ∅ E_T=\emptyset ET=∅。即每个顶点构成的一棵独立的树, T T T此时是一个仅含 ∣ V ∣ |V| ∣V∣个顶点的森林。
- 循环(重复直至 T T T是一棵树):按 G G G的边的权值递增顺序依次从 E − E T E-E_T E−ET中选择一条边,若这条边加入 T T T后不构成回路,则将其加入 E T E_T ET,否则舍弃,直到 E T E_T ET中含有 n − 1 n-1 n−1条边。
王道书上给出的 K r u s k a l Kruskal Kruskal算法简单实现的伪代码如下,感兴趣的读者可以尝试完善之:
void Kruskal(V,T){T=V; //初始化树T,仅含顶点numS=n; //连通分量数while(numS>1){ //若连通分量数大于1从E中取出权值最小的边(v,u);if(v和u属于T中不同的连通分量){T=T∪{(v,u)}; //将此边加入生成树中numS--; //连通分量数减1}}
}
根据图的相关性质,若一条边连接了两棵不同树中的顶点,则对这两棵树来说,它必定是连通的,将这条边加入森林中,完成两棵树的合并,直到整个森林合并成一棵树。
在 K r u s k a l Kruskal Kruskal算法中,最坏情况下需要对 ∣ E ∣ |E| ∣E∣条边各扫描一次。通常采用堆(第 7 7 7章里会讲)来存放边的集合,每次选择最小权值的边需要 O ( l o g 2 ∣ E ∣ ) O(log_2|E|) O(log2∣E∣)的时间;每次使用并查集来快速判断两个顶点是否属于一个集合所需的时间为 O ( α ( ∣ V ∣ ) ) O(α(|V|)) O(α(∣V∣)), α ( ∣ V ∣ ) α(|V|) α(∣V∣)的增长极其缓慢,可视为常数。算法的总时间复杂度为 O ( ∣ E ∣ l o g 2 ∣ E ∣ ) O(|E|log_2|E|) O(∣E∣log2∣E∣),不依赖于 ∣ V ∣ |V| ∣V∣,因此 K r u s k a l Kruskal Kruskal算法适合顶点较多的稀疏图。
相关例题:洛谷P3366 【模板】最小生成树(传送门)
个人题解:【洛谷P3366】【模板】最小生成树 解题报告
对本小节内容,需要掌握手推Prim算法和Kruskal算法过程,能够模拟构建最小生成树,如有余力可以打一些代码题增强理解。
以上。
相关文章:
408数据结构-图的应用1-最小生成树 自学知识点整理
前置知识:图的遍历 图的应用是408初试历年考查的重点。不过一般而言,这部分内容直接以算法设计题形式考查的可能性极小,更多的是结合图的实例来考查算法的具体操作过程,要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…...
Ubuntu18.04操作系统使用pip3安装open cv
在Ubuntu18.04操作系统环境下使用pip3安装opencv。安装方法如下: #pip3安装 sudo apt-get install python3-pip # 依赖包安装 sudo apt-get install libsm6 libxrender1 libxext6 #opencv安装;版本号自行填写 pip3 install opencv-python4.1.1.26 具体步骤 1、确认…...
为什么变量不可以在 switch 语句中声明定义?
目录 1.引言 2.switch语句的基本用法 3.为何不能在switch语句中声明变量 3.1.作用域问题 3.2.跳转语句的限制 4.解决方案 4.1.在switch语句之前声明变量 4.2.使用花括号创建新的作用域 5.总结 1.引言 在C/C等编程语言中,switch语句是一种常见的控制流结构&…...
手机定位技术全解析:原理、发展与应用
1. 引言 背景介绍 最近,神仙姐姐刘亦菲主演的电视剧《玫瑰的故事》中的一段情节引发了广泛讨论。剧中,方协文(丈夫)对玫瑰(妻子)的控制欲变本加厉,竟然偷偷在她的手机上安装监控软件ÿ…...
深入探索Kylin的Cube构建:数据魔方的构建之旅
深入探索Kylin的Cube构建:数据魔方的构建之旅 引言 Apache Kylin是一个开源的分布式分析引擎,提供Hadoop和Spark之上的高性能数据立方体(Cube)技术。Kylin的Cube构建过程是其核心功能之一,它允许用户定义和构建多维数…...
web渗透-CSRF漏洞
一、简介 cross-site request forgery 简称为"csrf",在csrf的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以csrf攻击也为"o…...
Python数据分析-电信客户流量预测与分析
一、背景介绍 研究背景:在快速发展和高度竞争的电信行业中,客户流失已成为运营商面临的主要挑战之一。电信服务的普及和用户选择的多样性使得保持客户忠诚度变得越来越困难。在这种背景下,准确预测客户流失并采取相应措施,对于运…...
动态人物抠图换背景 MediaPipe
pip下载 MediaPipe pip install mediapipe -i 手部特征点模型包包含一个手掌检测模型和一个手部特征点检测模型。手掌检测模型在输入图片中定位手部,手部特征点检测模型可识别手掌检测模型定义的被剪裁手掌图片上的特定手部特征点。 由于运行手掌检测模型非常耗时&…...
Vue3 vite使用postcss-px-to-viewport(适配vant)
Vue3 vite使用postcss-px-to-viewport(适配vant) 安装vite.config.js配置 安装 npm install postcss-px-to-viewport-8-plugin -Dvite.config.js配置 import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from …...
MCU复位时GPIO是什么状态?
大家一定遇到过上电或者复位时外部的MOS电路或者芯片使能信号意外开启,至此有经验的工程师就会经常关心一个问题,MCU复位时GPIO是什么状态?什么电路需要外部加上下拉? MCU从上电到启动,实际可分为复位前和复位后、初始…...
领先GPT-4o:Anthropic 推出新一代模型 Claude 3.5 Sonnet|TodayAI
Anthropic,全球领先的人工智能实验室之一,近日发布了其最新的人工智能模型——Claude 3.5 Sonnet。该模型不仅速度更快,成本更低,而且在多个关键任务上的表现超过了其前代模型 Claude 3 Opus。 更强的视觉功能与幽默感 Claude 3…...
使用AES,前端加密,后端解密,spring工具类了
学习python的时候,看到很多会对参数进行加密,于是好奇心驱使下,让我去了解了下AES加密如何在java中实现。 首先 npm install crypto-js 然后在你的方法中,给你们前端源码看看,因为我用的ruoyi框架做的实验ÿ…...
通过Spring-Data-Redis操作Redis
目录 一、搭建环境 (1)引入依赖 (2)自定义模板序列器 (3)编写配置文件 (4)操作方法 二、测试 一、搭建环境 (1)引入依赖 <dependencies><dep…...
自动驾驶ADAS
1 ToF摄像头分类 1.1 ToF原理 类似雷达测距,生成3D点云,或者叫3D贴图。ToF相机的分辨率一般在3万像素左右。ToF距离计算公式如图所示。 Figure 1-1 ToF距离计算公式 D:距离 c:光速 PHI:相位差 fmod:调制频率…...
Python+Pytest+Allure+Yaml接口自动化测试框架详解
PythonPytestAllureYaml接口自动化测试框架详解 编撰人:CesareCheung 更新时间:2024.06.20 一、技术栈 PythonPytestAllureYaml 版本要求:Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 1、安装python3.7,并配置…...
python turtle 001画两只小狗
效果图: 代码: pythonturtle001画两只小狗资源-CSDN文库 # 作者V w1933423import turtle # 导入turtle模块def draw_dogs():turtle.setup(800, 800) # 设置画布大小为800x800p turtle.Pen() # 创建一个画笔对象p.pensize(14) # 设置画笔大小为14p.…...
『亚马逊云科技产品测评』程序员最值得拥有的第一台专属服务器 “亚马逊EC2实例“
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 引言 自2006年8月9日,在搜索引擎大会(SES San Jo…...
python 趣味习题_递归函数(炸弹迷宫路径计算)
@[toc] python 学习中,常会遇到一些百思不得其解的难题,但有时“灵光一现”找准方法,难题便会迎刃而解。 本专栏旨在记录本人解决问题的思考方法,及实现过程。有更好方法或对程序执行有疑问的伙伴,可在评论区留言,共同讨论。 题目要求 题目描述:在一串连续的迷宫(房间…...
免费翻译API及使用指南——百度、腾讯
目录 一、百度翻译API 二、腾讯翻译API 一、百度翻译API 百度翻译API接口免费翻译额度:标准版(5万字符免费/每月)、高级版(100万字符免费/每月-需个人认证,基本都能通过)、尊享版(200万字符免…...
深度测试中的隐藏面消除技术
by STANCH 标签:#计算机图形学 #深度测试 #深度测试 #隐藏面消除 1.概述 根据我们的日常经验,近处的物体会挡住后面的物体,在三维场景中通常通过深度缓冲来实现这样的效果。深度缓冲记录着屏幕对应的每个像素的深度值。模型一开始所在的局部…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
