Updated:

πŸ“š Dijkstra

λ‹€μ΅μŠ€νŠΈλΌ μ΅œλ‹¨ 경둜 λ¬Έμ œλŠ” κ·Έλž˜ν”„ 자료 κ΅¬μ‘°μ—μ„œ μ—¬λŸ¬ 개의 λ…Έλ“œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, νŠΉμ •ν•œ λ…Έλ“œ(μ‹œμž‘μ )μ—μ„œ νŠΉμ •ν•œ λ…Έλ“œ(도착점)κΉŒμ§€μ˜ μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•΄μ£ΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ 섀계해야 ν•œλ‹€. 특히 λ‹€μ΅μŠ€νŠΈλΌλŠ” 음의 간선이 없을 λ•Œ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λ©°, 유ν–₯ & 무ν–₯을 가리지 μ•Šκ³  μ μš©ν•  수 μžˆλ‹€. λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ˜ λ™μž‘μ„ κΈ°μˆ ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

  • 1) 좜발 λ…Έλ“œ μ„€μ •
  • 2) μ΅œλ‹¨ 거리 ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”(좜발 λ…Έλ“œ 값은 0)
  • 3) λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ…Έλ“œ μ€‘μ—μ„œ ν˜„μž¬ κ°€μž₯ κ°€κΉŒμš΄ λ…Έλ“œλ₯Ό 선택(μ΅œλ‹¨ 거리 λ…Έλ“œ)
  • 4) μ„ νƒλœ λ…Έλ“œλ‘œλΆ€ν„° νŒŒμƒλ˜λŠ” λ‹€λ₯Έ κ²½λ‘œκ°’ μ—…λ°μ΄νŠΈ
  • 5) λͺ¨λ“  λ…Έλ“œμ— λŒ€ν•œ 계산 끝날 λ•ŒκΉŒμ§€ 3~4번 반볡

λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μ„€κ³„ν•˜λŠ” 방법은 크게 두가지가 μžˆλ‹€. λ¨Όμ € 3λ²ˆμ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 1) μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ 맀번 μ„ ν˜• νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜, 2) μ„ ν˜• 탐색 λŒ€μ‹ μ— νž™ 정렬을 μ΄μš©ν•΄ κ°€μž₯ κ°€κΉŒμš΄ λ…Έλ“œλ₯Ό μ„ νƒν•˜λŠ” 방식이 μžˆλ‹€. 1번의 경우 O(V^2) κ°€ λ˜μ–΄ μž…λ ₯ λ…Έλ“œκ°€ 1000개만 λ„˜μ–΄κ°€λ„ μ‹œκ°„ 초과λ₯Ό λ‹Ήν•˜κΈ° λ•Œλ¬Έμ—, 2번의 경우둜 μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 게 λ°”λžŒμ§ν•˜λ‹€. μ½”λ“œ μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

""" Dijkstra implementation """

import sys
import heapq
from typing import List

def dijkstra(x: int, distance: List[int]) -> None:
    h = []
    heapq.heappush(h, (distance[x], x))
    while h:
        min_cost, node = heapq.heappop(h)
        # λ°©λ¬Έν•œ λ…Έλ“œ 처리: costλ₯Ό κΈ°μ€€μœΌλ‘œ λ‹€μŒ λ…Έλ“œλ₯Ό μ„ μ •, λ”°λΌμ„œ costκ°€ distance[node]보닀 크닀면 이미 λ°©λ¬Έ ν–ˆλ˜ λ…Έλ“œλ‘œ λ³Ό 수 있음
        if min_cost > distance[node]:
            continue
        for i in graph[node]:
            cost = min_cost + i[0]
            if cost < distance[i[1]]:
                distance[i[1]] = cost
                heapq.heappush(h, (cost, i[1]))

V, E = map(int, sys.stdin.readline().split())
src = int(sys.stdin.readline())

# 1) init graph
graph, costs = [[] for _ in range(V+1)], [float('inf')] * (V+1)
costs[src] = 0
for _ in range(E):
    u, v, weight = map(int, sys.stdin.readline().split())
    graph[u].append((weight, v))

dijkstra(src, costs)
for i in range(1, V+1):
    print(costs[i] if costs[i] != float('inf') else 'INF')

Leave a comment