출처 : 출처
def dijkstra(start):
minheapq=[]
heapq.heappush(minheapq, (0,start))
# w,v - 시작점으로부터 시작점 w : 0 / 시작점 노드부터 시작
answer[start] = 0
while minheapq: # 가장 w가 작은 노드부터 검사 (bfs 와 비슷 흐름)
noww, nowv = heapq.heappop(minheapq)
if answer[nowv] < noww :
# nowv의 최단거리라고 기록돼있는 것이 noww 보다 작으면 더 이상 작아질 수 없다
# (왜냐면 이제부터는 noww+알파 로 최단경로 기록되니깐)
# nowv 보다 작다는 것은 이미 이 노드는 heappop 됐었다는 증거
# (처음에 heappop 될 수록 nowc가 가장 작은 상태)
# => 이는 방문 완료, 이미 확정됐다는 증거
# 한번 방문할 때 최단 경로가 이미 기록되어있다는 뜻이므로 방문 했을 시엔 검사할 필요 x
continue
for i in graph[nowv]: # 방문 안 한 노드라면 인접 노드 체크 필요
cmpv, cmpw = i[0], i[1] # 그래프에 (v,w) 로 담았었음
tmpcost = noww + cmpw # 현재 answer[cmpv] 에 기록된 최단경로와 비교해볼 대상
if tmpcost < answer[cmpv]: # 현재 answer[cmpv] 에 기록된 최단경로보다 더 짧은 경로라면
answer[cmpv] = tmpcost # answer[cmpv] 를 비교대상으로 대체
heapq.heappush( minheapq, ( tmpcost, cmpv ) ) #
"최대의 최소화"
꼴입니다.
- 다익스트라 알고리즘은 우선순위 큐 + BFS의 형태를 가지고 있다.
- 각 정점까지의 최단 거리를 저장하는 배열 dp[]를 유지하며, 정점을 방문할 때마다 인접한 정점을 모두 검사한다.
- 간선 (u, v)를 검사한다고하면 u까지의 최단 거리에 (u, v)의 가중치를 더해 v까지의 경로의 길이를 찾는다.
- 만약 이 길이가 최단거리라면 dp[v]를 갱신하고, (v, dp[v])를 큐에 넣는다.
- 다익스트라나 벨만포드는 한 시작점에서 다른 모든 정점까지의 거리를 구해준다.
- 모든 쌍 간의 최단 거리를 구하고 싶다면 플로이드 와샬 알고리즘을 사용하면 된다.
소중한 정보 감사드립니다!