๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ๋‹จ๊ฑฐ๋ฆฌ (improved_dijkstra)

improved_dijkstra

๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” O(v^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ ธ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10000๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ํ’€์ˆ˜๊ฐ€ ์—†๋‹ค.


ํ•˜์ง€๋งŒ ๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ O(ElogV)๋ฅผ ๋ณด์žฅํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. (V๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, E๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜)


๊ธฐ์กด ๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ํ™•์ธํ–ˆ๋Š”๋ฐ ์ด๋ฅผ ๋”์šฑ ๋น ๋ฅด๊ฒŒ heap๊ตฌ์กฐ์˜ ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ์ฐพ๋Š”๋‹ค๋Š”๊ฒƒ์ด ํ•ต์‹ฌ ํฌ์ธํŠธ์ด๋‹ค.

  • ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๊ณ  heapq ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์šฐ์„  ์ˆœ์œ„ ํ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜ํ˜• ์ž๋ฃŒํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ (๊ฐ€์น˜, ๋ฌด๊ฒŒ)๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ์ง‘์–ด๋„ฃ์œผ๋ฉด ํ•ญ์ƒ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ฌผ๊ฑด๋ถ€ํ„ฐ ๋จผ์ € ๋‚˜์˜ค๊ฒŒ๋œ๋‹ค.(๋งŒ์•ฝ (๋ฌด๊ฒŒ, ๊ฐ€์น˜)๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ผ๋ฉด ๋ฌด๊ฒŒ๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.)(์ตœ๋Œ€ํž™์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •)
  • ํŒŒ์ด์ฌ์—์„œ๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ตœ์†Œํž™๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” ๊ตฌํ•˜๋Š”๊ฒƒ์ด๋ฏ€๋กœ ์ตœ์†Œํž™์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ์—์„œ '์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜'๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ๋Œ€์ฒด



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))        # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š”๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ

def dijkstra(start):
  q = []
  heapq.heappush(q, (0, start))     # ์‹œ์ž‘๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ํ์— ์‚ฝ์ž… (๋…ธ๋“œ์™€ ๊ฒฝ๋กœ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€œ(heap์€ ์•ž์— ์ธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ตœ์†Œ๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์—))
  distance[start] = 0
  while q:    # ํ(q)๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
    dist, now = heapq.heappop(q)    # ๊ฐ€์žฅ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ (๊ฐ€์žฅ์•ž์—์žˆ๋Š”) ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊บผ๋‚ด์–ด dist, now์— ์ €์žฅ(๊ฒฝ๋กœํฌ๊ธฐ, ๋…ธ๋“œ)
    if distance[now] < dist:        # ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ์  ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
      continue
    for i in graph[now]:            # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
      cost = dist + i[1]
        if cost < distance[i[0]]:   # ๋งŒ์•ฝ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ(dist + graph(1))๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธ 
        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])