📜  DAA-生成树

📅  最后修改于: 2021-01-12 03:35:42             🧑  作者: Mango


生成树是无向图的子集,该图的所有顶点都通过最小数量的边连接。

如果所有顶点都连接在一个图中,则至少存在一棵生成树。在一个图中,可能存在一个以上的生成树。

物产

  • 生成树没有任何循环。
  • 可以从任何其他顶点到达任何顶点。

在下图中,突出显示的边缘形成一棵生成树。

边缘旋转树

最小生成树

最小生成树(MST)是连接的加权无向图的边的子集,该边将所有顶点与最小可能的总边权重连接在一起。要导出MST,可以使用Prim算法或Kruskal算法。因此,我们将在本章中讨论Prim算法。

正如我们所讨论的,一个图可能有一个以上的生成树。如果有n个顶点,则生成树应具有n -1个边。在这种情况下,如果图的每个边都与一个权重相关联,并且存在一个以上的生成树,则我们需要找到图的最小生成树。

此外,如果存在任何重复的加权边,则该图可能具有多个最小生成树。

最小旋转树

在上图中,我们显示了生成树,尽管它不是最小生成树。此生成树的成本为(5 + 7 + 3 + 3 + 5 + 8 + 3 + 4)= 38。

我们将使用Prim的算法来查找最小生成树。

普里姆算法

Prim的算法是一种寻找最小生成树的贪婪方法。在此算法中,要形成MST,我们可以从任意顶点开始。

Algorithm: MST-Prim’s (G, w, r) 
for each u є G.V 
   u.key = ∞ 
   u.∏ = NIL 
r.key = 0 
Q = G.V 
while Q ≠ Ф 
   u = Extract-Min (Q) 
   for each v є G.adj[u] 
      if each v є Q and w(u, v) < v.key 
         v.∏ = u 
         v.key = w(u, v) 

函数Extract-Min以最小的边成本返回顶点。此函数适用于最小堆。

使用Prim的算法,我们可以从任何顶点开始,让我们从顶点1开始。

顶点3以最小的边成本连接到顶点1 ,因此边(1、2)被添加到生成树。

接下来,认为边缘(2、3)是边缘{(1、2),(2、3),(3、4),(3、7)}中的最小值。

在下一步中,我们以最小的成本得到边(3,4)(2,4) 。随机选择边(3,4)

以类似的方式,选择边缘(4、5),(5、7),(7、8),(6、8)(6、9) 。当所有顶点都被访问时,算法将停止。

生成树的成本为(2 + 2 + 3 + 2 + 5 + 2 + 3 + 4)=23。此图中没有其他生成树,且成本小于23

普里姆的算法