约定:以下用 MST 表示最小生成树,SeMST 表示次小生成树。
一、MST
MST 有两种较常用的算法,分别是 Kruskal 算法和 Prim 算法。由于一些原因,这里只介绍 Kruskal 算法。
Kruskal 算法是一个贪心算法。它的根本是,要求生成树边权和最小,就尝试让每一条边都最小。
它的核心思路是:先把边按边权升序排序。然后从小到大枚举边。定义一个边集,判断将当前边加入该集合后是否会出现一个环。如果是,就不加入。否则就将这条边加入 MST 和边集中。如果到了某个时刻 MST 的边数到达了 ((n-1)), 则退出枚举。
排序的复杂度为 (O(mlog m)), 之后的枚举中,需要循环 (O(m)) 次,在循环中需要维护一个集合。可以发现,这个集合可以使用并查集实现,单次查找或插入的复杂度为 (O(alpha(n))=O(1)).
综上,Kruskal 算法的时间复杂度为排序的 (O(mlog m)).
二、SeMST
咕了啊,这里发个链接吧,讲得特别好!我就是看这个题解才看懂的!
https://www.acwing.com/solution/content/2884/