algorithm/Floyd-Warshall

[algorithm] 플로이드-워셜 (Floyd-Warshall) 알고리즘

ayeongjin 2025. 3. 3. 15:21

🧐 플로이드-워셜 알고리즘: 모든 노드 간 최단 경로 찾기

 

1. 플로이드-워셜 알고리즘이란?

플로이드-워셜(Floyd-Warshall) 알고리즘은 그래프의 모든 노드 쌍 간 최단 경로를 찾는 알고리즘입니다.

동적 프로그래밍(Dynamic Programming) 기법을 사용하며, 다익스트라와 다르게 음수 가중치가 있는 그래프도 처리할 수 있다는 장점이 있습니다.

 

2. 알고리즘의 동작 원리

이 알고리즘은 특정한 경유지 노드(k)를 거쳐 가는 경우와 바로 가는 경우를 비교하며 최단 경로를 갱신합니다.

점화식:

dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
dist[i][j]: 노드 i에서 노드 j로 가는 현재까지의 최단 거리
k: 경유하는 노드

 

3. 알고리즘 구현

INF = float('inf')

# 그래프 초기화 (노드 개수 n)
n = 4
graph = [[0, 5, INF, 8],
         [7, 0, 9, INF],
         [2, INF, 0, 4],
         [INF, INF, 3, 0]]

# 플로이드-워셜 알고리즘
for k in range(n):
    for i in range(n):
        for j in range(n):
            graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])

# 결과 출력
for line in graph:
    print(line)

 

4. 시간 복잡도와 특징

  • 시간 복잡도: O(n^3)
  • 공간 복잡도: O(n^2)
  • 음수 가중치 처리 가능 (단, 음수 사이클이 있는 경우는 불가)

 

5. 활용 예시

  • 모든 도시 간 최단 거리 계산
  • 네트워크에서 모든 노드 간 최소 지연 시간 찾기

 

6. 배운점

플로이드-워셜 알고리즘은 구현이 간단하고 모든 노드 간 최단 경로를 효율적으로 구할 수 있습니다.

특히 노드 개수가 많지 않은 경우 유용하며, 다익스트라 알고리즘과 함께 최단 경로 문제에서 자주 사용됩니다.