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

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

์ตœ๋‹จ ๊ฒฝ๋กœ (simple_dijkstra)

simple_dijkstra (๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ)

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

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ๋กœ๋Š”

  1. ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ์„ค์ •
  2. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”
  3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒ
  4. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 
  5. ์œ„ ๊ณผ์ •์—์„œ 3๊ณผ 4๋ฅผ ๋ฐ˜๋ณต
    ํ•œ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ๊ทธ ๋‹จ๊ณ„์˜ ๋…ธ๋“œ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ํ™•์‹คํžˆ ๊ตฌํ•ด์ง„๊ฒƒ์ด๋‹ค.

๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(v^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ ์ด๋•Œ v๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์ง€๋งŒ ๋ณดํ†ต ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋ฏ€๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•œ๋‹ค.

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())
  graph[a].append((b,c))   # a๋ฒˆ ๋…ธ๋“œ์—์„œ 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]:    # ๋งŒ์•ฝ distance[i] < INF์ด๊ณ  visited๊ฐ€ True์ด๋ฉด 
      min_value = distance[i]
      index = i
  return index

def dijkstra(start):
  distance[start] = 0
  visited[start] = True
  for j in graph[start]:    # j[0] = ๋…ธ๋“œ, j[1] = ๋น„์šฉ (์ฆ‰ start์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ(distance[๋…ธ๋“œ])์˜ ๋น„์šฉ์„ ์—…๋ฐ์ดํŠธ)
    distance[j[0]] = j[1]
  for i in range(n - 1):    # ์‹œ์ž‘๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ n-1๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
    now = get_smallest_node()   # ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์–ด
    visited[now] = True   # ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ False -> 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):   # ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
  if distance[i] == INF:    # ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅ ํ•  ๊ฒฝ์šฐ ๋ฌดํ•œ๋Œ€ ์ถœ๋ ฅ 
    print('INFINITY')
  else:                     # ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ ์ถœ๋ ฅ
    print(distance[i])