ποΈ Graph Theory 2: Dijkstra
π 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