최단 경로 알고리즘
다익스트라 알고리즘(Dijkstra)
그리디
개념
•
한 지점에서 다른 모든 지점까지의 최단 경로를 구하는 알고리즘
•
가중치가 음수가 아닌 그래프에서만 사용 가능
•
우선순위 큐를 이용해 가장 짧은 거리부터 방문
프로세스
1.
출발 노드 설정
2.
최단 거리 테이블 초기화
3.
방문하지 않은 노드 중에서 거리가 가장 짧은 노드를 선택(= 그리디)
4.
해당 노드를 거쳐 다른 노드로 가는 비용을 계산해 최단 거리 테이블 갱신
•
최단 거리 테이블을 직접 갱신하지 않고, 우선 순위 큐에 삽입하는 방식으로도 가능
•
매 단계에서 한 번 처리된 노드의 최단 거리는 고정 → 한 단계당 하나의 노드에 대한 최단 거리를 확실히 찾는 것으로 이해 가능
5.
3-4번을 반복
코드로 확인해볼까요?
import heapq
def dijkstra(start, graph, n):
distance = [float('inf') * (n + 1)] # 모든 노드의 최단거리 값을 무한대로 초기화
distance[start] = 0
pq = [(0, start)]
while pq:
dist, now = heapq.heappop(pq)
# 이미 처리된 더 짧은 경로가 있다면 건너뛰기
if distance[now] < dist:
continue
# 현재 노드의 인접 노드 확인
for neighbor, weight in graph[now]:
# 현재 노드를 거쳐 인접 노드로 가는 비용 계산
cost = dist + weight
# 더 짧은 경로라면, 최단거리를 갱신하고 큐에 추가해 다음에 처리
if cost < distance[neighbor]:
distance[neighbor] = cost
heapq.heappush(pq, (cost, neighbor))
return distance
# 노드 수, 간선 수
n, m = 6, 11
graph = [[] for _ in range(n + 1)]
edges = [
(1, 2, 2), (1, 3, 5), (1, 4, 1),
(2, 3, 3), (2, 4, 2),
(3, 2, 3), (3, 6, 5),
(4, 3, 3), (4, 5, 1),
(5, 3, 1), (5, 6, 2)
]
for a, b, c in edges:
graph[a].append((b, c))
print(dijkstra(1, graph, n)) # 1번 노드에서 각 노드까지의 최단거리
Python
복사
플로이드 워셜 알고리즘(Floyd-Warshall)
다이나믹 프로그래밍(DP)
개념
•
모든 지점에서 다른 모든 지점까지의 최단 경로를 구하는 알고리즘
•
다익스트라와 달리 시작점이 고정되어 있지 않음
•
음수 간선 허용(단, 음수 사이클은 허용 X)
•
동적 계획법(DP)를 활용한 알고리즘
프로세스
1.
2차원 테이블에 최단 거리 정보를 저장
2.
각 단계마다 특정한 노드 K를 거쳐 가는 경우를 확인
•
A → B로 가는 최단 거리보다 A → K → B로 가는 거리가 더 짧은지 검사
•
점화식 : D[A][B] = min(D[A][B], D[A][K] + D[K][B])
코드로 확인해볼까요?
def floyd_warshall(n, edges):
distance = [[float('inf')] * n for _ in range(n)] # 모든 노드의 최단 거리 값을 무한대로 초기화
for i in range(n):
distance[i][i] = 0
for a,b,cost in edges:
distance[a][b] = cost
for k in range(n):
for i in range(n):
for j in range(n):
distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j])
return distance
n = 4 # 노드 수
edges = [
(0, 1, 5),
(0, 3, 10),
(1, 2, 3),
(2, 3, 1),
]
print(floyd_warshall(n, edges))
Python
복사
비교 정리
항목 | 다익스트라 | 플로이드-워셜 |
최단거리 범위 | 한 정점 → 전체 | 모든 정점 → 모든 정점 |
시간복잡도 | O(E * logV) | O(V^3) |
음수 간선 허용 범위 | ||
사용 자료구조 | 우선순위 큐 | 2차원 배열 |
