一、相關概念
- 連通圖:圖中的任意兩個節點之間都是聯通的,即:總能從A節點按照一定路徑走到B節點。
- 生成樹:爲聯通圖的一個聯通子圖,包含N個結點和N-1條邊。
- 最小生成樹:當聯通圖中的每條邊帶有權值時,所有邊權值和最小的生成樹。
二、問題導向
各個城市之間修建鐵路,城市之間鋪設電纜、水管等,不考慮環境等複雜因素,肯定最小生成樹對應的權值(對應管線、鐵路等長度)和最小怎樣才能成本最低。因此如何鋪設的問題轉化成了找到這個最小生成樹的問題。如下圖(A~F表示城市,線上的數字表示距離):
三、相關算法
注:正常情況下沒有辦法一眼看出來該如何選擇的,如果更復雜一點的話就更難用眼睛看出來的了,因此面對該問題需要有響應的算法來解決。聽着很高端、實際實現的代碼邏輯很複雜,但是懂了思想理解起來很容易。
最終目的: 找到我們想要的N-1條線。
Prim算法:
通俗理解:
- 任意選擇一個結點開始(從此已有結點多了一個0到1)
- 從已有的結點中,找與已有結點和剩下的結點連線權限最小的那個
- 迭代重複第二步,直到所有結點都被連接。此時剛哈N-1條邊。
舉例: 假設以A爲第一個點,我們依次被連接的頂點順序爲:A->F->E->D->C->B,邊被選擇的順序爲:4、2、3、4、3。步驟爲紅色12345的順序。
Kruskal算法:
通俗理解:
- 從所有的邊中找最短的邊
- 保證,所有的邊連起來不能構成環路,如果構成環路則選擇次小的邊、或者次次小的邊,
- 按照第二部的要求,重複第一步的過程,直到所有的結點被連接。
舉例: 依次被選擇的邊:2(EF)->3(D)->3(BC)->4(A)->4。步驟爲紅色12345的順序。
Email : [email protected]
Website : http://beyonderwei.com
WeChat: