web-dev-qa-db-ja.com

最小優先度キューを持つダイクストラアルゴリズム

プライオリティキューを使用してダイクストラアルゴリズムを実装しようとしていますが、それがどのように機能するか理解できません。私はウェブで多くのガイドを読みましたが、このアルゴリズムをまったく理解できません。

私の質問は、各ノードの優先順位は何ですか?それは最小の価値を持つ着信エッジの重みだと思いますが、私にはわかりません。これは本当ですか?

2番目の質問、キューのルートを抽出するときに、訪問したノードが1つもない隣接ノードでない場合、どのように機能しますか?

15
giacomotb

priority queueを使用する必要があります。ここで、最初のvertexからの距離が最も短いvertexが最も優先されます。最初は、すべてのverticesは無限の最短距離を持ち、最初のvertexは最短距離0を持ちます。

vertices内のグラフからすべてのedges(およびPQ)を挿入することから始めます。 vertexからPQを削除し、edgesをすべて調べます。最短距離を隣接するすべてのverticesと比較し、現在のvertexの最短距離よりも短い距離がある場合は、vertex内の隣接するPQ最短距離を更新します。 PQが空でない間、続行します。 Verticesを取得しなかったedgesは、最初のvertexから「取得」できないため、無限の最短距離で終了します。ただし、PQからは削除されます。

疑似コード

initialize graph
initialize pq
pq.insertAll(graph.getVertices())

while (pq is not empty) {
  vertex = pq.remove()
  edges = vertex.getEdges()

  for all edges {
    destination = Edge.getDestination()
    newDistance = Edge.getLength() + vertex.getDistance()
    if (newDistance < destination.getDistance()) {
      destination.setShortestDistance(newDistance)
      pq.update(destination)
    }
  }
}

MIT OpenCourseWareリンク:
パスの問題の概要
ダイクストラ

18
Patrik Fuhrmann