Krafton Jungle/2. Keywords

[WEEK03] 플로이드-워셜 알고리즘

munsik22 2025. 3. 30. 00:25

플로이드-워셜 알고리즘

플로이드-워셜(Floyd-Warshall) 알고리즘은 모든 정점 간의 최단 경로를 찾는 알고리즘이다. 다익스트라(Dijkstra) 알고리즘이 한 정점에서 다른 모든 정점까지의 최단 경로를 구하는 방식이라면, 플로이드-워셜은 모든 정점에서 모든 정점까지의 최단 경로를 구하는 방식이다.

 

이 알고리즘은 동적 계획법(DP, Dynamic Programming)을 활용하여 최단 거리를 점진적으로 갱신하는 방식으로 동작한다.

알고리즘 원리

플로이드-워셜 알고리즘의 핵심 아이디어는 점진적인 경로 갱신이다. 즉, 현재 고려하는 정점을 경유지로 삼았을 때 경로가 더 짧아질 수 있는지 확인하는 방식으로 동작한다.

  1. 그래프를 인접 행렬(Adjacent Matrix) 형태로 표현한다.
  2. 모든 정점 쌍 (i, j)에 대해 직접 연결된 거리를 초기화한다.
  3. 모든 정점 k를 중간 정점으로 고려하여 최단 경로를 갱신한다.
    • dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
  4. 이 과정을 모든 노드에 대해 반복하면 최단 거리 행렬이 완성된다.

알고리즘 구현

다음은 플로이드-워셜 알고리즘을 파이썬으로 구현한 코드이다.

INF = float('inf')

def floyd_warshall(graph):
    num_vertices = len(graph)
    dist = [row[:] for row in graph]  # 거리 행렬 초기화
    
    for k in range(num_vertices):
        for i in range(num_vertices):
            for j in range(num_vertices):
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    
    return dist

# 예제 그래프 (인접 행렬 형태)
graph = [
    [0, 3, INF, INF],
    [2, 0, INF, INF],
    [INF, 7, 0, 1],
    [6, INF, INF, 0]
]

shortest_paths = floyd_warshall(graph)
for row in shortest_paths:
    print(row)

시간 복잡도

플로이드-워셜 알고리즘의 시간 복잡도는 O(V³) 이다.

  • 세 개의 중첩된 반복문이 각각 V(정점의 개수) 만큼 실행되므로 O(V³) 이다.
  • 따라서 정점의 개수가 클 경우(예: 1000개 이상)에는 다익스트라 알고리즘 등을 고려하는 것이 좋다.

플로이드-워셜 알고리즘의 활용

  • 네트워크 지연 시간 분석
  • 도시 간 최단 거리 계산
  • 게임 맵의 모든 지점 간 이동 경로 계산
  • GPS 네비게이션 시스템의 기초

정리

플로이드-워셜 알고리즘은 모든 정점 간의 최단 경로를 효율적으로 구할 수 있는 강력한 알고리즘이다. 특히, 그래프가 작을 경우 매우 직관적이고 쉬운 구현이 가능하므로 알고리즘 문제를 풀 때 유용하게 활용할 수 있다.


같이 보면 좋을 자료들

 

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

지난 포스팅에서는 다익스트라 알고리즘에 대해 작성했었다. 다익스트라의 경우 한 지점에서 다른 특정 지점까지의 최단 경로를 구하는 알고리즘이다. 그러나 모든 지점에서 다른 모든 지점까

velog.io

 

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

컴퓨터/IT/알고리즘 정리 블로그

chanhuiseok.github.io

 

그래프 알고리즘 한눈에 훑기

DAG(방향 비순환 그래프)에서 정점들의 순서를 정하는 알고리즘순서를 지켜야 하는 작업(선수 과목, 빌드 순서 등)에 사용진입 차수 0부터 시작 → 순서대로 큐에 넣고 → 간선 제거하며 정렬사이

velog.io

 

'Krafton Jungle > 2. Keywords' 카테고리의 다른 글

[WEEK04] 동적 프로그래밍 (DP)  (0) 2025.04.03
[WEEK03] 위상 정렬  (0) 2025.03.31
[WEEK03] 다익스트라 알고리즘  (0) 2025.03.29
[WEEK03] 스패닝 트리와 MST  (0) 2025.03.28
[WEEK03] DFS와 BFS  (0) 2025.03.28