[白俊1753 Python]最短経路(Gold 5,Daestra)
アルゴリズムタイプ:Dijkstra
草は参考にならずに自分で解いたのか.X
https://www.acmicpc.net/problem/1753
これはドエストラアルゴリズムを用いた典型的な問題である.
グラフリストの入力を保存します.
グラフィックは2 D配列に初期化され、最初のインデックス要素は開始ノードであり、インデックス内の要素リストにはtupleが含まれ、(ノード、ウェイトに到達)として格納されます.
グラフリストの開始ノードインデックスは、すべてのノードに対して存在する必要があります.
ノード自体が出発ノードであり、他の任意のノードへの幹線がない場合、ノードの2番目の要素リストは空のリストとして存在する必要があります.
マルチアウトレットはすべての幹線を検索するため、すべてのノードを削除します.この過程でインデックスエラーを避けるためにfor文でgraph[node]をクエリーするので、空のリストを初期化します.
すべてのノードの最短距離を求めるため,当然距離リストもすべてのノードを初期化すべきである.
それ以外は,そのままドエストラアルゴリズムを実現すればよい.
初期出発ノードの最短距離を0にリセットし、残りのリセットを最大値に更新します.
臀部に最初の出発ノードを配置し,隣接ノードを探索し続け,そのノードの最短距離を更新し続ける.
前のノードの最短距離を利用して特定のノードの最短距離を求めるため,DPの性質を持ち,基準を上向きに探索する方式もgreedyの性質を持つ.
最初の開始ノードから隣接ノードを探索するプロセスを開始し,輝度にBFSの構造を採用し,更新後の隣接ノードでは,新しい基準ノードが最短距離が最も小さいノードを選択する.
なぜなら、https://brownbears.tistory.com/554
本ブログで提供する例では、Bに先着すると、Bの最短距離は10で終了し、Cに先着すると、CからBに至る最短距離7が存在するので、Bを最短距離に更新することができる.このような状況を考慮した数です.
勉強するところ、難しいところ
これはドーエストラアルゴリズムを学習し応用できる有益な問題である.
草は参考にならずに自分で解いたのか.X
https://www.acmicpc.net/problem/1753
ソースコード(Python)
import heapq
import sys
input = sys.stdin.readline
V, E = map(int, input().split())
start = int(input())
graph = [[] for _ in range(V+1)]
# 그래프 정보 저장
for _ in range(E):
u, v, w = map(int, input().split())
graph[u].append((v, w))
# 다익스트라 알고리즘
def dijkstra(start):
distances = [float("inf")]*(V+1)
distances[start] = 0
q = []
# 힙은 새 기준이 될, 방문했던 인접 노드들 중 그 노드까지의 최단 거리가 가장 짧은 것을 먼저 방문하기 위해 씀
heapq.heappush(q, (distances[start], start))
while q:
cnt_distance, node = heapq.heappop(q)
# BFS처럼 수행하기에, 한 level에서 특정 인접 노드에 대한 정보가 중복될 수 있음
# 만약 (2, 4)가 이미 distances에 있는데, (2, 7)을 힙에서 뽑았다면,
# 최단거리인 4를 활용하는게 맞으므로 (2, 7)은 그냥 넘어간다.
if distances[node] < cnt_distance:
continue
# 인접 노드들 중에 최단거리 갱신이 되는 노드들은 갱신해주고, 갱신 안했으면
# 그냥 힙에 안넣고 넘어가면 됨. 이미 더 짧은 최단거리가 존재하고 있다는 것은
# 다른 경로로 이 노드를 방문하는 경우가 존재한다는 것이므로 그 경우에서
# 어차피 처리해줄 것이기 때문
for adjacency_node, distance in graph[node]:
cal_distance = distances[node] + distance
if cal_distance < distances[adjacency_node]:
distances[adjacency_node] = cal_distance
heapq.heappush(q, (cal_distance, adjacency_node))
return distances
result = dijkstra(start)
for i in range(1, len(result)):
print("INF" if result[i] == float("inf") else result[i])
プールの概要これは
グラフリストの入力を保存します.
グラフィックは2 D配列に初期化され、最初のインデックス要素は開始ノードであり、インデックス内の要素リストにはtupleが含まれ、(ノード、ウェイトに到達)として格納されます.
グラフリストの開始ノードインデックスは、すべてのノードに対して存在する必要があります.
ノード自体が出発ノードであり、他の任意のノードへの幹線がない場合、ノードの2番目の要素リストは空のリストとして存在する必要があります.
マルチアウトレットはすべての幹線を検索するため、すべてのノードを削除します.この過程でインデックスエラーを避けるためにfor文でgraph[node]をクエリーするので、空のリストを初期化します.
すべてのノードの最短距離を求めるため,当然距離リストもすべてのノードを初期化すべきである.
それ以外は,そのままドエストラアルゴリズムを実現すればよい.
初期出発ノードの最短距離を0にリセットし、残りのリセットを最大値に更新します.
臀部に最初の出発ノードを配置し,隣接ノードを探索し続け,そのノードの最短距離を更新し続ける.
前のノードの最短距離を利用して特定のノードの最短距離を求めるため,DPの性質を持ち,基準を上向きに探索する方式もgreedyの性質を持つ.
最初の開始ノードから隣接ノードを探索するプロセスを開始し,輝度にBFSの構造を採用し,更新後の隣接ノードでは,新しい基準ノードが最短距離が最も小さいノードを選択する.
なぜなら、https://brownbears.tistory.com/554
本ブログで提供する例では、Bに先着すると、Bの最短距離は10で終了し、Cに先着すると、CからBに至る最短距離7が存在するので、Bを最短距離に更新することができる.このような状況を考慮した数です.
これは
Reference
この問題について([白俊1753 Python]最短経路(Gold 5,Daestra)), 我々は、より多くの情報をここで見つけました https://velog.io/@ledcost/백준-1753-파이썬-최단경로-골드-5-다익스트라テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol