코딩테스트/알고리즘
플로이드-워셜(Floyd-Warshall) 알고리즘
윤깡패
2023. 7. 16. 23:16
플로이드-워셜(Floyd-Warshall) 알고리즘
그래프에서 모든 노드 간에 최단 거리를 구하는 알고리즘
- 특징
- 음수 가중치 에지가 있어도 수행할 수 있다.
- 동적 계획법의 원리를 이용해 알고리즘에 접근한다.
- 시간복잡도 : O(V³) (노드 수 : V)
플로이드-워셜 핵심 이론
전체 경로의 최단 경로는 부분 경로의 최단 경로의 조합으로 이뤄진다.
- 플로이드-워셜 점화식
D[S][E] = min(D[S][E], D[S][K] + D[K][E])
플로이드-워셜 알고리즘 구현 방법
1. 배열을 선언하고 초기화한다.
- D[S][E] : 노드 S에서 노드 E까지의 최단 거리를 저장하는 배열
- 초기화
- S == E ⇒ D[S][E] = 0 (자기 자신에게 가는 데 걸리는 최단 경로값)
- S != E ⇒ D[S][E] = ∞
2. 최단 거리 배열에 그래프 데이터를 저장한다.
- D[S][E] = W
- S : 출발 노드
- E : 도착 노드
- W : 에지의 가중치
3. 점화식으로 배열을 업데이트한다.
점화식을 3중 for문의 형태로 반복하면서 배열의 값을 업데이트한다.
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])
- 완성된 배열은 모든 노드 간의 최단 거리 정보를 표현한다.
* <Do It! 알고리즘 코딩테스트 with C++편>, <이것이 취업을 위한 코딩 테스트다 with 파이썬>을 참고하였습니다.
728x90