最小生成樹
最小生成樹的產生:希望在城市間建設基礎設施,連通所有城市,不考慮容錯性,如果花費最低成本實現?
最小生成子樹:原圖選出這樣的邊,讓所有頂點連通,邊權重和最低。(生成子圖不需要後兩個條件)
Kruskal算法
Kruskal算法的產生:從定義出發,選擇邊,讓其涵蓋所有頂點。邊的選擇使用貪心思想,限制是輻射生長的樹。假設圖包含 個頂點。
- 第 邊,先選擇最小權重的一條邊,記錄下已連通的 個頂點。
- 第 邊,然後選擇下一條最小權重的邊,該邊不能連接已連通的頂點(否則形成環,多餘的邊被加入,如下圖1.1所示)。記錄下已連通的 個頂點
- 第 邊,繼續選擇下一條最小權重的邊,該邊不能連接已連通的頂點,此時已連通全部 個頂點,結束。
動態效果圖:
Prim算法
Prim算法的產生:類似路由選擇下一跳的過程。下一跳選擇使用貪心思想,類似Kruskal的輻射。
- 先隨機選中一個頂點,選擇下一跳頂點,跳躍邊權重最小。
- 此時圖已包含了兩個頂點,觀察兩個頂點的所有下一跳頂點,繼續選擇該下一跳權重最小的頂點,且該頂點還沒連通上。
- 此時圖已包含了三個頂點,觀察三個頂點的所有下一跳頂點,繼續選擇該下一跳權重最小的頂點,且該頂點還沒連通上。
- 。。。
- 此時圖已包含了 個頂點,觀察 個頂點的所有下一跳頂點,繼續選擇該下一跳權重最小的頂點,且該頂點還沒連通上,也就是最後一個頂點。
- 此時圖已包含了 個頂點,結束。
數據結構:集合動態記錄已連通的節點。鄰接信息(表/矩陣)。
動態效果圖: