코드 14-3
def dijkstra(self, s):
distance = [self.BIG_NUMBER for _ in range(self.vertex_num)] ➊
p = [None for _ in range(self.vertex_num)] ➋
S = set() ➌
pq = MinPriorityQueue()
for i in range(self.vertex_num):
pq.push((self.BIG_NUMBER, i))➍
distance[s] = 0
pq.push((0, s))
while len(S) < self.vertex_num:
d, v = pq.pop()
if distance[v] != d:➎
continue
S.add(v)
adj_v = self.adjacent_set(v)
for u, w_u_v in adj_v:
if u not in S and distance[u] > distance[v]+w_u_v:
distance[u] = distance[v] + w_u_v
p[u] = v
pq.push((distance[u], u))
sp = ShortestPath(s, distance, p)
return sp
def adjacent_set(self, v):
adj_v = []
for i in range(self.vertex_num):
w = self.adj_matrix[v][i]
if w:
adj_v.append((i, w))
return adj_v
➊ 출발 정점에서 S에 있는 정점만 거쳐 v에 도달하는 경로 길이
➋ predecessor distance[v]를 구할 때 경로상에서 v의 바로 이전 노드
➌ 최단 경로가 발견된 정점 집합
➍ push((distance, v))
➎ relaxation 이전 요소는 무시합니다.