图论中的最小生成树基础解析
笔记哥 /
04-23 /
47点赞 /
0评论 /
199阅读
## 简介
首先给出生成子图的定义(From OI Wiki):

嗯……有点抽象,不妨简化一下:
有一个图 \(G\),如果删去 \(G\) 中的若干条边与若干个点得到一个图 \(G'\),且图 \(G'\) 还保证连通,则称 \(G'\) 为 \(G\) 的生成子图。
那么显然,如果 \(G'\) 是一棵树,那么 \(G'\) 称为 \(G\) 的生成树。
显然,生成树不一定唯一。
那么,最小生成树的“最小”决定于你要求什么,是点权或是边权?由你自己决定。
## 分析
这是一张较为经典的图:

那么这方案求最小生成树:
- 使用 dfs 递归选或不选,再判断是否联通
但是 dfs 递归时间本来就慢,而判连通则需更多的时间复杂度,显然不可行。
但是,我们可以~~当和珅~~贪心!
>
> 1. 按照边权排序
> 2. 选择边7-4,连通7,4
> 3. 选择边2-8,连通2,8
> 4. 选择边1-0,连通1,0
> 5. 选择边0-5,连通0,5
> 6. 选择边1-8,连通1,8
> 7. 选择边1-6,连通1-6
> 8. 选择边3-7,连通3,7
> 9. 选择边6-5,但是由于6,5已经连通,所以可以不加此边
> 10. 选择边1-2,但是由于1,2已经连通,所以可以不加此边
> 11. 选择边6-7,连通6,7
> 12. 已经形成一棵树,后面的边都不选了
那么我们发现,这个方法需要两种操作:
- 判断两个点是否在同一连通块内
- 将两个点添加到同一个连通块内
于是,基于并查集与贪心实现的Kruskal闪亮登场!!!
## 实现
### [Luogu P3366【模板】最小生成树](https://www.luogu.com.cn/problem/P3366)
首先,定义结构体数组Edge{u,v,w}来表示一条边,使用fa数组来表示并查集
输入及初始化:
并查集基本操作:
kruskal操作:
特殊处理:
可以发现,在最后如果图本身不连通,还需输出 `orz` ,我们可以发现,如果图本身不连通,那么最后就不会是一棵树,即 \(n-1\not=m\),判断即可。

### [Luogu P2820 局域网](https://www.luogu.com.cn/problem/P2820)
读题后可以发现,依旧是求最小生成树,只需在一开始求出边权总和,在最后求差值即可。
主要代码:
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2522
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利