๊ตญ๋ฏผ๋ํ๊ต์์ "์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ" ๊ต์ฌ๋ฅผ ์ด์ฉํ
๋ฐํ๋ช ๊ต์๋์ ๊ฐ์ ๊ต์์ ์ด์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค
Shortest Paths

Shortest Paths๋ ๋ง ๊ทธ๋๋ก ๋ ์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก์
=> ๋ ์ ์ฌ์ด์ ๊ฒฝ๋ก ์ค ๋น์ฉ์ด ์ต์์ธ ๊ฒฝ๋ก
(๊ฒฝ๋ก ๋ด ๊ฐ์ ๋ค์ ๋น์ฉ ํฉ)
Single Source Shortest Paths
๊ทธ๋ผ ์ด๋ฒ ํฌ์คํ ์ ์ฃผ์ ์ธ Single Source Shortest Paths๋ ๋ญ๊น?
์ด๋ ํ ์ ๊ณผ ๋ค๋ฅธ ๋ชจ๋ ์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํจ

=> ์์ ์ ์ (source node) s์์ ๋ค๋ฅธ ๋ชจ๋ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ๊ฐ ๊ณง, s๊ฐ root์ธ shortest-path tree ์ฐพ๊ธฐ์
(์ผ์ข ์ spanning tree๋ผ๊ณ ๋ณผ ์ ์์)
Dijkstra's Algorithm
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ Single Source Shortest Path๋ฅผ ๋ชจ๋ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์
๋จ, ๋ชจ๋ ๊ฐ์ ์ weight๊ฐ 0 ์ด์์ ๊ฐ์ ๊ฐ์ง
(= ์์ ๋ถ๊ฐ)

๋ฐฉ์์ Prim ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ฌํ๋ฐ, ์ ์ ์งํฉ S๋ฅผ ์ ์ง์ ์ผ๋ก ํ์ฅํด๋๊ฐ๋ ๋ฐฉ์์
1. ์์ ์ ์ s๋ง ํฌํจํ๋ ์งํฉ S={s}๋ฅผ ์์ฑ
2. S์ ํฌํจ๋์ง ์์ ์ ์ ์ค s์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ v๋ฅผ ์ฐพ์ S์ ํธ์
=> v์ ์ด์ ๋ ธ๋ ์ ์ฅ (๊ฒฝ๋ก ์ฐพ์ ๋ ํ์ฉ)
์ด์ 2๋ฒ ๊ณผ์ ์ ๋ชจ๋ ์ ์ ์ด S์ ํฌํจ๋ ๋ ๊น์ง ๋ฐ๋ณตํ๋ฉด๋จ
Prim ์๊ณ ๋ฆฌ์ฆ๊ณผ์ ์ฐจ์ด์ ์
Prim์ ์งํฉ S๊น์ง์ ๊ฐ์ ํ๋๋ง ํ์ธํ๋ ๋ฐ๋ฉด ๋ค์ต์คํธ๋ผ๋ ์์ ์ ์ s๊น์ง์ ์ด ๊ฑฐ๋ฆฌ๋ก ๋น๊ตํจ
pseudo ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
# s : ์์ ์ ์ , n : ์ ์ ์
prev = [-1] * n # ์ด์ ์ ์
d = [โ] * n # s์์ ๊ฑฐ๋ฆฌ
d[s] = 0 # ์์ ์ ์ ์ธ s๋ฅผ 0์ผ๋ก ํ๊ณ ๋๋จธ์ง๋ฅผ โ๋ก ์ด๊ธฐํ ํ๋ฉด๋จ
S = set()
Q = min_heap()
Q.enqueue((0, s)) # ์์๋๋ก ๊ฐ์ค์น, node๋ฅผ ์๋ฏธ
while Q is not empty :
w, u = Q.dequeue()
if u in S : continue
S.add(u)
for v, w_uv in neighbors(u) :
if v not in S and d[u] + w_uv < d[v] :
d[v] = d[u] + w_uv
prev[v] = u
Q.enqueue((d[v], v))
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๋ฆฌ

