CS/Algorithm

λ‹€μ΅μŠ€νŠΈλΌ(dijkstra)

deo2kim 2020. 10. 2. 20:01
λ°˜μ‘ν˜•

좜처: https://t1.daumcdn.net/cfile/tistory/277CC93A54C0ABE80A

πŸ“” λ‹€μ΅μŠ€νŠΈλΌ(dijkstra) λž€

  • λ‹€μ΅μŠ€νŠΈλΌλ₯Ό λ“€μ–΄κ°€κΈ° 전에... μ΅œλ‹¨ κ²½λ‘œλž€
    • κ°„μ„ μ˜ κ°€μ€‘μΉ˜κ°€ μžˆλŠ” κ·Έλž˜ν”„μ—μ„œ 두 정점 μ‚¬μ΄μ˜ κ²½λ‘œλ“€ 쀑 κ°„μ„ μ˜ κ°€μ€‘μΉ˜μ˜ 합이 μ΅œμ†ŒμΈ 경둜
    • κ°„μ„ μ˜ κ°€μ€‘μΉ˜κ°€ 균일(1)ν•  경우 BFSλ₯Ό μ‚¬μš©
  • 음의 κ°€μ€‘μΉ˜λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŒ
  • ν•˜λ‚˜μ˜ μ‹œμž‘ μ •μ μ—μ„œ 끝 μ •μ κΉŒμ§€μ˜ μ΅œλ‹¨κ²½λ‘œ
    • μ‹œμž‘ μ •μ μ—μ„œ 거리가 μ΅œμ†ŒμΈ 정점을 선택해 λ‚˜κ°€λ©΄μ„œ μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•˜λŠ” 방식이닀.
    • μ‹œμž‘ 정점(s) μ—μ„œ 끝 정점(t) κΉŒμ§€μ˜ μ΅œλ‹¨ κ²½λ‘œμ— 정점 x κ°€ μ‘΄μž¬ν•œλ‹€.
    • μ΄λ•Œ, μ΅œλ‹¨ κ²½λ‘œλŠ” s μ—μ„œ  x κΉŒμ§€μ˜ μ΅œλ‹¨κ²½λ‘œμ™€ x μ—μ„œ t κΉŒμ§€μ˜ μ΅œλ‹¨κ²½λ‘œλ‘œ κ΅¬μ„±λœλ‹€.
    • νƒμš• 기법을 μ‚¬μš©ν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ MST의 ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜κ³Ό μœ μ‚¬ν•˜λ‹€.
  • μ•„λž˜ μ½”λ“œμ˜ 경우 μ‹œκ°„λ³΅μž‘λ„λŠ” O(N^2) 이닀.
  • λ§Œμ•½ μš°μ„ μˆœμœ„νλ₯Ό μ΄μš©ν•˜κ²Œ λœλ‹€λ©΄ O(NlogN) 으둜 μ‹œκ°„λ³΅μž‘λ„λ₯Ό 쀄일 수 μžˆλ‹€.

πŸ“” λ‹€μ΅μŠ€νŠΈλΌ(dijkstra) κ΅¬ν˜„

V, E = 6, 11
edges = [
    [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]
]

# μΈμ ‘λ¦¬μŠ€νŠΈ λ§Œλ“€κΈ°
adj = {x: [] for x in range(V)}
for edge in edges:
    s, e, c = edge
    adj[s].append([e, c])

# dist, visited
dist = [float('inf')] * V
visited = [False] * V

# μ‹œμž‘μ  선택, λͺ¨λ“  정점 선택
dist[0] = 0
cnt = 0
while cnt < V:
    # distκ°€ μ΅œμ†ŒμΈ 정점 μ°ΎκΈ°
    min_dist = float('inf')
    u = -1
    for i in range(V):
        if not visited[i] and dist[i] < min_dist:
            min_dist = dist[i]
            u = i

    # 정점을 ν•˜λ‚˜ 선택
    visited[u] = True

    # κ°„μ„  μ™„ν™”
    for w, cost in adj[u]:  # 도착정점, κ°€μ€‘μΉ˜
        if dist[u] + cost < dist[w]:
            dist[w] = dist[u] + cost
    cnt += 1

print(dist)
λ°˜μ‘ν˜•