離散數學 - 生成樹



連通無向圖 $G$ 的生成樹是指包含 $G$ 中所有頂點的最小連通子圖。一個圖可能有多個生成樹。

示例

Graph in Span Spanning Tree

最小生成樹

對於一個加權的、連通的、無向圖 $G$,如果一個生成樹的權重小於或等於該圖所有可能的生成樹的權重,則稱之為最小生成樹 (MST)。生成樹的權重是指生成樹中所有邊的權重之和。

示例

Minimum Spanning Tree

克魯斯卡爾演算法

克魯斯卡爾演算法是一種貪心演算法,用於尋找連通加權圖的最小生成樹。它找到該圖中包含每個頂點的樹,並且樹中所有邊的總權重小於或等於所有可能的生成樹。

演算法

步驟 1 - 將給定圖 $G (V,E)$ 的所有邊按其邊權重升序排列。

步驟 2 - 從圖中選擇權重最小的邊,並檢查它是否與迄今為止形成的生成樹構成環。

步驟 3 - 如果沒有環,則將此邊包含到生成樹中,否則丟棄它。

步驟 4 - 重複步驟 2 和步驟 3,直到生成樹中剩下 $(V-1)$ 條邊。

問題

假設我們想使用克魯斯卡爾演算法為以下圖 G 找到最小生成樹。

Kruskal Problem

解決方案

根據上圖,我們構建以下表格 -

邊號 頂點對 邊權重
E1 (a, b) 20
E2 (a, c) 9
E3 (a, d) 13
E4 (b, c) 1
E5 (b, e) 4
E6 (b, f) 5
E7 (c, d) 2
E8 (d, e) 3
E9 (d, f) 14

現在我們將表格根據邊權重升序重新排列 -

邊號 頂點對 邊權重
E4 (b, c) 1
E7 (c, d) 2
E8 (d, e) 3
E5 (b, e) 4
E6 (b, f) 5
E2 (a, c) 9
E3 (a, d) 13
E9 (d, f) 14
E1 (a, b) 20
Kruskal Adding Vertex Edge Kruskal Adding Vertex Edge 1 Kruskal Adding Vertex Edge 2

由於我們在上圖中得到了所有 5 條邊,因此我們停止演算法,這就是最小生成樹,其總權重為 $(1 + 2 + 3 + 5 + 9) = 20$。

普里姆演算法

普里姆演算法由數學家沃伊捷赫·亞爾尼克和羅伯特·C·普里姆於 1930 年發現,是一種貪心演算法,用於尋找連通加權圖的最小生成樹。它找到該圖中包含每個頂點的樹,並且樹中所有邊的總權重小於或等於所有可能的生成樹。普里姆演算法在稠密圖上速度更快。

演算法

  • 用從圖中隨機選擇的單個頂點初始化最小生成樹。

  • 重複步驟 3 和 4,直到所有頂點都被包含在樹中。

  • 選擇一條連線樹與尚未在樹中的頂點的邊,使得邊的權重最小,並且邊的包含不會形成環。

  • 將所選邊及其連線到的頂點新增到樹中。

問題

假設我們想使用普里姆演算法為以下圖 G 找到最小生成樹。

Prim

解決方案

這裡我們從頂點 'a' 開始並繼續。

prim' Vertex a added prim' Vertex c b added prim' Vertex d e added prim' Vertex f added

這是最小生成樹,其總權重為 $(1 + 2 + 3 + 5 + 9) = 20$。

廣告

© . All rights reserved.