ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【开卷数据结构 】图的应用——最短生成树 [打印本页]

作者: 道家人    时间: 2022-6-26 14:22
标题: 【开卷数据结构 】图的应用——最短生成树
目录
最小生成树
Prim算法实现最小生成树
kruskal算法实现最小生成树


最小生成树

   Q:什么是广度优先搜索
  A:一个连通图的生成树含有图中全部的顶点,并且只含尽可能少的边。若砍去它的一条边,则会使生成树变成非连通图。若给它增加一条边,则会形成图中的一条回路。
  对于一个带权连通无向图 G=(V, E) ,生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同,其中边的权值之和最小的那棵生成树(构造连通网的最小代价生成树),称为G的最小生成树。
  
  通过定义不难看出,最小生成树具有以下性质:
  
构造最小生成树 有多种算法,但大多数算法都利用了最小生成树的下列性质:假设  G=(V,E) 是一个带权连通无向图,U 是顶点集 V 的一个非空子集。若 (u,v) 是一条具有最小权值的边,其中  u∈U,v∈V−U , 则必存在一棵包含边 (u,v) 的最小生成树。
  
  下面介绍一个通用的最小生成树算法:
  1. GENERIC_MST(G){
  2.         T=NULL;
  3.         while T 未形成一棵生成树;
  4.                 do 找到一条最小代价边(u, v)并且加入T后不会产生回路;
  5.                         T=T ∪ (u, v);
  6. }
复制代码
通用算法每次加入一条边以逐渐形成一棵生成树,下面介绍两种实现上述通用算法的途径。
  
Prim算法实现最小生成树

   Q:如何通过Prim算法构建最小生成树
  A:初始时从图中任取一顶点加入树 T,此时树中只含有一个顶点。之后选择一个与当前 T 中顶点集合距离最近的顶点,并将该顶点和相应的边加入 T。每次操作后 T 中的顶点数和边数都增 1。以此类推,直至图中所有的顶点都并入 T,得到的 T 就是最小生成树。此时 T 中必然有 n-1条边。
  通俗来讲,Prim算法构建最小生成树流程如下:
  
Prim算法的简单实现如下:
  1. void Prim(G,T)
  2. {
  3.         t=NULL;                                //初始化空树
  4.         U={w};                                //添加任一结点 w
  5.         while((V-U)!=NULL)        //若树中不含全部结点
  6.         {
  7.                 设(u,v)是使 u∈U与v∈(V-U),且权值最小的边;
  8.                 T=T∪{{u,v}}        //边归入树
  9.                 U=U∪{v};                //顶点归入树
  10.         }
  11. }
复制代码
Prim 算法的时间复杂度为 O(n^2),不依赖于|E|,因此它适用于求解边稠密的图的最小生成树。
  
kruskal算法实现最小生成树

   与 Prim 算法从顶点开始扩展最小生成树不同,Kruskal 算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。
  Q:如何通过kruskal算法构建最小生成树
  A:初始时为只有 n 个顶点而无边的非连通图 T=V,每个顶点自成一个连通分量,然后按照边的权值由小到大的顺序,不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在 T 中不同的连通分量上,则将此边加入 T,否则舍弃此边而选择下一条权值最小的边。以此类推,直至 T 中所有顶点都在一个连通分量上。
  通俗来讲,kruskal算法构建最小生成树流程如下:
  
kruskal算法的简单实现如下::
  1. void Kruskal(V,T)
  2. {
  3.         T=V;                                //初始化树T,仅含顶点
  4.         numS=n                                //连通分量数
  5.         while(numS>1){                //若连通分量数大于 1
  6.                 从 E 中取出权值最小的边(v,u);
  7.                 T=T ∪{{v,u}};        //将此边加入生成树中
  8.                 numS--;                 //连通分量减 1
  9.         }
  10. }
复制代码
kruskal 算法的时间复杂度为 O(ElogE) ,因此它适用于求解边稀疏而顶点多的图的最小生成树。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4