ダイクストラのアルゴリズムを優先度キューを使用して実装する方法


以下に、優先度キューを使用してダイクストラのアルゴリズムを実装するシンプルで簡単な方法を示します。

  1. グラフの初期化: 最短距離を保持する配列(distance)を作成し、全ての頂点の最短距離を無限大(または十分に大きな値)で初期化します。また、優先度キュー(priority queue)を作成し、出発点の最短距離を0として追加します。

  2. 優先度キューの利用: 優先度キューから最小の距離を持つ頂点を取り出し、その頂点に隣接する頂点の最短距離を更新します。具体的には、取り出した頂点をcurrent_vertexとし、current_vertexからの辺をたどりながら、頂点vに到達する最短距離が更新可能であれば、distance[v]を更新し、vを優先度キューに追加します。

  3. 2の手順を優先度キューが空になるまで繰り返します。最終的に、distance配列には各頂点までの最短距離が格納されます。

以下にPythonのコード例を示します:

import heapq
def dijkstra(graph, start):
    distance = [float('inf')] * len(graph)
    distance[start] = 0
    pq = [(0, start)] # (距離, 頂点)のタプルを要素とする優先度キュー
    heapq.heapify(pq)
    while pq:
        dist, vertex = heapq.heappop(pq)
        if dist > distance[vertex]:
            continue
        for neighbor, weight in graph[vertex]:
            new_dist = dist + weight
            if new_dist < distance[neighbor]:
                distance[neighbor] = new_dist
                heapq.heappush(pq, (new_dist, neighbor))
    return distance

上記のコードでは、graphは隣接リスト形式で表されたグラフを表します。各頂点には隣接する頂点とその辺の重みがリストとして格納されています。

この方法を使用することで、優先度キューを活用した効率的なダイクストラのアルゴリズムを実装することができます。