最小生成树算法

article/2025/9/16 10:40:27

最小生成树算法

  • 生成树的概念
  • ==最小==生成树算法
    • Prim算法
    • Kruskal算法

生成树的概念

  • 若图是连通的无向图或强连通的有向图,则从其中任一顶点出发,调用一次 d f s dfs dfs或者 b f s bfs bfs后,可以系统的访问图中所有顶点。
  • 若图是有根的有向图 ,则从根出发,调用一次 d f s dfs dfs或者 b f s bfs bfs后,可以系统的访问图中所有顶点。

在上述情况之下,图中所有顶点加上遍历过程中经过的所有边所构成的子图称为原图的生成树

若图是不连通的的无向图和不是强连通的有向图,从其中任一顶点出发,调用一次 d f s dfs dfs或者 b f s bfs bfs后,不能系统的访问图中所有顶点,只能得到以出发点为根的连通分支(或者强连通分支)的生成树。若想访问其他顶点则需要以一个没有访问过的点作为起点,再次调用 d f s dfs dfs或者 b f s bfs bfs,这样就得到了生成森林

很显然,一个图的生成树并不是唯一的,不同的搜索方法或者同一个搜索方法但出发点不同,都可以得到不同的生成树。
可以证明:具有n个顶点的带权连通图,其对应的生成树有n-1条边。

最小生成树算法

举例:给出一张有五座城市的地图。
在这里插入图片描述
用DFS遍历得到的生成树:
在这里插入图片描述
用BFS遍历得到的生成树:
在这里插入图片描述
上述俩种生成树的权和分别为20和33,我们不难发现,最小的生成树权和应该为19,因此上述俩种并不是最小生成树。那如何得到最小生成树呢?
在这里插入图片描述
出发点:具有n个顶点的带权连通图,其对应的最小生成树都有n-1条边。
下列俩种算法都是基于贪心思想的算法。
时间复杂都为O(n*n)。

Prim算法

思路如下:

  1. 设置一个顶点集合S和一个边集合TE,S和TE的初始状态皆为空集。
  2. 选定图中的任意顶点K,从K开始生成最小生成树。(K加入集合S)。
  3. 重复下列操作,直到选取了n-1条边为止。
    (1)选取一条权最小的边(X,Y),要求是X要集合S的元素,Y不是集合S的元素。
    (2)将顶点加入到集合S中,将边(X,Y)加入集合TE中。
  4. 得到最小生成树T,T=(S,TE)。

Kruskal算法

思路如下:

  1. 设最小生成树为T,T=(S,TE),TE初始状态为空集。
  2. 将图中的边权从小到大依次排序。
  3. 选取权最小的边,若这条边没有使T构成回路,就将这条边加入TE中(T保留了这条边);若构成回路,则舍弃,不能加入TE中。
  4. 再选取最小边,重复执行第三步,直到TE中包含n-1条边为止,最后的T即为最小生成树。

这个算法的难点在于,在选取权最小的边后,如何判断该边有没有使T构成回路。这里推荐一种方法:

将n个顶点划分为n个集合,就是每个集合只有一个顶点,表明他们之间互不相同,各自为无回路的连通分支。当选取一条边后:

  • 若这条边俩个顶点不属于同一集合,则表明了改边连通了俩个不同的连通分支,又因为每个连通分支都是无回路的,所以连通俩个连通分支后,也无法形成回路,所以该边保留,作为T的一条边。然后把这条边的俩个顶点所在集合合并为一个集合,构成一个新的无回路的连通分支。
  • 若这条边俩个顶点不属于同一集合,则舍弃,因为同一个集合中的顶点是连通无回路的,若加入一条俩个顶点都属于本集合的边,必会形成回路

http://chatgpt.dhexx.cn/article/nkat3Tuq.shtml

相关文章

【图】最小生成树

最小生成树:构造连通网的最小代价生成树。 最小生成树有两种算法:普利姆算法、克鲁斯卡尔算法。 普利姆(Prim)算法 加点,选择相邻点中边权最小的 需要两个一维数组,一个存权值,另一个存起始点…

最小生成树-Kruskal算法

数据结构:最小生成树-Kruskal算法 什么是最小生成树,最小生成树就是求图中把所有点都访问到的最短路径的长度 Kruskal算法采用的是边贪心思想,我们先大概讲一下它的大概思想,首先我们先假设先隐藏所有的边,这样每个点会成为一个连…

最小生成树(kruskal算法)

一、概述 最小生成树问题顾名思义,概括来说就是路修的最短。 接下来引入几个一看就明白的定义: 最小生成树相关概念: 带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值…

最小生成树、最短路径树

一、最小生成树与最短路径树的区别 最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。 应用如网络部线,把所有的电脑(服务器?)都连起来用的网线(光纤?)最少&#xff0c…

【图解算法】最小生成树

