最小生成树的形成
假设已知一无向连通图G=(V,E),其加权函数为w:E→R,我们希望找到图G的最小生成树。后文所讨论的两种算法都运用了贪心方法,但在如何运用贪心法上却有所不同。
下列的算法GENERNIC-MIT正是采用了贪心策略,每步形成最小生成树的一条边。算法设置了集合A,该集合一直是某最小生成树的子集。在每步决定是否把边(u,v)添加到集合A中,其添加条件是A∪{(u,v)}仍然是最小生成树的子集。我们称这样的边为A的安全边,因为可以安全地把它添加到A中而不会破坏上述条件。
GENERNIC-MIT(G,W)
1. A←?
2. while A没有形成一棵生成树
3 do 找出A的一条安全边(u,v);
4. A←A∪{(u,v)};
5. return A
注意从第1行以后,A显然满足最小生成树子集的条件。第2-4行的循环中保持着这一条件,当第5行中返回集合A时,A就必然是一最小生成树。算法最棘手的部分自然是第3行的寻找安全边。必定存在一生成树,因为在执行第3行代码时,根据条件要求存在一生成树T,使AíT,且若存在边(u,v)?T且(u,v)?A,则(u,v)是A的安全边。
在本节余下部分中,我们将提出一条确认安全边的规则(定理1),下一节我们将具体讨论运用这一规则寻找安全边的两个有效的算法。
首先我们来定义几个概念。有向图G=(V,E)的割(S,V-S)是V的一个分划。当一条边(u,v)?E的一个端点属于S而另一端点属于V-S,则我们说边(u,v)通过割(S,V-S)。若集合A中没有边通过割,则我们说割不妨害边的集合A。如果某边是通过割的具有最小权值的边,则称该边为通过割的一条轻边。要注意在链路的情况下可能有多条轻边。从更一般意义来讲,如果一条边是满足某一性质的所有边中具有最小权值的边,我们就称该边为满足该性质的一条轻边。图2说明了这些概念。(a)集合S中的结点为黑色结点,V-S中的那些结点为白色结点。连接白色和黑色结点的那些边为通过该割的边。边(d,c)为通过该割的唯一一条轻边。子集A包含阴影覆盖的那些边,注意,由于A中没有边通过割,所以割(S,V-S)不妨害A。(b)对于同一张图,我们把集合S中的结点放在图的左边,集合V-S中的结点放在图的有边。如果某条边使左边的顶点与右边的顶点相连则我们说该边通过割。
|
|
(a) |
(b) |
图2 从两种途径来观察图1所示图的割(S,V-S)
确认安全边的规则由下列定理给出。
定理1
设图G(V,E)是一无向连通图,且在E上定义了相应的实数值加权函数w,设A是E的一个子集且包含于G的某个最小生成树中,割(S,V-S)是G的不妨害A的任意割且边(u,v)是穿过割(S,V-S)的一条轻边,则边(u,v)对集合A是安全的。
证明:
设T是包含A的一棵最小生成树,并假定T不包含轻边(u,v),因为若包含就完成证明了。我们将运用“剪贴技术”(cut-and-paste technique)建立另一棵包含A∪{(u,v)}的最小生成树T¢,并进而证明(u,v)对A是一条安全边;
图3 定理1的证明
图3演示出了定理1的证明。S中的结点为黑色,V-S中的结点为白色,边(u,v)与T中从u到v的通路P中的边构成一回路。由于u和v处于割(S,V-S)的相对的边上,因此在T中的通路P上至少存在一条边也通过割。设(x,y)为满足此条件的边。因为割不妨害A,所以边(x,y)不属于A。又因为(x,y)处于T中从u到v的唯一通路上,所以去掉边(x,y)就会把T分成两个子图。这时加入边(u,v)以形成一新的生成树T¢=T-{(x,y)}∪{(u,v)}。
下一步我们证明T¢是一棵最小生成树。因边(u,v)是通过割(S,V-S)的一条轻边且边(x,y)也通过割,所以有w(u,v)£w(x,y),因此 w(T¢)=w(T)-w(x,y)+w(u,v)£(T),但T是最小生成树,所以w(T)=w(T¢),因此T¢必定也是最小生成树。
现在还要证明(u,v)实际上是A的安全边。由于AíT且(x,y)?A,所以有AíT¢,则A∪{(u,v)}íT¢。而T¢是最小生成树,因而(u,v)对A是安全的。□
定理1使我们可以更好地了解算法GENERNIC-MIT在连通图G=(V,E)上的执行流程。在算法执行过程中,集合A始终是无回路的,否则包含A的最小生成树包含一个环,这是不可能的。在算法执行中的任何一时刻,图GA=(V,A)是一森林且GA的每一连通支均为树。其中某些树可能只包含一个结点,例如在算法开始时,A为空集,森林中包含|V|棵树,每个顶点对应一棵。此外,对A安全的任何边(u,v)都连接GA中不同的连通支,这是由于A∪{(u,v)}必定不包含回路。
随着最小生成树的|V|-1条边相继被确定,GENERNIC-MIT中第2-4行的循环也随之要执行|V|-1次。初始状态下,A=?,GA中有|V|棵树,每个迭代过程均将减少一棵树,当森林中只包含一棵树时,算法执行终止。
第2节中论述的两种算法均使用了下列定理1的推论。
推论2
设G=(V,E)是一无向连通图,且在E上定义了相应的实数值加权函数 w,设A是E的子集且包含于G的某最小生成树中,C为森林GA=(V,A)中的连通支(树)。 若边(u,v)是连接C和GA中其他某连通支的一轻边,则边(u,v)对集合A是安全的。
证明:
因为割(C,V-C)不妨害A,因此(u,v)是该割的一条轻边。□
5.1 图的基本概念 |
5.2 图的存储结构 |
5.3 图的遍历 |
5.4 生成树和最小生成树 |
5.5 最短路径问题 |
5.6 拓扑排序 |
|
|
|
5.4.2 最小生成树
(理解最小生成树的概念,大致了解算法)
|
|
|
|
|
5.4.3求解图的最小生成树
(对一个无向网络求解它的最小生成树,通常有两种方法:一是kruskal法,二是prim法)
1.Kruskal算法 |
|
|
|
|
|
|
2.prim算法 |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
>>继续<< >>后退<<