모든 노드 간의 최단 경로를 구하는 알고리즘
i != j 에 대해 dis[i][j] = ∞, dis[i][j] = 0 으로 초기화
k=1 (정점 1) 경유
k=2 (정점 2) 경유dis[1][3] = 3으로 갱신됨
k=3 (정점 3) 경유dis[1][4] = 7이 됨
k=4 (정점 4) 경유dis[1][7] = 10으로 갱신됨
k=5 (정점 5) 경유dis[1][6] = 10이 됩니다.
k=6 (정점 6) 경유dis[2][7] = −3dis[1][7] = 3으로 바뀜
k=7 (정점 7) 경유 및 최종 확정dis[i][j]도 짧아지지 않으므로 현재 행렬이 모든 쌍 최단 경로가 맞다는 것이 확정됨
public class Main {
static int[][] dis;
static int INF = 1000000000;
static void floydWarshall(int v, int e, int[][] data, int start) {
dis = new int[v + 1][v + 1];
for (int i = 1; i <= v; i++) {
for (int j = 1; j <= v; j++) {
if (i != j) {
dis[i][j] = INF;
}
}
}
for (int i = 0; i < e; i++) {
dis[data[i][0]][data[i][1]] = data[i][2];
}
for (int k = 1; k <= v; k++) {
// i -> j (k를 거쳐서 가는 경우가 짧을 때 업데이트)
for (int i = 1; i <= v; i++) {
for (int j = 1; j <= v; j++) {
if (dis[i][k] != INF && dis[k][j] != INF) {
dis[i][j] = Math.min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
for (int i = 1; i <= v; i++) {
for (int j = 1; j <= v; j++) {
if (dis[i][j] >= INF) {
System.out.printf("%5s ", "INF");
} else {
System.out.printf("%5d ", dis[i][j]);
}
}
System.out.println();
}
}
public static void main(String[] args) {
int[][] data = {
{1, 2, 8}, {1, 3, 6}, {1, 5, 5}, {2, 3, -5}, {2, 4, 1},
{2, 6, 4}, {3, 4, 4}, {4, 7, 3}, {5, 6, 5}, {6, 2, 0},{6, 7, -7}
};
floydWarshall(7, 11, data, 1);
data = new int[][]{
{1, 2, 8}, {1, 3, 6}, {1, 5, 5}, {2, 3, -5}, {2, 4, 1},
{2, 6, 4}, {3, 4, 4}, {4, 7, 3}, {5, 6, 5}, {6, 2, -5},{6, 7, -7}
};
floydWarshall(7, 11, data, 1);
}
}