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