์ต๋จ ๊ฒฝ๋ก์ ๋ถ๋ถ ๊ฒฝ๋ก ์ญ์ ์ต๋จ ๊ฒฝ๋ก์์ ์ด์ฉํจ
P๊ฐ s์ e ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ผ๋ฉด,
s์ ๊ฒฝ๋ก์์ ์ ์ x ์ฌ์ด์ ๊ฒฝ๋ก P1๋ ์ต๋จ ๊ฒฝ๋ก์
=> ๋ง์ผ s์ x์ฌ์ด์ P1๋ณด๋ค ์งง์ P2๊ฐ ์กด์ฌํ๋ค๋ฉด, s์ e ์ฌ์ด์๋ P๋ณด๋ค ์งง์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๊ฒ ๋๋ฏ๋ก ๋ชจ์!
Discussion
- ์๊ฐ ๋ณต์ก๋๋ Heap์ ์ต๋ |E| ๊ฐ์ ๊ฐ์ด ๋ค์ด๊ฐ๊ณ ์ด๋ฅผ ๋ค์ ์ ์ ๊ฐ์์ธ |E| ๋งํผ ๋ฐ๋ณตํ๋ฏ๋ก O(|E|log|E|) ๋ก ๋ณผ ์ ์์ง๋ง
|E| < |V|^2 ์ด๋ฏ๋ก O(|E|log|E|) = O(2|E|log|V|) = O(|E|log|V|) ๋ก ๋ณผ ์ ์์ - ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ greedy algorithm์
=> ๋งค๋ฒ ํ๋ณด ์ค์์ s์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ์ ํํ๋ฏ๋ก - ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ dynamic programming์
=> ๊ฑฐ๋ฆฌ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๊ณ , ๊ธฐ์กด ๊ฑฐ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์๋ก์ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ฏ๋ก

- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ์ ๊ฐ์ค์น์ ์์๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์๋ชป ๋์ํจ
๊ทธ๋ฆผ์ฒ๋ผ ์์ ๊ฐ์ค์น๊ฐ ์๋ 2๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ
- ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ต๋จ๊ฒฝ๋ก๊ฐ ์ ์๋์ง ์๊ณ
- ์์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์์ง๋ง ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ์ด ์กด์ฌํ๋ฉด ์ต๋จ๊ฒฝ๋ก๊ฐ ์์ง๋ง ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ๋ต์ ๋ชป์ฐพ์
- ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ต๋จ๊ฒฝ๋ก๊ฐ ์ ์๋์ง ์๊ณ
Bellman-Ford Algorithm
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ Single Source Shortest Path๋ค์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์
๋ค์ต์คํธ๋ผ์ ๋ค๋ฅด๊ฒ ์์ ๊ฐ์ค์น๋ฅผ ํ์ฉํจ
(์์ ์ฌ์ดํด์ด ์๋ ๊ฒฝ์ฐ๋ ์ค๋ฅ๋ฅผ ๋ฐํ)

๋ฐฉ์์ ๋ชจ๋ ๊ฐ์ ์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํ์ฌ ์์ ์ ์ ์์ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํด ๋๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์
1. ์์ ์ ์ s์ ์ต๋จ๊ฑฐ๋ฆฌ d[s]๋ฅผ 0์ผ๋ก, ๋๋จธ์ง ์ ์ v์ ์ต๋จ๊ฑฐ๋ฆฌ d[v]๋ฅผ ๋ฌดํ๋๋ก ์ด๊ธฐํ
2. ๋ชจ๋ ๊ฐ์ (u, v, w_uv)์ ๋ํด d[v]์ ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์
=> ์ฌ๊ธฐ์ d[v] = min(d[v], d[u] + w_uv)
์ 2๋ฒ ๊ณผ์ ์ |V| - 1ํ ๋ฐ๋ณตํ๋ฉด๋๋๋ฐ
๋ฐ๋ณต์ด ๋๋๊ณ ๋ง์ง๋ง ๊ณผ์ ์ผ๋ก ์์ ์ฌ์ดํด์ด ์๋์ง๋ฅผ ํ์ธํด์ผํจ
์ด๋ d[v] < d[u] + w_uv ์ธ ๊ฐ์ (u, v, w_uv)๊ฐ ์กด์ฌํ๋ฉด ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒ์ผ๋ก ํ๋จํ ์ ์์
(์ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด ์ดํด๊ฐ ์ฌ์)
Discussion
pseudo ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
# s : ์์์ ์ , n : ์ ์ ์, E : ๊ฐ์ ์งํฉ
prev = [-1] * n # ์ด์ ์ ์ (parent pointer tree)
d = [โ] * n # s์์ ๊ฑฐ๋ฆฌ
d[s] = 0
for _ in range(n - 1) :
for (u, v, w_uv) in E :
if d[u] + w_uv < d[v] :
d[v] = d[u] + w_uv # dp์์ ์ ์ ์์
prev[v] = u
for (u, v, w_uv) in E :
if d[u] + w_uv < d[v] :
#์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๋ป
์๊ฐ ๋ณต์ก๋๋ for๋ฌธ์ ๋ณด๋ฉด ์ง๊ด์ ์ผ๋ก ์ ์ ์๋๋ฐ, O(|E| * (|V| - 1)) = O(|V||E|) ์
|V| - 1 ๋ฒ ๋ฐ๋ณตํ๋ ์ด์
๊ฒฝ๋ก์ ํฌํจ๋ ๊ฐ์ ์๋ ์ต๋ |V| - 1๊ฐ ์ด๋ฏ๋ก!
(|V| - 1๊ฐ ๋ณด๋ค ๋ง์ผ๋ฉด ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๋ป์)
์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ
|V| - 1 ํ ์ดํ์๋ ๋ ์งง์์ง๋ ๊ฒฝ๋ก๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ๊ฑด ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๋ป์ด ๋จ
Correctness Analysis

