All Pairs Shortest Paths; Floyd-Warshall
2020-1νκΈ°, λνμμ βμκ³ λ¦¬μ¦β μμ μ λ£κ³ 곡λΆν λ°λ₯Ό μ 리ν κΈμ λλ€. μ§μ μ μΈμ λ νμμ λλ€ :) μ 체 ν¬μ€νΈλ Algorithm ν¬μ€νΈμμ νμΈνμ€ μ μμ΅λλ€.
μ°λ¦¬κ° μ§κΈκΉμ§ μ΄ν΄λ³Έ βShortest Pathβ λ¬Έμ λ λͺ¨λ μΆλ° λ Έλ $s$μ λμ°© λ Έλ $t$κ° κ³ μ λ κ²½μ°μλ€. κ·Έλ¬λ λλ‘λ μ£Όμ΄μ§λ λ Έλ 쿼리 $(s, t)$μ λν shortest pathλ₯Ό μ°Ύκ±°λ λλ κ·Έλνμ μ‘΄μ¬νλ λͺ¨λ λ Έλ μ $(u, v)$ μ¬μ΄μ shortest pathλ₯Ό μ°Ύκ³ μΆμ μ μλ€.
λ§μ½ μ΄κ²μ <Dijkstra Algorithm>μ μ¬μ©ν΄ $V$κ°μ λ Έλμ λν΄μ βsingle-source shortest pathβλ₯Ό μ°Ύκ³ μ νλ€λ©΄, μ΄ $V \times O(VE) = O(V^2 E)$μ μκ°μ΄ κ±Έλ¦°λ€.
κ·Έ.λ¬.λ. <DP>λ₯Ό μ¬μ©νλ©΄, μ’λ λΉ λ₯Έ μκ° μμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€!! π μ΄ μκ³ λ¦¬μ¦μ <Floyd-Warshall Aglrorithm>λΌκ³ νλ€.
μ°λ¦¬λ λ μ μ $(i, j)$μ μλ μ΅λ¨ κ²½λ‘λ₯Ό μλμ κ°μ΄ κ²½μ μ§ $k$λ₯Ό κ±°μΉλ λ¬Έμ λ‘ μκ°ν΄λ³Ό μ μλ€!!

μ¦, λ μ μ μ μλ μ΅λ¨ κ²½λ‘λ₯Ό $k-1$κΉμ§μ λ Έλλ₯Ό μ¬μ©νλ κ²½μ°μ $k$κΉμ§ λ Έλλ₯Ό ν¬ν¨ν΄ μ¬μ©ν κ²½μ°(pass through $k$)λ‘ λλμ΄ λ μ€ μ΅λ¨ κ²½λ‘λ₯Ό μ ννλ€.
μ΄λ, μ£Όμν μ μ μ΄λ κ² κ²½μ μ§λ₯Ό κ±°μ³κ°λ λ°©λ²μ μ¬μ©νκΈ° μν΄μ κ²½μ νλ κ²½λ‘λ₯Ό μ΄λ£¨λ sub-path μμ μ΅λ¨ κ²½λ‘μμ΄ λ³΄μ₯λμ΄μΌ νλ€!
μ΄λ₯Ό μκ³ λ¦¬μ¦μΌλ‘ νννλ©΄ μλμ κ°λ€.
// initialize
for all $(i, j) \in E$
ββ$\text{dist}(i, j, 0) = \ell(i, j)$
for $k=1$ to $n$:
ββfor $i=1$ to $n$:
ββββfor $j=1$ to $n$:
ββββββ$\text{dist}(i, j, k) = \min \{ \text{dist}(i, j, k-1), \; \text{dist}(i, k, k-1) + \text{dist}(k, j, k-1)\}$
μ¬μ€ μ€μ λ‘ κ΅¬νμ ν΄λ³΄λ©΄, 3μ°¨μ λ°°μ΄μ΄ μλλΌ $k$λ₯Ό μμ€ 2μ°¨μ λ°°μ΄λ‘λ μΆ©λΆν μ λμνλ€ π
μκ° λ³΅μ‘λλ κΈ°μ‘΄ DFS κΈ°λ°μ $O(V^2 E)$μμ $O(V^3)$λ‘ μ€μ΄λ€μλ€!! (μΌλ°μ μΌλ‘ sparse graphκ° μλλΌλ©΄ $V < E$μ΄λ€.)
ꡬν
- adjacency matrixλ‘ μ°κ²°μ±μ νννλ κ±Έ μΆμ²
- adjacency matrix μ΄κΈ°ν μμ§ λ§κ²;
fill()
;- μ΄κΈ°ν ν λ,
INT_MAX
μ κ°μ΄ λ§€μ° ν°μλ‘ νκ² λλ©΄ overflow λλ¬Έμ μλͺ»λ κ²°κ³Όλ₯Ό λ±μ;;
- μ΄κΈ°ν ν λ,
- ꡬν μ체λ μ λ§ κ°λ¨ν¨! LIS, edit distance κΈμΌλ‘ μ¬μ΄ ꡬν!
// initialization 1
fill(&dist[0][0], &dist[N+1][N+1], MAX2);
// initialization 2
for (int i = 0; i < M; i++) {
int a, b;
scanf("%d %d", &a, &b);
dist[a][b] = 1;
dist[b][a] = 1;
}
// Floyd-Warshall
for (int k = 1; k <= N; ++k) {
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= N; ++j) {
if(dist[i][k] == MAX2 || dist[k][j] == MAX2) continue;
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
μ°Έκ³ λ‘ <Flyod-Warshall>μ λ Έλμ μκ° 10,000κ° λλ©΄ λ무 λ§μ λ©λͺ¨λ¦¬λ₯Ό μ°κΈ° λλ¬Έμ μΈ μ μλ€! λ°±μ€ 1325λ²: ν¨μ¨μ μΈ ν΄νΉμ΄ λ©λͺ¨λ¦¬ λλ¬Έμ <Flyod-Warshall>μ μΈ μ μλ μμ΄λ€!
μΆμ² λ¬Έμ
- λ°±μ€ 1389λ²: μΌλΉ λ² μ΄μ»¨μ 6λ¨κ³ λ²μΉ
- λ°±μ€ 11404λ²: νλ‘μ΄λ
- λ°±μ€ 11562λ²: λ°±μλ‘ λΈλ μ΄ν¬
- λ°±μ€ 1507λ²: κΆκΈν λ―ΌνΈ // νλ‘μ΄λ-μμ¬μ μ΄λ»κ² μ¨μΌν μ§ κ³ λ―Όμ μ’ ν΄μΌ νλ€
- λ°±μ€ 1238λ²: νν° // μ¬μ€ κ·Έλ₯ λ€μ΅νΈμ€λΌλ‘ νμ΄λ λλ€