요르딩딩
플로이드 워셜 알고리즘 본문
728x90
반응형
플로이드 워셜 알고리즘
모든 노드에서 다른 모든 노드까지의 최단 경로를 모두 계산합니다.
2차원 테이블에 최단 거리 정보를 저장합니다.
다이나믹 프로그래밍 유형에 속합니다.
시간복잡도 : O(N^3) = 2차원 리스트를 처리해야 하므로 거쳐가는 N번의 단계에서 매번 O(N^2)의 시간이 소요된다.
점화식 : Dab = min(Dab, Dak + Dkb)
각 단계마다 특정한 노드 k를 거쳐가는 경우를 확인합니다.
비교
다익스트라 알고리즘은 '한 지점에서 다른 특정 지점까지의 최단 경로를 구해야 하는 경우'에 사용할 수 있는 알고리즘
플로이드 워셜 알고리즘은 '모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야하는 경우'에 사용할 수 있는 알고리즘
다익스트라 알고리즘은 그리디 알고리즘이고, 플로이드 워셜 알고리즘은 다이나믹 프로그래밍이다.
노드의 개수가 N이라고 할떄, N번 만큼의 단계를 반복하여 '점화식에 맞게' 2차원 리스트를 갱신하기 때문이다.
코드
import java.util.*;
public class Main {
public static final int INF = (int) 1e9; // 무한을 의미하는 값으로 10억을 설정
// 노드의 개수(N), 간선의 개수(M)
// 노드의 개수는 최대 500개라고 가정
public static int n, m;
// 2차원 배열(그래프 표현)를 만들기
public static int[][] graph = new int[501][501];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
// 최단 거리 테이블을 모두 무한으로 초기화
for (int i = 0; i < 501; i++) {
Arrays.fill(graph[i], INF);
}
// 자기 자신에서 자기 자신으로 가는 비용은 0으로 초기화
for (int a = 1; a <= n; a++) {
for (int b = 1; b <= n; b++) {
if (a == b) graph[a][b] = 0;
}
}
// 각 간선에 대한 정보를 입력 받아, 그 값으로 초기화
for (int i = 0; i < m; i++) {
// A에서 B로 가는 비용은 C라고 설정
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
graph[a][b] = c;
}
// 점화식에 따라 플로이드 워셜 알고리즘을 수행
for (int k = 1; k <= n; k++) {
for (int a = 1; a <= n; a++) {
for (int b = 1; b <= n; b++) {
graph[a][b] = Math.min(graph[a][b], graph[a][k] + graph[k][b]);
}
}
}
// 수행된 결과를 출력
for (int a = 1; a <= n; a++) {
for (int b = 1; b <= n; b++) {
// 도달할 수 없는 경우, 무한(INFINITY)이라고 출력
if (graph[a][b] == INF) {
System.out.print("INFINITY ");
}
// 도달할 수 있는 경우 거리를 출력
else {
System.out.print(graph[a][b] + " ");
}
}
System.out.println();
}
}
}
참고 : 이것이 취업을 위한 코딩 테스트다.
728x90
반응형
'[코딩테스트] > 이론' 카테고리의 다른 글
Chapter 9. 최단경로 (0) | 2022.02.14 |
---|---|
CHAPTER 3. DFS/BFS (0) | 2022.02.10 |
CHAPTER 4. 정렬 (0) | 2022.02.03 |
CHAPTER 8. 그래프 이론 (0) | 2022.01.20 |
다익스트라 최단거리 알고리즘 (0) | 2022.01.10 |
Comments