[ํ์ด์ฌ/python] ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ (Dijkstra Algorithm)
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์์ ์ ์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ทธ๋ํ์์ ์ฃผ์ด์ง ์์ ๋ ธ๋์ ๋ํด์ ๋ค๋ฅธ ์ ์ ๊ฐ์ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋๋ค.
์ฆ, u์์ v๋ก ๊ฐ ๋ ๊ฒฝ๋ก ์ค ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์๊ฐ ๋๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ค ํ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋
๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๊ฐ ๊ฒฐ์ ๋๋ฉด ๋ฉ์ถ๋ ์์ผ๋ก ์ฌ์ฉํ๋ค.
ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๊ธฐ
์์ ๊ฐ์ ๊ทธ๋ํ์ด๊ณ ์์๋ ธ๋๊ฐ 1์ผ ๋,
์์๋ ธ๋ : [(๋์ฐฉ๋ ธ๋, ๊ฐ์ค์น)] ํ์์ผ๋ก ๋์ ๋๋ฆฌ๋ฅผ ๋ง๋ค๋ฉด ์๋์ ๊ฐ๋ค
n = 1
graph = { 1: [(2,2), (3,3)],
2: [(3,4), (4,5)],
3: [(4,6)],
5: [(1,1)]
}
๊ฐ ์ ์ ์ ๋ํ ์์๋ ธ๋๋ถํฐ ํด๋น ์ ์ ๊น์ง์ ๊ฐ์ค์น ํฉ์ ์ ์ฅํ point ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค.
ํด๋น ๋ฆฌ์คํธ์ ์ด๊ธฐ๊ฐ์ ๋ฌดํํ ๊ฐ์ผ๋ก 1e9๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
INF = int(1e9)
point = [INF]*(5+1) # ๋ชจ๋ ์ ์ ๊ณผ ๊ฐ์ ์ธ๋ฑ์ค๊ฐ ์๋๋ก ์ ์ ๊ฐ์ + 1 ๋งํผ ๋ง๋ฆ
point๋ฅผ ํ๋ก ๊ทธ๋ ค๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
์ธ๋ฑ์ค ๋ฒํธ์ ์ ์ ๋ฒํธ๊ฐ ๊ฐ๊ฒ ํ๊ธฐ ์ํด ํ์นธ ๋ ํฐ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ธ๋ฑ์ค 0์ ์ฌ์ฉํ์ง์๋๋ค.
์ ์ (์ธ๋ฑ์ค) | 0 | 1 | 2 | 3 | 4 | 5 |
point | INF | INF | INF | INF | INF | INF |
dijkstra ์๊ณ ๋ฆฌ์ฆ์ heapq๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ๊ตฌํํ์๋ค.
import heapq
def dijkstra(n):
queue = []
point[n] = 0
heapq.heappush(queue, (0, n))
while queue:
c, now = heapq.heappop(queue)
if point[now] < c:
continue
for node in graph[now]:
cost = c + node[1]
if cost < point[node[0]]:
point[node[0]] = cost
heapq.heappush(queue, (cost, node[0]))
queue๋ ํ์ํ ๋ ธ๋๋ค์ (๊ฐ์ค์น ํฉ, ์ ์ ) ์์ด ๋ค์ด๊ฐ ๋ฆฌ์คํธ์ด๋ค.
n์ ์์๋ ธ๋๋ก์จ ๊ฐ์ค์น ํฉ์ธ point[n]์ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
heapq๋ฅผ ์ด์ฉํ์ฌ queue์ ์ฒซ๋ฒ์จฐ๋ก ํ์ํ ๋ ธ๋์ n์ ๋ํ (๊ฐ์ค์น ํฉ, ์ ์ )์ธ (0,n)์ ๋ฃ๋๋ค.
queue์ ํ์ํ ๋ ธ๋๊ฐ ์๋๋์ ๋ฐ๋ณต๋๋ค.
heapq๋ฅผ ์ด์ฉํ์ฌ queue์ ์๋ ๊ฐ์ ๊บผ๋ด c, now์ ๋ฃ๋๋ค.
c์๋ ์ด์ ๋ ธ๋๊น์ง์ ๊ฐ์ค์น ํฉ์ด, now์๋ ํ์ฌ ๋ ธ๋๊ฐ ์ ์ฅ๋์ด ์๋ค.
๋ง์ฝ ํ์ฌ ๋ ธ๋๊น์ง์ ๊ฐ์ค์น ํฉ point[now]๊ฐ ์ด์ ๋ ธ๋๊น์ง์ ๊ฐ์ค์น ํฉ c ๋ณด๋ค ์๋ค๋ฉด
c์์ now๋ก ๊ฐ๋ ๊ฐ์ค์น ํฉ์ ๋ํด๋ณผ ํ์์์ด ์ด์ฐจํผ point[now]๊ฐ ์์ผ๋ฏ๋ก ์๋ ๋ด์ฉ์ ์คํํ์ง์๋๋ค.
๋ง์ฝ point[now]๊ฐ c๋ณด๋ค ํฌ๋ค๋ฉด now์์ ์ฐ๊ฒฐ๋๋ ์ ์ ๋ค์ graph[now]๋ฅผ ํตํด ์ดํด๋ณธ๋ค.
node[0]์๋ ์ฐ๊ฒฐ๋๋ ์ ์ ์ ๋ฒํธ๊ฐ, now[1]์๋ ํด๋น ์ ์ ์ผ๋ก ๊ฐ๋๋ฐ์ ๊ฐ์ค์น๊ฐ ๋ค์ด์์ ๊ฒ์ด๋ค.
cost์ ์ด์ ๋ ธ๋๊น์ง์ ๊ฐ์ค์น ํฉ + node[0]์ผ๋ก ๊ฐ๋๋ฐ์ ๊ฐ์ค์น๋ฅผ ๋ํด ์ ์ฅํ๋ค.
๋ง์ฝ cost๊ฐ ์๋ ๋ค์ด์๋ cost[0]์ ๋ํ ๊ฐ์ค์น ํฉ์ธ point[node[0]]๋ณด๋ค ์๋ค๋ฉด
point[node[0]]๋ฅผ cost๋ก ๊ฐฑ์ ํด์ฃผ๊ณ
๋ค์์ ํ์ํ๊ธฐ ์ํด heapq๋ฅผ ์ด์ฉํ์ฌ queue์ cost์ node[0]์ ์ ์ฅํด์ค๋ค.
์์ ๊ธ๋ก ๋ ์ค๋ช ์ด ์ดํด๊ฐ ์๋๋ค๋ฉด ์๋์ ์์๋ฅผ ์ดํด๋ณธ๋ค.
์ฐ์ ์์ ๋ ธ๋ 1์ ๋ํ point ๊ฐ์ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ ์์ํ๋ค.
queue์๋ 1๊น์ง์ ๊ฐ์ค์น ํฉ 0, ์ ์ 1์ ์ ์ฅํ๋ค.
์ ์ (์ธ๋ฑ์ค) | 0 | 1 | 2 | 3 | 4 | 5 |
point | INF | 0 | INF | INF | INF | INF |
queue์ ๋ค์ด์๋ ๊ฐ (0,1)์ ํ์ธํ๋ค.
point[1]์ด 0์ผ๋ก ์ฝ๋์ c์ ๊ฐ์ผ๋ฏ๋ก for๋ฌธ์ ์คํํ ๊ฒ์ด๋ค.
graph[now]๋ฅผ ํตํด 1๊ณผ ์ฐ๊ฒฐ๋ ์ ์ 2=(2,2)์ 3=(3,3)์ ํ์ํ๋ค.
(2,2)์ ๊ฒฝ์ฐ,
์ด์ ๋ ธ๋ 1๊น์ง ๊ฐ๋๋ฐ์ ๋ํ ๊ฐ์ค์น๊ฐ 0์ด๋ฏ๋ก 2๊น์ง์ ๊ฐ์ค์น ํฉ cost๋ ๊ทธ๋๋ก 2๊ฐ ๋๋ค.
cost=2๋ ๊ธฐ์กด์ ๋ค์ด์๋ point[2]์ ๊ฐ INF๋ณด๋ค ์์ผ๋ฏ๋ก point๋ฅผ ๊ฐฑ์ ํ๋ค.
์ ์ (์ธ๋ฑ์ค) | 0 | 1 | 2 | 3 | 4 | 5 |
point | INF | 0 | 2 | INF | INF | INF |
๊ทธ๋ฆฌ๊ณ queue์ 2๊น์ง์ cost 2์ ์ ์ 2๋ฅผ ์ ์ฅํ๋ค. = (2,2)
(3,3)์ ๊ฒฝ์ฐ,
๋ง์ฐฌ๊ฐ์ง๋ก ์ด์ ๋ ธ๋ 1๊น์ง ๊ฐ๋๋ฐ์ ๋ํ ๊ฐ์ค์น๊ฐ 0์ด๋ฏ๋ก 3๊น์ง์ ๊ฐ์ค์น ํฉ cost๋ 3์ด ๋๋ค.
cost=3์ ๊ธฐ์กด์ ๋ค์ด์๋ point[3]์ ๊ฐ INF๋ณด๋ค ์์ผ๋ฏ๋ก point๋ฅผ ๊ฐฑ์ ํ๋ค.
์ ์ (์ธ๋ฑ์ค) | 0 | 1 | 2 | 3 | 4 | 5 |
point | INF | 0 | 2 | 3 | INF | INF |
๊ทธ๋ฆฌ๊ณ queue์ 3๊น์ง์ cost 3๊ณผ ์ ์ 3์ ์ ์ฅํ๋ค. = (3,3)
queue์ ๋ค์ด์๋ ๋ค์ ๊ฐ (2,2)๋ฅผ ํ์ธํ๋ค.
point[2]๊ฐ 2๋ก ์ฝ๋์ c์ธ 2์ ๊ฐ์ผ๋ฏ๋ก for๋ฌธ์ ์คํํ ๊ฒ์ด๋ค.
graph[now]๋ฅผ ํตํด 2์ ์ฐ๊ฒฐ๋ ์ ์ 3=(3,4)์ 4=(4,5)๋ฅผ ํ์ํ๋ค.
(3,4)์ ๊ฒฝ์ฐ,
์ด์ ๋ ธ๋ 2๊น์ง ๊ฐ๋๋ฐ์ ๋ํ ๊ฐ์ค์น๊ฐ 2์ด๋ฏ๋ก 3๊น์ง์ ๊ฐ์ค์น ํฉ cost๋ 6์ด ๋๋ค.
cost=6์ ๊ธฐ์กด์ ๋ค์ด์๋ point[3]์ ๊ฐ 3๋ณด๋ค ํฌ๋ฏ๋ก point๋ฅผ ๊ฐฑ์ ํ์ง ์๋๋ค.
(4,5)์ ๊ฒฝ์ฐ
์ด์ ๋ ธ๋ 2๊น์ง ๊ฐ๋๋ฐ์ ๋ํ ๊ฐ์ค์น๊ฐ 2์ด๋ฏ๋ก 4๊น์ง์ ๊ฐ์ค์น์ ํฉ cost๋ 7์ด ๋๋ค.
cost=7์ ๊ธฐ์กด์ ๋ค์ด์๋ point[4]์ ๊ฐ INF๋ณด๋ค ์์ผ๋ฏ๋ก point๋ฅผ ๊ฐฑ์ ํ๋ค.
์ ์ (์ธ๋ฑ์ค) | 0 | 1 | 2 | 3 | 4 | 5 |
point | INF | 0 | 2 | 3 | 7 | INF |
๊ทธ๋ฆฌ๊ณ queue์ 4๊น์ง์ cost 7๊ณผ ์ ์ 4๋ฅผ ์ ์ฅํ๋ค. = (7,4)
queue์ ๋ค์ด์๋ ๋ค์ ๊ฐ (3,3)์ ํ์ธํ๋ค.
point[3]์ด 3์ผ๋ก ์ฝ๋์ c์ธ 3๊ณผ ๊ฐ์ผ๋ฏ๋ก for๋ฌธ์ ์คํํ ๊ฒ์ด๋ค.
graph[now]๋ฅผ ํตํด 3๊ณผ ์ฐ๊ฒฐ๋ ์ ์ 4=(4,6)์ ํ์ํ๋ค.
(4,6)์ ๊ฒฝ์ฐ,
์ด์ ๋ ธ๋ 3๊น์ง ๊ฐ๋๋ฐ์ ๋ํ ๊ฐ์ค์น๊ฐ 3์ด๋ฏ๋ก 4๊น์ง์ ๊ฐ์ค์น ํฉ cost๋ 9๊ฐ ๋๋ค.
cost=9๋ ๊ธฐ์กด์ ๋ค์ด์๋ point[4]์ ๊ฐ 7๋ณด๋ค ํฌ๋ฏ๋ก point๋ฅผ ๊ฐฑ์ ํ์ง ์๋๋ค.
queue์ ๋ค์ด์๋ ๋ค์ ๊ฐ (7,4)๋ฅผ ํ์ธํ๋ค.
point[4]๊ฐ 7์ผ๋ก ์ฝ๋์ c์ธ 7๊ณผ ๊ฐ์ผ๋ฏ๋ก for๋ฌธ์ ์คํํ ๊ฒ์ด๋ค.
graph[now]๋ฅผ ํตํด 4์ ์ฐ๊ฒฐ๋ ์ ์ ์ ํ์ธํด์ผํ์ง๋ง ์ฐ๊ฒฐ๋ ์ ์ ์ด ์์ผ๋ฏ๋ก for๋ฌธ์ ์คํ๋์ง์๋๋ค.
์ด๋ก์จ queue์๋ ๊ฐ์ด ์์ผ๋ฏ๋ก ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๋ค.
์ต์ข ์ ์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก point๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ (์ธ๋ฑ์ค) | 0 | 1 | 2 | 3 | 4 | 5 |
point | INF | 0 | 2 | 3 | 7 | INF |
'๐์๊ณ ๋ฆฌ์ฆ > ๐ ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์ด์ฌ/python] ํ (heap) (0) | 2021.09.06 |
---|---|
[ํ์ด์ฌ/python] DFS, BFS ๊ตฌํ (์ฌ๊ท) (0) | 2021.07.03 |
[ํ์ด์ฌ/python] ์งํฉ (0) | 2021.04.05 |
[ํ์ด์ฌ/python] DFS์ BFS (0) | 2021.04.05 |
[์๊ณ ๋ฆฌ์ฆ] ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ (Brute Force) (0) | 2021.04.02 |