一. 前言
生成树的概念: 生成树是图的极小连通子图,也就是去掉一条边就非连通的图,并且这个图的所有顶点都由边连接在一起,但不存在回路。
生成树的特点:一个图可以有很多个不同的生成树。生成树的顶点个数和图的顶点个数相同。一个有n个顶点的连通图的生成树有n-1条边。在生成树中再加一条边必然形成回路。生成树中任意两个点之间的路径唯一。
如果是深度优先遍历形成的生成树就叫作深度优先生成树,广度优先遍历形成的生成树就叫做广度优先生成树。
最小生成树:给定一个无向网,在该网的所有生成树中,使得各边权值之和最小的那棵生成树就称为该网的最小生成树,也叫最小代价生成树。
最小生成树具有非常广泛的用途,例如求线路的最少费用。
二. 如何找到一个最小生成树
找生成树的方法有很多,但不管是哪一种求生成树的方法,都存在一种MST性质。
也就是说,在生成树的构造过程中,首先分两个集合,一个已经落在生成树上的顶点集U,另外一个就是还没有落在生成树上的顶点集V-U。接下来就在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。再把这个边对应的还没在U中的顶点加入到U中,继续重复上面过程,直到所有的顶点都在U当中。
下面我们来学习构造最小生成树的两种最常用算法。
三. 普里姆(prim)算法
该算法的思路如下所示:
总的来说,普里姆算法主要就是找两个顶点,这两个顶点之间的权值是最小的。
四. 克鲁斯卡尔(Kruskal)算法
该算法的思路如下所示:
总的来说,克鲁斯卡尔算法主要就是找边,找权值最小的边,直到所有的顶点都包含在这个连通分量当中。