在电子电路设计中,通常需要将多个组件的针脚连接在一起。 设有 n 个针脚,则至少需要 n-1 根连线连接(每根连线连接两个针脚)。问怎么连线才能使所使用的连线总长度最短?
将布线问题用一个连通无向图G = (V,E)表示,结点表示针脚, 边表示针脚之间的连线。对每条边(u,v)∈E赋予权重 ω(u,v) 表示 连接针脚(结点)u和v的代价(连线长度)。 问题转化为找G中的一个无环子集 ,使之既能够将所有的结点(针脚)连接起来,又具有最小的权重,即使得的值最小。
由于 T 无环,且连接所有顶点,故T必为一颗树,称生成树。
具有最小权重的生成树。
我们想要达成这样一种贪心策略:保持在每个时刻,该策略生长最小生成树的一条边,并在整个策略的实施过程中,管理一个遵守下述循环不变式的边的集合A :
在每遍循环之前,A是某棵最小生成树的一个子集
这样的边使得我们可以“安全地”将之加入到集合A而不会破坏A的循环不变式,因此称之为集合 A 的“安全边” 。
无向图G = (V,E)的一个切割(S,V-S)是集合V的一个划分。
如果一条边(u,v)∈E的一个端点在集合S中,另一个端点在集合V-S中,则称该条边横跨切割(S,V-S)。
如果边集A中不存在横跨该切割的边,则称该切割尊重集合A。(就是没有切到A中的边)
在横跨一个切割的所有边中,权重最小的边称为轻量级边。
一般,如果一条边是满足某个性质的所有边中权重最小的,则称该边是满足给定性质的一条轻量级边
设G=(V,E)是一个在边 E 上定义了实数值权重函数ω 的连通无向图。设集合A为E的一个子集,且A包含在图G的某棵最小生成树中,设 (S,V-S) 是图G中尊重集合A的任意一个切割,又设(u,v)是横跨切割(S,V-S)的一条轻量级边。那么边(u,v)对于集合A是安全的。
证明:
设T是一棵包含 A 的最小生成树,且T不包含轻量级边(u,v) (若T包含轻量级边(u,v)则已成立)
T中包含有G的所有结点,且是一棵树,所以 (u,v) 与 T 中从结点 u 到结点 v 的简单路径 p 形成一个环。
对于(u,v)而言, u和v分别处在它所横跨的切割(S,V-S)的两端,且T中至少有一条属于p的边也横跨该切割,设(x,y)是T中属于简单路径 p 但横跨该切割的边,且根据已知条件:切割 (S,V-S) 尊重集合A,所以边(x,y)不在集合A中。 由于边(x,y)位于树T中,是从u到v的唯一简单路径上的一条边,所以将该边删除会导致T被分解为两个连通分量。 将(u,v)加上去,则可以将这两个连通分量连接起来再次形成一棵新的生成树,记为T’=T-{(x,y)}∪{(u,v)}。 由于边(u,v)是横跨切割(S,V-S)的一条轻量级边,而且边 (x,y)也横跨该切割,所以应有ω(u,v)≤ ω(x,y)。因此
而T是一棵最小生成树,所以还应有ω(T)≤ ω(T')。 所以ω(T)=ω(T'),即T'一定也是一棵最小生成树。又且故
因此由于T'是最小生成树,所以(u,v)对于集合A是安全的。
证毕。
基于此,有算法
算法执行的任意时刻,图=(V,A)是一个森林。 中的每个连通分量是一棵树
某些连通分量可能是仅含一个结点的树,如在初始时,A=Ø,中有 |V|棵树,每棵树都只有一个结点。
对于安全边(u,v),由于A∪{(u,v)}必须无环,所以 (u,v) 连接的是中的两个不同连通分量。
设G = (V,E)是一个无向连通图,并有定义在边集合 E上的实数值权重函数ω。设集合A为E的一个子集,且A包含在图G 的某棵最小生成树中。设为森林中的一个连通分量,边 (u,v)∈E、 是C连接和中其它连通分量的所有边中权重最小的边,则边(u,v)对于集合A是安全的。
证明:
由于C是一个连通分量,与其它连通分量没有边连接,所以定义在 C 的结点集上的切割( ,)尊重集合A,即A 中没有横跨该切割的边。而边(u,v)就是横跨该切割的一 条轻量级边,根据MST性质,(u,v)对于集合A是安全的。
证毕
实际上,对于MST性质的不同细化,就形成了这两种不同的算法。
集合A始终是森林,开始时A就是G中所有单节点构成的森林,之后每次加入A中的安全边是连接A中两分量的权重最小的边。
时间复杂度:
(并查集实现)
集合A始终是一颗树,每次加入A中的安全边是连接A中点和A外点的权重最小的边。
时间复杂度:
从渐进意义上看,Kruskal和Prim算法具有相同的运行时间。