๐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด๋?
ํ๋์ ์์ ์ ์ ์์ ๋ค๋ฅด์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค!
โ๏ธ Dijkstra์ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ฆผ์์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ค๊ณ ํ๋ค.
- ๊ฐ ๋จ๊ณ์์ S์์ ์์ง ์์ ์ ์ ์ค์์ ๊ฐ์ฅ distance๊ฐ์ด ์์ ์ ์ ์ S์ ์ถ๊ฐํ๋ค.
- ์ ์ W๋ฅผ ๊ฑฐ์ณ์ ์ ์ u๋ก ๊ฐ๋ ๊ฐ์์ ์ธ ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์!
๊ทธ๋ฌ๋ฉด ์ ์ v์์ ์ ์ u๊น์ง์ ๊ฑฐ๋ฆฌ๋ v->w->u (๊ฒฝ๋ก2 + ๊ฒฝ๋ก3) ๊ฑฐ๋ฆฌ๊ฐ ๋๋ค. - ๊ทธ๋ฌ๋ ๊ฒฝ๋ก 2๋ ๊ฒฝ๋ก 1๋ณด๋ค ํญ์ ๊ธธ ์ ๋ฐ์ ์๋ค. ํ์ฌ distance ๊ฐ์ด ๊ฐ์ฅ ์์ ์ ์ ์ u์ด๊ธฐ ๋๋ฌธ์ด๋ค. => ๊ฑฐ๋ฆฌ1 < ๊ฑฐ๋ฆฌ2 + ๊ฑฐ๋ฆฌ3
์ด ์๊ณ ๋ฆฌ์ฆ์ ํด๊ฒฐํ๊ธฐ ์ํด์ 3๊ฐ์ง๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
- direction
- visited
- queue
- distance
โ๏ธ direction
๊ฐ ๋ ธ๋์ ์ธ์ ๋ ธ๋ ๋ฒํธ์ ๊ฑฐ๋ฆฌ๊ฐ ์ ์ฅ๋์ด์๋ ๋ฆฌ์คํธ
โ๏ธ visited
๋ ธ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ
โ๏ธ queue
1. ์ฐ์ ์์ ํ์์ ๋
ธ๋ ๊ฐ์ ธ์ค๊ธฐ
2. ํ์ฌ ์ ํ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ํ์ธ
3. ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ๋
ธ๋๋ก ์
๋ฐ์ดํธ
4. for ํ์ฌ ๋
ธ๋์ ์ธ์ ๋
ธ๋ ๋งํผ
4-1. ์ธ์ ๋
ธ๋์ distance > ํ์ฌ ๋
ธ๋์ distance + ์ธ์ ๋
ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ ์ด๋ฉด
4-2. ์ธ์ ๋
ธ๋์ distance ๊ฐ ๋ณ๊ฒฝ
4-3. queue์ ์ธ์ ๋
ธ๋ ์ถ๊ฐ
โ๏ธ distance
์์์ ์ผ๋ก๋ถํฐ ๊ฐ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ์ฅ ๋ฐฐ์ด
๐พ ์ต๋จ๊ฒฝ๋ก - ๋ฐฑ์ค 1753๋ฒ
https://www.acmicpc.net/problem/1753
์์ ์ ๋ ฅ1
5 6
1
5 1 1
1 2 2
1 3 3
2 3 4
2 4 5
3 4 6
์์ ์ถ๋ ฅ1
0
2
3
7
INF
๐ํ์ด โญ๏ธ
์ด๊ธฐ ์ค์
1. visited ์ด๊ธฐํ
2. ๊ฐ ๋
ธ๋์ distance๋ ์ต๋๋ก
distance
[1] | [2] | [3] | [4] | [5] |
0 | ∞ | ∞ | ∞ | ∞ |
direction = [[] for _ in range(V + 1)]
visited = [False] * (V + 1)
queue = PriorityQueue()
distance = [sys.maxsize] * (V + 1)
direction ๋ฆฌ์คํธ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅํ๋ค.
1 -> [2,2], [3,3]
2 -> [3,4], [4,5]
3 -> [4,6]
4
5 -> [1,1]
for _ in range(E):
start, end, weight = map(int, input().split())
direction[start].append([end, weight])
# ์ถ๋ ฅ
# direction [[], [[2, 2], [3, 3]], [[3, 4], [4, 5]], [[4, 6]], [], [[1, 1]]]
๋ค์ต์คํธ๋ผ ์ํ
1๏ธโฃ K๋ฅผ ์์์ ์ผ๋ก ์ค์
queue.put((0, K))
distance[K] = 0
2๏ธโฃ queue๊ฐ ๋น ๋๊น์ง
(1) ์ฐ์ ์์ ํ์์ ๋ ธ๋ ๊ฐ์ ธ์ค๊ธฐ
(2) ํ์ฌ ์ ํ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ํ์ธ
(3) ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ๋ ธ๋๋ก ์ ๋ฐ์ดํธ
(4) for ํ์ฌ ๋ ธ๋์ ์ธ์ ๋ ธ๋ ๋งํผ
(4.1) ์ธ์ ๋ ธ๋์ distance > ํ์ฌ ๋ ธ๋์ distance + ์ธ์ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ ์ด๋ฉด
(4.2) ์ธ์ ๋ ธ๋์ distance ๊ฐ ๋ณ๊ฒฝ
(4.3) queue์ ์ธ์ ๋ ธ๋ ์ถ๊ฐ
1๋ฒ ๋ ธ๋ ์ ํ
visited
[0] |
1 |
distance
[1] | [2] | [3] | [4] | [5] |
0 | 2 | 3 | ∞ | ∞ |
queue
[0] | [1] |
2 | 3 |
2๋ฒ ๋ ธ๋ ์ ํ
visited
[0] | [1] |
1 | 2 |
distance
[1] | [2] | [3] | [4] | [5] |
0 | 2 | 3 | 7 | ∞ |
queue
[0] | [1] |
3 | 4 |
3๋ฒ ๋ ธ๋ ์ ํ
visited
[0] | [1] | [2] | [3] |
1 | 2 | 3 | 4 |
distance
๋ ธ๋4 ๊ฐ์ ๊ฒฝ์ฐ, ๊ธฐ์กด์ ์๋ ๊ฐ์ด ์ ๊ท ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ๊ฐฑ์ ํ์ง ์์! (7 < 3+6)
[1] | [2] | [3] | [4] | [5] |
0 | 2 | 3 | 7 | ∞ |
queue
[0] |
4 |
while queue.qsize() > 0:
current = queue.get()
current_node = current[1]
if visited[current_node]:
continue
visited[current_node] = True
for tmp in direction[current_node]:
next = tmp[0]
value = tmp[1]
if visited[next]:
continue
if distance[next] > distance[current_node] + value: # ๋ ์งง์ distance ๊ฐฑ์
distance[next] = distance[current_node] + value
queue.put((distance[next], next))
๐์ ์ฒด ์ฝ๋
# ๋ค์ต์คํธ๋ผ
import sys
from queue import PriorityQueue
input = sys.stdin.readline
# V(์ ์ ์ ๊ฐ์), E(๊ฐ์ ์ ๊ฐ์)
V, E = map(int, input().split())
# K (์์ ์ ์ )
K = int(input())
direction = [[] for _ in range(V + 1)]
visited = [False] * (V + 1)
queue = PriorityQueue()
distance = [sys.maxsize] * (V + 1)
for _ in range(E):
start, end, weight = map(int, input().split())
direction[start].append([end, weight])
# print("direction", direction)
queue.put((0, K)) # K๋ฅผ ์์์ ์ผ๋ก (๊ฑฐ๋ฆฌ, ์ถ๋ฐ)
distance[K] = 0
while queue.qsize() > 0:
current = queue.get()
current_node = current[1]
if visited[current_node]:
continue
visited[current_node] = True
for tmp in direction[current_node]:
next = tmp[0]
value = tmp[1]
if visited[next]:
continue
if distance[next] > distance[current_node] + value: # ๋ ์งง์ distance ๊ฐฑ์
distance[next] = distance[current_node] + value
queue.put((distance[next], next))
for i in range(1, V + 1):
if visited[i]:
print(distance[i])
else:
print("INF")
'Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ค ์ธ์ฐ๊ธฐ] ์์ ์ ๋ ฌ | ๋ฐฑ์ค 2252๋ฒ | python (5) | 2024.09.01 |
---|---|
[๋ฏธ๋ก ํ์ถ] DFS&BFS | ์ด๊ฒ์ด ์ฝ๋ฉ์ด๋ค | python (0) | 2024.08.31 |
[K๋ฒ์งธ ์ต๋จ๊ฒฝ๋ก ์ฐพ๊ธฐ] ๋ค์ต์คํธ๋ผ | ๋ฐฑ์ค 1854๋ฒ | python (0) | 2024.08.30 |
[์๊ณ ๋ฆฌ์ฆ] ์ฐ์ ์์ ํ (0) | 2024.07.08 |
[๊ฒ์๊ฐ๋ฐ] ์์์ ๋ ฌ(Topological Sorting) | ๋ฐฑ์ค 1516๋ฒ | python (0) | 2024.06.26 |