最小 & 次小生成樹淺談

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章