最小生成树(Kruskal算法和Prim算法)

关于图的几个概念定义:

  • 连通图:在无向图中,若任意两个顶点vivj都有路径相通,则称该无向图为连通图。
  • 强连通图:在有向图中,若任意两个顶点都有路径相通,则称该有向图为强连通图。
  • 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。
  • 生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
  • 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。

(一)Kruskal算法

1.介绍

此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

  1. 初始化并查集。father[x]=x,
  2. tot=0
  3. 将所有边用快排从小到大排序。
  4. 计数器 k=0;
  5. for (i=1; i<=M; i++)      //循环所有已从小到大排序的边
    • if 这是一条u,v不属于同一集合的边(u,v)(因为已经排序,所以必为最小),
      •      ①合并u,v所在的集合,相当于把边(u,v)加入最小生成树。
      •      ②tot=tot+W(u,v)
      •         ③k++
      •         ④如果k=n-1,说明最小生成树已经生成,则break;
  6. 结束,tot即为最小生成树的总权值之和。

2.算法分析

假若以“堆”结构来存放边进行堆排序,对于包含 e 条边的网,上述算法排序的时间复杂度为 O(e㏒2e)。只要采取合适的数据结构,算法的时间复杂度为 O(e㏒2e)。与普里姆算法相比,该算法更适合于求稀疏图的最小生成树。

(二)Prim算法

1.算法介绍

此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。

  1. 初始化:min[v]= ∞(v≠1); min[1]=0;MST=0;
  2. for (i = 1; i<= n; i++)
    • (1)寻找min[u]最小的蓝点u。
    • (2)将u标记为白点
    • (3)MST+=min[u]
    • (4)for 与白点u相连的所有蓝点v  
      • if (w[u][v]<min[v])
      •  min[v]=w[u][v];
  3. 算法结束: MST即为最小生成树的权值之和

2.算法分析

该算法时间复杂度为 O(n2),与图结构的边数无关,适合稠密图。(n是点的数量)

 

posted @ 2023-03-30 10:19  ImreW  阅读(31)  评论(0编辑  收藏  举报