今天我们介绍图论中的另一部分,最小生成树。 对图的最短路感兴趣的同学可以看: 【图解算法】一次解决最短路径问题 目录 1. 最小生成树简介2. Prim算法2.1 模板题2.2 思路模板2.3 代码实现2.3 prim 算法的优化 3. Kruskal算法3.1 模板题3.2 思路模板3.3…

数据结构—最小生成树

目录 一、生成树 二、最小生成树(代价最小树) 三、求最小生成树 1、Prim算法(普里姆) 2.Kruskal 算法(克鲁斯卡尔) 3.Prim算法和Kruskal算法对比 一、生成树 连通图的生成树是包含图中全部顶点的一个…

最小生成树详解

目录 最小生成树简介 什么是树 什么是生成树 什么是最小生成树 最小生成树的做法 Kruscal(克鲁斯卡尔)算法 思路 代码 其他算法 最小生成树简介 什么是树 树(tree)是一种特殊的图,一个图要成为树要满足三个条…

最小生成树的实现(C语言)

今天做洛谷的时候刷到好多图论的题,发现自己在这一方面算法的掌握还是有待提高啊。在这就先介绍最小生成树的算法吧。 最小生成树 最小生成树(minimum spanning tree)是由n个顶点,n-1条边,将一个连通图连接起来&…

详解: 最小生成树

详解: 最小生成树算法 最小生成树(Minimum Spanning Tree, MST)是在一个给定的无向图G(V, E)中求一棵树,使得这棵树有图G的所有顶点,且所有边都来自图G中的边,并且满足整棵树的边权之和最小. 最下生成树满足如下性质…

最小生成树

目录 一、最小生成树定义: 二、普里姆算法(Prim) 三、Kruskal算法(克鲁斯卡尔) 小结: 下一篇:最短路径算法 问题: 一、最小生成树定义: 对于一个带权连通无向图G(V,E)&am…

最小生成树——Prim算法(详细图解)

目录 最小生成树的概念 经典题目 prim算法简介 prim算法解析 (详细图解) 代码实现 代码实战 最小生成树的概念 在一给定的无向图G (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边,而 w(u, v) 代表此的边权重,若…

最小生成树入门(图解)

1.什么是最小生成树 来看百度百科的定义 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆&am…

最小生成树(Prim、Kruskal)算法,秒懂!

前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法。但是可能很多人对概念不是很清楚,什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点&…

最小生成树详解(模板 + 例题)

作为一个伪ACMer,先来首广为人知的打油诗: 模拟只会猜题意,贪心只能过样例,数学上来先打表,规律一般是DP,组合数学碰运气,计算几何瞎暴力,图论一顿套模板,数论只会GCD,递归递推伤不起&#xff0…

Linux开启/关闭防火墙

一、查看防火墙状态: systemctl status firewalldinactive表示防火墙为关闭状态。 二、开启防火墙: systemctl start firewalld启动后无任何提示,再次查看防火墙状态,可以看到变成active,成功启动。 三、关闭防火墙…

linux服务器查看防火墙是否关闭,linux查看防火墙是否关闭了的方法

linux查看防火墙是否关闭了的方法 发布时间:2020-04-02 10:49:28 来源:亿速云 阅读:62 作者:小新 今天小编给大家分享的是linux查看防火墙是否关闭了的方法,很多人都不太了解,今天小编为了让大家更加了解li…

linux操作系统关闭防火墙,linux操作系统关闭防火墙的方法

防火墙是一项协助确保信息安全的设备,会依照特定的规则,允许或是限制传输的数据通过。简单的来说防火墙的作用就是保护你的网络免受非法用户的侵入,虽然防火墙是为了你网络安全而存在,但是同时也限制了你上网操作,有很多人会选择关闭防火墙,windows操作系统的防火墙好关闭…

linux为什么要关闭防火墙,Linux怎么样关闭防火墙

Linux系统下面自带了防火墙iptables,iptables可以设置很多安全规则。但是如果配置错误很容易导致各种网络问题,那么如果要关闭禁用防火墙怎么操作呢?下面就让学习啦小编给大家说说Linux怎么关闭防火墙吧。 Linux关闭防火墙的方法 如果启动的iptables防火…

linux防火墙的开启、关闭、永久关闭

防火墙是什么?我们为什么需要关闭防火墙? 防火墙就是一个保护我们系统的软件服务,默认开启,但是我们在实际开发中,如果需要使用宿主机来连接虚拟机里面的redis, mysql,nginx,tomcat等服务&#…

linux防火墙能关吗,linux防火墙怎么样关闭

有没有什么方法可以关闭linux防火墙呢?方法是有的,小编来告诉你!下面由学习啦小编给你做出详细的linux防火墙关闭方法介绍!希望对你有帮助! linux防火墙关闭方法一: 1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig …