📅  最后修改于: 2021-01-08 06:12:21             🧑  作者: Mango
连接的无向图$ G $的生成树是最小包含$ G $的所有顶点的树。图可能有许多生成树。
分配的权重小于或等于加权,连通和无向图$ G $的每个可能的生成树的权重的生成树,称为最小生成树(MST)。生成树的权重是分配给生成树每个边缘的所有权重的总和。
Kruskal算法是一种贪婪算法,可为连接的加权图找到最小生成树。它找到该图的一棵树,其中包括每个顶点,并且树中所有边的总权重小于或等于每个可能的生成树。
步骤1-按照其边缘权重,按升序排列给定图$ G(V,E)$的所有边缘。
步骤2-从图中选择最小的加权边,并检查它是否形成了迄今为止形成的生成树的循环。
步骤3-如果没有循环,则将此边缘包括在生成树中,否则将其丢弃。
步骤4-重复步骤2和步骤3,直到生成树中剩下$(V-1)$个边。
问题
假设我们要使用Kruskal算法为以下图G找到最小生成树。
解
从上图我们构建下表-
Edge No. | Vertex Pair | Edge Weight |
---|---|---|
E1 | (a, b) | 20 |
E2 | (a, c) | 9 |
E3 | (a, d) | 13 |
E4 | (b, c) | 1 |
E5 | (b, e) | 4 |
E6 | (b, f) | 5 |
E7 | (c, d) | 2 |
E8 | (d, e) | 3 |
E9 | (d, f) | 14 |
现在我们将相对于Edge权重按升序重新排列表-
Edge No. | Vertex Pair | Edge Weight |
---|---|---|
E4 | (b, c) | 1 |
E7 | (c, d) | 2 |
E8 | (d, e) | 3 |
E5 | (b, e) | 4 |
E6 | (b, f) | 5 |
E2 | (a, c) | 9 |
E3 | (a, d) | 13 |
E9 | (d, f) | 14 |
E1 | (a, b) | 20 |
由于在上图中获得了所有5条边,因此我们停止了算法,这是最小的生成树,其总权重为$(1 + 2 + 3 + 5 + 9)= 20 $。
Prim的算法是由数学家Vojtech Jarnik和Robert C. Prim于1930年发现的,是一种贪婪算法,可以为连接的加权图找到最小的生成树。它找到该图的一棵树,其中包括每个顶点,并且树中所有边的总权重小于或等于每个可能的生成树。 Prim的算法在密集图上更快。
用一个顶点初始化最小生成树,该顶点是从图中随机选择的。
重复步骤3和4,直到所有顶点都包含在树中。
选择连接树和树中尚未存在的顶点的边,以使边的权重最小,并且不包含边不会形成循环。
添加选定的边和连接到树的顶点。
问题
假设我们要使用Prim算法找到下图G的最小生成树。
解
在这里,我们从顶点“ a”开始并继续。
这是最小的生成树,其总权重为$(1 + 2 + 3 + 5 + 9)= 20 $。