[白俊1753 Python]最短経路(Gold 5,Daestra)


アルゴリズムタイプ:Dijkstra
草は参考にならずに自分で解いたのか.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を最短距離に更新することができる.このような状況を考慮した数です.
  • 勉強するところ、難しいところ
    これは
  • ドーエストラアルゴリズムを学習し応用できる有益な問題である.