[알고리즘] 최단 경로 - Floyd-Warshall 알고리즘
1. Floyd-Warshall 알고리즘이란?
최단 경로는 크게 두 가지 경우로 나눌 수 있습니다.
one-to-all : 하나의 출발지에 대해 나머지 모든 노드까지의 최단 경로를 구한다. (Dijkstra 알고리즘, 벨만-포드 알고리즘)
all-to-all : 모든 노드에 대해 다른 모든 노드까지의 최단 경로를 구한다. (Floyd-Warshall 알고리즘)
플로이드 와샬은 all-to-all 에 대한 최단 경로를 구할 때 사용되는 알고리즘입니다.
5개의 노드가 있다고 가정했을 때, 1번 노드에서 2, 3, 4, 5번 노드까지의 최단 경로, 2번 노드에서 1, 3, 4, 5번 노드까지의 최단 경로, ...처럼 모든 노드에 대해 최단 경로를 구하기 때문에 비용을 저장하기 위해 2차원 배열이 필요합니다.
아래와 같은 그래프가 있다고 가정해보자.

위 테이블 세팅 값은 당장에 알 수 있는 간선의 비용입니다.
예를 들어, 1->5 로 가는 비용은 11이고 5->4로 가는 비용은 3입니다. 하지만, 직접적으로 1->4 로 가는 간선은 없습니다.
1->4로 갈려면 5를 거쳐야하기 때문입니다. 따라서 1->4는 INF값으로 초기셋팅을 해줍니다.
이제 Floyd-Warshall 알고리즘을 이용해 모든 노드에 대해 다른 모든 노드까지의 최단경로 비용을 구해보겠습니다.
Floyd-Warshall의 핵심은 '거쳐가는 정점'입니다. 코드를 먼저 보고난 후, 테이블을 채워나가 보겠습니다.
void floydWarshall() { for (int k = 1; k <= 5; k++) { // 거쳐가는 정점 for (int i = 1; i <= 5; i++) { // 출발지 정점 for (int j = 1; j <= 5; j++) { // 목적지 정점 arr[i][j] = Math.min(arr[i][j], arr[i][k] + arr[k][j]); } } } }
1->4번까지 거쳐가는 정점은 1개가 있고, 1->3번까지는 2개의 거쳐가는 정점이 있다는 걸 잘 기억해주세요. 🙂
위 제시된 그래프는 거쳐가는 정점이 3번부터 의미가 있으므로, k=3일때 갱신되는 테이블 셋팅을 보겠습니다.

다음으로 k=4일 때는 테이블이 다음과 같이 갱신됩니다.

마지막으로 k=5일 때는 테이블이 다음과 같이 갱신됩니다.

즉, Floyd-Warshall 알고리즘을 이용하면 모든 노드에 대해 다른 모든 노드로의 최단경로를 쉽게 구할 수 있습니다.
2. 참고자료
[1] m.blog.naver.com
'Algorithm > Theory' 카테고리의 다른 글
[알고리즘] 최단 경로 - 벨만 포드 알고리즘 (0) | 2020.10.25 |
---|---|
[알고리즘] 최단 경로 - Dijkstra 알고리즘 (0) | 2020.10.25 |
[알고리즘] 수열의 순열과 조합 (0) | 2020.09.26 |
[알고리즘] LCS(Longest Common Subsequence) (0) | 2020.09.13 |
[알고리즘] 최소 공통 조상 - LCA(Lowest Common Acestor) (0) | 2020.09.10 |
댓글
이 글 공유하기
다른 글
-
[알고리즘] 최단 경로 - 벨만 포드 알고리즘
[알고리즘] 최단 경로 - 벨만 포드 알고리즘
2020.10.25최단 경로 알고리즘은 크게 두 가지로 분류된다. one-to-all : 하나의 정점에서 다른 모든 정점으로의 최단 경로를 구한다. (다익스트라 알고리즘, 벨만-포드 알고리즘) all-to-all : 모든 정점에 대해 자신을 제외한 다른 모든 정점으로의 최단 경로를 구한다. (플로이드-와샬 알고리즘) 벨만 포드 알고리즘은 one-to-all에 속하며, 이 외에도 다익스트라 알고리즘이 있다. 벨만 포드(Bellman-Ford) 알고리즘 벨만 포드 알고리즘의 특징은 다음과 같다. one-to-all (하나의 정점에서 다른 모든 정점으로의 최단 경로를 구한다.) 음의 가중치일 경우에도 사용이 가능하다. (다익스트라는 가중치가 음수이면 사용이 불가능) 시간 복잡도가 $\mathcal{O}(V \cdot E)$로 … -
[알고리즘] 최단 경로 - Dijkstra 알고리즘
[알고리즘] 최단 경로 - Dijkstra 알고리즘
2020.10.251. 개요 최단 경로 알고리즘은 크게 두 가지로 분류됩니다. one-to-all : 하나의 정점에서 다른 모든 정점으로의 최단 경로를 구한다. (Dijkstra 알고리즘, 벨만-포드 알고리즘) all-to-all : 모든 정점에 대해 자신을 제외한 다른 모든 정점으로의 최단 경로를 구한다. (Floyd-Warshall 알고리즘) Dijkstra 알고리즘은 one-to-all에 속하며, 이 외에도 벨만 포드 알고리즘이 있습니다. 벨만 포드는 음의 가중치일 때 사용되는데, 실세계에서 음의 가중치를 가질만한 것들이 잘 없기 때문에 잘 쓰이진 않습니다. 2. 다익스트라(Dijkstra) 알고리즘이란? Dijkstra 알고리즘의 특징은 다음과 같습니다. one-to-all (하나의 정점에서 다른 모든 정점으로의 … -
[알고리즘] 수열의 순열과 조합
[알고리즘] 수열의 순열과 조합
2020.09.26순열(${}_n \mathrm{ P }_k$)과 조합(${}_n \mathrm{ C }_k$) 특정 수열에 대해 순열과 조합을 구하는 방법을 알아보자. 먼저 순열은 Permutation의 앞 글자를 따서 ${}_n \mathrm{ P }_k$로 나타내고, n개의 수열에서 r개의 수를 뽑아 정렬하는 가짓수이다. 예를 들어, { 1, 2, 3 }이란 수열이 있고, ${}_3 \mathrm{ P }_2$를 구해보면 다음과 같다. {1, 2}, {2, 1}, {1, 3}, {3, 1}, {2, 3}, {3, 2} -
[알고리즘] LCS(Longest Common Subsequence)
[알고리즘] LCS(Longest Common Subsequence)
2020.09.13LCS (Longest Common Subsequence_최장 공통 부분 수열)이란? 먼저, Subsequence가 무엇인지 이해해야 한다. 일반적으로 부분 문자열을 다룰 때 사용하는 Substring이라는 개념을 살펴보자. 가나다라마바사 가파나카마바사 위의 예시로 든 두 문자열 간의 Substring은 "마바사" 이다. 그렇다면 Subsequence는? 가나다라마바사 가파나카마바사 위의 예시로 든 두 문자열 간의 가장 긴 Subsequence는 '가', '나', '마', '바', '사' 이다. 즉, Substring은 연속된 부분 문자열이고, Subsequence는 연속되지 않은 부분 문자열이다. 개념을 확실히 하기 위해 마지막으로 하나 더 해보자. 아래의 문자열에서 LCS(가장 긴 Subsequenc…
댓글을 사용할 수 없습니다.