[알고리즘] 백준 - 플로이드
개념 정리
플로이드 와샬: 모든 정점에서 모든 정점으로 최단거리를 갱신하는 알고리즘
각각의 노드를 거쳐가는 가정을 하면서 갱신한다.
3중 for문을 쓰게되며, 시간복잡도는 O(n^3)이다.
내 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
public class baekjoon_11404 {
static int n, m;
static int[][] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
graph = new int[n + 1][n + 1];
for (int i = 0; i < n + 1; i++) {
Arrays.fill(graph[i], Integer.MAX_VALUE);
graph[i][i] = 0;
}
for (int i = 0; i < m; i++) {
String[] inputs = br.readLine().split(" ");
int a = Integer.parseInt(inputs[0]);
int b = Integer.parseInt(inputs[1]);
int c = Integer.parseInt(inputs[2]);
// 경로가 하나가 아닐 수 있다는 조건이 있
graph[a][b] = Math.min(c, graph[a][b]);
}
floyd();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][j] == Integer.MAX_VALUE) {
System.out.print(0 + " ");
} else {
System.out.print(graph[i][j] + " ");
}
}
if (i != n) {
System.out.println();
}
}
}
//dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]
private static void floyd() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][k] == Integer.MAX_VALUE || graph[k][j] == Integer.MAX_VALUE) {
continue;
}
graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
}
}
}
Author And Source
이 문제에 관하여([알고리즘] 백준 - 플로이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@injoon2019/알고리즘-백준-플로이드저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)