1、最小生成树的概念
实际问题:在n个城市中建立一个通信网络,则至少需要布置n-1条通信线路。
这个时候我们需要考虑如何在成本最低的情况下建立这个通信网?
于是我们就可以引入连通图来解决我们遇到的问题,n个城市就是图上的n个顶点,
边表示两个城市的通信线路,每条边上的权重就是我们搭建这条线路所需要的成本,
所以现在我们有n个顶点的连通网可以建立不同的n-1条边的生成树。
当我们构造这个连通网所花的成本最小时,此图就称为最小生成树。
最小生成树的重要性质:MST性质
- 假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集,
- 如果(u,v)是一条具有最小权值的边,其中u属于U,v属于V-U,
- 则必定存在一颗包含边(u,v)的最小生成树。
下面就介绍两种使用MST性质生成最小生成树的算法:普里姆算法和克鲁斯卡尔算法。
2、普里姆算法—Prim算法
【一. 算法思路】
V为点的全集。首先从图中的一个(任意)起点a开始,把a加入U集合,
从与a有关联的边中寻找权重最小的那条边、并且该边的终点b在顶点集合(V-U)中,
我们也把b加入到集合U中,并且输出边(a,b)的信息,
这样我们的集合U就有:{ a , b }。
寻找与a或b关联的边中、权重最小的那条、并且该边的终点在集合(V-U)中。
我们把c加入到集合U中,并且输出对应的那条边的信息,
这样我们的集合U就有:{a,b,c}这三个元素了,一次类推,直到所有顶点都加入到了集合U。
对下面这幅图求其最小生成树:
从顶点v1开始,(v1,v3)边的权重最小,所以第一个输出的边就是:v1—v3=1。
然后,我们要从v1和v3作为起点的边中寻找权重最小的边,
首先了(v1,v3)已经访问过了,所以我们从其他边中寻找,
发现(v3,v6)这条边最小,所以输出边就是:v3—-v6=4。
然后,我们要从v1、v3、v6这三个点相关联的边中寻找一条权重最小的边,
我们可以发现边(v6,v4)权重最小,所以输出边就是:v6—-v4=2。