ALGORITHM
알고리즘 강의 | Do it! 알고리즘 코딩테스트 with Python - 다익스트라
진미
2024. 9. 14. 12:46
08-4 다익스트라
그래프에서 최단 거리를 구하는 알고리즘
- 출발 노드와 모든 노드 간의 최단 거리 탐색
- 에지는 모두 양수
- 다익스트라 알고리즘의 핵심이론
1. 인접 리스트로 그래프 구현하기
graph = [ [] for _ in range(n+1)]
for n1, n2, w in fares:
graph[n1].append((n2, w))
graph[n2].append((n1, w))
2. 최단 거리 배열 초기화하기
출발 노드 = 0, 이외의 노드는 = max 값 (충분히 큰 값)
D = [ 100001 for _ in range(n+1) ]
D[s] = 0
3. 값이 가장 작은 노드 고르기
처음에는 출발 노드
4. 최단 거리 배열 업데이트 하기
선택된 노드에 연결된 에지의 값을 보고 Min(선택 노드의 최단 거리 배열의 값 + 에지 가중치, 연결 노드의 최단 거리 배열의 값)
5. 모든 노드가 처리될 때까지 3~4를 반복
한 번 선택된 노드는 다시 선택되지 않도록 처리 -> visited 배열
결과적으로 나온 배열은 시작 노드에서 모든 노드(i)까지의 최단 거리를 알 수 있음
# heapq X
def dijkstrap(n, start, graph):
dist = [float('inf')] * (n + 1)
dist[start] = 0
# 방문 여부 체크
visited = [False] * (n + 1)
for _ in range(n):
# 방문하지 않은 노드 중 가장 짧은 거리를 가진 노드 선택
min_dist = float('inf')
node = -1
for i in range(1, n + 1):
if not visited[i] and dist[i] < min_dist:
min_dist = dist[i]
node = i
visited[node] = True
# 선택된 노드와 인접한 노드들의 거리 갱신
for next_node, weight in graph[node]:
if dist[next_node] > dist[node] + weight:
dist[next_node] = dist[node] + weight
return dist
# heapq 사용
import heapq
def dijkstra(n, start, graph):
dist = [float('inf')] * (n + 1)
dist[start] = 0
# 우선순위 큐 사용
queue = [(0, start)] # (거리, 노드)
while queue:
current_dist, node = heapq.heappop(queue)
# 이미 처리된 노드라면 무시
if current_dist > dist[node]:
continue
# 현재 노드에서 인접한 노드들로 가는 거리 갱신
for next_node, weight in graph[node]:
distance = current_dist + weight
if distance < dist[next_node]:
dist[next_node] = distance
heapq.heappush(queue, (distance, next_node))
return dist
반응형