Skip to content

Latest commit

ย 

History

History
85 lines (60 loc) ยท 3.2 KB

Dijkstra.md

File metadata and controls

85 lines (60 loc) ยท 3.2 KB

๋‹ค์ต์ŠคํŠธ๋ผ (Dijkstra)

Dijkstra์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„์—์„œ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค

๊ฒ€์ƒ‰ ๊ณผ์ •

  1. ์‹œ์ž‘ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌดํ•œ๋Œ€๋กœ ์„ค์ •ํ•˜์—ฌ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์— ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
  3. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์—์„œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

Gif๋กœ ์ดํ•ดํ•˜๊ธฐ

dijkstra

ํŠน์ง•

  • DP๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ๋ฐ˜๋ณต์—์„œ ๊ณ„์‚ฐ๋œ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ์ ์ž„์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ๋ฅผ ์—ญ์ถ”์ ํ•˜์—ฌ ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ์˜ ๋ผ์šฐํŒ…, ์ง€๋„์—์„œ ๋„์‹œ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ์ฐพ๊ธฐ, ์ œ์กฐ ํ”„๋กœ์„ธ์Šค์˜ ์ผ์ • ์ตœ์ ํ™”์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„

  • Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(E log V)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์ ‘์ (V), ๊ฐ„์„ (E)

๐Ÿ“Œ ์˜ˆ์ œ (Baekjoon)

์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

๋ฌธ์ œ

image

ํ’€์ด

๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅ

  • ์ •์ ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š” ์ง€ ์ €์žฅ

๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋กœ ๋ฒ„์Šค ๋…ธ์„ ์„ ์ž…๋ ฅํ•˜๊ณ , ํšจ์œจ์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ๊ตฌํ˜„์„ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ

import sys
from heapq import heappush, heappop   # ์šฐ์„ ์ˆœ์œ„ ํ 

input = sys.stdin.readline
inf = sys.maxsize

# ์ž…๋ ฅ
n = int(input())
m = int(input())
graph = [[] for _ in range(n + 1)]
dp = [inf] * (n + 1)
heap = []

def dijkstra(start):
    dp[start] = 0
    heappush(heap, [0, start])   # ์‹œ์ž‘ ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ ์‹œ์ž‘
    while heap:
        w, n = heappop(heap)
        if  dp[n] < w:     # ๊ธฐ์กด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ณด๋‹ค ๋ฉ€๋‹ค๋ฉด ๋ฌด์‹œ
            continue
        for n_n, wei in graph[n]:
            n_w = wei + w   # ์ธ์ ‘๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
            if n_w < dp[n_n]:   # ๊ธฐ์กด ๊ฑฐ๋ฆฌ ๋ณด๋‹ค ์งง์œผ๋ฉด ๊ฐฑ์‹ 
                dp[n_n] = n_w
                heappush(heap, [n_w, n_n])  # ๋‹ค์Œ ์ธ์ ‘ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐ ํ•˜๊ธฐ ์œ„ํ•ด ํ์— ์‚ฝ์ž…

for _ in range(m):
    d, a, v = map(int, input().split())
    graph[d].append([a, v])

d_c, a_c = map(int, input().split())

dijkstra(d_c)
print(dp[a_c])

Reference

https://velog.io/@woonchoi/Dijkstra-%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%B5%9C%EB%8B%A8%EA%B1%B0%EB%A6%AC