普里姆算法求最小生成樹

普里姆算法是一種用於求解圖的最小生成樹的算法。它是一種貪心算法,通過不斷添加邊來構建一棵包含所有頂點的樹,同時儘可能使樹的總權重最小。

以下是普里姆算法的基本步驟:

  1. 初始化:選擇任意一個頂點作為生成樹的根節點,並將其加入生成樹中。
  2. 重複以下步驟直到生成樹中不再添加新的邊: a. 尋找當前生成樹和圖中所有未被包含的頂點之間的最小邊。 b. 如果找到了這樣的邊,將其加入生成樹中,並從圖中移除該邊。
  3. 返回生成的生成樹。

以下是使用Python實現普里姆算法的示例代碼:

import sys  # 導入系統模組

def prim(graph):
    num_vertices = len(graph)  # 獲取圖中的頂點數
    selected_vertices = [0]  # 初始化已選擇的頂點列表
    selected_edges = []  # 初始化已選擇的邊列表
    total_weight = 0  # 初始化總權重

    for _ in range(num_vertices):  # 循環直到所有頂點都被包含在生成樹中
        min_weight = sys.maxsize  # 初始化最小權重為無窮大
        x = None  # 初始化當前頂點
        y = None  # 初始化當前邊的另一個頂點

        for v in range(num_vertices):  # 遍歷所有未選擇的頂點
            if v not in selected_vertices:  # 如果當前頂點未被選擇
                weight = graph[v][0]  # 獲取當前頂點到已選擇頂點的權重
                if weight < min_weight:  # 如果找到更小的權重邊
                    min_weight = weight  # 更新最小權重
                    x = v  # 更新當前頂點和邊的另一個頂點
                    y = selected_vertices[-1]  # 更新邊的另一個頂點是已選擇的頂點列表的最後一個元素(最後一個頂點)
        if min_weight == sys.maxsize:  # 如果沒有找到有效的邊(最小權重大於無窮大)
            break  # 則結束算法,不選擇新的邊,結束循環
        else:  # 選擇有效的邊
            selected_edges.append((x, y))  # 將找到的邊添加到已選擇的邊列表中
            total_weight += min_weight  # 將邊的權重添加到總權重中
            selected_vertices.append(y)  # 將找到的頂點添加到已選擇的頂點列表中
    return selected_edges, total_weight / num_vertices  # 返回已選擇的邊和生成樹的總權重(與頂點數相等)

使用該算法時,你需要提供一個鄰接矩陣或鄰接表表示的圖作為輸入。然後調用prim()函式,並傳入你的圖作為參數,即可得到最小生成樹。注意,輸入圖需要是連通的,否則普里姆算法可能無法得到正確的結果。