1. 출발점으로부터의 최단 거리를 저장할 배열 d[v]를 만들고, 출발 노드에는 0을. 나머지 노드에는 매우 큰 값인 INF를 놓는다.(보통 실무에서는 원소 타입의 최대값으로 지정)
2. 현재 노드를 나타내는 변수 A에 출발 노드의 번호를 저장.
3. A로부터 갈 수 있는 임의의 노드 B에 대해서, d[A] + Path[A][B]와 d[B]의 값을 비교.
4. 만약 d[A] + Path[A][B]가 더 작다면, d[B]를 이 값으로 갱신.
5. A의 모든 이웃노드 B에 대해서 이 작업을 수행.
6. A의 상태는 "방문 완료"로 바꾸며, 더이상 이는 사용 안한다.
7. "미방문"인 노드들중, 출발점으로부터 거리가 제일 가까운 노드를 골라서 A에 저장
8. 모든 노드가 방문 완료가 되거나, 더이상 노드를 선택할수 없을때까지 3~7의 과정을 반복
import heapq # priority queue 사용을 위한 library
# 다익스트라 알고리즘 구현
def dijkstra( graph , start ):
# 각 노드까지의 최소 거리를 저장할 딕셔너리. 초기에는 무한대 값으로 설정.
distances = {node: float('inf') for node in graph}
print(f'초기에 설정한 노드의 거리는 {distances}입니다.')
distances[start] = 0 # 출발 노드의 거리는 0으로 설정
print(f'start를 설정한 노드의 거리는 {distances}입니다.')
priority_queue = [ (0,start) ] # 우선 순위 큐 생성. 첫번째 요소로 (거리,노드)를 지정
print(f'반복을 수행하기 전의 우선순위 큐 출력: {priority_queue}\n')
while priority_queue: # 우선순위 큐가 empty될때까지 반복
# 우선 순위 큐에서 가장 작은 거리 값을 가진 노드를 꺼냄
current_dist , current_node = heapq.heappop( priority_queue )
print(f'-----> 우선순위 큐에서 pop한 데이터..... current_dist is {current_dist} , current_node is {current_node} , 거리는 {distances}')
if current_dist > distances[ current_node ]: # 현재 노드까지의 거리가 기존에 저장된 거리보다 큰 경우
continue
for neighbor , weight in graph[ current_node].items(): # 인접한 노드를 탐색
distance = current_dist + weight
if distance < distances[ neighbor]: # 새로 계산한 거리가 기존보다 가까운 경우
distances[neighbor] = distance # 갱신
heapq.heappush( priority_queue , ( distance , neighbor )) # 갱신된 거리를 우선 순위 큐에 넣어줌
print(f'----------------> 거리는 {distances} ----> queue : {priority_queue}\n')
return distances