一个连通无向图G=(V, E),每条边(u, v) ∈ E,都有权重w(u, v),希望找到一个无环子集T E,既能够将所有节点都连接起来,又具有最小的权重。由于T是无环的,并且能连接所有的节点,所以T必然是一棵树,成T为最小生成树。最小生成树不唯一。
一:最小生成树的形成
本章所讨论的两种算法都采用贪心策略,这个贪心策略由下面的通用算法描述:
GENERIC-MST(G, w)
A =∅
while A does not form a spanningtree
find an edge (u, v) that issafe for A
A = A {(u, v)}
return A
该通用算法遵循循环不变式:在每次循环之前,A是某颗最小生成树的一个子集。我们要做的主要事情就是选择一条边(u, v),将其加入到集合A中,使得A不违反循环不变式,也就是A∪ {(u,v)}也是某颗最小生成树的子集。称这样的边(u, v)为集合A的安全边。
算法的关键就在于如何找到安全边,下面介绍找安全边的规则:
无向图G=(V, E)的一个切割(S, V-S)是集合V的一个划分,如下图所示,如果一条边(u, v)∈ E的一个端点位于集合S,另一个端点位于集合V-S,则称该条边横跨切割(S, V-S)。如果集合A中不存在横跨该切割的边,