📜  离散数学-生成树

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

Kruskal添加顶点边Kruskal添加顶点边缘1Kruskal添加顶点边缘2

由于在上图中获得了所有5条边,因此我们停止了算法,这是最小的生成树,其总权重为$(1 + 2 + 3 + 5 + 9)= 20 $。

普里姆算法

Prim的算法是由数学家Vojtech Jarnik和Robert C. Prim于1930年发现的,是一种贪婪算法,可以为连接的加权图找到最小的生成树。它找到该图的一棵树,其中包括每个顶点,并且树中所有边的总权重小于或等于每个可能的生成树。 Prim的算法在密集图上更快。

算法

  • 用一个顶点初始化最小生成树,该顶点是从图中随机选择的。

  • 重复步骤3和4,直到所有顶点都包含在树中。

  • 选择连接树和树中尚未存在的顶点的边,以使边的权重最小,并且不包含边不会形成循环。

  • 添加选定的边和连接到树的顶点。

问题

假设我们要使用Prim算法找到下图G的最小生成树。

原始

在这里,我们从顶点“ a”开始并继续。

prim'Vertex添加了添加了prim'Vertex c b添加了prim'Vertex d e添加了prim'Vertex f

这是最小的生成树,其总权重为$(1 + 2 + 3 + 5 + 9)= 20 $。