1.什么是最小生成树
对于一个联通无向图 G = ( V , E ),对于每条边 ( u , v ) ∈ E,我们为其赋予权重w( u , v )。现在我们希望找到一个无环子集T∈E,既能够将所有结点连接起来,又具有最小权重。由于T是无环的,并且联通所有的结点,因此,T必然是一颗树。我们称这样的树为生成树,称求取该生成树的问题为最小生成树问题。
2.形成最小生成树的通用方法
常见的求最小生成树的算法有Kruskal和Prim算法,这两种算法都是使用贪心策略来解决这个问题的,但是它们使用贪心策略的方式有所不同。它们使用的贪心策略都可以用一种统一的方式来表述,下面就来重点讲解一下这种方法。
该通用方法在每个时刻生长最小生成树的一条边,并在整个策略的实施过程中,维护一个遵守下述循环不变式的边集合A:在每次循环之前,A是某棵最小生成树的一个子集。
在每一步,我们要做的是选取一条边( u , v ),将其加入到集合A中,使得A不违反循环不变式,即A∪{ ( u,v ) }也是某棵最小生成树的子集。由于我们可以安全地将这种边加入到集合A而不会破坏A的循环不变式,因此我们称这样的边为集合A的安全边。
伪代码如下:
A=∅
while A does not form a spanning tree
find an edge(u,v) that is safe for A
A∪{ ( u,v ) }
return A
3.如何寻找安全边
上面我们提到了安全边,不难发现,最小生成树算法的奥妙就在于如何寻找到安全边。本篇文章的剩下内容中重点讲如何去辨别安全边。
3.1 首先我们先来了解一些概念:
3.1.1 切割:无向图 G = ( V , E )的切割( S , V - S )是集合V的一个划分。换句话说切割就是将G中的节点分为两部分,选取G的一些节点将其归入S集合,G中的另外所有节点归入V-S的集合。注意,这里的划分只是集合意义上的划分,并不要求同一个集合中的结点是聚集在一起的,两个集合的点在图上来看可能是相互交错,杂乱无章的,不一定是聚集在一起的。
3.1.2 横跨切割:横跨切割是边对于切割的一种关系。如果一条边( u , v )的一遍连接着S中的结点,另一边连接着V-S中的结点,那么就称边( u , v )横跨切割。
3.1.3 尊重集合A:尊重集合A(A的意义与前文所述相同)是一个切割对于集合A的一种关系。如果横跨一个切割的所有边中没有边属于A,那么称这个切割尊重集合A。
3.1.4 轻量级边:在横跨切割的所有边中,边权最小的边成为轻量级边。注意,轻量级边可能不唯一。
3.2 辨认安全边的规则
这里有一个定理,给出了辨认安全边的规则:
设G = ( V , E )是一个在边E上定义了实数值权重函数w的无向图。设集合A是E的一个子集,且A包括在图G的某棵最小生成树中,设( S , V-S )是图G中尊重集合A的任意一个切割,又设( u , v )是横跨切割( S , V-S )的一条轻量级边。那么边(u,v)对于集合A是安全的。
我来谈一谈我对这个定理的认识。这里的集合A就是前文所述的集合A,集合A就是最小生成树T的的子集。集合A,T,G之间的关系是A⊆T⊆G。这个定理给出了寻找安全边的方法,总的一句话就是:一个无向联通带权图中,横跨尊重集合A的切割的一条轻量级边就是安全边。而各种算法就是去解决这样一些问题,(1)如何去构造一个尊重集合A的切割(2)如何在横跨该切割的所有边中寻找出一条轻量级边
3.3 定理的证明
我们要证明上述定理,也就是横跨尊重集合A的分割的轻量级边(u,v)满足安全边的定义,即把这样一条边(u,v)加入到集合A中后,集合A仍然是图G的某棵最小生成树的子集。数学表达也就是证明A∪{(u,v)}⊆T’,T’是图G的某棵最小生成树。
设T是一颗包含A的最小生成树,并假定A不包含轻量级边(u,v)。现在我们来构造另外一颗最小生成树T’,我们通过剪切复制的方式将A∪{(u,v)}包含在树T’中,从而说明(u,v)对集合A是安全的。
在T中,结点u到节点v一定有一条简单路径p,因为最小生成树T是连通的,且这条简单路径p是唯一的,那么边(u,v)和路径p形成了一条环路。由于结点u,v分别处在切割( S , V - S )的两端,因此T中至少有一条边属于简单路径p并横跨该切割。设这条边为(x,y)。因为切割( S , V - S )尊重集合A,边(x,y)不在集合A当中。由于边在唯一的简单路径p上,若将该边删去,则T会被分为两个连通分量。再将边(u,v)加上可将整两个连通的分量连接起来,形成一颗新的树T'=( T - {(x,y)} )∪{ (u,v) }。
下面证明下面证明T'是一颗最小生成树。由于边(u,v)是横跨切割( S , V - S )的一条轻量级边,所以w(u,v)<=W(x,y),所以w(T')=w(T)-w(x,y)+w(u,v)<=w(T)。因为T是一颗最小生成树,所以w(T)<=w(T'),因此T’是一颗最小生成树。
因为A⊆T,并且(x,y)∉A,所以A⊆T’,所以A∪{(u,v)}⊆T’,而T’是一颗最小生成树,故(u,v)对于集合A是安全的。