플로이드 워셜 알고리즘
개념
플로이드-워셜 알고리즘은 모든 노드 간의 최단 경로를 구하는 알고리즘이다.
그래프에서 모든 정점에서 모든 정점에 방문해야 할 때 사용할 수 있다.
특정 노드를 경유하는 방법 or 경유 없이 직행하는 방법 중 작은 비용을 인접 행렬에 저장한다.
구현 방법
- 인접 행렬로 구현된 그래프에서 간선이 있으면 비용을 넣고, 간선이 없으면 무한대값을 넣는다.
- 모든 정점에서 모든 정점까지, 직행하는 경로와 경유하는 경로 중 작은 값을 비용으로 저장한다.
- 모든 정점을 비교할 수 있게 반복한다.
특징
반복문이 세번 나오므로 시간복잡도 O(n³)이 나온다.
노드 수가 많을수록 시간이 많이 소요되지만, 빠르고 효율적으로 답을 구할 수 있다.
예시
void FloydWarshall(vector<vector<int>>& map, int n) { for (int k = 0; k < n; ++k) { // for (int i = 0; i < n; ++i) { // for (int j = 0; j < n; ++j) { map[i][j] = min(map[i][j], map[i][k] + map[k][j]); } } } }