最小 & 次小生成树浅谈
约定:以下用 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/
转载是允许的,但是除了博主同意的情况下,必须在文章的明显区域说明出处,否则将会追究其法律责任。