νλ‘μ΄λ-μμ μκ³ λ¦¬μ¦ Floyd-Warshall Algorithm
μ΄ κΈμ λͺ©μ°¨5κ°
π νλ‘μ΄λ-μμ μκ³ λ¦¬μ¦ Floyd-Warshall Algorithm
λͺ¨λ λ Έλ κ° μ΅λ¨ 거리λ₯Ό ꡬνλ μκ³ λ¦¬μ¦μΌλ‘, λμ κ³νλ² (DP)μ νμ©νμ¬ μ΅μ μ κ²½λ‘λ₯Ό μ°Ύλλ€.
π νλ‘μ΄λ μμ μκ³ λ¦¬μ¦μ΄λ?
**DP(λμ κ³νλ²)**μ μ΄μ©νμ¬ λͺ¨λ λ Έλ κ°μ μ΅μ 거리λ₯Ό ꡬνλ μκ³ λ¦¬μ¦ 2μ°¨μ λ°°μ΄μ μ¬μ©νμ¬ κ° λ Έλ κ°μ μ΄λ 거리λ₯Ό μ μ₯ νΉμ λ Έλλ₯Ό κ²½μ ν λ, λ μ§§μ κ²½λ‘κ° μ‘΄μ¬νλμ§ νμΈνμ¬ κ±°λ¦¬ μ 보λ₯Ό κ°±μ
β λ€μ΅μ€νΈλΌ vs νλ‘μ΄λ μμ λΉκ΅

- νλ‘μ΄λ μμ μ κ·Έλν μ 체μ μ΅λ¨ κ²½λ‘λ₯Ό ꡬν λ μ¬μ©
- λ Έλ μκ° μ κ³ (100 μ΄ν), λͺ¨λ κ²½λ‘λ₯Ό κ³ λ €ν΄μΌ ν λ μ ν©
π§ ν΅μ¬ κ°λ
-
λͺ¨λ λ Έλ κ°μ 거리 μ 보λ₯Ό μ μ₯ν 2μ°¨μ λ°°μ΄ μμ±
-
μκΈ° μμ β μκΈ° μμ 거리 = 0
-
μ°κ²°λμ§ μμ λ Έλμ 거리 = 무νλ (Integer.MAX_VALUE)
-
κ° κ°μ μ 보λ₯Ό μ λ ₯λ°μ 거리 μ΄κΈ°ν
-
λͺ¨λ λ Έλ(i)λ₯Ό βκ²½μ βνλ©΄μ μ΅λ¨ 거리 κ°±μ
-
(μΆλ° β λμ°©) vs (μΆλ° β κ²½μ β λμ°©)
-
λ μ§§μ κ±°λ¦¬λ‘ κ°±μ ν μ μλ€λ©΄ κ° μ λ°μ΄νΈ
π ꡬν μμ :
μ κ·Έλνλ₯Ό ν λλ‘ 2μ°¨μ λ°°μ΄μ λ§λ€λ©΄ λ€μκ³Ό κ°λ€
μ€μ€λ‘μ λν 거리λ 0μΌλ‘ μ·¨κΈνλ©°, μ΄μ΄μ§μ§ μμ λ
Έλμ λν΄μλ 거리λ₯Ό 무νμΌλ‘ μ€μ νλ€.

3μ€ λ°λ³΅λ¬Έμ μ΄μ©ν΄μ 2μ°¨μ λ°°μ΄μ κ°±μ νλ€.

ν΅μ¬ μ½λλ λ€μκ³Ό κ°μλ°, μ΅μμ forλ¬Έμ 1λ² λΆν° 5λ² λ Έλλ₯Ό κ²½μ ν λλ₯Ό κ°μ νλ€.
λ€μμΌλ‘ μΆλ°λ Έλ, λμ°©λ Έλλ₯Ό νμΈνμ¬
1. μΆλ°λ Έλ -> λμ°©λ Έλ
2. μΆλ°λ Έλ -> κ²½μ λ Έλ -> λμ°©λ Έλ
2κ°μ§ κ²½μ°λ₯Ό λΉκ΅νμ¬ μ΄λκ±°λ¦¬κ° λ μμ κ²μΌλ‘ ν΄λΉ μΈλ±μ€λ₯Ό κ°±μ νλ€.
μ΄ λ, μΆλ°λ Έλ, λμ°©λ Έλ, κ²½μ λ Έλκ° λ¬΄ν(Integer.MAX_VALUE)μΈ κ²½μ° μ΄λν μ μλ μνμ΄λ―λ‘ continueνμ¬ λ€μ κ²½μ°λ₯Ό νμΈνλ€.
μ½λ ꡬν (Java)
import java.util.*;
class Solution {
public void solution(int n, int[][] edges) {
// 1. 2μ°¨μ λ°°μ΄ μμ± λ° μ΄κΈ°ν
int[][] floyd = new int[n + 1][n + 1];
for (int i = 0; i <= n; i++) {
Arrays.fill(floyd[i], Integer.MAX_VALUE);
}
// 2. μκΈ° μμ μΌλ‘ κ°λ 거리λ 0
for (int i = 1; i <= n; i++) {
floyd[i][i] = 0;
}
// 3. κ°μ μ 보 μ
λ ₯ (거리 μ΄κΈ°ν)
for (int[] edge : edges) {
floyd[edge[0]][edge[1]] = edge[2];
}
// 4. νλ‘μ΄λ μμ
μκ³ λ¦¬μ¦ μ€ν
for (int k = 1; k <= n; k++) { // κ²½μ λ
Έλ
for (int i = 1; i <= n; i++) { // μΆλ° λ
Έλ
for (int j = 1; j <= n; j++) { // λμ°© λ
Έλ
// κ²½μ ν μ μλ κ²½μ° ν¨μ€
if (floyd[i][k] == Integer.MAX_VALUE || floyd[k][j] == Integer.MAX_VALUE) {
continue;
}
// μ΅λ¨ 거리 κ°±μ
floyd[i][j] = Math.min(floyd[i][j], floyd[i][k] + floyd[k][j]);
}
}
}
// 5. κ²°κ³Ό μΆλ ₯ (μ΅λ¨ 거리 νλ ¬)
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
System.out.print(floyd[i][j] + " ");
}
System.out.println();
}
}
}