首先谈下对最小生成树(Minimum Spanning Tree, MST)用处的理解,然后给出经典的Kruskal和Prim算法的伪码和理解。
首先显然它是解决最优化问题的,用的是贪心的思想(于是显然它是非常“优”的了,能用它解决就用它吧)。
最小生成树是从一个图简化而来,保留所有的(从树的角度来讲是连通图的所有)顶点以及连通性,砍掉尽可能多的边并使得剩下的边权值的和最小(用最短的边保持连通性)。
映射到现实问题,当我们面对一些有关系的实体(比如一个实体可以导出另一个实体),我们不愿丢掉连通性(砍掉两点之间的边一定是在有其它路径存在的前提下),希望获得最小代价的时候,可以考虑最小生成树。它与单源最短的区别就在于,第一它是全局的一种优化,没有指定的起点,不是针对某个特定的实体对其他的实体关系的问题;第二它多条边组成的路径对两端的点来说未必是最短的,但是它每条边对于两边的集合来说是最短的,单源最短路具有最优子结构,也就是说,单源最短路生成的图中,只要源点不作为中点,任意两点之间的路径一定是最短路。
最小生成树总的贪心思路是:每一步加入一条安全边。Kruskal和Prim以不同的方式寻找安全边。
说明一些术语:
安全边:不妨碍最小生成树边集的一条割的轻边。
割:把顶点分成两个集合,把相连的边剪掉。宛如一把剪刀。
不妨碍:A是一个边的集合,A中没有边通