[アルゴリズム]最短パスアルゴリズム
7097 ワード
最短パスアルゴリズムとは? 최단 경로 알고리즘
は、2つのノードを接続する最短パスを検索するアルゴリズムである.重み付けパターンでは,幹線重み付けと最小化の経路を探すことは符号化試験でよく発生する問題ではないと思うが,この点に注意すべきである.😱
エンコードテストで最も短いパスの問題のタイプ
単点出発と単点到達(単点源と単点目的地の最短経路問題)最短経路問題
単点出発(single-source and最短経路問題)最短経路問題
問題
全対(all-pair)最短パス:グラフィック内のすべてのノード対(u,v)の最短パスを検索する問題
Dijkstraアルゴリズムロジック
다익스트라(Dijkstra)
アルゴリズムは、第1の頂点に基づいて接続された頂点を追加し、最短距離を更新する方法によって、그래프 탐색
の古典的なアルゴリズム너비 우선 탐색(BFS)
と同様である.エクスポートアルゴリズムの変換ロジックはいくつかありますが、最も改善された優先度キューを使用します.
まず,マルチアウトプットアルゴリズムを記述するためのグラフィックを取得する.
ステップ1:初期化
配列が最初の頂点に対して相対することを宣言して、最初の頂点から各頂点までの距離を保存します.
ステップ2:優先順位キューから抽出した(A,0)[ノード,1番目のノードからの距離]から隣接ノードからの距離を算出する
우선순위 큐
では、第1の頂点に隣接するノードの距離を比較し、優先順位キューに配置する.第1の頂点からノードまでの距離が
すなわち、頂点以外のすべてのノードがinfであるため、第1の頂点に隣接するすべてのノードが優先キューに入り、第1の頂点に隣接するノード間の距離が配列に更新される.(ノードへのアクセスは、
너비 우선 탐색
と非常に類似しています.)ステップ3:優先キュー(C,1)[ノードと最初のノードの距離]から隣接ノードとの距離を計算する
Pythonでは
우선순위 큐
が最小ヒップ数であるため、ステップ2の表では、まず(C,1)、(D,2)、(B,8)(C,1)を抽出する.A-B最短距離が8の場合
ステップ4:優先キュー(D,2)[ノード,1番目のノードからの距離]から隣接ノードの距離を計算する
Aの隣接ノードのみにアクセスする場合、EとFの間の距離が計算される.
距離
ステップ5:優先キュー(E,5)[ノード,1番目のノードからの距離]から隣接ノードの距離を計算する
A−E距離が5の場合、Eに隣接するFの距離は1、すなわちA−E−Fは5+1=6であり、現在のアレイA−Fの最短距離は7であるため、(F,6)に更新される.
ステップ6:優先順位キューから(B、6)、(F、6)を順に抽出し、各ノードに基づく隣接ノードとの距離を算出する
例示的なグラフィックでは、Bノードは他のノードのルートノードに通じていないため、パスがあり、FノードはルートノードがAノードに通じているが、現在のA-Aは0であり、A-F-Aは6+5=11であるため、更新できない.
ステップ7:優先順位キューから(F,7)、(B,8)を順に抽出し、各ノードに基づく隣接ノードとの距離を算出する
A-Fのルートまでの距離は7ですが、配列内の現在の最短距離は6であるため、通過します.(B,8)A−B距離が6であるため、A−B距離を計算する必要もない.
マルチカーブアルゴリズムの実装
import heapq
def dijsktra(graph, start):
# 무한대로 넣음
distances = {node: float('inf') for node in graph}
# 그래프의 시작 정점 거리는 0으로 초기화
distances[start] = 0
# 모든 정점이 저장될 큐 생성
queue = []
# 그래프의 시작 정점과 거리를 최소힙에 넣음
heapq.heappush.(queue, [distances[start], start])
while queue:
current_distance, current_node = heapq.heappop(queue)
# 지금까지의 거리가 발견한 거리보다 더 작다면 다음 단계 패스
if distances[current_node] < current_distance:
continue
# 인접노드, 거리 값
for adjacent, weight in graph[current_node].items():
distance = current_distance + weight
# 최단거리를 발견했을 경우 거리를 업데이트
if distance < distances[adjacent]:
distances[adjacent] = distance
heapq.heappush(queue, [distance, adjacent])
return distance
Reference
この問題について([アルゴリズム]最短パスアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@norighthere/알고리즘-최단-경로-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol