플로이드-워셜 알고리즘다익스트라, 벨만-포드 알고리즘으로 주어진 하나의 정점으로부터 다른 모든 정점들까지의 최단 경로를 구할 수 있었다면, 플로이드-워셜 알고리즘을 활용하면 플로이드-워셜 알고리즘 구현플로이드-워셜 알고리즘은 경유하는 정점에 초점을 두고, 그 정점을 거쳐가는 경로가 기존 경로보다 더 효율적인지를 판단한다. 즉, 경유하는 정점의 입장에서 어떤 정점 u가 다른 정점 v로 갈 때 자신을 거쳐서 가는 것이 기존의 경로보다 더 효율적이라면 기존의 경로를 갱신해주는 작업을 반복하는 것이다. 플로이드-워셜 알고리즘 프로세스
플로이드-워셜 알고리즘 코드 (Python) 시간 복잡도 & 공간 복잡도코드에서 알 수 있듯이 정점의 개수
VV만큼 반복분이 3중으로 수행되고 있기 때문에 O(V3)O(V^3)의
시간 복잡도를 갖는다. 플로이드 워셜(Floyd-Warshall)은 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우 에 사용할 수 있는 알고리즘이다.
노드의 개수가 n 개일때 n 번의 단계를 수행하며 단계마다 O(N²) 의 연산을 통해 현재 노드를 거쳐가는 모든 경로를 고려한다. 그래서 총 시간 복잡도는 O(N³)이다. 즉, 모든 지점을 시작으로 삼고 모든 지점에 대해서 끝으로 삼아서 최단 거리를 구하는데 모든 노드를 경유지로 삼는 과정인 n 번의 단계를 수행 한다. min(시작 → 끝, 시작 → 경유 + 경유 → 끝) 를 구하는 것이다.
전체적으로 3중 반복문을 잉요하여 최단 거리 배열을 갱신하면 된다. 핵심 개념에 대해서 Swift 로 구현된 예시 코드를 살펴보자. |