(圖論)最小生成樹

問題描述

在 n 個城市之間鋪設光纜,以保證這n個城市中的任意兩個城市之間都可以通信。由於鋪設光纜的價格很高,且各個城市之間的距離不同,這就使得在各個城市之間鋪設光纜的價格不同。那麼如何選擇鋪設線路的方案,才能使費用最低呢?
該問題就涉及到有權圖的最小生成樹問題。

基本概念

連通圖:在無向圖中,若任意兩個頂點之間都有路徑相通,則稱該圖爲連通圖。
強聯通圖:在有向圖中,若任意兩個頂點之間都有路徑相通,則稱該圖爲強連通圖。
連通網:在連通圖中,若圖的邊具有一定的意義,每一條邊都對應着一個數,稱爲權;權代表着連接這兩個頂點的代價,稱這種連通圖爲連通網。
最小生成樹:在連通網的所有生成樹中,所有邊的代價和最小的生成樹,稱爲最小生成樹。

普利姆算法——Prim算法

是加權連通圖裏生成最小生成樹的一種算法。

算法流程

  1. 對於一個加權聯通圖,其頂點集合爲V,邊集合爲E。從集合V中任選一個頂點作爲初始頂點,將該頂點標爲已處理。
  2. 已處理的所有頂點可以看成是一個集合U,計算所有與集合U中相鄰的頂點的距離,選擇距離最短的頂點,將其標記爲已處理,並記錄最短距離的邊。
  3. 不斷計算已處理的頂點集合U和未處理的頂點的距離,每次選出距離最短的頂點標爲已處理,同時記錄最短距離的邊,直至所有頂點都處理完。
  4. 最終,所有記錄的最短距離的邊構成的樹,即爲最小生成樹。

圖解算法

性能分析

使用鄰接矩陣來保存圖的話,時間複雜度是O(n2)O(n^2)

克魯斯卡算法——Kruskal算法

算法流程:

  1. 把圖中的所有邊按代價從小到大排序。
  2. 把圖中的n個頂點看成是獨立的n棵樹組成的森林。
  3. 按照權值從大到小選擇邊,所選的邊連接的兩個頂點 uiu_iviv_iuiu_iviv_i應該屬於兩棵不同的樹,則成爲最小生成樹的一條邊,並將這兩棵樹合併爲一棵樹。
  4. 重複步驟3,直到所有的頂點都在一棵樹內或者有n-1條邊爲止。

圖解算法

性能分析

Kruskal算法需要先對所有邊按照權值進行排序,這個操作的時間複雜度爲 O(nlogn)O(nlogn),其中n爲無向連通圖邊的數目。之後就是遍歷排序後的所有邊,並判斷邊所連接的兩個頂點是否屬於同一棵樹,如果不是,就進行合併,所以總體的時間複雜度爲O(nlogn)O(nlogn)

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