๐ก ๋ฌธ์ ์ค๋ช
V์ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ์ฃผ์ด์ง๋ค.(1 โค V โค 20,000, 1 โค E โค 300,000) ๋ชจ๋ ์ ์ ์๋ 1๋ถํฐ V๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ค.K(1 โค K โค V)๊ฐ ์ฃผ์ด์ง๋ค.E๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ๊ฐ์ ์ ๋ํ๋ด๋ ์ธ ๊ฐ์ ์ ์ (u, v, w)๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค.u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ธ ๊ฐ์ ์ด ์กด์ฌํ๋ค๋ ๋ป์ด๋ค.u์ v๋ ์๋ก ๋ค๋ฅด๋ฉฐ w๋ 10 ์ดํ์ ์์ฐ์์ด๋ค. ์๋ก ๋ค๋ฅธ ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์กด์ฌํ ์๋ ์์์ ์ ์ํ๋ค.V๊ฐ์ ์ค์ ๊ฑธ์ณ, i๋ฒ์งธ ์ค์ i๋ฒย ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก์ ๊ฒฝ๋ก๊ฐ์ ์ถ๋ ฅํ๋ค.0์ผ๋ก ์ถ๋ ฅํ๊ณ , ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์๋ INF๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.โ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด
์์ ๊ฐ์ ์ด ์์ ๋ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
3๋ฒ๊ณผ 4๋ฒ์ ๋ฐ๋ณตํฉ๋๋ค. ๐งโ๐ป ์ฝ๋ ํ์ด
import heapq # ์ฐ์ ์์ ํ
import sys
INF = int(1e9) # ์ต๋๊ฐ
n, m = map(int, sys.stdin.readline().split())
start = int(sys.stdin.readline())
graph = [[] for i in range(n + 1)] # ๊ทธ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
distance = [INF] * (n + 1) # ๊ฐ ๋
ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ
for i in range(m):
x, y, cost = map(int, sys.stdin.readline().split())
graph[x].append([y, cost]) # x ๋
ธ๋์์ y ๋
ธ๋๋ก ๊ฐ๋ cost๋ฅผ ๊ฐ์ ๊ทธ๋ํ์ ์ถ๊ฐ
def dijkstra(start):
q = [] # ์ฐ์ ์์ ํ ์์ฑ
heapq.heappush(q, (0, start)) # ํ์ฌ๊ฑฐ๋ฆฌ, ์์ ๋
ธ๋ ์ต์ ํ์ ์ถ๊ฐ
distance[start] = 0 # ์์๋
ธ๋ ์ต๋จ ๊ฒฝ๋ก 0์ผ๋ก ์ด๊ธฐํ
while q:
dist, now = heapq.heappop(q) # ํ์์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๊ฐ ๋ด๊ธด ๋
ธ๋ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
if distance[now] < dist: # ํ์ฌ ๋
ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ dist ๋ณด๋ค ์์ผ๋ฉด continue
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('INF')
else:
print(distance[i])