Search
moon
sun
✅

다익스트라, 플로이드 워셜

최단 경로 알고리즘

다익스트라 알고리즘(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차원 배열