Floyd-Warshall
Floyd-Warshall : ๊ทธ๋ํ์ ์ต๋จ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
ํ๋ก์ด๋ ์์
(Floyd-Warshall)
๊ทธ๋ํ์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
๊ธฐ๋ฅ : ๋ชจ๋ ๋ ธ๋ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก ํ์
ํน์ง : ์์ ๊ฐ์ค์น ์์ง๊ฐ ์์ด๋ ์ํ์ด ๊ฐ๋ฅํ๋ค.
๋ ธ๋์ ๊ฐฏ์๊ฐ ์ ์ ๋ ์ฌ์ฉํด๋ณผ๋ง ํจ
์๊ฐ ๋ณต์ก๋ : O(N^3)
ํน์ง
A โ B ๋ ธ๋๊น์ง ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ต๋จ ๊ฒฝ๋ก ์์ C๋ ธ๋๊ฐ ์กด์ฌํ๋ค๋ฉด ๋ถ๋ถ ๊ฒฝ๋ก ์ญ์ ์ต๋จ ๊ฑฐ๋ฆฌ์ด๋ค.
์ฝ๋์ ๊ธธ์ด๊ฐ ๋งค์ฐ ์งง๊ณ , 3์ค for๋ฌธ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๋ ธ๋์ ๊ฐฏ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ์ธ์ ํ๋ ฌ๋ก ์ต๋จ๊ฑฐ๋ฆฌ ๊ทธ๋ํ๋ฅผ ๋ง๋ค ์ ์๋ค.
์ ํ์ :
D[S][T] = Math.min(D[S][T], D[S][K] + D[K][T]K : ๊ฑฐ์ณ๊ฐ๋ ์ ์ if (D[S][T] > D[S][K] + D[K][E]) D[S][T] = D[S][K] + D[K][T]

S -> T ๊น์ง ์ต๋จ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ค. ์ด ๊ฒฝ๋ก ์ฌ์ด์ ์กด์ฌํ๋ ๋ชจ๋ K๋ฅผ ํ์ํ๋ ๊ฒ์ด๋ค. (๋ธ๋ฃจํธํฌ์ค์ฒ๋ผ)
๊ฐ ์ ์๋ ๋ชจ๋ K๋ฅผ ํ์ํด ๋ณด๊ณ ๊ทธ์ค ๊ฐ์ด ๊ฐ์ฅ ์์ K๋ฅผ ์ ํ
๊ตฌํ ๋ฐฉ๋ฒ
์ธ์ ํ๋ ฌ ์์ฑ
i ๋ ์ถ๋ฐ ๋ ธ๋, j ๋ ๋์ฐฉ ๋ ธ๋, k๋ ๊ฒฝ์ ๋ ธ๋, ๊ฐ์ค์น๋ w
(i == j) D[i][j] = 0
(i โ j) D[i][j] = INF
D[i][j] = w
์ ํ์์ผ๋ก ๊ทธ๋ํ ์ ๋ฐ์ดํธ
์ต์ข ๊ทธ๋ํ์์ ๊ฐ์ด ๋ฌดํ๋(INF)๋ ์ ๋ ๊ฐ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค.
๋ฌธ์ :
BOJ 11403 ๊ฒฝ๋ก ์ฐพ๊ธฐ : https://www.acmicpc.net/problem/11403
BOJ 11404 ํ๋ก์ด๋ : https://www.acmicpc.net/problem/11404
BOJ 2060 ๋ฐ์ด๋ฌ์ค : https://www.acmicpc.net/problem/2606
BOJ 14938 ์๊ฐ ๊ทธ๋ผ์ด๋ : https://www.acmicpc.net/problem/14938
Last updated