m๋ฒ ๋ฐ๋ณต ํ์๋ ์ต๋ m๊ฐ์ ๊ฐ์ ์ ์ฌ์ฉํด์ ์ป์ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๊ณ์ฐ๋จ
=> ์ต๋จ๊ฒฝ๋ก์ ์ต๋ ๊ธธ์ด๋ |V| - 1 ์ด๋ฏ๋ก |V| - 1ํ ๋ฐ๋ณต์ฐ์ฐ ํ์๋ ๋ชจ๋ ์ ์ ์ ์ด๋ฅด๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๊ณ์ฐ๋จ
'๐ฅ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
L14 - KMP Algorithm (1) | 2024.11.30 |
---|---|
L13 - Topological Sorting (0) | 2024.11.29 |
L11 - Minimum Spanning Trees (0) | 2024.11.26 |
L10 - Disjoint Sets (0) | 2024.11.22 |
L09 - Greedy Algorithms (1) | 2024.11.03 |
๊ตญ๋ฏผ๋ํ๊ต์์ "์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ" ๊ต์ฌ๋ฅผ ์ด์ฉํ
๋ฐํ๋ช ๊ต์๋์ ๊ฐ์ ๊ต์์ ์ด์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค
Shortest Paths

Shortest Paths๋ ๋ง ๊ทธ๋๋ก ๋ ์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก์
=> ๋ ์ ์ฌ์ด์ ๊ฒฝ๋ก ์ค ๋น์ฉ์ด ์ต์์ธ ๊ฒฝ๋ก
(๊ฒฝ๋ก ๋ด ๊ฐ์ ๋ค์ ๋น์ฉ ํฉ)
Single Source Shortest Paths
๊ทธ๋ผ ์ด๋ฒ ํฌ์คํ ์ ์ฃผ์ ์ธ Single Source Shortest Paths๋ ๋ญ๊น?
์ด๋ ํ ์ ๊ณผ ๋ค๋ฅธ ๋ชจ๋ ์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํจ

=> ์์ ์ ์ (source node) s์์ ๋ค๋ฅธ ๋ชจ๋ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ๊ฐ ๊ณง, s๊ฐ root์ธ shortest-path tree ์ฐพ๊ธฐ์
(์ผ์ข ์ spanning tree๋ผ๊ณ ๋ณผ ์ ์์)
Dijkstra's Algorithm
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ Single Source Shortest Path๋ฅผ ๋ชจ๋ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์
๋จ, ๋ชจ๋ ๊ฐ์ ์ weight๊ฐ 0 ์ด์์ ๊ฐ์ ๊ฐ์ง
(= ์์ ๋ถ๊ฐ)

