📅  最后修改于: 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 。