避圈法求最小生成樹例題

避圈法(BFS)是一種常見的求解最小生成樹的方法,它通常用於解決加權無向圖的最小生成樹問題。下面是一個使用避圈法求解最小生成樹的Python代碼示例:

import sys
from heapq import heappop, heappush

def bfs_mst(graph):
    # 初始化佇列和最小權重為無窮大
    queue = []
    for node in graph:
        queue.append((node, float('inf')))
    queue.sort()

    # 初始化最小生成樹為空
    mst = []

    while queue:
        # 獲取當前最小權重和對應的節點
        node, weight = heappop(queue)
        mst.append(node)

        # 將與當前節點相鄰的節點加入佇列,並更新它們的權重
        for neighbor, weight_to_neighbor in graph[node]:
            if weight + weight_to_neighbor < weight_to_neighbor:
                weight_to_neighbor = weight + weight_to_neighbor
                heappush(queue, (neighbor, weight_to_neighbor))

    return mst

# 測試數據示例
graph = {
    'A': [(1, 1), (2, 2)],
    'B': [(3, 3)],
    'C': [(4, 4), (5, 5)],
    'D': [(6, 6)]
}
mst = bfs_mst(graph)
print("最小生成樹為:", mst)

這個代碼示例中,我們首先將每個節點和與它相鄰的節點及其對應的權重加入佇列中,並按照權重從小到大排序。然後,我們不斷從佇列中取出當前最小的節點,並將其相鄰的節點加入佇列中,並更新它們的權重。如果新加入的節點的權重比原來已知的最小權重還小,我們就更新最小權重,並將新節點加入最小生成樹中。最後,返回最小生成樹的所有節點。在這個示例中,我們使用了一個簡單的鄰接表來表示圖,其中每個節點表示為一個鍵,每個鍵對應的值是一個列表,表示與該節點相鄰的節點及其對應的權重。你可以根據實際需要修改代碼來適應不同的數據結構和算法實現方式。