Single Source Shortest Path Algorithms
๐ก ๋จ์ผ์ถ๋ฐ์ง ์ต๋๊ฒฝ๋ก(SSP) : ํ๋์ ์ถ๋ฐ์ ์์ ๊ฐ ์ ์ ๊น์ง ๋๋ฌํ๋๋ฐ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋๊ฒ
๐ป
๐v1์์ v4๋ก ๊ฐ๋ ค๋ฉด ๋ ๊ฐ์ง์ ๊ฒฝ๋ก๊ฐ ์กด์ฌ
- v1 -> v2 -> v4
- v1 -> v2์ ๋น์ฉ์ย 5์ด๊ณ , v2 -> v4์ ๋น์ฉ์ 2์ด๋ฏ๋กย 5 + 2 = 7
- v1 -> v3 -> v4
- v1 -> v3์ ๋น์ฉ์ย 3์ด๊ณ , v3 -> v4์ ๋น์ฉ์ 9์ด๋ฏ๋ก 3 + 9 = 12
โ ๋ ๊ฒฝ๋ก ์ค ๋น์ฉ์ด ์ ์ 1๋ฒ์ ์ ํํ๋ ๊ฒ์ด v1์์ v4์ ์ต๋จ ๊ฒฝ๋ก
โ ์ต๋จ ๊ฒฝ๋ก๋ย ์ง์ ์ ์ ๊น์ง์ ๊ฒฝ๋ก ๋น์ฉ์ ์ํฅ์ ๋ฐ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๐Negative-Weight Edges (์์ ๊ฐ์ค์น)
- ์์ ๊ฐ์ค์น๋ฅผ ํ์ฉํ์ฌ SSP๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ย Bellman-Fordย ์๊ณ ๋ฆฌ์ฆ
- ์์ ๊ฐ์ค์น๋ฅผ ํ์ฉํ์ง ์๊ณ SSP๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ย Dijkstraโsย ์๊ณ ๋ฆฌ์ฆ
Relaxation
- d[v] ๋ฅผ ์ ์ v๊น์ง์ย ์ต๋จ ๊ฒฝ๋ก ์ถ์ ๊ฐ, ฮด(s, v)๋ฅผ ์ ์ s์์ v๊น์ง์ย ์ค์ ์ต๋จ๊ฒฝ๋ก ๋น์ฉ ์ด๋ผ๊ณ ํ ๋,
Relaxation์ด๋ d[v]๊ฐ์ด ฮด(s, v)์ ์ํ์ด ๋๋๋ก ์ ์งํ๋ ๊ฒ์ ๋งํ๋ค.
- d[v]๋ฅผ ์กฐ์ ํ๋ฉด์ ๋๋ฌํด์ผ ํ ๋ชฉ์ ์ง = ฮด(s, v)
- d[v]๋ฅผ ์กฐ์ ํ๋ ํจ์ : Relax
๐ป
โ Original : d[v2]=9 (SSP๋ฅผ ์งํํ๋ฉด์ ์ป์ ์ต๋จ๊ฒฝ๋ก ์ถ์ ๊ฐ)
โ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ด์ ์ ์ ( v1 )๊น์ง์ ๊ฒฝ๋ก ๋น์ฉ๊ณผ ์ฐ๊ฒฐ๋ ๊ฐ์ค์น์ ๋น์ฉ์ ๋ํ๋ ๊ฒ
โ ๊ทธ๋์ d[v1]์ดย 5์ด๊ณ , ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ 2์ด๋ฏ๋ก d[v2]๋ 7.
โ ๊ธฐ์กด์ ์ถ์ ๊ฐ 9๋ณด๋ค ๋ ์์ ๋น์ฉ์ด๋ฏ๋ก d[v2]๋ฅผย 7๋ก ๋ณ๊ฒฝ
โ ์ด๋ ๊ฒ ๋น๊ต ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ Relax ๋ผ๊ณ ํ๋ค.
- Relax๋ย ๋ชฉ์ ์ง ์ ์ ( v2 )์ ์ถ์ ๊ฐ๊ณผ ์ง์ ์ ์ ( v1 )์ ์ถ์ ๊ฐ +ย ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๋น๊ตํด์
๋ชฉ์ ์ง ์ ์ ์ ์ถ์ ๊ฐ์ ์กฐ์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์ถ์ ๊ฐ์ ๋ณ๊ฒฝ์ํฌ ์๋ ์๊ณ , ์ํ ์๋ ์๋ค.
Bellman-Ford ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฉํฅ ๊ทธ๋ํ, ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ทธ๋ํ์์ SSP๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋ชฉ์
- ํ์ง๋ง ๊ฐ์ ์ด ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ ์ด ์ํ๊ตฌ์กฐ๋ฅผ ๋๋ ๊ฒฝ์ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๋ค.
- v2 โ v3์ ๊ฐ์ค์น 2๋ณด๋ค v3 -> v2์ ๊ฐ์ค์น -4๊ฐ ์ ๋๊ฐ์ด ๋ ํฌ๋ฏ๋ก,
์ด ์ํ๊ตฌ์กฐ๋ก d[v2], d[v3] = oo ๊ฐ ๋๊ณ , d[v4]๋ oo ๊ฐ ๋์ด ๊ฒฐ๊ตญ v1โv4์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๊ฒ ๋๋ค.
-
๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ SSP๋ฅผ ๊ตฌํ ์ ์์์ ๋ฌผ๋ก , ์์ ๊ฐ์ด ์ต๋จ๊ฒฝ๋ก์ ๋๋ฌํ ์ ์์์ false๋ฅผ ๋ฐํํจ์ผ๋ก์จ ํํํ ์ ์๋ค.
- ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ ์ ๊ฐ์๋งํผ ๋ชจ๋ ๊ฐ์ ์ Relaxํ๋ ์์ ์ ์ํ(์๊ฐ๋ณต์ก๋ ๋์)
- ์๊ฐ๋ณต์ก๋๊ฐ ๋์์๋ ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ด์ : ์ ํ์ฑ
- ์์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์ ๋จ์ผ ์ถ๋ฐ์ง ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๊ณ , ๊ทธ๋ํ๊ฐ ์์ ์ํ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค๋ฉด ์ด๋ฅผ ์๋ณํ ์ ์๋ค.
๐ป
โ ์ ์ v1์ ๋ํด ๋ชจ๋ ๊ฐ์ ์ Relax๋ฅผ ํ์. ์ด์ ๋ค์ ์ ์ ์ ์ ํํ์ฌ ๋ ๋ชจ๋ ๊ฐ์ ์ Relax๋ฅผ ์ํํ๋ค.
- Bellman-Ford ์๊ณ ๋ฆฌ์ฆ์ ์ ์ ์ ๊ฐ์๋งํผ ๋ชจ๋ ๊ฐ์ ์ Relaxํ๊ธฐ ๋๋ฌธ์ ์์ฒญ๋ ์ฐ์ฐ์ด ์ํ๋จ
- ๊ฐ์ SSP ์๊ณ ๋ฆฌ์ฆ์ธ Dijkstraโs ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ์ ๋ํด SSP๋ฅผ ๊ตฌํ ์ ์๋ค.
- ์๊ฐ๋ณต์ก๋
- ์ด๊ธฐํ ์์ : ฮ(V)
-
์์ ์ํ๊ตฌ์กฐ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐ๋ณต๋ฌธ : ฮ( E ) - ๋ฐ๋ผ์ ฮ(VE)
Dykstraโs ์๊ณ ๋ฆฌ์ฆ
- ์ต์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํด์ ํ๋์ ์ ์ ์ผ๋ก๋ถํฐ ์ธ์ ํ ๊ฐ์ ๋ค์ ํ์ฅํด ๋๊ฐ๋ ๋ฐฉ์
- Dijkstraโs ์๊ณ ๋ฆฌ์ฆ์ ๋จผ์ ๋ชจ๋ ์ ์ ๋ค์ ์ต์ ์ฐ์ ์์ ํ์ ์ฝ์ ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ต๋จ ๊ฒฝ๋ก ๊ฐ์ค์น ๊ฐ( d[v] )์ด ๊ฐ์ฅ ์์ ์ ์ ์ ์ ํํ์ฌ ์ธ์ ๊ฐ์ ๋ค์ ๋ํด Relax๋ฅผ ์ํํ์ฌ,
์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ๋น์ฉ์ ๊ณ์ฐํฉ๋๋ค.
๐ป
-
๋ชจ๋ ์ ์ ๋ค์ ์ต์์ฐ์ ์์ํ์ ์ฝ์ ํ๋ค.
-
์ต๋จ ๊ฒฝ๋ก ๊ฐ์ค์น ๊ฐ ( d[v] )์ด ๊ฐ์ฅ ์์ ์ ์ ์ ์ ํํด ์ธ์ ๊ฐ์ ๋ค์ ๋ํด Relax๋ฅผ ์ํํ์ฌ,
์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋น์ฉ์ ๊ณ์ฐํ๋ค.
Dijkstraโs Algorithm Example
์์ ์ ์ ์ 0์ผ๋ก ์ก๊ณ , ๊ฐ ์ง์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ํ์.
์ง์ ์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌดํ๋๋ก ํ์.
ํ์ ๋์ด ์๋ ๊ฑฐ๋ฆฌ ์ค ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ ์ ์ 4๊น์ง์ ๊ฑฐ๋ฆฌ์ธ 3์ด๋ฏ๋ก ์ ์ 4๋ฅผ ์งํฉ S์ ์ถ๊ฐ์์ผ์ค๋ค.
์๋ก์ด ์ ์ ์ด S์ ์ถ๊ฐ๋๋ฉด ๋ค๋ฅธ ์ ์ ๋ค์ distance ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
0๋ฒ ์ ์ ์์๋ ์ง์ ์ ์ผ๋ก ๊ฐ ์ ์๋ ์ ์ ์ ์๋กญ๊ฒ ๋ค์ด์จ ์ ์ 4๋ฅผ ํตํด
์ง์ ์ ์ผ๋ก ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌดํ๋์ ๊ฐ์์ ๊ตฌ์ฒด์ ์ธ ์ ์๊ฑฐ๋ฆฌ๋ก ์ ๋ณด๊ฐ ๊ฐฑ์ ๋๋ค.
๋ํ ์๋ก์ด ์ ์ 4๋ฅผ ํตํด ๊ฐ ๋ ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ๋ฐ๊ฒฌ ๋๋ค๋ฉด ๊ทธ ์ ๋ณด ๋ํ ๊ฐฑ์ ์ ํด์ค๋ค.
๊ฐฑ์ ๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์งํฉ S์ ์ถ๊ฐํ ๋ค์ ์ ์ ์ ์ ํ. ๋จ์ ์ ์ ์ค ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ์ ์ 1์ S์ ์ถ๊ฐํ๊ณ ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ๋ค.
1๋ฒ ์ ์ ์ ์ถ๊ฐํจ์ผ๋ก์จ 2๋ฒ ์ ์ ๊น์ง ์ง์ ์ ์ผ๋ก ๊ฐ ์ ์๊ฒ ๋์์ผ๋ฏ๋ก
๋ฌดํ๋์ ๊ฐ์์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ค์น์ธ 9๋ก ์์ ํด์ค๋ค. ํ์ฌ๊น์ง์ distance ๋ฐฐ์ด๊ฐ์ ๊ธฐ์ค์ผ๋ก
๊ฐ์ฅ ์์ ๊ฐ์ 6๋ฒ ์ ์ ์ 8์ด๋ฏ๋ก, 6๋ฒ ์ ์ ์ ํํ๋ค.
6๋ฒ ์ ์ ์ ์งํฉ S์ ์ถ๊ฐํจ์ผ๋ก์จ ๊ฐฑ์ ํ ์ ์๋ ์ ๋ณด๋ ์ ์ 3๊น์ง์ ๊ฑฐ๋ฆฌ.
๋ค์ ํํ ์ ์ ์ ์ ์ 2
์ ์ 2๋ฅผ ์งํฉ S์ ์ถ๊ฐํจ์ผ๋ก์จ ์ ์ 3๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐฑ์ ๋์๋ค.
๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์ ์ 5๋ฒ ์ ์ ์ ์ ํํ๊ณ , ๊ฐฑ์ ํ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๊ฐฑ์ ํ๋ค.
๊ทธ ๋ค์์ ๋ง์ง๋ง ์ ์ ์ธ 3๋ฒ ์ ์ ์ ํํ๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฌํ ์์์ ์๋ฆฌ๋ก ์งํ ๋๋ค.
import heapq
import sys
def dijkstra(start):
# ์ด๊ธฐ ๋ฐฐ์ด ์ค์
distances = {node: sys.maxsize for node in graph}
# ์์ ๋
ธ๋์ ๊ฑฐ๋ฆฌ๋ 0์ผ๋ก ์ค์
distances[start] = 0
queue = []
# ์์ ๋
ธ๋๋ถํฐ ํ์ ์์ ํ๊ธฐ ์ํจ. (๊ฑฐ๋ฆฌ, ๋
ธ๋) - ๊ฑฐ๋ฆฌ, ๋
ธ๋ ์์ผ๋ก ๋ฃ์ ์ด์ ๋ heapq ๋ชจ๋์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ ์งํํ๊ธฐ ๋๋ฌธ (๋
ธ๋, ๊ฑฐ๋ฆฌ) ์์ผ๋ก ๋ฃ์ผ๋ฉด ์ต์ ํ์ด ์์ํ๋๋ก ์ ๋ ฌ๋์ง ์์
heapq.heappush(queue, (distances[start], start))
# ์ฐ์ ์์ ํ์ ๋ฐ์ดํฐ๊ฐ ํ๋๋ ์์ ๋๊น์ง ๋ฐ๋ณต
while queue:
# ๊ฐ์ฅ ๋ฎ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ๋
ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ์ถ
current_distance, node = heapq.heappop(queue)
# ํ์ด์ฌ heapq์ (๊ฑฐ๋ฆฌ, ๋
ธ๋) ์์ผ๋ก ๋ฃ๋ค ๋ณด๋๊น ๋์ผํ ๋
ธ๋๋ผ๋ ํ์ ์ ์ฅ์ด ๋๋ค ์์: queue[(7, 'B'), (10, 'B')]
# ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ด๋ฏธ ๊ณ์ฐ๋์ด ์ ์ฅํ ๊ฑฐ๋ฆฌ์ ์ถ์ถ๋ ๊ฑฐ๋ฆฌ์ ๋น๊ตํ์ฌ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์๋ค๋ฉด ๋น๊ตํ์ง ์๊ณ ํ์ ๋ค์ ๋ฐ์ดํฐ๋ก ๋์ด๊ฐ๋ค.
if distances[node] < current_distance:
continue
# ๋์์ธ ๋
ธ๋์์ ์ธ์ ํ ๋
ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ์ํ
for adjacency_node, distance in graph[node].items():
# ํ์ฌ ๋
ธ๋์์ ์ธ์ ํ ๋
ธ๋๋ฅผ ์ง๋๊ฐ ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํจ
weighted_distance = current_distance + distance
# ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ๋ณด๋ค ์์ ๊ฐ์ค์น๊ฐ ๋ ์์ผ๋ฉด ํด๋น ๋
ธ๋์ ๊ฑฐ๋ฆฌ ๋ณ๊ฒฝ
if weighted_distance < distances[adjacency_node]:
# ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ๋ณด๋ค ๊ฐ์ค์น๊ฐ ๋ ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ
distances[adjacency_node] = weighted_distance
# ๋ค์ ์ธ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ ํ๊ธฐ ์ํด ์ฐ์ ์์ ํ์ ์ฝ์
(๋
ธ๋๊ฐ ๋์ผํด๋ ์ผ๋จ ๋ค ์ ์ฅํจ)
heapq.heappush(queue, (weighted_distance, adjacency_node))
return distances
graph = {
'A': {'B': 10, 'C': 3},
'B': {'C': 1, 'D': 2},
'C': {'B': 4, 'D': 8, 'E': 2},
'D': {'E': 7},
'E': {'D': 9},
}
result = dijkstra('A')
print(result)
# {'A': 0, 'B': 7, 'C': 3, 'D': 9, 'E': 5}
#์ถ์ฒ:https://brownbears.tistory.com/554
[์ถ์ฒ]