๋ฐฉ์์ Prim ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ฌํ๋ฐ, ์ ์ ์งํฉ S๋ฅผ ์ ์ง์ ์ผ๋ก ํ์ฅํด๋๊ฐ๋ ๋ฐฉ์์
1. ์์ ์ ์ s๋ง ํฌํจํ๋ ์งํฉ S={s}๋ฅผ ์์ฑ
2. S์ ํฌํจ๋์ง ์์ ์ ์ ์ค s์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ v๋ฅผ ์ฐพ์ S์ ํธ์
=> v์ ์ด์ ๋ ธ๋ ์ ์ฅ (๊ฒฝ๋ก ์ฐพ์ ๋ ํ์ฉ)
์ด์ 2๋ฒ ๊ณผ์ ์ ๋ชจ๋ ์ ์ ์ด S์ ํฌํจ๋ ๋ ๊น์ง ๋ฐ๋ณตํ๋ฉด๋จ
Prim ์๊ณ ๋ฆฌ์ฆ๊ณผ์ ์ฐจ์ด์ ์
Prim์ ์งํฉ S๊น์ง์ ๊ฐ์ ํ๋๋ง ํ์ธํ๋ ๋ฐ๋ฉด ๋ค์ต์คํธ๋ผ๋ ์์ ์ ์ s๊น์ง์ ์ด ๊ฑฐ๋ฆฌ๋ก ๋น๊ตํจ
pseudo ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
# s : ์์ ์ ์ , n : ์ ์ ์
prev = [-1] * n # ์ด์ ์ ์
d = [โ] * n # s์์ ๊ฑฐ๋ฆฌ
d[s] = 0 # ์์ ์ ์ ์ธ s๋ฅผ 0์ผ๋ก ํ๊ณ ๋๋จธ์ง๋ฅผ โ๋ก ์ด๊ธฐํ ํ๋ฉด๋จ
S = set()
Q = min_heap()
Q.enqueue((0, s)) # ์์๋๋ก ๊ฐ์ค์น, node๋ฅผ ์๋ฏธ
while Q is not empty :
w, u = Q.dequeue()
if u in S : continue
S.add(u)
for v, w_uv in neighbors(u) :
if v not in S and d[u] + w_uv < d[v] :
d[v] = d[u] + w_uv
prev[v] = u
Q.enqueue((d[v], v))
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๋ฆฌ

์ต๋จ ๊ฒฝ๋ก์ ๋ถ๋ถ ๊ฒฝ๋ก ์ญ์ ์ต๋จ ๊ฒฝ๋ก์์ ์ด์ฉํจ
P๊ฐ s์ e ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ผ๋ฉด,
s์ ๊ฒฝ๋ก์์ ์ ์ x ์ฌ์ด์ ๊ฒฝ๋ก P1๋ ์ต๋จ ๊ฒฝ๋ก์
=> ๋ง์ผ s์ x์ฌ์ด์ P1๋ณด๋ค ์งง์ P2๊ฐ ์กด์ฌํ๋ค๋ฉด, s์ e ์ฌ์ด์๋ P๋ณด๋ค ์งง์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๊ฒ ๋๋ฏ๋ก ๋ชจ์!
Discussion
- ์๊ฐ ๋ณต์ก๋๋ Heap์ ์ต๋ |E| ๊ฐ์ ๊ฐ์ด ๋ค์ด๊ฐ๊ณ ์ด๋ฅผ ๋ค์ ์ ์ ๊ฐ์์ธ |E| ๋งํผ ๋ฐ๋ณตํ๋ฏ๋ก O(|E|log|E|) ๋ก ๋ณผ ์ ์์ง๋ง
|E| < |V|^2 ์ด๋ฏ๋ก O(|E|log|E|) = O(2|E|log|V|) = O(|E|log|V|) ๋ก ๋ณผ ์ ์์ - ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ greedy algorithm์
=> ๋งค๋ฒ ํ๋ณด ์ค์์ s์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ์ ํํ๋ฏ๋ก - ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ dynamic programming์
=> ๊ฑฐ๋ฆฌ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๊ณ , ๊ธฐ์กด ๊ฑฐ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์๋ก์ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ฏ๋ก

- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ์ ๊ฐ์ค์น์ ์์๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์๋ชป ๋์ํจ
๊ทธ๋ฆผ์ฒ๋ผ ์์ ๊ฐ์ค์น๊ฐ ์๋ 2๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ
- ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ต๋จ๊ฒฝ๋ก๊ฐ ์ ์๋์ง ์๊ณ
- ์์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์์ง๋ง ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ์ด ์กด์ฌํ๋ฉด ์ต๋จ๊ฒฝ๋ก๊ฐ ์์ง๋ง ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ๋ต์ ๋ชป์ฐพ์
- ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ต๋จ๊ฒฝ๋ก๊ฐ ์ ์๋์ง ์๊ณ
Bellman-Ford Algorithm
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ Single Source Shortest Path๋ค์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์
๋ค์ต์คํธ๋ผ์ ๋ค๋ฅด๊ฒ ์์ ๊ฐ์ค์น๋ฅผ ํ์ฉํจ
(์์ ์ฌ์ดํด์ด ์๋ ๊ฒฝ์ฐ๋ ์ค๋ฅ๋ฅผ ๋ฐํ)

