[Algorithm] Dynamic Programming(4) - ๋ฒจ๋งํฌ๋(Bellman-Ford)
๐คDynamic Programming
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ ํฐ ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ๋๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์ค ํ๋์ธ ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ (Shortest Path Problem)
โ๏ธ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋?
๊ทธ๋ํ G = (V, E)์ ์์์ ์ ์ u์์ v๋ก์ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ฅผ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ edge-weighted graph์ ๊ฒฝ์ฐ๋ง์ ์๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค. ( ์ด๋ |V| = n, |E| = m )
โ๏ธ Edge-weighted graph
๊ทธ๋ํ G์ edge(a, b)์ ๊ฐ์ค์น w(a, b)๊ฐ ์๋ ๊ทธ๋ํ๋ฅผ ๋งํฉ๋๋ค.
์ด๋ ์ ์ u์์ v๋ก์ ๊ฒฝ๋ก์ ๊ธธ์ด๋ u์์ v๋ก์ ๊ฒฝ๋ก ์์ edge๋ค์ ์ด ๊ฐ์ค์น์ ํฉ์ด ๋ฉ๋๋ค.
์๋์ ๊ทธ๋ํ์์ ์ ์ '0' ์์๋ถํฐ '2'๊น์ง์ ๋นจ๊ฐ์ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๋ '8 + 7 = 15' ์ ๋๋ค.
๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋๋ฐ ์ฐ๋ฆฌ๊ฐ ๊ณต๋ถํ๋ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ ๊ทธ ์ค ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
์์ ๊ทธ๋ฆผ์์๋ edge(0, 3)๊ณผ edge(3, 2)์ ๊ฐ์ค์น๋ฅผ ๋ํ 14๊ฐ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋ฉ๋๋ค.
โ๏ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ(Dijkstra Algorithm)
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฌธ์ ์ค ํ๋์ ๋๋ค.
ํ์ง๋ง ์ค๋ ๋ฐฐ์ธ ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ๋ ๋ค๋ฅด๊ฒ, ๊ทธ๋ํ์์ ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋ edge๊ฐ ์กด์ฌํ๋ค๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ์ง ์์ต๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
How To Solve
์์ ์ ์ s(source) ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๋ค ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
์ฆ, ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๋ค๊ฐ์ ๊ฑฐ๋ฆฌ๋ table๋ก ์ ์ฅํ๋ฉฐ, ์ ์ ์ ํ๋ ์ฉ ๋ฐฉ๋ฌธํด๊ฐ๋ฉด์ table์ ์ ๋ฐ์ดํธ ํฉ๋๋ค.
Key Lemma
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ s์์๋ถํฐ์ ๊ธธ์ด๊ฐ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค ๊ฐ์ฅ ์งง์ ์ ์ ์ v๋ผ๊ณ ํ ๋ ํด๋น ๊ธธ์ด๋ ์ค์ s์์ v๋ก์ ์ต๋จ ๊ฒฝ๋ก ๊ธธ์ด์ ๊ฐ๋ค.
๋ฐ๋ผ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ ์ local optimum(์ฃผ๋ณ์ ๋ค๋ฅธ ๊ฐ๋ค๋ณด๋ค ๋ ์ข์ ๊ฐ)์ ๊ธฐ๋ฐํ์ฌ ํ๋์ฉ ๋ฐฉ๋ฌธํ๋ ์ผ์ข ์ greedy ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
ํ์ง๋ง ์์ Key Lemma๋ ๊ฐ์ค์น๊ฐ ์์์ธ edge๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ฑ๋ฆฝํ์ง ์์ต๋๋ค.
์๋์ ๊ทธ๋ํ์์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ Edge(s, v)๊ฐ s์ v ์ฌ์ด์ shorest path๋ผ๊ณ ๋ตํฉ๋๋ค.
ํ,
ํ์ง๋ง ์ค์ s์ v ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ s - v' - v ์ ๋๋ค.
๐ ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ DP(Dynamic Programming) ๊ธฐ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ ์ s ์์ ๊ทธ๋ํ G์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๋ค๊ฐ์ ์ต๋จ ๊ฒฝ๋ก์ ๊ธธ์ด ๋ฐ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ฉฐ, ๋งค ๋จ๊ณ๋ง๋ค ํด๋น ์ต๋จ ๊ฒฝ๋ก๋ค์ ๊ธธ์ด๋ฅผ ์ ๋ฐ์ดํธํด ๋๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก directed graph๋ฅผ ๊ฐ์ ํ๋ฉฐ undirected graph๋ ๋ ์ ์ ๊ฐ์ ๋ฐฉํฅ์ ๋ชจ๋ ๊ฐ์ง๋ directed graph๋ก ์๊ฐํฉ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ๋ ๋ฌ๋ฆฌ๊ฐ์ค์น๊ฐ ์์์ธ edge๊ฐ ์กด์ฌํ ๋๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํฉ๋๋ค.
โ๏ธ Problem & Subproblem ์ ์
dist(u)๋ฅผ ์ ์ s ์์ u๊น์ง์ ์ค์ ์ต๋จ ๊ฒฝ๋ก์ ๊ธธ์ด๋ผ๊ณ ํ๊ณ dis(i, u)๋ฅผ 'edge๋ฅผ i๊ฐ ์ดํ๋ก ์ฌ์ฉํ๋ฉด์' vertex s ์์ u๋ก ๊ฐ๋ shortest path์ ๊ธธ์ด'๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
โ๏ธ Lemma
๋ชจ๋ i < j์ ๋ํด dist(u) ≤ dist(j, u) ≤ dist(i, u)๊ฐ ์ฑ๋ฆฝํ๋ค.
๋ฐ๋ผ์ G๊ฐ negative cycle(๊ฐ์ค์น์ ํฉ์ด negative๊ฐ ๋๋ cycle)์ด ์์ ์, dist(u) = dist(|V|-1, u)๊ฐ ๋๋ค.
โ๏ธ Recurrence Relation
base case) i = 0์ผ ๋, ์ฆ, dist(0, s) = 0 ๋๋จธ์ง v ∈ V์ ๋ํด์๋ dist(0, v) = ๋ฌดํ๋๋ก ๋ก๋๋ค.
induction step) dis(i, v)๊ฐ ์ฃผ์ด์ก๋ค๊ณ ํ ๋ dis(i, v)๊ฐ ์ฃผ์ด์ก๋ค๊ณ ํ ๋ dis(i + 1, v)๋ฅผ ์ด๋ป๊ฒ ๊ตฌํ ๊น? ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
dist(i, v) > dist(i, u) + w(u, v)๋ฅผ ๋ง์กฑํ๋ ๋ชจ๋ edge(u, v)๋ค ์ค ์ค๋ฅธ์ชฝ ํญ์ ๊ฐ์ฅ ์๊ฒ ๋ง๋๋ edge(u', v)๊ฐ ์๋ค๋ฉด
$$dis(i + 1, v) = dist(i, u') + w(u', v)$$์ ๋๋ค.
ํด๋น edge๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ $dis(i+1, v) = dis(i, v)$์ ๋๋ค.
ํ์ธ์ ์ํด ์์ ๊ทธ๋ํ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
example
์์ ์ ์ s์์ i๊ฐ ์ดํ์ edge๋ฅผ ์ง๋ v์ ๋์ฐฉํ๋ ๊ฒฝ์ฐ์ธ dis(i, v) = 3์ ๋๋ค.
dis(i+1, v)๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ ์ u์ ๋๋ฌํ ๋ dis(i, u) = 5๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
edge(u, v)์ ๊ฐ์ค์น๊ฐ -6์ด๋ผ ํ ๋, $dis(i+1, v) = dis(i, u) + w(u, v) = -1 < dis(i, v)$๋ฅผ ๋ง์กฑํ๋ฏ๋ก ์์ ๊ทธ๋ํ์์ dis(i+1, v) = -1์ด ๋ฉ๋๋ค.
โ๏ธ Algorithm outline
๊ทธ๋ฌ๋ฏ๋ก ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
1. ์๊ณ ๋ฆฌ์ฆ์ ์ด 0 ~ n-1 ์ stage (iteration) ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, i ๋ฒ์งธ stage ๊ฐ ๋๋ ๋๋ง๋ค G ์ ๋ชจ๋ vertex v ์ ๋ํด dist (i, v) ๊ฐ dist (v) ์ ์ ์ฅ๋ฉ๋๋ค (invariant).
2. 0 ๋ฒ์งธ stage ์์๋ ์์ base case ์ ๋ง๊ฒ dist ๊ฐ์ ์ ํด ์ค๋๋ค.
3. ์ดํ i ๋ฒ์งธ stage ๋ง๋ค ๋ชจ๋ edge (u, v) ์ ๋ํด ๋ค์ ์์
์ ๋ฐ๋ณตํฉ๋๋ค.
→ dist (v) > dist(u) + w (u, v) ์ธ ๊ฒฝ์ฐ dist (v) ๋ฅผ dist (u) + w (u, v) ๋ก update
์์ ๊ฐ์ด ๊ฐ์ updateํ ๋๋ ์ด์ ์ updateํ ๊ฐ์ ์ด์ฉํด์ผ๋ง ํ๋ค๋ ๊ฒ์ ๋๋ค.
โ๏ธ ์๋์ฝ๋
์ด๋ฅผ ์๋์ฝ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
โ๏ธ ์ค์ shortest path๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ
์ ์๊ณ ๋ฆฌ์ฆ์์ dis(v)๋ฅผ dis(u) + w(u, v) ๋ก ์ ๋ฐ์ดํธ ํ ๋๋ง๋ค pre(v) = u๋ก ์ค์ ํฉ๋๋ค.
์ค์ ๊ฒฝ๋ก๋ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฃ ํ v์์๋ถํฐ pre(v)๋ฅผ ์ญ์ผ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ์ญ์ถ์ ํ ์ ์์ต๋๋ค.
โ๏ธ Time Complexity
(n ๋ฒ์ stage = $O(n)$) x (๊ฐ stage ๋ง๋ค |E| = m ๊ฐ์ edge๋ฅผ checkํ๋ฉฐ dist ๊ฐ์ update = $O(m)$) = $O(nm)$
๐ Negative Cycle ํ๋ณํ๊ธฐ
Negative cycle์ด ์๋ ๊ฒฝ์ฐ ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ path๊ฐ ์๋ ๊ฐ์ cycle์ ๊ณ์ํด์ ๋๋ walk์ ๊ธธ์ด๋ฅผ retrun ํ๊ฒ ๋ฉ๋๋ค.
์ฝ๊ฒ ๋งํด cycle์ ๋ฌดํ๋ฒ ๋๊ฒ ๋๋ค๋ฉด shortest path๋ -๋ฌดํ๋๊ฐ ๋๋ค๋ ๋ป์ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ค์น edge๊ฐ ์๋ undirected graph ์์๋ ๋์ํ์ง ์๋๋ค.( ์์์ ์ ์ํ๋ฏ undirected ๊ทธ๋ํ๋ ๊ฐ๊ฐ์ ์ ์ ๋ผ๋ฆฌ cycle์ด ์กด์ฌํ๋ directed graph์ ๊ฐ๊ธฐ ๋๋ฌธ)
๋ํ ์์ ์ฑ์ง์ ์ญ์ผ๋ก ์ด์ฉํ์ฌ ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด graph๊ฐ negative cycle์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
Negative Cycle ํ๋ณ๋ฒ
n-1๋ฒ์งธ stageํ, n ๋ฒ์งธ stage๋ฅผ ์ถ๊ฐ๋ก ์ํํ์ฌ dist ๊ฐ์ด update ๋๋ ๊ฒฝ์ฐ negative cycle์ด ์กด์ฌํฉ๋๋ค.
๐์ฆ๋ช
ํด๋ณด์ ํด๋ณด์~
๊ท๋ฅ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค.
