1. 程式人生 > 其它 >演算法專題——最小生成樹

演算法專題——最小生成樹

最小生成樹

最小生成樹的概念

prim演算法以及kruskal演算法,原生問題中是求解將n個節點連線並花費最小而形成的樹的演算法。還可以求解最大的邊權最小的問題。

相關題目後續補充



求最小生成樹的演算法


Prim演算法

總是連結離中心最近的一個節點到樹中。

O(n ^ 2)

原理解釋:

  1. 反證法:將當前與外界直接相連的權值最小的一條邊不併入樹中,而是通過其他點將兩個連通塊連線構成了一棵樹。在樹構成完成之後,將該邊併入樹中,根據樹的性質可以得到一個環,由於一開始兩個連通塊並不連通,一定是通過一條比該邊權值更大的邊進行連通的,所以該環一定會出現比該邊權值更大的邊,於是可以將環中權值最大的邊去掉,仍然可以得到一棵樹並且整棵樹權值不會減小,於是得證該邊一定可以併入該最小生成樹中。

  2. 連通性:將樹與外界分開,將外界所有節點視為已經連通的連通塊,如果最後要構成一棵樹的話,顯然需要一條邊將“樹”和“外界”進行連通。那麼最優解顯然就是權值最小的那一條邊。


kruskal演算法

類似於Bellman-Ford演算法,去中心化,最終得到一棵樹。直接儲存邊的結構體實現。

O(ElogE),如果不用排序可以優化到O(E)

原理解釋:

  1. 反證法:和prim演算法的證明差不多,大致環節就是,如果不加該邊→成樹→加上該邊得到環→替換掉一條權值更大的邊→更優解→該邊可以出現在最後的最小生成樹中。
  2. 最優解:總是將權值最小的邊併入樹中,如果成環了,那麼由於已經併入的都是比該邊權值更小的邊,所以環上一定不存在可替換的邊,將該邊捨去,如果不會成環,那就將其視為可以作為最小生成樹的一條邊。

特點:

計算中的任意過程拿出來都是正確的,可以中途結束,同樣可以中途開始。是一個逐漸連線各個連通塊,逐漸減少連通塊個數的方法,因此可以可以求解類似最小生成森林的問題。

關鍵詞:連通塊,最小邊



拓展應用

  1. 虛擬原點:可以完成點權轉換為邊權,將一些特殊的東西一般化。
  2. 最小邊:Kurskal演算法的靈活應用需要關注演算法過程中的連通塊和最小邊,這是一個很重要的性質。
  3. 次小生成樹:最小生成樹的一類問題,最小生成樹的鄰集。

次小生成樹

定義:第二小的生成樹,不嚴格的話可以等於最小生成樹,嚴格的話一定小於最小生成樹。

求解方法:

  1. 先求最小生成樹,列舉刪去最小生成樹中的邊求解。O(mlogm + m)
  2. 先求最小生成樹,列舉非樹邊,將該邊加入樹中,替換掉環上剛好比該邊小(根據性質,一定是環上權值最大)的一條邊。O(m + n^2 + mlogm),如果使用LCA倍增優化,可以達到O(mlogm)