๋ฐฉ์์ ๋ชจ๋ ๊ฐ์ ์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํ์ฌ ์์ ์ ์ ์์ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํด ๋๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์
1. ์์ ์ ์ s์ ์ต๋จ๊ฑฐ๋ฆฌ d[s]๋ฅผ 0์ผ๋ก, ๋๋จธ์ง ์ ์ v์ ์ต๋จ๊ฑฐ๋ฆฌ d[v]๋ฅผ ๋ฌดํ๋๋ก ์ด๊ธฐํ
2. ๋ชจ๋ ๊ฐ์ (u, v, w_uv)์ ๋ํด d[v]์ ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์
=> ์ฌ๊ธฐ์ d[v] = min(d[v], d[u] + w_uv)
์ 2๋ฒ ๊ณผ์ ์ |V| - 1ํ ๋ฐ๋ณตํ๋ฉด๋๋๋ฐ
๋ฐ๋ณต์ด ๋๋๊ณ ๋ง์ง๋ง ๊ณผ์ ์ผ๋ก ์์ ์ฌ์ดํด์ด ์๋์ง๋ฅผ ํ์ธํด์ผํจ
์ด๋ d[v] < d[u] + w_uv ์ธ ๊ฐ์ (u, v, w_uv)๊ฐ ์กด์ฌํ๋ฉด ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒ์ผ๋ก ํ๋จํ ์ ์์
(์ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด ์ดํด๊ฐ ์ฌ์)
Discussion
pseudo ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
# s : ์์์ ์ , n : ์ ์ ์, E : ๊ฐ์ ์งํฉ
prev = [-1] * n # ์ด์ ์ ์ (parent pointer tree)
d = [โ] * n # s์์ ๊ฑฐ๋ฆฌ
d[s] = 0
for _ in range(n - 1) :
for (u, v, w_uv) in E :
if d[u] + w_uv < d[v] :
d[v] = d[u] + w_uv # dp์์ ์ ์ ์์
prev[v] = u
for (u, v, w_uv) in E :
if d[u] + w_uv < d[v] :
#์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๋ป
์๊ฐ ๋ณต์ก๋๋ for๋ฌธ์ ๋ณด๋ฉด ์ง๊ด์ ์ผ๋ก ์ ์ ์๋๋ฐ, O(|E| * (|V| - 1)) = O(|V||E|) ์
|V| - 1 ๋ฒ ๋ฐ๋ณตํ๋ ์ด์
๊ฒฝ๋ก์ ํฌํจ๋ ๊ฐ์ ์๋ ์ต๋ |V| - 1๊ฐ ์ด๋ฏ๋ก!
(|V| - 1๊ฐ ๋ณด๋ค ๋ง์ผ๋ฉด ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๋ป์)
์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ
|V| - 1 ํ ์ดํ์๋ ๋ ์งง์์ง๋ ๊ฒฝ๋ก๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ๊ฑด ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ๋ป์ด ๋จ
Correctness Analysis

m๋ฒ ๋ฐ๋ณต ํ์๋ ์ต๋ m๊ฐ์ ๊ฐ์ ์ ์ฌ์ฉํด์ ์ป์ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๊ณ์ฐ๋จ
=> ์ต๋จ๊ฒฝ๋ก์ ์ต๋ ๊ธธ์ด๋ |V| - 1 ์ด๋ฏ๋ก |V| - 1ํ ๋ฐ๋ณต์ฐ์ฐ ํ์๋ ๋ชจ๋ ์ ์ ์ ์ด๋ฅด๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๊ณ์ฐ๋จ
'๐ฅ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
L14 - KMP Algorithm (1) | 2024.11.30 |
---|---|
L13 - Topological Sorting (0) | 2024.11.29 |
L11 - Minimum Spanning Trees (0) | 2024.11.26 |
L10 - Disjoint Sets (0) | 2024.11.22 |
L09 - Greedy Algorithms (1) | 2024.11.03 |