# Kruskal 演算法證明:為什麼產生的生成樹是最小花費?
## 目標
我們要證明:
1. Kruskal 演算法一定會產生一棵生成樹。
2. 這棵生成樹的花費是最少的。
---
## 記號說明
- **T**:Kruskal 演算法產生的生成樹。
- **U**:假設的一棵最小花費的生成樹。
- **e**:T 中的某一條邊,但不在 U 中。
- **f**:U 中的某一條邊,但不在 T 中。
---
## 目標 1:Kruskal 演算法會產生一棵生成樹
1. Kruskal 演算法的過程是選擇圖中不會形成迴路的邊,從最小權重開始,直到選出 n-1 條邊為止(n 是節點的數量)。
2. 如果 G 是一個連通圖,演算法一定能選出一個連通的邊集合,並在選滿 n-1 條邊後停止。
3. 因此,Kruskal 演算法一定會產生一棵生成樹。
---
## 目標 2:Kruskal 演算法產生的生成樹是最小花費
### 證明思路
1. 假設 T 是 Kruskal 演算法生成的生成樹,U 是假設的最小花費生成樹。
2. 假設 T 和 U 不相同,我們可以通過轉換 U 使其逐步變成 T,並保持轉換過程中的花費不變。
3. 最後證明 T 的花費和 U 一樣,這樣就證明了 T 也是最小花費的生成樹。
---
### 具體步驟
1. **初始狀態**:
- T 是 Kruskal 演算法生成的生成樹。
- U 是我們假設的最小花費生成樹。
- T 和 U 之間有 k 條不同的邊(即 T 中有 k 條邊不在 U 中,U 中有 k 條邊不在 T 中)。
2. **選擇邊**:
- 從 T 中選一條不在 U 中的邊 e,將它加入 U 中。
- 加入 e 後,U 會形成一個唯一的迴路。
3. **解決迴路**:
- 在這個迴路中選一條不在 T 中的邊 f,從 U 中移除,這樣 U 又回到生成樹的狀態。
- 此時,U 中不在 T 中的邊數減少一條。
4. **重複步驟**:
- 重複上述操作,直到 U 完全變成 T。
---
### 為什麼花費不會變?
- **情況 1**:如果 e 的花費比 f 小,那麼 U 的花費會變小,這與 U 是最小花費的假設矛盾。
- **情況 2**:如果 e 的花費比 f 大,那麼在 Kruskal 演算法中,f 早就應該被選擇,而不是 e,這也導致矛盾。
- **唯一可能**:e 和 f 的花費相同,因此 U 的花費不變。
經過 k 次這樣的交換操作後,U 會變成 T,並且 U 的花費保持不變。這證明了 T 的花費和 U 相同,證明了 T 是最小花費的生成樹。
---
### 圖示化過程
假設初始的生成樹 T 和 U 如下:
```plaintext
T 的邊集合:{a, b, c}
U 的邊集合:{d, b, c}