最小生成树的算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最小生成树的算法

王洁

引言:

求连通图的最小生成树是数据结构中讨论的一个重要问题.在现实生活中,经常遇到如何得到连通图的最小生成树,求最小生成树不仅是图论的基本问题之一 ,在实际工作中也有很重要的意义,,人们总想寻找最经济的方法将一个终端集合通过某种方式将其连接起来 ,比如将多个城市连为公路网络 ,要设计最短的公路路线;为了解决若干居民点供水问题 ,要设计最短的自来水管路线等.而避开这些问题的实际意义 ,抓住它们的数学本质 ,就表现为最小生成树的构造。下面将介绍几种最小生成树的算法。

一,用“破圈法”求全部最小生成树的算法

1 理论根据

1.1 约化原则

给定一无向连通图 G =(V ,E )( V 表示顶点,E 表示边),其中 V={ 1v , 2v ,3v …… n v },E= { 1e , 2e , 3e …… n e }对于 G 中的每条边 e ∈ E 都赋予权ω(i e )>0,求生成树 T = (V ,H ),H ⊆ E ,使生成树所有边权最小,此生成树称为最小生成树.

(1) 基本回路

将属于生成树 T 中的边称为树枝,树枝数为n -1,不属于生成树的边称为连枝.将任一连枝加到生成树上后都会形成一条回路.把这种回路称为基本回路,记为()cf e 。 基本回路是由 T 中的树枝和一条连枝构成的回路.

(2) 基本割集

设无向图 G 的割集 S (割集是把连通图分成两个分离部分的最少支路集合) ,若 S 中仅包含有T 中的一条树枝,则称此割集为基本割集,记为()S e 。 基本割集是集合中的元素只有一条是树枝,其他的为连枝.

(3) 等长变换

设T=(V,H),为一棵生成树,e ∈ H, 'e ∈ E, 'e ∉ H,当且仅当'e ∈()cf e ,也就是说

e ∈()S e ,则'T =T ⊕{e, '

e }也是一棵生成树。当()e ω='()e ω时,这棵生成树叫做等长变换。

等长变换就是从基本回路中选取与树枝等权边,并与此树枝对换后形成的生成树. 根据以上定理得出2个结论:①若在某个回路C 中有一条唯一的最长边,则任何一棵最小生成树都不含这条边;②若在某个边 e 的割集中有一条唯一最短边,则每棵生成树中都必须含这条边.由上面结论可以得到唯一性:若图 G 中的生成树T = (V ,H )是唯一的一棵最小生成树,当且仅当任意一连枝e ∈ H, '

e ∈ E 都是其基本回路中唯一最长边,任意一条树边 e 都是其基本割集()S e 中的唯一最短边.

由此在最小生成树不唯一的情况下,就可以得到一个约化的原则:假设已得到一棵最小生成树0T 。对于0T 中每一条树边e ∈ H ,若 e 是基本割集()S e 中唯一的最短边,则每棵最小生成树中一定包含此边,则把此边取为固定边,并将此边的基本割集去掉。

对于每条连枝e ∈ H, 'e ∈ E ,若它是基本回路()cf e 中唯一最长边,则每棵生成树中都不会包含此条连枝,则将其消去.

约化原则是在最小生成树不唯一的情况下,从已经得到的一棵最小生成树0T 中选出其树枝是基本割集中唯一的最短边,则每一棵最小生成树中必含有此边,就取为固定边.在基本回路中若有一条唯一最长边,则每棵最小生成树都不含此条边,将其去掉.通过这样约化后再求最小生成树,计算量会大大下降.

1.2 全部最小生成树

设0T 是已求得的一棵最小生成树,在最小生成树不唯一的情况下,存在其他最小生成树 T ,称T-0T 得到的边集的长度为距离(这里的长度是指集合中元素的个数)。

为了简单起见,设最小生成树0T 的边集为{ 1e , 2e , 3e ……1n e -},对于0T 的任何边集k H ={ 1e , 2e , 3e ……1k e -}(11k n ≤≤-),则每棵最小生成树 T 与0T 的距离是一定的,或为1,或为2 ,或为 n -1.这样我们就可以按所有的最小生成树与0T 的距离来分类。

