相关概念:
通过对图的遍历,由遍历过程中使用到的边和顶点(顶点一定是都用上了,但是边只用了一部分,产生的效果就是,顶点都只和一个或者两个顶点邻接而已),这个子图称为原图的生成树。
按照遍历的方式的不同,称为深度优先生成树、广度优先生成树。
最小生成树:对于边是有权的话,生成树的所有边的权值之和就是生成树的权。其权值之和最小的生成树称为该图的最小生成树(Minimum Spanning Tree,MST)。
生成树的实际意义就是得到一条路径,可以将所有的点都连接起来,而最小生成树的实际意义就是让这条路径的开销最小。
构建最小生成树的算法:
构造最小生成树的算法有很多,比较经典的有两个:Kruskal(克鲁斯卡尔)算法、Prim算法。
Kruskal(克鲁斯卡尔)算法:
图 G(V E)最小生成树 T = (U Te),U 始终等于 V,但是 E 是所有边,而 Te 是最小生成树的边的集合,一开始为 0 。是将图 G 的所有边按权值大小排列,每次选择权值最小的边,如果这条边和 Te 中已有的边构成了回路,则将它舍弃,重新选择新的,最小的权值的边。重复这个过程,直到 T 包含有 n-1 个边为止(n 为顶点的数目)。
Prim算法:
换一个角度来看待最小生成树的问题,设 V(T)为最小生成树 T 的顶点集合,E(T)是最小生成树的边的集合,两个集合一开始都为空。如果一条边的