Ch9 Shortest Path 9-1
๐ ์ต๋จ ๊ฒฝ๋ก (Shortest Path) ์๊ณ ๋ฆฌ์ฆ
์ต๋จ ๊ฒฝ๋ก (Shortest Path) ์๊ณ ๋ฆฌ์ฆ ์ด๋ ๋ง ๊ทธ๋๋ก ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ ์ ํ์๋ ๋ค์ํ ์ข
๋ฅ๊ฐ ์กด์ฌํ๋ค.
- ํ ์ง์ ์์ ๋ค๋ฅธ ํน์ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก
- ํ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก
- ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก
- ํ๋ถ ์์ค์ผ๋ก ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ, ํ๋ก์ด๋ ์์
, ๋ฒจ๋ง ํฌํธ ์๊ณ ๋ฆฌ์ฆ ์ด๋ ๊ฒ 3๊ฐ์ง์ด๋ค.
- ์ด ์ฑ ์ ๋ค์ต์คํธ๋ผ์ ํ๋ก์ด๋ ์์ 2๊ฐ์ง๋ฅผ ๋ค๋ฃธ.
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์๊ณ ๋ฆฌ์ฆ์ด ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋๋ก ์ ์ฉ๋๋ค๋ ํน์ง์ด ์๋ค.
๋ค์ต์คํธ๋ผ์ ์ ํํ ์ธ๋์ด ํ๊ธฐ๋ โ๋ฐ์ดํฌ์คํธ๋ผโ๋ผ๊ณ ํ๋ค.
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
- ๋ค์ต์คํธ๋ผ (Dijkstra) ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์์ ์ฌ๋ฌ๊ฐ์ ๋ ธ๋๊ฐ ์์ ๋, ํน์ ํ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- โ์์ ๊ฐ์ โ์ด ์์ ๋ ์ ์ญ์ ์ผ๋ก ๋์ํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋๋ค. ๋งค๋ฒ โ๊ฐ์ฅ ์์ ๋น์ฉ์ด ์ ์ ๋ ธ๋โ๋ฅผ ์ ํํด์ ์์์ ๊ณผ์ ์ ๋ฐ๋ณต
- ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ต ์ค๋ช
- 1) ์ถ๋ฐ ๋ ธ๋๋ฅผ ์ค์ ํ๋ค.
- 2) ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ด๊ธฐํํ๋ค.
- 3) ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๋ค.
- 4) ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ค.
- 5) ์ ๊ณผ์ ์์ 3)๊ณผ 4)๋ฒ์ ๋ฐ๋ณตํ๋ค.
- ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋ฐฉ๋ฒ์ 2๊ฐ์ง.
- ๊ตฌํํ๊ธฐ ์ฝ์ง๋ง ๋๋ฆฌ๊ฒ ๋์ํ๋ ์ฝ๋
- ๊ตฌํํ๊ธฐ ์กฐ๊ธ ๋ ๊น๋ค๋กญ์ง๋ง ๋น ๋ฅด๊ฒ ๋์ํ๋ ์ฝ๋
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ: ๋์ ๊ณผ์
- ์ด๊ธฐ ์ํ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ์ผ๋ก๋ 999,999,999 ๋๋ 987,654,321 (์ฝ10์ต) ์ผ๋ก ์ค์ ํ๊ธฐ๋ ํ๋ค.
- ํ์ด์ฌ์์ ๊ธฐ๋ณธ์ผ๋ก 1e9๋ฅผ ์ค์ ์๋ฃํ์ผ๋ก ์ฒ๋ฆฌ ํ๋๋ฐ ๋ชจ๋ ๊ฐ์ ์ด ์ ์ํ์ผ๋ก ํํ๋๋ ๋ฌธ์ ์์๋ int(1e9)๋ก ์ด๊ธฐํ.
- ๋จ๊ฒ๋ฅผ ๊ฑฐ์น๋ฉฐ ํ ๋ฒ ์ฒ๋ฆฌ๋ ๋
ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๊ณ ์ ๋์ด ๋ ์ด์ ๋ฐ๋์ง ์๋๋ค.
- ํ ๋จ๊ณ๋น ํ๋์ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ํ์คํ ์ฐพ๋ ๊ฒ์ผ๋ก ์ดํด
- ๋ง์ง๋ง ๋ ธ๋๋ ๋๋จธ์ง ๋ ธ๋๋ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ํ์ ๋ ์ํ์ด๋ฏ๋ก ๋ ์ด์ ํ ์ด๋ธ ๊ฐฑ์ ์ด ๋ ์ ์์ด ํ์ธํ ํ์๊ฐ ์๋ค.
- ์๋ฒฝํ ํํ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ค๋ฉด ์์ค์ฝ๋์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ ๋ฃ์ด์ผ ํ๋ค.
- ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ ๊ฐ์ด 0์ธ 1๋ฒ ๋ ธ๋๋ก ์ถ๋ฐ
- 1๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ ์ ํ๋์ฉ ํ์ธ
- 4๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ 3, 5๋ฒ ๋ ธ๋ ๋น์ฉ๊ณผ 1๋ฒ ๋ ธ๋์์ 3, 5๋ฒ ๋ ธ๋์ ๋น์ฉ ๋น๊ต
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ผ ๊ฒฝ์ฐ ๋ ธ๋ ๋ฒํธ๊ฐ ๋ ๋ฎ์ ๊ฐ์ ์ ํ.
- ๋ง์ง๋ง ๋
ธ๋๋ ์ฒ๋ฆฌํ์ง ์์๋ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ์ป์
- ๋๋จธ์ง 5๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ํ์ ๋ ์ํ์ด๋ฏ๋ก ๋ ์ด์ ํ ์ด๋ธ ๊ฐฑ์ ๋ถ๊ฐ
๋ฐฉ๋ฒ 1. ๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ์ด $O(V)$๋ฒ์ ๊ฑธ์ณ์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ์งง์ ๋
ธ๋๋ฅผ ๋งค๋ฒ ์ ํํ์ -> ์ ์ฒด ์๊ฐ๋ณต์ก๋ $O(V^2)$
- V๋ ๋ ธ๋์ ๊ฐ์๋ฅผ ์๋ฏธ
- ์ฒ์ ๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด๋ 1์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ ์ธ
- ๋จ๊ณ๋ง๋ค โ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํโํ๊ธฐ ์ํด ๋งค ๋จ๊ณ๋ง๋ค 1์ฐจ์ ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ฅผ ํ์ธ(์์์ ๋ถํฐ ์์ฐจ์ ํ์)
- ๋
ธ๋์ ๊ฐ์๊ฐ 5,000๊ฐ ์ดํ๋ผ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฅ
- ๊ฐ์๊ฐ 10,000๊ฐ ์ด์์ด๋ฉด ์ด ์ฝ๋๋ก๋ ํ๋ค๋ค.
# ๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์์ค์ฝ๋
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์์ ๋
ธ๋ ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
start = int(input())
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ธฐ
graph = [[] for i in range(n+1)]
# ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ์ฒดํฌํ๋ ๋ชฉ์ ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ธฐ
visited = [False]*(n+1)
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
distance = [INF]*(n+1)
# ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(m):
a, b, c = map(int, input().split())
# a๋ฒ ๋
ธ๋์์ b๋ฒ ๋
ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ด c๋ผ๋ ์๋ฏธ
graph[a].append((b, c))
# ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ ์ค์์, ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ฒํธ๋ฅผ ๋ฐํ
def get_smallest_node():
min_value = INF
index = 0 # ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋(์ธ๋ฑ์ค)
for i in range(1, n+1):
if distance[i] < min_value and not visited[i]:
min_value = distance[i]
index = i
return index
def dijkstra(start):
# ์์ ๋
ธ๋์ ๋ํด์ ์ด๊ธฐํ
distance[start] = 0
visited[start] = True
# ์์ ๋
ธ๋์์์ ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ๊ฐฑ์
for j in graph[start]:
distance[j[0]] = j[1]
# ์์ ๋
ธ๋๋ฅผ ์ ์ธํ ์ ์ฒด n-1๊ฐ์ ๋
ธ๋์ ๋ํด ๋ฐ๋ณต
for i in range(n-1):
# ํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋
ธ๋๋ฅผ ๊บผ๋ด์, ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
now = get_smallest_node()
visited[now] = True
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ํ์ธ
for j in graph[now]:
cost = distance[now]+j[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์ ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[j[0]]:
distance[j[0]] = cost
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
dijkstra(start)
# ๋ชจ๋ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
for i in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ(INFINITY)์ด๋ผ๊ณ ์ถ๋ ฅ
if distance[i] == INF:
print("INFINITY")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(distance[i])
# ์
๋ ฅ ์์
# 1. ๋
ธ๋์ ๊ฐ์ ์
# 2. ์ถ๋ฐ ๋
ธ๋
# 3. ์ถ๋ฐ๋
ธ๋, ๋์ฐฉ๋
ธ๋, ๊ฐ์
6 11
1
1 2 2
1 3 5
1 4 1
2 3 3
2 4 2
3 2 3
3 6 5
4 3 3
4 5 1
5 3 1
5 6 2
# ์ถ๋ ฅ ์์
0
2
3
1
2
4
๋ฐฉ๋ฒ 2. ๊ฐ์ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ๋จ๊ณ๋ง๋ค โ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํโํ๊ธฐ ์ํด ํ(Heap) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉ (๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์์ฐจ ํ์์ ์ด์ฉ)
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ๋์ํ๋ ๊ธฐ๋ณธ ์๋ฆฌ๋ ๋์ผ
- ํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ์ ์ฅํด ๋๊ธฐ ์ํด์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ด์ฉํ๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
- ํ์ฌ์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํด์ผ ํ๋ฏ๋ก ์ต์ ํ์ ์ฌ์ฉํ๋ค.
ํ ์ค๋ช
- ์์ ์ด์ง ํธ๋ฆฌ์ ์ผ์ข ์ด๋ค.
- ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ
- ์ฐ์ ์์ ํ(Priority Queue)๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋.
- ์ต์ ํ(Min Heap)๊ณผ ์ต๋ ํ(Max Heap)์ด ์๋ค.
- ์ต๋ ํ: ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ํค ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ
- ์ต์ ํ: ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ํค ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ
- ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํด ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋๋ค.
(์ฃผ์) ํ ์ ๋ ฌ์์ ๋งํ๋ โํโ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๊ณต๊ฐ์ธ โํโ์ ๊ด๋ จ์ด ์๋ค.
์ฐ์ ์์ ํ๋ ์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ๊น?
- ์ด์ ๋ ์ํ์๊ฐ ๋๋ฌธ์ด๋ค.
- heap์ ์ฝ์ ์ญ์ ์ฐ์ฐ์ด ๋ชจ๋ logN์ด์ง๋ง ๋ฐฐ์ด, ๋ฆฌ์คํธ์ ๊ฐ์ ์ ํ ๊ตฌ์กฐ์ ํํ๋ ์ฝ์ ํน์ ์ญ์ ๋ ์ค ํ๋์ ์ฐ์ฐ์ด ๊ทน๋จ์ ์ธ ์ํ ์๊ฐ์ ๊ฐ๋๋ค.
- ์ ๋ ฌ์ด ๋์ด์์ง ์์ ๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ, ์ ๋ ฅ์ ์์ ์ํ์๊ฐ์ ๊ฐ์ง๋ฉฐ ์ฐ์ ์์์ ๋ถํฉํ๋ ์์๋ฅผ ์ฐพ๋ ๊ณผ์ ์์ ์ต์ ์ ๊ฒฝ์ฐ n ๋ฒ์ ์ฐ์ฐ ์ํํ๋ค.
- ์ ๋ ฌ์ด ๋์ด์๋ ๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ, ์ ๋ ฅํ๋ ๊ณผ์ ์์ ์ ๋ ฌ์ ์์ผ์ผํ๋ค ๋ฐ๋ผ์ ์ต์ ์ ๊ฒฝ์ฐ n ๋ฒ์ ์ฐ์ฐ์ ์ํํ๋ค.
- ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์์๋ ํญ์ ์ต์ ์ ์ํฉ์ ๊ณ ๋ คํด์ผ ํ๋๋ฐ ๋ง์ฝ n ๊ฐ์ ๋ฐ์ดํฐ ๋ชจ๋ ์ต์ ์ ๊ฒฝ์ฐ์ ๋์ธ๋ค๋ฉด $n^2$์ ์ํ ์๊ฐ์ ๊ฐ๊ฒ ๋๋ค.
- ํ์ ๊ฒฝ์ฐ ๋ชจ๋ ์ต์ ์ ์ํฉ์ ๋์ธ๋ค ๊ฐ์ ํด๋ $nlogn$์ ์ํ ์๊ฐ์ ๊ฐ๋๋ค.
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์์ : ์ต์ ํ
import heapq
# ์ค๋ฆ์ฐจ์ ํ ์ ๋ ฌ(Heap Sort)
def heapsort(iterable):
h = []
result = []
# ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ํ์ ์ฝ์
for value in iterable:
heapq.heappush(h, value)
# heapq.heappush(h, -value)
# ํ์ ์ฝ์
๋ ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊บผ๋ด์ด ๋ด๊ธฐ
for i in range(len(h)):
result.append(heapq.heappop(h))
# result.append(-heqpq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)
์คํ๊ฒฐ๊ณผ
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
- heappush(): ํน์ ๋ฆฌ์คํธ์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฃ์๋
- heappop(): ํน์ ๋ฆฌ์คํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๋ -> ์ฐ์ ์์๋๋ก ๊บผ๋ด์ง
- default๋ ์ค๋ฆ์ฐจ์์ผ๋ก ๊บผ๋ด์ง๋ค.
- ์ต๋ ํ์ ์ด์ฉํ๊ณ ์ถ์ ๋๋ ๋ถํธ๋ฅผ ๋ฐ๊ฟ์ ๋ฃ์ ๋ค, ๊บผ๋ผ ๋ ๋ค์ ๋ถํธ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ
- n๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์๊ฐ๋ณต์ก๋ $O(NlogN)$
- ๋ณํฉ, ํต ์ ๋ ฌ๊ณผ ๋น์ทํ ์๊ฐ๋ณต์ก๋
-
ํ ๋์ ๊ณผ์
์ฐ์ ์์ ํ ์ค๋ช
- ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ญ์ ํ๋ ์๋ฃ๊ตฌ์กฐ.
- ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๊ฐ์ ๋ฌผ๊ฑด ๋ฐ์ดํฐ๋ฅผ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์๋ค๊ฐ ๊ฐ์น๊ฐ ๋์ ๋ฌผ๊ฑด ๋ฐ์ดํฐ๋ถํฐ ๊บผ๋ด์ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ ์ ์๋ค.
- Python, C++, Java๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก ์ง์ํ๋ค.
- ํ์ด์ฌ์ PriorityQueue ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๋๋ ๊ฐ๋ตํด ์ง์ง๋ง ์๋๊ฐ ๋งค์ฐ ๋๋ฆฌ๋ค.
์๋ฃ๊ตฌ์กฐ | ์ถ์ถ๋๋ ๋ฐ์ดํฐ |
---|---|
์คํ(Stack) | ๊ฐ์ฅ ๋์ค์ ์ฝ์ ๋ ๋ฐ์ดํฐ |
ํ(Queue) | ๊ฐ์ฅ ๋จผ์ ์ฝ์ ๋ ๋ฐ์ดํฐ |
์ฐ์ ์์ ํ(Priority) | ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ |
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ: ์ฐ์ ์์ ํ ๋์ ๊ณผ์
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์์ ๋
ธ๋ ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
start = int(input())
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ธฐ
graph = [[] for i in range(n+1)]
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
distance = [INF]*(n+1)
# ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append((b,c))
def dijkstra(start):
q = []
# ์์ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฒฝ๋ก๋ 0์ผ๋ก ์ค์ ํ์ฌ, ํ์ ์ฝ์
heapq.heappush(q, (0, start))
distance[start] = 0
while q: # ํ๊ฐ ๋น์ด์์ง ์๋ค๋ฉด
# ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ํ ์ ๋ณด ๊บผ๋ด๊ธฐ
# dist = ํ์ฌ ํ์ธํ๊ณ ์๋ ๋
ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ
dist, now = heapq.heappop(q)
# ํ์ฌ ๋
ธ๋๊ฐ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ์ ์ด ์๋ ๋
ธ๋๋ผ๋ฉด ๋ฌด์
# ๊ฐ์ด ์๋ค๋ ๊ฒ์ ์ด๋ฏธ ์ฒ๋ฆฌ๋์ด ์ต์ ๊ฐ์ด ๋ค์ด๊ฐ ์๋ค๋ ์๋ฏธ
if distance[now] < dist:
continue
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ธ์ ํ ๋
ธ๋๋ค์ ํ์ธ
for i in graph[now]:
cost = dist + i[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์, ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํ
dijkstra(start)
# ๋ชจ๋ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
for i in range(1, n+1):
if distance[i] == INF:
print("INFINITY")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(distance[i])
# ์
๋ ฅ ์์
# 1. ๋
ธ๋์ ๊ฐ์ ์
# 2. ์ถ๋ฐ ๋
ธ๋
# 3. ์ถ๋ฐ๋
ธ๋, ๋์ฐฉ๋
ธ๋, cost
6 11
1
1 2 2
1 3 5
1 4 1
2 3 3
2 4 2
3 2 3
3 6 5
4 3 3
4 5 1
5 3 1
5 6 2
# ์ถ๋ ฅ ์์
0
2
3
1
2
4
๊ฐ์ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋
- ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ $O(ElogV)$
- N = 1,000,000์ผ ๋, $log_{2}N$์ด ์ฝ 20์ธ ๊ฒ์ ๊ฐ์ํ๋ฉด ์๋๊ฐ ํ๊ธฐ์ ์ผ๋ก ๋นจ๋ผ์ง๋ค.
- ๋
ธ๋๋ฅผ ํ๋์ฉ ๊บผ๋ด ๊ฒ์ฌํ๋ ๋ฐ๋ณต๋ฌธ(while)์ ๋
ธ๋์ ๊ฐ์ V ์ด์์ ํ์๋ก๋ ์ฒ๋ฆฌ๋์ง ์๋๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ฌ ์ฐ์ ์์ ํ์์ ๊บผ๋ธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋ ธ๋๋ค์ ํ์ธํ๋ ์ดํ์๋ ์ต๋ ๊ฐ์ ์ ๊ฐ์(E)๋งํผ ์ฐ์ฐ์ด ์ํ๋ ์ ์๋ค.
- ์ง๊ด์ ์ผ๋ก ์ ์ฒด ๊ณผ์ ์ E๊ฐ์ ์์๋ฅผ ์ฐ์ ์์ ํ์ ๋ฃ์๋ค๊ฐ ๋ชจ๋ ๋นผ๋ด๋ ์ฐ์ฐ๊ณผ ๋งค์ฐ ์ ์ฌํ๋ค.
- ์๊ฐ ๋ณต์ก๋๋ฅผ $O(ElogE)$๋ก ํ๋จํ ์ ์๋ค.
- ์ค๋ณต ๊ฐ์ ์ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ์ ์ด๋ฅผ $O(ElogV)$๋ก ์ ๋ฆฌํ ์ ์๋ค (E๊ฐ ์๋ฌด๋ฆฌ ๋ง์๋ $V^2$๋ฅผ ๋์ ์ ์์)
- $O(ElogE)$ -> $O(ElogV^2)$ -> $O(2ElogV)$ -> $O(ElogV)$
- ํต์์ ์ผ๋ก ๊ฐ์ ์ ๊ฐ์ 20๋ง ๊ฐ ์ด์, ๋ ธ๋ 2๋ง ๊ฐ ์ด์ ์ด์ฌ๋ 1์ด ์์ ๊ฐ๋ฅ
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ๋ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ณ์ฐํ๋ค.
- ํ๋ก์ด๋ ์์
(Floyd-warshall)์๊ณ ๋ฆฌ์ฆ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋จ๊ณ๋ณ๋ก ๊ฑฐ์ณ ๊ฐ๋ ๋
ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋ค.
- ๋ค๋ง ๋งค ๋จ๊ณ๋ง๋ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ๋ ธ๋๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ํ์ํ์ง ์๋๋ค.
- ํ๋ก์ด๋ ์์ ์ 2์ฐจ์ ํ ์ด๋ธ์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- ๊ฐ์ค์น๊ฐ ์์์ฌ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๋ค์ต์คํธ๋ผ ๋ณด๋ค ๊ตฌํ์ ์ฝ์ง๋ง ์๊ฐ๋ณต์ก๋$O(N^3)$
- ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(DP)์ ํ์ ์ํ๋ค.
- ๊ฐ ๋จ๊ณ๋ง๋ค ํน์ ํ ๋
ธ๋ K๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ธํ๋ค.
- a์์ b๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ณด๋ค a์์ k๋ฅผ ๊ฑฐ์ณ b๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์์ง ๊ฒ์ฌ.
- ์ ํ์์ $D_{ab} = min(D_{ab},D_{ak}+D_{kb})$
- ๊ฐ ๋จ๊ณ๋ง๋ค ํน์ ํ ๋
ธ๋ K๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ธํ๋ค.
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ: ๋์ ๊ณผ์
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์ ๋ฐ ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n = int(input())
m = int(input())
# 2์ฐจ์ ๋ฆฌ์คํธ(๊ทธ๋ํ ํํ)๋ฅผ ๋ง๋ค๊ณ , ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
graph = [[INF]*(n+1) for _ in range(n+1)]
# ์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
for a in range(1, n+1):
for b in range(1, n+1):
if a == b:
graph[a][b] = 0
# ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์
๋ ฅ ๋ฐ์, ๊ทธ ๊ฐ์ผ๋ก ์ด๊ธฐํ
for _ in range(m):
# A์์ B๋ก ๊ฐ๋ ๋น์ฉ์ C๋ผ๊ณ ์ค์
a, b, c = map(int, input().split())
graph[a][b] = c
# ์ ํ์์ ๋ฐ๋ผ ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ์ ์ํ
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
# ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
for a in range(1, n+1):
for b in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ(INFINITY)์ด๋ผ๊ณ ์ถ๋ ฅ
if graph[a][b] == INF:
print("INFINITY", end=" ")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(graph[a][b], end=" ")
print()
# ์
๋ ฅ ์์
4
7
1 2 4
1 4 6
2 1 3
2 3 7
3 1 5
3 4 4
4 3 2
# ์ถ๋ ฅ ์์
0 4 8 6
3 0 7 9
5 9 0 4
7 11 2 0
๋๊ธ๋จ๊ธฐ๊ธฐ