다익스트라(Dijkstra) 알고리즘
정점 - 다른 정점까지의 최단 경로를 구하는 알고리즘
그 과정에 모든 다른 정점까지 최단 경로를 획득
전제 : 모든 간선에 음수인 가중치(weight)가 있어서는 안된다
알고리즘
대략적인 흐름
- 출발 노드 설정
- 각 노드로 가는 최소 비용 저장
- 방문하지 않은 노드 중 비용이 적은 노드 선택
- 해당 노드를 거쳐 다른 노드로 가는 경우를 계산, 기존 비용보다 낮을 경우 비용 갱신
- 3~4 반복
구현
- 초기화:
- 시작 정점의 거리 0으로, 나머지의 거리는 무한대(∞)로 설정
- 우선순위 큐(최소 힙)에 시작 정점을 넣음
- 반복:
- 우선순위 큐에서 현재 거리가 가장 짧은 정점을 꺼냄
- 해당 정점에서 인접 정점으로 가는 간선을~
- 종료
import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
# 노드 수, 간선 수 입력
num_nodes, num_edges = map(int, input().split())
start_node = int(input())
# 그래프 초기화 (인접 리스트)
graph = [[] for _ in range(num_nodes + 1)]
# 시작 시 모든 노드의 최단 거리 INF로 초기화
distances = [INF] * (num_nodes + 1)h
# 간선 정보 입력 (출발 노드, 도착 노드, 가중치)
for _ in range(num_edges):
src, dest, weight = map(int, input().split())
graph[src].append((dest, weight))
def dijkstra(start_node):
priority_queue = []
heapq.heappush(priority_queue, (0, start_node))
distances[start_node] = 0
while priority_queue:
current_cost, current_node = heapq.heappop(priority_queue)
# 이미 더 짧은 경로가 존재하는 경우 무시
if distances[current_node] < current_cost:
continue
for adjacent_node, weight in graph[current_node]:
new_cost = current_cost + weight
if new_cost < distances[adjacent_node]:
distances[adjacent_node] = new_cost
heapq.heappush(priority_queue, (new_cost, adjacent_node))
dijkstra(start_node)
# 결과 출력
for node in range(1, num_nodes + 1):
if distances[node] == INF:
print("INFINITY")
else:
print(distances[node])
추후 그림자료와 함께 보완 예정
728x90
'Algorithm' 카테고리의 다른 글
| [Python] 너비 우선 탐색(BFS)와 깊이 우선 탐색(DFS) (0) | 2025.04.03 |
|---|---|
| [Python] 위상정렬 (Kahn 알고리즘, DFS 활용) (0) | 2025.04.03 |
| [Python] 트리 - 전위, 중위, 후위순회와 이진탐색트리 (0) | 2025.04.03 |
| [Python] 백준 3190 - 뱀 (deque와 list를 활용한 queue 구현) (0) | 2025.03.25 |
| 분할 정복 기법 (Divide and Conquer) (0) | 2025.03.25 |