Primアルゴリズムは、重み付きグラフにおける最小全域木(MST: Minimum Spanning Tree)を求めるための効率的なアルゴリズムです。最小全域木とは、グラフ内のすべての頂点を含む部分グラフで、辺の総重みが最小になるものです。このアルゴリズムは、ネットワーク設計やクラスター分析など、さまざまな応用があります。
Primアルゴリズムは、以下の手順で最小全域木を構築します。
以下に、PrimアルゴリズムのPythonによる実装を示します。
import heapq
def prim(graph, start):
mst = [] # 最小全域木を格納するリスト
visited = set() # 訪問済みのノードを保持するセット
min_heap = [(0, start)] # (重み, 頂点)のタプルを保持する最小ヒープ
while min_heap:
weight, current_vertex = heapq.heappop(min_heap) # 最小重みの辺を取り出す
if current_vertex in visited:
continue # 既に訪問済みの頂点はスキップ
visited.add(current_vertex) # 現在の頂点を訪問済みにする
mst.append((weight, current_vertex)) # 最小全域木に追加
for neighbor, edge_weight in graph[current_vertex]: # 隣接する頂点を確認
if neighbor not in visited:
heapq.heappush(min_heap, (edge_weight, neighbor)) # ヒープに追加
return mst
# グラフの定義(隣接リスト形式)
graph = {
'A': [('B', 1), ('C', 4)],
'B': [('A', 1), ('C', 2), ('D', 5)],
'C': [('A', 4), ('B', 2), ('D', 1)],
'D': [('B', 5), ('C', 1)],
}
# Primアルゴリズムの実行
mst_result = prim(graph, 'A')
print("最小全域木:", mst_result)
heapq
は、Pythonの優先度付きキューを実装するためのモジュールで、効率的な最小ヒープを提供します。prim
関数は、グラフと開始頂点を引数に取り、最小全域木を返します。mst
リストに最小全域木の辺を格納し、visited
セットで訪問済みのノードを管理します。min_heap
には、初期ノードを重み0で追加します。Primアルゴリズムは、以下のような用途に利用されます:
このように、Primアルゴリズムは多くの実世界の問題に適用可能で、効率的に最小全域木を求める手段として重要です。