Dijkstra Algorithm

μ΅œλ‹¨ 경둜

μ΅œλ‹¨ 경둜 μ •μ˜

: κ°„μ„ μ˜ κ°€μ€‘μΉ˜κ°€ μžˆλŠ” κ·Έλž˜ν”„μ—μ„œ 두 정점 μ‚¬μ΄μ˜ κ²½λ‘œλ“€ 쀑에 κ°„μ„ μ˜ κ°€μ€‘μΉ˜μ˜ 합이 μ΅œμ†ŒμΈ 경둜

ν•˜λ‚˜μ˜ μ‹œμž‘ μ •μ μ—μ„œ 끝 μ •μ κΉŒμ§€μ˜ μ΅œλ‹¨ 경둜 (one to all)

  • λ‹€μ΅μŠ€νŠΈλΌ (dijkstra) μ•Œκ³ λ¦¬μ¦˜

    • 음의 κ°€μ€‘μΉ˜λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŒ

  • 벨만-ν¬λ“œ (Bellman-Ford) μ•Œκ³ λ¦¬μ¦˜

    • 음의 κ°€μ€‘μΉ˜ ν—ˆμš©

λͺ¨λ“  정점듀에 λŒ€ν•œ μ΅œλ‹¨ 경둜

  • ν”Œλ‘œμ΄λ“œ-μ›Œμƒ¬ (Floyd-Warshall) μ•Œκ³ λ¦¬μ¦˜

Dijkstra Algorithm

μ‹œμž‘ μ •μ μ—μ„œ 거리가 μ΅œμ†ŒμΈ 정점을 선택해 λ‚˜κ°€λ©΄μ„œ μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•˜λŠ” 방식

  • μ‹œμž‘ 정점 (s)μ—μ„œ 끝 정점 (t) κΉŒμ§€μ˜ μ΅œλ‹¨ κ²½λ‘œμ— 정점 xκ°€ μ‘΄μž¬ν•œλ‹€

  • μ΄λ•Œ, μ΅œλ‹¨ κ²½λ‘œλŠ” sμ—μ„œ xκΉŒμ§€μ˜ μ΅œλ‹¨ κ²½λ‘œμ™€ x μ—μ„œ t κΉŒμ§€μ˜ μ΅œλ‹¨ 경둜둜 κ΅¬μ„±λœλ‹€

  • νƒμš• (greedy) 기법을 μ‚¬μš©ν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ MST의 Prim Algorithmκ³Ό μœ μ‚¬ν•˜λ‹€

  • 인접 ν–‰λ ¬ κ·Έλž˜ν”„μ™€ μ‹œμž‘ 정점이 μ£Όμ–΄μ‘Œμ„ λ•Œ, λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ©΄ μ‹œμž‘ μ •μ μ—μ„œ λͺ¨λ“  μ •μ μœΌλ‘œ κ°€λŠ” μ΅œλ‹¨ 거리λ₯Ό ꡬ할 수 μžˆλ‹€

μ‹œκ°„ λ³΅μž‘λ„

: O(logN)

κ΅¬ν˜„ 해보기

Dijkstra + μΈμ ‘λ¦¬μŠ€νŠΈ

"""
6 11
0 1 3
0 2 5
1 2 2
1 3 6
2 1 1
2 3 4
2 4 6
3 4 2
3 5 3
4 0 3
4 5 6

κ²°κ³Ό
[0, 3, 5, 9, 11, 12]
"""

# dist, selected λ°°μ—΄ μ€€λΉ„
# μ‹œμž‘μ  선택
# λͺ¨λ“  정점이 선택될 λ•Œ κΉŒμ§€
# 아직 μ„ νƒλ˜μ§€ μ•Šκ³  dist의 값이 μ΅œμ†ŒμΈ 정점 : u
# 정점 u의 μ΅œλ‹¨κ±°λ¦¬ κ²°μ •
# 정점 u에 μΈμ ‘ν•œ 정점에 λŒ€ν•΄μ„œ κ°„μ„  μ™„ν™”

V, E = map(int, input().split())
adj = {i:[] for i in range(V)}

for i in range(E):
    s, e, c = map(int, input().split())
    adj[s].append([e,c]) #λ°©ν–₯ κ·Έλž˜ν”„λΌμ„œ

INF = float('inf')
dist = [INF]*V
selected = [False]*V

dist[0] = 0
cnt = 0
while cnt <V:
    # distκ°€ μ΅œμ†ŒμΈ 정점 μ°ΎκΈ°
    MIN = INF
    for i in range(V):
        if not selected[i] and dist[i] < MIN:
            MIN = dist[i]
            u = i
    # κ²°μ •
    selected[u] = True
    cnt += 1

    # κ°„μ„  μ™„ν™”
    for w, cost in adj[u]: # 도착정점, κ°€μ¦μΉ˜
        if dist[w] > dist[u] + cost:
            dist[w] = dist[u] + cost
    
print(dist) # [0, 3, 5, 9, 11, 12]

Last updated

Was this helpful?