文章目录
- 最小生成树(MST)
- 定义
- 构造最小生成树
- Prim算法
- Kruskal算法
最小生成树(MST)
连通图的生成树包含图的所有顶点,并且只含有尽可能少的边。对于生成树来说,若砍去它的一条边,则会使生成树变成非连通图;若给它增加一条边,则会形成图中的一条回路。
例如:
它的生成树可以是:
也可以是
定义
对于一个带权连通无向图G来说,生成树不同,每棵树的权(树中所有边上的权值之和)也不同。权值之和最小的那棵生成树称为G的最小生成树(Minimum-Spanning-Tree,MST)。
例如,上文中,G1是G的最小生成树。
不难看出,最小生成树具有以下性质:
- 若图G中存在权值相同的边,则G的最小生成树可能不唯一。当图G中的各边权值互不相等时,最小生成树是唯一的。
- 若无向连通图G的边数比定点数少1,则G的最小生成树就是它本身。
- 虽然图G最小生成树可能不唯一,但权值之和总是唯一的,而且是最小的。
- 最小生成树的边数为顶点树减1
构造最小生成树
构造最小生成树的方法有很多,但大多都使用了贪心思维,其中最典型的就是Prim算法和Kruskal算法。
(由于考研对这部分代码的要求并不高,因此实现代码略过)
Prim算法
Prim算法的核心是选择与已构造的生成树连接的权值最小、未被选择过的且另一端结点不在生成树内的边加入到已构造的生成树中。
例如:
假设我们以1为起点进行构造。
那么我们将1作为已构造的最小生成树。
第一次:选择与1连接的最小的边,有1–2
第二次,选择与{1,2}连接的最小的边,有2–4
第三次,选择与{1,2,4}连接的最小的边,有4–7
第四次,选择与{1,2,4,7}连接的最小的边,有7–6
第五次,选择与{1,2,4,7,6}连接的最小的边,有6–3
第六次,选择与{1,2,4,7,6,3}连接的最小的边,有4–5
第七次,选择与{1,2,4,7,6,3,5}连接的最小的边,有5–8
所以根据Prim算法得到的最小生成树为:
Kruskal算法
Kruskal算法的核心是每次选择权值最小的、未被选择过的且两端结点属于两个不同的集合的边。
例如:
第一次:选择权值最小的、未被选择的且两端属于不同集合的边,有5–8
第二次,选择权值最小的、未被选择的且两端属于不同集合的边,有2–4
第三次,选择权值最小的、未被选择的且两端属于不同集合的边,有3–6
第四次,选择权值最小的、未被选择的且两端属于不同集合的边,有,4–7
第五次,选择权值最小的、未被选择的且两端属于不同集合的边,有7–6
第六次,选择权值最小的、未被选择的且两端属于不同集合的边,有1–2
第七次,选择权值最小的、未被选择的且两端属于不同集合的边,有4–5
所以根据Prim算法得到的最小生成树为:
全篇结束,感谢阅读!