贪心算法(2)-Kruskal最小生成树
什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起。一个图可以有许多不同的生成树。一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树其实是 最小权重生成树 的简称。生成树的权重是考虑到了生成树的每条边的权重的总和。 最小生成树有几条边? 最小生成树有(V – 1)条边,其中V是给定的图的顶点数量。 Kruskal算法 下面是步骤寻找MST使用Kruskal算法 1 1,按照所有边的权重排序(从小到大) 2 3 2,选择最小的边。检查它是否形成与当前生成树形成环。如果没有形成环,讲这条边加入生成树。否则,丢弃它。 4 5 3,重复第2步,直到有生成树(V-1)条边 步骤2使用 并查集算法 来检测环。如果不熟悉并查集建议阅读下 并查集 。 该算法是一种贪心算法。贪心的选择是选择最小的权重的边,并不会和当前的生成树形成环。让我们了解一个例子,考虑下面输入图 spanning-tree-mst 该图包含9个顶点和14个边。因此,形成最小生成树将有(9 – 1)= 8条边。 01 排序后: 02 Weight Src Dest 03 1 7 6 04 2 8 2 05 2 6 5 06 4 0 1 07 4 2 5 08 6 8 6 09 7 2 3 10 7 7 8 11 8