绪论
上一章节介绍了图的遍历,这一章节开始介绍图中生成树,最小生成树的概念以及生成最小生成树的算法。
Definition and Application
首先还是要知道问题和算法涉及概念的定义是什么?
Spanning Trees
生成树从概念上来看其实一个合成词——一个图的生成(导出)子图中满足树状结构的图称为该图的生成树,例如下图中红色边组成的部分就是该图的生成树:
Minimum Spanning Trees
很显然生成树的情况不唯一,那么最小生成树的最小指的是什么最小呢?由于生成树的点集和原图相同,有关点的个数和属性显然不可能,因为树的性质,边的数量等于点的数量-1,所以也显然不是边的数量,但是边的选择不唯一,有权图各条边的权值也不一定相同。
所以最小生成树的最小指的是生成树n-1条边的权值之和最小。
Application
在讨论之前,首先需要知道一个性质——树结构是让n个结点成为连通图使用边的数量最少的情况,所以说对于有权图,最小生成树是让图上所有点连通需要连通边的权值,或者说代价最小的情况。
需要图上所有点连通(且代价最小)的情况有很多:
例如电板上的各种元件的电路规划,一块区域各个地点的路线规划。
多个终端无线网络的建立(终端距离越远越容易出现传输错误的情况):
Prim’s algorithm
求解最小生成树的方法一般有普利姆算法和克鲁斯卡尔算法。就我个人的了解来看,就像AC3和Ordering一样,普利姆算法以点扩展,克鲁斯卡尔算法以边扩展。
我们认为一个节点也可以看作一个最小生成树,普利姆算法从任选一个结点构成的最小生成树开始,每次选择距离算法当前最小生成树内的点最近的生成树之外的点扩展进最小生成树的点集(最近的边扩展到边集)得到一个规模更大的最小生成树。
算法每进行到一个阶段得到是结点个数为k的最小生成树:
算法扩展到最后我们希望得到一个结点个数为n的最小生成树,同时我们会产生一个疑问,就是我们这么做一定能够成功地从当前阶段扩展到下一个阶段么,即会不会出现一个阶段我们无法扩展?
这个结论是显然的,我们用反证法,如果存在一个阶段无法扩展到下一个阶段,我们在这个阶段选择的结点构成的生成树没有可以扩展的结点,也就是说选择的结点的任何一个与没有选择的结点的任何一个两两之间不存在边,那么该图并不是连通图,非连通图中不存在生成树,矛盾。
算法在存在生成树的图中的可行性检验