모든 노드 간의 최단 경로를 구하는 알고리즘
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] = −3
dis[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);
}
}