[1. 개요]
다익스트라 알고리즘, 벨만포드 알고리즘은 한 개의 시작점에서 다른 모든 정점까지의 최단거리를 계산한다.
그래서 전체 N개의 정점 쌍 간의 최단거리를 구하기 위해서는 N 번의 다익스트라, 벨만포드 알고리즘을 사용해야 한다.
그러나 적절한 경우에 좀 더 간단하게 모든 정점 쌍 간의 최단 거리를 구할 수 있는데,
이 때 사용하는 알고리즘이 플로이드-워셜 알고리즘 이다.
[2. 원리]
경로의 경유점
- 두 정점 u 와 v 를 잇는 어떤 경로가 있다.
- 이 경로는 항상 시작점, 끝점이 u, v 이며 이는 자명하다.
- u 와 v 를 직접 연결하는 경로 일 수 있으나, 다른 정점을 거쳐서 u 와 v 를 이을 수 있다.
- 이 때, 사용되는 정점을 경유점이라 한다.
u 와 v 가 직접 연결 된 경로보다 경유점을 거치는 경로가 더 짧을 수 있다.
이렇게 정점 집합 s 에 포함 된 정점 만을 경유점 'x' 로 사용한다면, 아래와 같은 경우를 생각해볼 수 있다.
- 경로가 x 를 경유하지 않는다.
=> 이 경로는 S - {x} 에 포함된 정점들만을 경유점으로 사용한다. - 경로가 x 를 경유한다.
=> u ~ v 경로는 u ~x 와 x ~ v 이렇게 두 개의 경로로 나눌 수 있다.
정점 집합 S 에 정점을 하나씩 추가해가면서 최단 경로를 구해나간다.
=> 반복적 동적 계획법
구현부에서
가장 바깥쪽 for 문 이 바로 경유점에 사용할 정점 집합 S 에 해당
2번째 for 문이 u 에 해당
3번째 for 문이 v 에 해당한다.
[4. 경로 복원]
플로이드 알고리즘은 최단 경로에 간선을 하나씩 추가해가는
다익스트라나 벨만포드 알고리즘과 다른 방식으로 동작하므로,
실제 경로를 계산하는 과정도 다르다.
과정
- 플로이드 알고리즘을 수행하면서, u-v 최단 경로가 갱신되었을 때 사용한 경유점을 저장한다.
- 플로이드 알고리즘 종료 후, u ~ v 최단거리가 존재하지 않는다면 경로를 구할 수 없다.
- u ~ v 최단경로가 존재한다면, u ~ v 경로가 경유점 x 를 거쳐가야 한다.
- u ~ x 의 최단 경로를 구한다.
- x ~ v 의 최단 경로를 구한다.
- 4 와 5 에서 구한 최단 경로를 합친다.
=> x 가 중복되니, 한쪽 경로에서는 제거되어야 한다.
=> 3 ~ 6 은 재귀적으로 처리되어야 한다.
[5. 예제]
'알고리즘 > 기타' 카테고리의 다른 글
이분 탐색, 하한 / 상한 값 탐색 (1) | 2023.05.13 |
---|---|
Lazy propagation (0) | 2023.03.10 |
DFS 스패닝 트리 및 edge 의 유형 (0) | 2022.11.22 |
원형 큐 (0) | 2022.11.10 |
좌표 압축 (0) | 2022.11.07 |