๋ชฉ์ฐจ
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์๊ฐ
- ์๊ณ ๋ฆฌ์ฆ ๋์ ๊ณผ์
- ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ(ํ์ด์ฌ)
๋ค์ต์คํธ๋ผ(Dijkstra) ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
- ํน์ ์ ์ ์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก ๊ณ์ฐ
- Single-Source Shortest Paths ๋ฌธ์ ์ ์ฌ์ฉ๋ ์ ์์
- ๋งค ์ํฉ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋ ์ ํ์ ๋ฐ๋ณต(๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ)
์๊ณ ๋ฆฌ์ฆ ๋์ ๊ณผ์
- ์ถ๋ฐ ์ ์ ์ ํ
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ INF๋ก ์ด๊ธฐํ
- ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ์ ์ ์ ํ
- ํด๋น ์ ์ ์ ๊ฑฐ์ณ ๋ค๋ฅธ ์ ์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
- 3~4๋ฒ ๊ณผ์ ๋ฐ๋ณต
์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ์ ์ ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ์ฐ์ ์์ ํ ์ฌ์ฉ
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
# ์ ์ ์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์ ์
๋ ฅ
n, m = map(int, input().split())
# ์์ ์ ์ ์
๋ ฅ
start = int(input())
# ์ธ์ ๋ฆฌ์คํธ ์์ฑ
graph = [[] for i in range(n + 1)]
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ์ด๊ธฐํ
distance = [INF] * (n + 1)
# ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
for _ in range(m):
i, j, c = map(int, input().split())
graph[i].append((j, c)) # ์ ์ i์์ ์ ์ j๋ก ๊ฐ๋ ๋น์ฉ c
def dijkstra(start):
q = []
heapq.heappush(q, (0, start)) # ์์ ์ ์ ์ฝ์
distance[start] = 0
while q:
# ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์ต์์ธ ์ ์ ์ ์ ๋ณด ๊บผ๋ด๊ธฐ
dist, now = heapq.heappop(q)
# ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ธ์ง ํ์ธ
if distance[now] < dist:
continue
# ํ์ฌ ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ํ์ธ
for x in graph[now]:
new_dist = dist + x[1]
# ํ์ฌ ์ ์ ์ ๊ฑฐ์ณ๊ฐ๋๊ฒ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ๊ฐฑ์
if new_dist < distance[x[0]]:
distance[x[0]] = new_dist
heapq.heappush(q, (new_dist, x[0]))
dijkstra(start) # ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ์ถ๋ ฅ
for i in range(1, n + 1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ INF ์ถ๋ ฅ
if distance[i] == INF:
print("INF", end=" ")
else:
print(distance[i], end=" ")
์์ ๊ฐ์ ๊ทธ๋ํ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฃ์ ๊ฒฝ์ฐ 0 5 4 2 1 ์ถ๋ ฅ
์ฐธ๊ณ
728x90