💻코딩테스트/알고리즘, 자료구조

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

공대 컴린이 2023. 7. 26. 12:39
728x90

📖 플로이드 워셜 알고리즘

다익스트라 알고리즘은 한 지점에서 다른 특정 지점까지의 최단 경로를 구하는 알고리즘이다.

그러나, 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우에는 "플로이드 워셜 알고리즘"을 사용해야 한다.

📌 플로이드-워셜 알고리즘 vs 다익스트라 알고리즘의 차이점

1. 플로이드 워셜 알고리즘은 다익스트라에 비해 소스코드가 매우 짧아 구현이 쉽다.

 

2. 플로이드 워셜 알고리즘은 모든 지점에서 다른 모든 지점까지의 최단 거리를 저장해야 하기 때문에 2차원 테이블에 최단 거리 정보를 저장한다.

(다익스트라 알고리즘은 한 지점에서 다른 지점까지의 최단 거리만을 구하므로 1차원 리스트에 저장하였다)

 

3. 플로이드 워셜 알고리즘은 DP 알고리즘에 속한다.

만약 노드의 개수가 N개라고 할 때, N번 만큼의 단계를 반복하며 점화식에 맞춰 2차원 리스트를 갱신하기 때문이다.

(다익스트라 알고리즘은 그리디 알고리즘에 속한다고 볼 수 있다)

 

4. 플로이드 워셜 알고리즘은 단계마다 "거쳐 가는 노드"를 기준으로 알고리즘을 수행한다. 그러므로 매 단계마다 방문하지 않은 노드 중에서 최단거리를 갖는 노드를 찾아야하는 단계를 수행할 필요가 없다.

(다익스트라 알고리즘은 단계마다 최단 거리를 갖는 노드를 하나씩 반복적으로 선택한다. 이후에는 해당 노드를 거쳐가는 경로를 확인하여 최단 거리 테이블을 갱신하는 방식으로 동작한다)

 

📌 플로이드 워셜 알고리즘의 점화식

플로이드가 DP를 이용하여 풀이하는 문제인 만큼, 점화식이 존재하는데 해당 점화식은 아래와 같다.

여기서 ab는 노드 a에서 노드 b를 향하는 경로를 의미한다.

따라서 dp[a][b] 는 기존의 경로 dp[a][b]와, 중간에 거쳐갈 노드 k 를 끼는 dp[a][k] + dp[k][b]의 경로 중, 더 작은 비용을 갖는 경로를 찾아 저장하게 된다.

 

🖼️ 그림으로 확인하기

  • [초기 상태] 그래프를 준비하고 최단 거리 테이블을 초기화한다

그림으로 다시한번 개념을 이해해보자.

 

1번 노드부터 4번 노드까지의 경로를 나타내는 2차원 배열 graph를 선언하여 안에 비용(cost)을 저장해주었다.

갈 수 있는 경로가 없는 경우에는 "무한"으로 표기하였다.

 

  • [Step 1] 1번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다

플로이드 워셜의 핵심이 "거쳐가는 노드"를 기준으로 알고리즘을 수행하는 것이기 때문에, 1번 노드부터 거쳐가는 노드로 지정하여 나머지 노드들의 경로와 비교해주었다.

 

예를 들어, 2번 노드 -> 3번 노드로 가는 경로 D23은 7의 비용을 갖고, 1번을 중간에 낑겨서 거쳐간다면 2번 노드 -> 1번 노드 -> 3번 노드가 되고, 비용은 3 + 5 = 8 이 된다.

D23  = min(D23, D21 + D13)의 점화식에 따라 7과 8 중 더 작은 최솟값을 선택하므로, 2번->3번 노드로 가는 비용은 7로 저장될 것이다.

(즉, 1번 노드를 안거쳐가는 것이 더 빠르다)

 

다른 예시로, 3번에서 2번 노드로 가는 경로는 원래 존재하지 않기 때문에 "무한"이라고 초기화 되어 있었다.

그러나 중간에 1번 노드를 거쳐가면 3번 노드-> 1번 노드 -> 2번 노드의 경로가 구성되고, 5 + 4 = 9 라는 경로의 비용이 발생한다.

따라서 최종으로 3번에서 2번 노드로 가는 경로는 "무한" 보다 9라는 비용이 훨씬 작기 때문에 D32를 9로 저장하게 된다.

 

이와 같이 1번 노드를 거쳐가는 것 뿐만 아니라 나머지 노드들도 중간으로 두고 거쳐가는 비용을 비교해보면 된다.


  • [Step 2] 2번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다

  • [Step 3] 3번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다

  • [Step 4] 4번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다


참조

https://velog.io/@kimdukbae/%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Floyd-Warshall-Algorithm

 

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

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

velog.io

https://freedeveloper.tistory.com/277?category=888096 

 

[이것이 코딩 테스트다] 7. 최단 경로 알고리즘

www.youtube.com/watch?v=acqm9mM1P6o&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=7 다익스트라 최단 경로 알고리즘 최단 경로 문제 최단 경로 알고리즘은 가장 짧은 경로를 찾는 알고리즘을 의미함 다양한 문제 상

freedeveloper.tistory.com

 

728x90