数据结构与算法-最小生成树—普里姆算法

时间:2022-03-30 11:40:39

主要介绍最小生成树中的:普利姆

问题实际上是选择顶点之间的边【n个顶点,需要选择n-1条边】,使得构建的连通无回路网络带权最小。

1)普里姆算法。

可取图中任意一个顶点v作为生成树的根,之后若要往生成树上添加顶点w,则在顶点v和顶点w之间必定存在一条边,并且该边的权值在所有连通顶点v和w之间的边中取值最小。
一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上的结点)和V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。
例如:起始生成树上面就一个顶点。为了连通两个集合,在可选的边中,选择权值最小的。需要辅助数组,V-U中所有顶点。

具体实例如下图所示:求下图的最小生成树

数据结构与算法-最小生成树—普里姆算法

我们以a点为起始点,此时的U集合={a},V-U到U集合的路径有a-b=4,a-c=2,取最小的a-c,所以将c点添加到U集合中,U={a,c}。

此时,V-U到U集合的路径有b-a=4,b-c=3,取最小,更新b点到U集合的最短路径为3,此外还有c-d=5,c-h=5,所以,取V-U到U集合的最小值为b-c=3,将b点添加到U集合中。U={a,c,b}。此时V-U到U集合存在以下点:c-d=5,c-h=5,b-d=5(与现有的c-d=5一样,所以不更新,仍旧采用c-d),b-e=9,取最小的,此时可以有两个选择,假设选择c-d,所以将d点添加到U集合中。U={a,c,b,d}。此时V-U到U的路径,因为e-d=7<e-b=9,所以e点进行更新,更新为d-e=7;同理d-h=4<c-h=5,所以点h到U的路径更新为d-h=4。新增加的路径为d-f和d-g。此时选择V-U到U集合的最短路径为d-h=4,所以将h添加到U集合,此时U={a,c,b,d,h}。依次不断选择下一个距离U集合最短路径的点,并将其添加到U集合,直到将所以顶点添加完毕。实现过程如下图所示:



数据结构与算法-最小生成树—普里姆算法