图 - 生成树和最小生成树 - 最小生成树

 最小生成树

  对于连通的带权图(连通网)G其生成树也是带权的生成树T各边的权值总和称为该树的权记作

  

  这里:

  TE表示T的边集

  w(uv)表示边(uv)的权

  权最小的生成树称为G的最小生成树(Minimum SpannirngTree)最小生成树可简记为MST

生成树和最小生成树的应用

  生成树和最小生成树有许多重要的应用

  【例】网络G表示n各城市之间的通信线路网线路(其中顶点表示城市边表示两个城市之间的通信线路边上的权值表示线路的长度

  或造价可通过求该网络的最小生成树达到求解通信线路或总代价最小的最佳方案

最小生成树性质(MST性质)

()MST性质

  最小生成树性质设G=(VE)是一个连通网络U是顶点集V的一个真子集若(uv)是G中所有的一个端点在U(u∈U)里另一个端

  点不在U(即v∈VU)里的边中具有最小权值的一条边则一定存在G的一棵最小生成树包括此边(uv)

()MST性质的证明

  为方便说明先作以下约定

  ①将集合U中的顶点看作是红色顶点②而VU中的顶点看作是蓝色顶点③连接红点和蓝点的边看作是紫色边④权最小的紫

  边称为轻边(即权重最轻的边)于是MST性质中所述的边(uv)就可简称为轻边

  用反证法证明MST性质

  假设G中任何一棵MST都不含轻边(uv)则若T是G的一棵MST则它不含此轻边

  由于T是包含了G中所有顶点的连通图所以T中必有一条从红点u到蓝点v的路径P且P上必有一条紫边(uv)连接红点集和蓝点集

  否则u和v不连通当把轻边(uv)加入树T时该轻边和P必构成了一个回路删去紫边(uv)后回路亦消除由此可得另一生

  成树T

  T和T的差别仅在于T用轻边(uv)取代了T中权重可能更大的紫边(uv)因为w(uv)≤w(uv)所以

  w(T)=w(T)+w(uv)w(uv)≤w(T)

  故T亦是G的MST它包含边(uv)这与假设矛盾

  所以MST性质成立

求MST的一般算法描述

  求MST的一般算法可描述为针对图G从空树T开始往集合T中逐条选择并加入n条安全边(uv)最终生成一棵含n条边的

  MST

  当一条边(uv)加入T时必须保证T∪{(uv)}仍是MST的子集我们将这样的边称为T的安全边

  用伪代码可将算法描述为

  GenerieMST(G){//求G的某棵MST

  T〈¢; //T初始为空是指顶点集和边集均空

  while T未形成G的生成树 do{

  找出T的一条安全边(uv);//即T∪{(uv)}仍为MST的子集

  T=T∪{(uv)}; //加入安全边扩充T

  }

  return T; //T为生成树且是G的一棵MST

  }

  注意

  下面给出的两种求MST的算法均是对上述的一般算法的求精两算法的区别仅在于求安全边的方法不同

  为简单起见下面用序号…n来表示顶点集即

  V(G)={…n}

  G中边上的权解释为长度并设T=(UTE)


普里姆(Prim)算法

  ()算法思想

  T=(UTE)是存放MST的集合

  ①T的初值是({r}¢)

  即最小生成树初始时只有一个红点r没有红边

  ②T经过n次如下步骤操作最后得到一棵含n个顶点n条边的最小生成树

  ⒈选择紫边集中一条轻边并扩充进T

  ⒉将轻边连接的蓝点改红点

  ⒊将轻边改红边

  ⒋修改紫边集

  ()较小紫边集的构造

  若当前形成的T中有k个顶点|U|=k|Vu|=nk故可能的紫边数目是k(nk)从如此大的紫边集中选择轻边是低效的因此

  必须构造较小的紫边集

  对于每个蓝点v ∈VU从v到各红点的紫边中只有最短的那一条才有可能是轻边因此只须保留所有nk个蓝点所关联的最

  短紫边作为轻边的候选集即可

  ()候选紫边集合的修改

  当把轻边(uv)扩充到T时因为v由蓝变红故对每个剩余的蓝点j边(vj)就由非紫边变为紫边这条新紫边的长度可能小

  于蓝点j原来所关联的最短紫边的长度因此用长度更小的新紫边取代那些原有的最短紫边

  ()Prim算法的伪代码描述

  PrimMST(GTr){

  //求图G的以r为根的MST结果放在T=(UTE)中

  InitCandidateSet(…);//初始化设置初始的轻边候选集并置T=({r}¢)

  for(k=;k

  (u,v)=SelectLiShtEdge(…);//选取轻边(u,v);

  T←T∪{(u,v)};//扩充T,即(u,v)涂红加入TE,蓝点v并人红点集U

  ModifyCandidateSet(…); //根据新红点v调整候选轻边集

  }

  }

  (5) 算法的执行过程

  用PRIM算法得到最小生成树的过程【 参见动画演示 】

  

  注意:

  若候选轻边集中的轻边不止一条,可任选其中的一条扩充到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(n 2 )。与图中边数无关,该算法适合于稠密图。


克鲁斯卡尔(Kruskal)算法

  ()算法思想

  ①T的初始状态

  只有n个顶点而无边的森林T=(V¢ )

  ②按边长递增的顺序选择E中的n安全边(uv)并加入T生成MST

  注意

  安全边指两个端点分别是森林T里两棵树中的顶点的边加入安全边可将森林中的两棵树连接成一棵更大的树

  因为每一次添加到T中的边均是当前权值最小的安全边MST性质也能保证最终的T是一棵最小生成树

  ()算法特点

  该算法的特点是当前形成的集合T除最后的结果外始终是一个森林

  ()Kruskal算法的抽象描述

  KruskalMST(G){//求连通网G的一棵MST

  T=(V¢); //初始化T是只含n个顶点不包含边的森林

  依权值的递增序对E(G)中的边排序并设结果在E[e]中

  for(i=;i

  取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算法构造最小生成树的过程

  用Kruskal算法构造最小生成树的过程【 参见动画演示 】

  

  (5)算法分析

  该算法的时间复杂度为O(elge)。

  Kruskal算法的时间主要取决于边数。它较适合于稀疏图。

转载自: http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/gailun/gailun1.1.1b.htm

你可能感兴趣的:(数据结构和算法)