1、什么是最小生成树?
对于无向图G=(V, E),V表示图中的结点,E表示图中的边,所谓最小生成树就是联通图G中所有结点所需要的边长度总和最小,这些边加上V就构成图G的一颗最小生成树。这样还不清楚我们可以举个例子:有n个城市分布在不同的地方,为了保证每个城市间都能用火车通行,我们需要在城市之间修铁路,但是为了节约成本,我们在保证每两个城市之间都能联通的情况下要使得所修的铁路长度最短。这就是一个最小生成树的问题
2、如何求出无向图G=(V, E)的一棵最小生成树呢?
假设A是某棵最小生成树的子集,下一步我们需要做的就是找出一条边(u,v),将其加入到A中,使得A∪{(u,v)}也是某棵最小生成树的子集,我们称(u,v)为安全边。
用下列伪代码来表示获得一棵最小生成树的过程
A=null
While A 还不是一棵完整的最小生成树{
找到一条安全边(u,v)
A=A∪{(u,v)}
}
return A //此时A已经是一棵最小生成树
很显然难点在与如何寻找A的安全边。
3、如何需找A的安全边?
在寻找安全边之前我们需要介绍介几个概念:
切割(S,V-S):对集合V的一个划分,将集合V划分为两个部分S和V-S
横跨切割:若边(u,v)的一个节点属于S另一个节点属于V-S,则称(u,v)横跨切割
尊重集合A:如果A中不存在横跨切割的边,则称该集合尊重集合A
设(S,V-S)是图G中尊重A的任意一个切割,(u,v)是横跨切割(S,V-S)的轻量级边。我们可以证明(u,v)是A的一条安全边
证明:设T是一棵包含A的最小生成树,并假定T不包括(u,v),若T包括(u,v)则可以直接说明(u,v)是安全的,现在我们需要构建一棵最小生成树T2包含A∪{(u,v)},从而证明(u,v)对于A是安全的。具体如何构造T2如下:
我们可以找到另外一条横跨切割(S,V-S)的边(x,y)且(x,y)属于树T,由于该切割尊重集合A,所以(x,y)不在集合A中,所以可以构造一棵新树T2=T-{(x,y)}∪{(u,v)}。下面证明T2为最小生成树,设W(T)为T中所有边的权重和W(u,v)为边(u,v)的权重,则W(T2)=W(T)-W(x,y)+W(u,v)<=W(T),所以T2也是一棵最小生成树
最终证明了横跨尊重集合A的切割(S,V-S)的一条轻量级边(u,v)为A的一条安全边
有关求最小生成树的算法Prim和kruskal请参照最小生成树算法Prim、Kruskal