最小 & 次小生成树浅谈

约定:以下用 MST 表示最小生成树,SeMST 表示次小生成树。


一、MST

MST 有两种较常用的算法,分别是 Kruskal 算法和 Prim 算法。由于一些原因,这里只介绍 Kruskal 算法。
Kruskal 算法是一个贪心算法。它的根本是,要求生成树边权和最小,就尝试让每一条边都最小。
它的核心思路是:先把边按边权升序排序。然后从小到大枚举边。定义一个边集,判断将当前边加入该集合后是否会出现一个环。如果是,就不加入。否则就将这条边加入 MST 和边集中。如果到了某个时刻 MST 的边数到达了 \((n-1)\), 则退出枚举。
排序的复杂度为 \(O(m\log m)\), 之后的枚举中,需要循环 \(O(m)\) 次,在循环中需要维护一个集合。可以发现,这个集合可以使用并查集实现,单次查找或插入的复杂度为 \(O(\alpha(n))=O(1)\).
综上,Kruskal 算法的时间复杂度为排序的 \(O(m\log m)\).


二、SeMST
咕了啊,这里发个链接吧,讲得特别好!我就是看这个题解才看懂的!
https://www.acwing.com/solution/content/2884/

posted @ 2020-12-19 22:07  Aehnuwx  阅读(68)  评论(0编辑  收藏  举报