플로이드 와샬 알고리즘은 다익스트라 알고리즘처럼 최단 경로를 구하는 알고리즘이다.
다익스트라 알고리즘은 출발 정점을 정하고 그 정점부터 가장 가까운 정점들을 선택해나가는데 비해,
플로이드 와샬 알고리즘은 모든 정점에서 모든 정점으로 최단 경로를 구한다.
int INF = 1000000;
int a[4][4] = {
{ 0, 5, INF, 8 },
{ 7, 0, 9, INF },
{ 2, INF, 0, 4 },
{ INF, INF, 3, 0 }
};
for(int k = 0; k < 4; k++)
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++
if (a[i][k] + a[k][j] < a[i][j])
a[i][j] = a[i][k] + a[k][j];
https://ansohxxn.github.io/algorithm/floyd/
첫번째 링크를 보면 동작 과정을 자세히 볼 수 있다. for문 순서를 외워야 한다.
바깥쪽부터 거쳐가는 정점, 출발 정점, 도착 정점 순으로 루프를 만들어야한다.
거쳐가는 정점을 기준으로 하면 계산해야 할 양이 줄어들기 때문에 가장 바깥쪽에 거쳐가는 정점 기준 루프를 돌린다.
distance[i,j] = min(distance[i,j], distance[i,n] + distance[n,j])
위 점화식을 사용해 모든 정점을 돌면서 최단 경로를 업데이트해준다.
삼중루프를 돌고 있으므로 시간 복잡도는 O(N^3)이다.
'알고리즘' 카테고리의 다른 글
| [알고리즘] 그래프와 트리 (트리는 방향 그래프인가?) (0) | 2023.02.09 |
|---|---|
| [알고리즘] 최소 스패닝 트리 - 프림(Prim) 알고리즘 (0) | 2023.02.08 |
| [알고리즘] 약수의 개수 구하기 (0) | 2023.01.11 |
| [알고리즘] 에라토스테네스의 체 (소수 구하기) (0) | 2023.01.05 |
| [알고리즘] 최소 스패닝 트리 - 크루스칼(Kruskal) 알고리즘 (0) | 2022.07.11 |