---
# System prepended metadata

title: Kruskal 演算法證明：為什麼產生的生成樹是最小花費？

---

# 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}
