๐Ÿ“š ์ตœ๋‹จ ๊ฒฝ๋กœ (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})$

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ๋™์ž‘ ๊ณผ์ •

ํ”Œ๋กœ์ด๋“œ์›Œ์…œ

ํ”Œ๋กœ์ด๋“œ์›Œ์…œ

ํ”Œ๋กœ์ด๋“œ์›Œ์…œ

ํ”Œ๋กœ์ด๋“œ์›Œ์…œ

ํ”Œ๋กœ์ด๋“œ์›Œ์…œ

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

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