1. 플로이드 워셜 알고리즘이란?
다익스트라 알고리즘이 하나의 정점에서 다른 모든 정점까지의 최단 경로를 구하는 알고리즘이었다면, 플로이드-워셜 알고리즘은 한 번 실행하여 모든 노드 간의 최단 경로를 구할 수 있다.
또한 플로이드-워셜 알고리즘 역시 다익스트라와는 다르게 음의 가중치를 갖는 간선이 있어도 사용 가능하다.
플로이드-워셜 알고리즘은 다이나믹 프로그래밍에 속하여 다음과 같은 점화식을 갖는다.
2. 진행 과정
- 모든 지점에서 다른 모든 지점까지의 최단 경로를 저장하기 위해 2차원 거리 배열을 이용한다.
- 최단 거리 테이블의 초기 상태를 저장한다.
- 1번 정점을 거쳐서 가는 경우에 대해 최단 거리 테이블을 갱신한다.
- 2번 정점을 거쳐서 가는 경우에 대한 최단 거리 테이블을 갱신한다.
- 3번 정점을 거쳐서 가는 경우에 대한 최단 거리 테이블을 갱신한다.
- 4번 정점을 거쳐서 가는 경우에 대한 최단 거리 테이블을 갱신한다.
3. 구현 (c++)
진행 과정을 보면 알겠지만, 매우 심플하다. 따라서 구현 역시 다익스트라 알고리즘에 비해 굉장히 단순하다.
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cin >> adj[i][j];
if(adj[i][j] == 0)
adj[i][j] = INF;
}
}
//플로이드-워셜
for (int k=0; k<N; k++){
for (int i=0; i<N; i++){
for (int j=0; j<N; j++){
adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]);
}
}
}
'알고리즘 공부 및 문제 풀이 > 알고리즘(ALGORITHM)' 카테고리의 다른 글
[pro] 프로그래머스 level3 12907 거스름돈 (Java) - dp (0) | 2023.01.27 |
---|---|
[알고리즘] 소수 판별 알고리즘 - 에라토스테네스의 체 (0) | 2022.10.27 |
[알고리즘] 최단 경로 알고리즘(2) - 다익스트라(Dijkstra) 알고리즘 (0) | 2022.10.25 |
[알고리즘] 최단 경로 알고리즘(1) - 벨만 포드(Bellman Ford) 알고리즘 (0) | 2022.10.25 |
[알고리즘] 세그먼트 트리(Segment Tree) (0) | 2022.06.20 |