Untitled

  1. 초기 배열 설정
  2. 시작노드 거리 0으로 설정. 시작노드 부터 탐색 시작하게 하기 위해서.
  3. (거리, 노드) 순으로 삽입, 거리 순으로 정렬 할 경우 앞에 것으로 정렬 함
  4. 큐에 데이터 하나도 없을 때 까지 반복
  5. 가장 가까운 거리와 노드 추출
  6. 동일 노드도 큐에 저장 됨
  7. 저장 거리가 더 가까우면 패스
  8. 대상 노드에서 인접한 거리와 노드 순회
  9. 현재 노드에서 인접한 노드 지나갈 때 까지의 거리 더함
  10. 배열의 저장된 거리보다 위의 가중치가 더 작으면 해당 노드의 거리 변경
  11. 배열에 저장된 거리보다 가중치가 더 작으므로 변경
  12. 다음 인접 거리를 계산하기 위해 우선 순위 큐에 삽입 (노드가 동일해도 저장)
  13. 거리 반환
import heapq
import sys

def dijkstra(start, graph):
    distances = {node: sys.maxsize for node in graph}   # 1
    distances[start] = 0    # 2
    queue = []  # 3
    heapq.heappush(queue, (distances[start], start))

    while queue:    # 4
        current_distance, node = heapq.heappop(queue)   # 5, 6, 7
        if distances[node] < current_distance:  
            continue

        for adjacency_node, distance in graph[node].items():    # 8
            weighted_distance = current_distance + distance     # 9
            if weighted_distance < distances[adjacency_node]:   # 10
                distances[adjacency_node] = weighted_distance   # 11
                heapq.heappush(queue, (weighted_distance, adjacency_node))  # 12

    return distances    # 13