五、图的最小生成树

来源:互联网 发布:淘宝商品销量统计 编辑:程序博客网 时间:2024/06/05 09:25

一、概述
  对于连通的带权图(连通网)G,其生成树也是带权的。生成树T各边的权值总和称为该树的权,记作:
        
这里:
  TE表示T的边集
  w(u,v)表示边(u,v)的权。
  权最小的生成树称为G的最小生成树(Minimum SpannirngTree)。最小生成树可简记为MST。
二、最小生成树的应用
  最小生成树有许多重要的应用。
【例】网络G表示n各城市之间的通信线路网线路(其中顶点表示城市,边表示两个城市之间的通信线路,边上的权值表示线路的长度或造价。可通过求该网络的最小生成树达到求解通信线路或总代价最小的最佳方案。
三、最小生成树性质(MST性质)
(1)MST性质
    
 最小生成树性质:设G=(V,E)是一个连通网络,U是顶点集V的一个真子集。若(u,v)是G中所有的一个端点在U(u∈U)里、另一个端点不在U(即v∈V-U)里的边中,具有最小权值的一条边,则一定存在G的一棵最小生成树包括此边(u,v)。
(2)MST性质的证明

     为方便说明,先作以下约定:
  ①将集合U中的顶点看作是红色顶点,②而V-U中的顶点看作是蓝色顶点,③连接红点和蓝点的边看作是紫色边,④权最小的紫边称为轻边(即权重最"轻"的边)。于是,MST性质中所述的边(u,v)就可简称为轻边。
用反证法证明MST性质:
  假设G中任何一棵MST都不含轻边(u,v)。则若T是G的一棵MST,则它不含此轻边。由于T是包含了G中所有顶点的连通图,所以T中必有一条从红点u到蓝点v的路径P,且P上必有一条紫边(u',v')连接红点集和蓝点集,否则u和v不连通。当把轻边(u,v)加入树T时,该轻边和P必构成了一个回路。删去紫边(u',v')后回路亦消除,由此可得另一生成树T'。
T'和T的差别仅在于T'用轻边(u,v)取代了T中权重可能更大的紫边(u',v')。因为w(u,v)≤w(u',v'),所以w(T')=w(T)+w(u,v)-w(u',v')≤w(T)。故T'亦是G的MST,它包含边(u,v),这与假设矛盾。所以,MST性质成立。
四、求MST的一般算法描述
     求MST的一般算法可描述为:针对图G,从空树T开始,往集合T中逐条选择并加入n-1条安全边(u,v),最终生成一棵含n-1条边的MST。
     当一条边(u,v)加入T时,必须保证T∪{(u,v)}仍是MST的子集,我们将这样的边称为T的安全边。
     用伪代码可将算法描述为:
      GenerieMST(G){//求G的某棵MST
         T〈-¢; //T初始为空,是指顶点集和边集均空
         while T未形成G的生成树 do{
             找出T的一条安全边(u,v);//即T∪{(u,v)}仍为MST的子集
             T=T∪{(u,v)}; //加入安全边,扩充T
          }
         return T; //T为生成树且是G的一棵MST
       }
  注意:
     下面给出的两种求MST的算法均是对上述的一般算法的求精,两算法的区别仅在于求安全边的方法不同。
     为简单起见,下面用序号0,1,…,n-1来表示顶点集,即:V(G)={0,1,…,n-1},G中边上的权解释为长度,并设T=(U,TE)。

五、普里姆(Prim)算法
(1)算法思想
     T=(U,TE)是存放MST的集合。
  ①T的初值是({r},¢)
    即最小生成树初始时只有一个红点r,没有红边。
  ②T经过n-1次如下步骤操作,最后得到一棵含n个顶点,n-1条边的最小生成树
    ⒈选择紫边集中一条轻边并扩充进T
  ⒉将轻边连接的蓝点改红点
  ⒊将轻边改红边
    ⒋修改紫边集
(2)较小紫边集的构造
     若当前形成的T中有k个顶点,|U|=k,|V-u|=n-k,故可能的紫边数目是k(n-k)。从如此大的紫边集中选择轻边是低效的。因此,必须构造较小的紫边集。
     对于每个蓝点v ∈V-U,从v到各红点的紫边中,只有最短的那一条才有可能是轻边。因此,只须保留所有n-k个蓝点所关联的最短紫边作为轻边的候选集即可。
(3)候选紫边集合的修改

     当把轻边(u,v)扩充到T时,因为v由蓝变红,故对每个剩余的蓝点j,边(v,j)就由非紫边变为紫边,这条新紫边的长度可能小于蓝点j原来所关联的最短紫边的长度。因此,用长度更小的新紫边取代那些原有的最短紫边。
(4)Prim算法的伪代码描述
     PrimMST(G,T,r){
      //求图G的以r为根的MST,结果放在T=(U,TE)中
        InitCandidateSet(…);//初始化:设置初始的轻边候选集,并置T=({r},¢)
        for(k=0;k<n-1;k++){ //求T的n-1条树边
            (u,v)=SelectLiShtEdge(…);//选取轻边(u,v);
             T←T∪{(u,v)};//扩充T,即(u,v)涂红加入TE,蓝点v并人红点集U
            ModifyCandidateSet(…); //根据新红点v调整候选轻边集
          } 
       }
(5) 算法的执行过程  
    
注意:
     
若候选轻边集中的轻边不止一条,可任选其中的一条扩充到T中。
     连通网的最小生成树不一定是惟一的,但它们的权相等。
【例】在上图(e)中,若选取的轻边是(2,4)而不是(2,1)时,则得到如图(h)所示的另一棵MST。
6)算法特点
     该算法的特点是当前形成的集合T始终是一棵树。将T中U和TE分别看作红点和红边集,V-U看作蓝点集。算法的每一步均是在连接红、蓝点集的紫边中选择一条轻边扩充进T中。MST性质保证了此边是安全的。T从任意的根r开始,并逐渐生长直至U=V,即T包含了 C中所有的顶点为止。MST性质确保此时的T是G的一棵MST。因为每次添加的边是使树中的权尽可能小,因此这是一种"贪心"的策略。
(7)算法分析
     该算法的时间复杂度为O(n2)。与图中边数无关,该算法适合于稠密图。

六、克鲁斯卡尔(Kruskal)算法
(1)算法思想
  ①T的初始状态
       只有n个顶点而无边的森林T=(V,¢ )
  ②按边长递增的顺序选择E中的n-1安全边(u,v)并加入T,生成MST
注意:
     安全边指两个端点分别是森林T里两棵树中的顶点的边。加入安全边,可将森林中的两棵树连接成一棵更大的树
     因为每一次添加到T中的边均是当前权值最小的安全边,MST性质也能保证最终的T是一棵最小生成树。
(2)算法特点
     该算法的特点是:当前形成的集合T除最后的结果外,始终是一个森林。
(3)Kruskal算法的抽象描述

      KruskalMST(G){//求连通网G的一棵MST
         T=(V,¢); //初始化,T是只含n个顶点不包含边的森林依权值的递增序对E(G)中的边排序,并设结果在E[0..e-1]中
         for(i=0;i<e;i++) { //e为图中边总数
            取E[0..e-1)中的第i条边(u,v);
             if u和v分别属于T中两棵不同的树then
                T=T∪{(u,v)};//(u,v)是安全边,将其加入T中
             if T已是一棵生成树then
                return T;
            }//endfor
           return T;
       } 
(4)用Kruskal算法构造最小生成树的过程
           
(5)算法分析
    该算法的时间复杂度为O(elge)。
  Kruskal算法的时间主要取决于边数。它较适合于稀疏图。

原创粉丝点击