All Pairs Shortest Paths; Floyd-Warshall
2020-1ํ๊ธฐ, ๋ํ์์ โ์๊ณ ๋ฆฌ์ฆโ ์์ ์ ๋ฃ๊ณ ๊ณต๋ถํ ๋ฐ๋ฅผ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ง์ ์ ์ธ์ ๋ ํ์์ ๋๋ค :)
์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์ดํด๋ณธ โ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๋ฒ: ํํฐ // ์ฌ์ค ๊ทธ๋ฅ ๋ค์ตํธ์ค๋ผ๋ก ํ์ด๋ ๋๋ค