记1,2,i i T ……ik ={ 1e , 2e , 3e ……1k e -}为所有的0T —k H 即不含k H 的最小生成树的集合(可能为空).对于其它的最小生成树T ∈1,2,i i T ……ik 而言,k H =0T —T 为换出边,k H =T —0T 为入边,0T T ⋂中的边叫不动边.

若 T 有 k 个换出边就说它与0T 的距离为 k .当 k=0 时为参考树本身。

当 k = 1 时,对任意

的11i n ≤≤-,有10110{{,}|(),()(),}

i i i i i T T e p p S T p e p e ωω=⊕∈=≠。最小生成树1i T 是用基本割集1i S 的边 p 换出0T 的边1i e 且边p 的权和边1i e 的权相等。

当 k = 2时,1,10{{,}|()(),()(),}i ij i ij ij ij ij ij ij T T e p p S T S T p e p e ωω=⊕∈⋂=≠。在换入一条边后得到的生成树中再换入一条边,即换入两条边后得到的一棵最小生成树1,i ij T 。

以此递推下去,可建立如下关系:1,2ik 1,2ik 11,2k-10k k {{,}|()(),()(),}i i i i ik ij i i i i T T e p p S T S T p e p e ωω-=⊕∈⋂=≠………………此递推关系表示在换入k —1条边后得到的生成树中再换入一条边后得到的一棵最小生成树.用

此递推关系,就可以求出全部的最小生成树。

2 算法

选取一棵最小生成树0T ,求出0T 的全部基本回路.对每一个基本回路去掉唯一最大边,约化所给的图.然后对应于0T 的每条树边,求出基本割集.若此树边也是基本割集中唯一最短边,则取其为固定边,并将此基本割集作上记号,求其他的最小生成树时,就不用考虑此割集了.其余的基本割集,应用递推关系,对应于递推式求出所有的换入边.对于距离为1的,每一个换入边对应着一棵最小生成树;对于距离为2 的每两个换入边也对应着一棵最小生成树;换入 k 条边,就对应着距离为 k 的最小生成树.以此类推就可以求出全部的 最小生成树.

求无向图 G 的全部最小生成树的算法如下.

(1) 求最小生成树0T .比较成熟的算法,在此就不做介绍.

(2) 求约化图算法 (去掉基本回路中的唯一最长边)

Step1 令123{,,,p }b p p p p =……为连枝集合,j=1;

Step2 在0T 中加入连枝p j ,形成一个基本回路,记为j cf ;

Step 3 若p j 是基本回路j cf 中唯一最长边,则从图 G 中去掉p j ;

Step4 j =j +1,若 j 不大于 b ,则返回Step2;

Step5 输出经约化后的图 G 。

(3 )求固定边算法 (保留基本割集中唯一的最短边)

Step 1 令 E ={ 1e , 2e , 3e ……1n e -}为最小生成树0T 的树枝集合,S =121{,,}n S S S -……,i S 为树枝i e 的基本割集,i=1;

Step 2 从约化后的图 G 中求出树枝i e 的基本割集i S ;

Step3 若i e 是基本割集 S 中的唯一最短边,则将i e 取为固定边,并对i S 作记号; Step4 i 增加1, 若 i 不等于n, 则返回Step2.

(4) 求换入边算法( 若基本割集中有记号,则为固定边,若没有记号,则从中求换入边) Step1 设 H 为换入边的集合,F 为换出边的集合,初始 H 、F 为空,i=1;

Step 2 若i e 的基本割集i S =12{,,}d P P ……P 中有记号,则i e 为固定边,执行Step 8; Step3 若i e 的基本割集i S 中无记号,则i e 放入 F 中;

Step4 令 k= 1;

Step 5 若i e k P ≠,且权()(p )i k e ωω=,p k 放入H 中;

Step6 k =k+ 1;

Step7 若 k < d (d 为i S 的长度,即i S 中元素的个数) 则返回Step5;

相关文档
最新文档