約定:以下用 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