플로이드-와샬?
모든 최단 경로를 구하는 방법, 음의 가중치 간선 가능
방법
Step 1. D[][] : 자기자신으로의 인접이 아니고 갈 수 없는 경로라면 INF
Step 2. k 경 i 출 j 도 : 경유지와 도착지가 같거나 출발지와 도착지가 같다면 패스
Step 3. 출발지에서 도착지까지의 가중치의 합이 경유지를 들렸을 때값보다 클 경우 갱신
소스 코드
import java.util.Scanner;
public class FloydTest {
static final int INF = 9999999;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] D = new int[N][N];
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
D[i][j] = sc.nextInt();
if(i != j && D[i][j] == 0) { // 자기 자신으로의 인접이 아니고 갈수 없다면
D[i][j] = INF;
}
}
}
for (int k = 0; k < N; ++k) { // 경유지
for (int i = 0; i < N; ++i) { // 출발지
if(i==k) continue; // 경유지와 출발지가 같다면 패스
for (int j = 0; j < N; ++j) { // 도착지
if(j==k || i==j) continue; // 경유지와 도착지가 같거나 출발지와 도착지가 같다면 패스
if(D[i][k]+D[k][j] < D[i][j]) {
D[i][j] = D[i][k]+D[k][j];
}
}
}
}
System.out.println();
}
}
'알고리즘 > 개념' 카테고리의 다른 글
[JAVA] 이진탐색(Binary Search) (0) | 2020.09.22 |
---|---|
[JAVA] 최장 증가 수열 LIS (Longest Increasing Subsequence) (0) | 2020.09.01 |
[JAVA] 부분집합(SubSet) 구현 - 비트마스크 (0) | 2020.08.20 |
[JAVA]다음 순열(NextPermutation) (0) | 2020.08.12 |
[JAVA]다익스트라 알고리즘(Dijkstra Algorithm) (0) | 2020.08.10 |