最小生成树的概念与思想

简介: 数据结构中的图存储结构包含顶点和边,分为连通图与非连通图。生成树是包含所有顶点、任意两点间仅有一条通路的极小连通图。最小生成树则是权值总和最小的生成树,常用于解决道路建设等实际问题,常用算法有普里姆算法和克鲁斯卡尔算法。

数据结构提供了 3 种存储结构,分别称为线性表、树和图,如图 1 所示。


图 1 3 种存储结构

a) 是线性表,b) 是树,c) 是图。 在图存储结构中,a、b、c 等称为顶点,连接顶点的线称为

线性表是最简单的存储结构,很容易分辨。树和图有很多相似之处,它们的区别是:树存储结构中不允许存在环路,而图存储结构中可以存在环路(例如图 1 c) 中,c-b-f-c、b-a-f-b 等都是环路)。


本节要讲的最小生成树和图存储结构息息相关,接下来我们将结合图存储结构,给大家讲解什么是生成树,以及什么是最小生成树。

生成树

根据所有顶点之间是否存在通路,图存储结构可以细分为连通图非连通图。举个例子:


图 2 连通图与非连通图


图 2 a) 是一个非连通图,比如图中找不到一条从 a 到 c 的路径。图 2 b) 是一个连通图,因为从一个顶点到另一个顶点都至少存在一条通路,比如从 a 到 c 的通路可以为 a-f-c、a-b-c 等。


所谓生成树,指的是具备以下条件的连通图:

  • 包含图中所有的顶点;
  • 任意顶点之间有且仅有一条通路。


图 2 b) 是一个连通图,其对应的生成树有很多种,例如:


图 3 生成树


图 2 b) 对应的生成树还有很多,图 3 仅给大家列出了其中的 4 种。也就是说,一个连通图可能对应着多种不同的生成树。

最小生成树

借助生成树,可以解决实际生活中的很多问题。例如,为了方便 6 座城市中居民的生产和生活,政府要在 6 座城市之间修建公路。本着节约资金的原则,6 座城市只需要建立 5 条公路即可实现连通,如何修建公路才能最大程度上节省资金呢?


我们将 6 座城市分别用 a~f 表示,6 座城市之间可以修建的公路以及所需资金如下图所示:


图 4 城市道路模拟图

a~f 这 6 个顶点各自代表一座城市,连接两个顶点的边代表两座城市之间可以修建公路,每条边对应的数值称为,表示修建公路所需要的资金。

如图 4 所示,在连通图的基础上,我们赋予每条边一个数值,这样的连通图又称连通网。一个连通网对应生成树可能有多种,每个生成树中所有边的权值的总和,就是这个生成树的总权值。例如结合图 4 ,图 3 a) 生成树的总权值为 17,图 3 c) 的总权值为 13。


最小生成树指的就是在连通网中找到的总权值最小的生成树。在连通图查找最小生成树,常用的算法有两种,分别称为普里姆算法克鲁斯卡尔算法,您可以点击它们做详细地了解。

相关文章
|
4月前
|
存储 搜索推荐 算法
归并排序算法
归并排序是一种基于分治思想的高效排序算法,通过将序列不断划分为不可再分的子序列,再两两合并完成排序。其时间复杂度为O(nlogn),适用于对序列进行升序或降序排列。
320 0
|
4月前
|
存储 算法 Java
求数组中的最大值和最小值
本文介绍了在程序中如何查找数组中的最大值和最小值,重点讲解了两种算法:普通算法和分治算法。普通算法通过遍历数组直接比较元素大小,找出最值;而分治算法则通过递归将数组划分成更小的部分,分别找出各部分的最大值,最终合并结果得到整个数组的最大值。文章以 {3,7,2,1} 为例,详细演示了两种算法的实现过程,并提供了 C、Java 和 Python 的代码示例。
302 0
|
4月前
|
算法 Java C语言
弗洛伊德算法求最短路径
弗洛伊德算法用于寻找加权图中各顶点间的最短路径,适用于无向图和有向图。算法基于动态规划思想,通过枚举中间顶点来更新路径,确保最终得到最短路径。该算法要求路径权值非负,否则可能出错。
446 0
|
4月前
|
算法
回溯算法的基本思想
本节介绍回溯算法,通过图1中从A到K的路径查找示例,说明其与穷举法的异同。回溯算法通过“回退”机制高效试探各种路径,适用于决策、优化和枚举问题。
126 0
|
4月前
|
算法 Java C语言
汉诺塔问题
汉诺塔问题源自印度古老传说,涉及将一组圆盘从一根柱子移动到另一根,遵循特定规则。文章详细介绍了该问题的背景、解决思路以及如何使用分治算法实现,同时提供了C语言、Java和Python的代码示例。
303 0
|
4月前
|
算法 搜索推荐
分治算法的基本思想
分治算法通过将复杂问题拆分成多个独立的小问题,逐一解决后再合并结果。适合处理大规模数据,常见应用包括排序、查找最大值/最小值及汉诺塔等问题。
137 0
|
4月前
|
存储 算法 Java
寻找图中是否存在路径
本节介绍了如何使用并查集判断图中两个顶点之间是否存在有效路径。通过将图的边信息存储到并查集中,同一连通区域的顶点会处于同一集合。只需比较两个顶点的根节点是否相同,即可判断它们是否连通。文中提供了C语言、Java和Python的实现代码,并通过示例验证了算法的正确性。
129 0
|
5月前
|
存储 关系型数据库 MySQL
知道什么是聚簇索引,什么是二级索引吗?
本文介绍了数据库中的聚簇索引与二级索引概念。聚簇索引将数据与索引存储在一起,每张表仅有一个,通常为主键索引。若无主键,则会选择非空唯一索引或自动生成rowID作为聚簇索引。二级索引则存储主键值,支持多条索引,用于加速查询过程。
196 26
|
4月前
|
搜索推荐 Java C语言
插入排序算法
插入排序算法是一种简单直观的排序方法,通过将每个元素插入到已排序序列中的合适位置,最终完成整个序列的排序。其时间复杂度为 O(n²),适用于小规模数据的排序。
210 0