플로이드 워셜(Floyd-Warshall) 알고리즘
- 다익스트라가 특정 정점과 특정 정점까지의 최단 경로를 구하는 알고리즘 이라면, 플로이드 워셜은 모든 정점에서 다른 모든 정점까지의 최단 경로를 모두 찾는 탐색 알고리즘
- 다익스트라는 그리디, 플로이드 워셜은 DP
- 노드의 개수가 N개일 때 알고리즘상으로 N번의 단계를 수행하며, 단계마다 O(N2)의 연산을 통해 ‘현재 노드를 거쳐 가는 모든 경로’를 고려한다. 따라서 총 시간 복잡도는 O(N3)이다.
플로이드 워셜(Floyd-Warshall) 알고리즘의 과정
1. 인접 행렬 방식으로 출발노드, 도착노드, 비용을 입력한다. 갈 수 없다면 INF로 설정한다.
2. k(거쳐갈 노드), a(출발 노드), b(도착 노드) 순서로 3중 for문을 만든다. a->b 비용과 (a->k) + (k->b) 비용 중 더 짧은 거리를 인접 행렬에 갱신한다.
점화식 ( k는 거쳐가는 노드, 모든 노드가 한 번씩 k가 된다 )
Dab = min(Dab, Dak + Dkb)
a -> b의 최단거리 = a -> b로 가는 거리와, a -> k를 거쳐 k -> b로 가는 거리 중 짧은 거리를 선택
해당 테이블에서 변경을 시도할 값이 선택되는 기준은, 현재 선택된 K값(거쳐갈 노드)에 해당하는 행과 열, 그리고 자기 자신에게 향하는 0값을 제외한 나머지이다.
플로이드 워셜 알고리즘 파이썬 연습 코드
플로이드 워셜 알고리즘의 구현은 매우 쉽다. 딱 저 4줄이 끝이다.
점화식도 간결하고 외우기 좋다. 노드나 간선의 수가 적을 때 다익스트라 대신 플로이드 워셜 알고리즘을 사용하면 매우 편할 듯 하다.
맨 아래 주석은 테스트 케이스 입력값이다. 오타 없이 코딩했을 경우 결과는 이렇다.
0 4 8 6
3 0 7 9
5 9 0 4
7 11 2 0
'크래프톤 정글 > TIL' 카테고리의 다른 글
[크래프톤 정글 5기] week03 알고리즘 주차 스무번째 날, 프로시저, 리턴주소, 함수호출, 디스어셈블 코드 실행추적 (0) | 2024.04.09 |
---|---|
[크래프톤 정글 5기] 스택, 레지스터, 꼬리 재귀 최적화 (0) | 2024.04.09 |
[크래프톤 정글 5기] week03 알고리즘 주차 열아홉번째 날, CS, 어셈블리어, 레지스터, 오퍼랜드, 메모리 주소, 스택 포인터 (0) | 2024.04.08 |
[크래프톤 정글 5기] week03 알고리즘 주차 열다섯번째 날, DP, 그리디, LCS (0) | 2024.04.04 |
[크래프톤 정글 5기] week02 알고리즘 주차 열네번째 날, 최소 스패닝 트리, 프림 알고리즘, 이분 그래프 (0) | 2024.04.03 |