코딩 테스트/개념

Floyd-Warshall algorithm

nan-noo 2023. 4. 11. 23:24
728x90

그래프에서 최단 거리를 구하는 알고리즘이다. 단, 특정 노드가 아닌 모든 노드 간에 최단 경로를 탐색한다. 

음수 가중치가 있어도 가능하다.

동적 계획법의 원리를 이용해 알고리즘에 접근한다.

시간 복잡도는 O(V^3)이다. -> 시간 초과때문에 규모가 작은 경우에 활용한다(N = 200 정도?). 

🔰구현

삼중 for문으로 되어 있고, 구현이 쉽다.

a 노드에서 b 노드까지 최단 경로를 구했다고 가정했을 때, 그 경로를 이루는 부분 경로 역시 최단 경로다. 즉, 전체 경로의 최단 경로는 부분 경로의 최단 경로 조합으로 이뤄진다.

D[S][E] = min(D[S][E], D[S][K] + D[K][E]),  K는 S 노드와 E 노드까지의 경로에 존재하는 모든 노드를 의미한다.

  1. 최단 거리 인접 행렬을 선언하고 초기화한다. 출발 노드와 도착 노드가 같으면 0, 나머지 칸은 무한대로 초기화한다.
  2. 최단 거리 인접 행렬에 그래프 데이터를 저장한다. D[S][E] = W
  3. 최단 거리 인접 행렬을 업데이트 한다. -> K, S, E 순으로 3중 루프를 돌린다.
for 경유 노드 K에 관해 (1 ~ N):
    for 출발 노드 S에 관해 (1 ~ N):
        for 도착 노드 E에 관해 (1 ~ N):
            D[S][E] = min(D[S][E], D[S][K] + D[K][E])

결과적으로 최단 거리 인접 행렬이 모든 노드 쌍에 관한 최단 거리를 표현한다.

728x90

'코딩 테스트 > 개념' 카테고리의 다른 글

Tree  (0) 2023.04.14
MST  (0) 2023.04.12
Bellman-Ford algorithm  (0) 2023.04.11
Dijkstra algorithm  (0) 2023.04.11
Topological sort  (0) 2023.04.11