算法 - 最小生成树

什么是最小生成树

​ 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的全部 n 个结点,而且有保持图连通的最少的边。最小生成树能够用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。算法

最小权重生成树又是什么

​ 在一给定的无向图G = (V, E) 中,(u, v) 表明链接顶点 u 与顶点 v 的边(即),而 w(u, v) 表明此的权重,若存在 T 为 E 的子集(即)且为无循环图,使得ide

的 w(T) 最小,则此 T 为 G 的最小生成树视频

img

最小生成树实际上是最小权重生成树的简称。对象

实际应用场景

img

例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间均可以通讯,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不一样,所以另外一个目标是要使铺设光缆的总费用最低。这就须要找到带权的最小生成树。blog

算法实现

咱们首先看咱们的无向图 , 须要找到一个最小权重生成树排序

kruskal 算法

其基本思想就是把每条边都拿出来, 而后按照权重排序, 将这些边组合起来, 要求的是组合过程当中不能够造成环, 造成环则放弃这条边get

基本实现就是这个了, 打错的是不符合要求的. 到最后就会造成最小权重生成树it

Prim 算法

其基本思想就比较麻烦, 咱们先看一张图class

这里有四行数据,循环

第一行各个节点.

第二行是节点是否被选中

第三行是节点与父亲节点之间的距离(权重) , 好比 a-b ,若是a被选了,那么 b的父亲就是a,就是这个意思,ab之间的权重就是这个值, 并且b不必定只有一个父亲

第四行就是父亲节点是谁了

因此开始吧

咱们首先以0位起始位置 , 0标记为true, 开始往前推动, 0和1,7连着. 0-7=8,0-1=4 , 因此这一次选0-1 , 此时 标记1为true ,

01节点连着的有 0-7=8,1-7=11,1-2=8 ,此时0-7与1-2相同, 此时选择父节点小的为选择对象 , 此时将7标记为true.

071 节点连着 1-2=8 , 7-6=1 , 7-8=7 , 因此选择 7-6 ,标记6为true , 就一直标记到所有为true为止.

这个思路就是我上述讲的.

若是你仍是不理解能够看看这个视频 , 连接 : https://www.bilibili.com/video/av47042691?from=search&seid=15424121794388295524