演算法專題——最小生成樹
阿新 • • 發佈:2021-08-10
最小生成樹
最小生成樹的概念
prim演算法以及kruskal演算法,原生問題中是求解將n個節點連線並花費最小而形成的樹的演算法。還可以求解最大的邊權最小的問題。
相關題目後續補充
求最小生成樹的演算法
Prim演算法
總是連結離中心最近的一個節點到樹中。
O(n ^ 2)
原理解釋:
-
反證法:將當前與外界直接相連的權值最小的一條邊不併入樹中,而是通過其他點將兩個連通塊連線構成了一棵樹。在樹構成完成之後,將該邊併入樹中,根據樹的性質可以得到一個環,由於一開始兩個連通塊並不連通,一定是通過一條比該邊權值更大的邊進行連通的,所以該環一定會出現比該邊權值更大的邊,於是可以將環中權值最大的邊去掉,仍然可以得到一棵樹並且整棵樹權值不會減小,於是得證該邊一定可以併入該最小生成樹中。
-
連通性:將樹與外界分開,將外界所有節點視為已經連通的連通塊,如果最後要構成一棵樹的話,顯然需要一條邊將“樹”和“外界”進行連通。那麼最優解顯然就是權值最小的那一條邊。
kruskal演算法
類似於Bellman-Ford演算法,去中心化,最終得到一棵樹。直接儲存邊的結構體實現。
O(ElogE)
,如果不用排序可以優化到O(E)
原理解釋:
- 反證法:和prim演算法的證明差不多,大致環節就是,如果不加該邊→成樹→加上該邊得到環→替換掉一條權值更大的邊→更優解→該邊可以出現在最後的最小生成樹中。
- 最優解:總是將權值最小的邊併入樹中,如果成環了,那麼由於已經併入的都是比該邊權值更小的邊,所以環上一定不存在可替換的邊,將該邊捨去,如果不會成環,那就將其視為可以作為最小生成樹的一條邊。
特點:
計算中的任意過程拿出來都是正確的,可以中途結束,同樣可以中途開始。是一個逐漸連線各個連通塊,逐漸減少連通塊個數的方法,因此可以可以求解類似最小生成森林的問題。
關鍵詞:連通塊,最小邊。
拓展應用
- 虛擬原點:可以完成點權轉換為邊權,將一些特殊的東西一般化。
- 最小邊:Kurskal演算法的靈活應用需要關注演算法過程中的連通塊和最小邊,這是一個很重要的性質。
- 次小生成樹:最小生成樹的一類問題,最小生成樹的鄰集。
次小生成樹
定義:第二小的生成樹,不嚴格的話可以等於最小生成樹,嚴格的話一定小於最小生成樹。
求解方法:
- 先求最小生成樹,列舉刪去最小生成樹中的邊求解。
O(mlogm + m)
- 先求最小生成樹,列舉非樹邊,將該邊加入樹中,替換掉環上剛好比該邊小(根據性質,一定是環上權值最大)的一條邊。
O(m + n^2 + mlogm)
,如果使用LCA倍增優化,可以達到O(mlogm)