(n-2)(n-3)…1 = (n-2)!
이 된다O(n^3)
이다. 단, n은 정점의 수이다O(n^3)
으로 다익스트라의 시간복잡도와 동일하다{1, 2, 3, …, k}
만을 경유 가능한 정점들로 고려하여, 정점 i로 부터 정점 j까지의 모든 경로 중에서 가장 짧은 경로의 거리이런 방식으로 k가 1에서 n이 될 때까지 를 계산해서, , 즉, 모든 정점을 경유 가능한 정점들로 고려한 모든 쌍 i와 j의 최단 경로의 거리를 찾는 방식이 플로이드의 모든 쌍 최단 경로 알고리즘이다
모든 쌍 최단 경로 알고리즘
D[i][j] = 정점 i에서 정점 j로의 최소 비용
AllPairsShortest(D[][])
FOR k in 1 -> n
FOR i in 1 -> n (단, i != k)
FOR j in 1 -> n (단, j != k, j != i)
D[i][j] <- min(D[i][k] + D[k][j], D[i][j])
D[i][k] + D[k][j]
와 정점 {1, 2, …, (k-1)}
만을 경유 가능한 점들로 고려하여 계산된 최단 경로의 거리가 D[i][j]
가 짧은지를 결정하여 D[i][j]
를 갱신한다n * n * n = n^3
회 계산이 이루어지고, 각 계산은 O(1)
시간이 걸린다import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* 시간 : 304ms, 메모리 : 41,756KB
*/
public class 백준_11404_플로이드 {
static int[][] dist;
static int n, m, from, to, weight;
static final int INF = 100_000_000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
dist = new int[n][n];
for (int i = 0; i < n; i++) {
Arrays.fill(dist[i], INF);
dist[i][i] = 0;
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
from = Integer.parseInt(st.nextToken());
to = Integer.parseInt(st.nextToken());
weight = Integer.parseInt(st.nextToken());
dist[from-1][to-1] = Math.min(dist[from-1][to-1], weight);
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(dist[i][j] == INF ? 0 : dist[i][j]).append(" ");
}
sb.append("\n");
}
System.out.print(sb);
br.close();
}
}