一个无向图G 的最小生成树(minimum spanning tree) 就是由该图的那些连接 G 的所有顶点的边构成的树,即在最小生成树中边的条数为 |V| - 1,且其总的值最低。最小生成树存在当且仅当 G 是连通的。虽然一个强壮的算法应该指出 G 不连通的情况,但是我们还是假设 G 是连通的。
对于最小生成树问题,贪婪的做法是成立的,这里介绍两种算法,它们的区别在于最小(值的)边如何选取上。
Prim 算法
在该算法的任一时刻,我们都可以看到一组已经添加到树中的顶点,而其余顶点尚未加到树上。此时,算法在每一阶段都可以通过选择边(u, v),使得(u, v) 的值是所有 u 在树上但 v 不在树上的边的最小值,从而找出一个新的顶点并将它添加到这棵树中。
对于图1 中的无向图 G,图2 指出了该算法如何从 v1 开始构建最小生成树。开始时,v1 在构建中的树上,它作为树的根但是没有边。每一步添加一条边和一个顶点到树上。
我们可以看到,Prim 算法基本上与求最短路径的 Dijkstra 算法相同。因此,和前面一样,我们对每一个顶点保留值 dv 和 pv 以及一个指标,标示该顶点是 known 的还是 unknown 的。这里,dv 是连接 v 到一个 known 顶点的最短边的权,而 pv 则是导致 dv 改变的最后的顶点。算法其余部分完全一样,只有一点不同:由于 dv 的定义不同,因此它的更新法则也不同:在每一个顶点 v 被选取之后,对于每一个邻接到 v 的unknown 的 w,dw = min(dw, vw,v)。
表的初始配置由图3 指出,其中 v1 被选取,而 v2、v<