普里姆算法求最小生成樹
普里姆算法是一種用於求解圖的最小生成樹的算法。它是一種貪心算法,通過不斷添加邊來構建一棵包含所有頂點的樹,同時儘可能使樹的總權重最小。
以下是普里姆算法的基本步驟:
- 初始化:選擇任意一個頂點作為生成樹的根節點,並將其加入生成樹中。
- 重複以下步驟直到生成樹中不再添加新的邊: a. 尋找當前生成樹和圖中所有未被包含的頂點之間的最小邊。 b. 如果找到了這樣的邊,將其加入生成樹中,並從圖中移除該邊。
- 返回生成的生成樹。
以下是使用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()
函式,並傳入你的圖作為參數,即可得到最小生成樹。注意,輸入圖需要是連通的,否則普里姆算法可能無法得到正確的結果。