플로이드-워셜(Floyd-Warshall) 알고리즘은 모든 정점 쌍 간의 최단 경로를 구하는 알고리즘이다. O(V³) 시간에 동작하며, 음수 가중치를 허용하지만 음수 사이클은 없어야 한다.
핵심 아이디어
dp[i][j][k] = 정점 0~k를 거쳐서 i→j까지의 최단 거리
점화식:
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])
구현
python
INF = float('inf')
def floyd_warshall(n, edges):
dist = [[INF]*n for _ in range(n)]
for i in range(n):
dist[i][i] = 0
for u, v, w in edges:
dist[u][v] = w
for k in range(n):
for i in range(n):
for j in range(n):
if dist[i][k] + dist[k][j] < dist[i][j]:
dist[i][j] = dist[i][k] + dist[k][j]
return dist
# 음수 사이클 탐지: dist[i][i] < 0이면 존재
알고리즘 비교
| 알고리즘 | 용도 | 복잡도 |
|---|
| 다익스트라 | 단일 출발, 양수 | O((V+E)logV) |
| 벨만-포드 | 단일 출발, 음수 | O(VE) |
| 플로이드-워셜 | 전체 쌍 | O(V³) |
관련 개념
참고문헌
- •Floyd, R.W. (1962). Algorithm 97: Shortest path