Computer Science/Algorithms

๐Ÿงฟ Dijkstra's (Shortest Path) Algorithm

metamong 2024. 1. 14.

intro

๐Ÿงฟ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ '๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋˜๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ํ•˜๋‚˜์˜ ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜'์ด๋‹ค. ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋“  ์ •์  ์Œ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ผ์ผ์ด ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. ํ”Œ๋กœ์ด๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์ˆ˜์ธ ๊ฐ„์„  ์กด์žฌ๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ์Œ์ˆ˜์ธ ์‚ฌ์ดํด์ด ์žˆ์„ ๋•Œ๋งŒ ๋ฌธ์ œ์ด๋‚˜, ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์Œ์ˆ˜์ธ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ„์„ ์ด ์žˆ์œผ๋ฉด ์•„์˜ˆ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ. ์Œ์ˆ˜์ธ ๊ฐ„์„ ์ด ์žˆ๋‹ค๋ฉด ๋ฒจ๋งŒํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ. ๋˜ํ•œ ์ •ํ™•ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ทผ์‚ฌ์น˜๋ฅผ ์›ํ•  ๊ฒฝ์šฐ A* ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•จ. ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ๋„คํŠธ์›Œํฌ์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ.

 

๐Ÿงฟ ์ผ๋ช… '์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜' ์ค‘ ํ•˜๋‚˜๋กœ, ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ ์ƒํ™ฉ์€ (1) ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ํ•œ ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ (2) ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ (3) ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” (2)์ด๋ฉฐ, ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜ → ๋งค ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ์ž„์˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋˜ํ•œ, A →  C๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ  A → B๋กœ ๊ฐ„ ์ผ€์ด์Šค์—์„œ B → C ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๋Š”, ๊ธฐ๋ณธ์ ์œผ๋กœ DP์˜ ์›๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์Œ์ˆ˜์ธ ๊ฐ„์„ ์ด ์—†์„ ๊ฒฝ์šฐ ๋™์ž‘ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ๋„๋กœ(๊ฐ„์„ )๊ฐ€ ์Œ์˜ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š๋Š” ์ ์œผ๋กœ ๋ฏธ๋ฃจ์–ด ๋ณด์•„ ํ˜„์‹ค์„ธ๊ณ„์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

๐Ÿงฟ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ •

โ‘  ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ •

 

โ‘ก ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”: ์ฒ˜์Œ์— ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๊ธฐ ์œ„ํ•œ ๋น„์šฉ ๋ฌดํ•œ๋Œ€ ์„ค์ •, ์ž๊ธฐ ์ž์‹ (์ถœ๋ฐœ ๋…ธ๋“œ)์€ 0์œผ๋กœ ์„ค์ •

 

โ‘ข <๊ทธ๋ฆฌ๋””> ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ ์„ ํƒ
(์ด ๋•Œ, ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉฐ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌ๋œ ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ๊ณ ์ •๋˜์–ด ๋” ์ด์ƒ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. ํ•œ ๋‹จ๊ณ„๋‹น ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ํ™•์‹คํžˆ ์ฐพ๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ด)

 

โ‘ฃ <dp> (์œ„ ์„ ํƒํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€) ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 

 

โ‘ค ์œ„ ๊ณผ์ •์—์„œ โ‘ข๊ณผ โ‘ฃ๊ณผ์ •์„ ๋ฐ˜๋ณต. ์ดํ›„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ…Œ์ด๋ธ”์— ์ถœ๋ฐœ ๋…ธ๋“œ์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค.

implementation

โ‘  without using Priority Queue

๐Ÿงฟ ๊ตฌ์ฒด ๊ณผ์ •

โ‘  ๊ทธ๋ž˜ํ”„ ์ค€๋น„ / ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ • / ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์„ค์ •

โ‘ก ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 1๋ฒˆ ๋…ธ๋“œ(๊ฑฐ๋ฆฌ 0) ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ + ๋…ธ๋“œ 1์—์„œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ(๋…ธ๋“œ 2์™€ ๋…ธ๋“œ 3๊ณผ ๋…ธ๋“œ4): ๊ธฐ์กด ํ…Œ์ด๋ธ” ๊ฐ’๊ณผ ๋…ธ๋“œ1๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€ ๊ฐ„์„  ๊ฑฐ๋ฆฌ ํ•ฉ ๋‘ ๊ฐœ๋ฅผ ๋น„๊ตํ•ด์„œ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ

โ‘ข ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ 3๋ฒˆ ์„ ํƒ → 3๋ฒˆ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ + ์ธ์ ‘ ๋…ธ๋“œ 4๋ฒˆ ๋…ธ๋“œ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ(ํ˜„์žฌ 3๋ฒˆ ๋…ธ๋“œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ 2 + ๊ฐ„์„  2์˜ ํ•ฉ 4๊ฐ€ 5๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 4๋กœ ์—…๋ฐ์ดํŠธ)

 

โ‘ฃ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ 2๋ฒˆ ์„ ํƒ → 2๋ฒˆ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ + ์ธ์ ‘๋…ธ๋“œ 5๋ฒˆ ๋…ธ๋“œ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ(ํ˜„์žฌ 2๋ฒˆ ๋…ธ๋“œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ 3 + ๊ฐ„์„  8์˜ ํ•ฉ 11์ด inf๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 11๋กœ ์—…๋ฐ์ดํŠธ)

โ‘ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ 4๋ฒˆ ์„ ํƒ → 4๋ฒˆ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ + ์ธ์ ‘๋…ธ๋“œ 5๋ฒˆ ๋…ธ๋“œ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ(ํ˜„์žฌ 4๋ฒˆ ๋…ธ๋“œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ 4 + ๊ฐ„์„  6์˜ ํ•ฉ 10์ด 11๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 10์œผ๋กœ ์—…๋ฐ์ดํŠธ)  

 

โ‘ฅ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ 5๋ฒˆ ์„ ํƒ → 5๋ฒˆ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ + ์ธ์ ‘๋…ธ๋“œ 6๋ฒˆ ๋…ธ๋“œ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ(ํ˜„์žฌ 5๋ฒˆ ๋…ธ๋“œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ 10 + ๊ฐ„์„  1์˜ ํ•ฉ 11์ด inf๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 11๋กœ ์—…๋ฐ์ดํŠธ) 

 

โ‘ฆ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ 6๋ฒˆ ์„ ํƒ → 6๋ฒˆ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ + ์ธ์ ‘๋…ธ๋“œ 6๋ฒˆ ๋…ธ๋“œ๊ฐ€ ์—†๊ณ  ๋ฐฉ๋ฌธ ์•ˆํ•œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒ

 

๐Ÿงฟ python code

import sys
input=sys.stdin.readline
INF = int(1e9)

n,m=map(int,input().split()) #node number, line number
start=int(input()) #start node
graph=[[]for i in range(n+1)] #graph list
visited=[False]*(n+1)
distance=[-1]+[INF]*(n) #shortest-path distance arr

#forms graph
for _ in range(m):
    a,b,c=map(int,input().split())
    graph[a].append((b,c)) #node a -> node b (cost c)

#returns the smallest paths of node among non-visited
def get_smallest_node():
    min_value=INF
    index=0 #the smallest node's index
    for i in range(1,n+1):
        if distance[i] < min_value and not visited[i]:
            min_value = distance[i]
            index = i
    return index

def dijkstra(start):
    distance[start] = 0 #initialize 0 in start node in sp distance arr
    visited[start] = True
    for j in graph[start]:
        distance[j[0]] = j[1] #update sp arr starting from start node
    
    for _ in range(n-1): #n-1 times (start node operated above)
        now = get_smallest_node()
        visited[now] = True
        for j in graph[now]: #update sp arr starting from each node
            cost = distance[now] + j[1]
            if cost < distance[j[0]]:
                distance[j[0]] = cost

dijkstra(start)

print(distance) #print sp arr table

 

๐Ÿงฟ ๋ฌธ์ œ์ : ๋งค ๋ฒˆ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํ˜•ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค(์œ„ get_smallest_node() ํ•จ์ˆ˜). ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ๋Š” table update๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ๋…ธ๋“œ ํƒ์ƒ‰ + ๋งค ํƒ์ƒ‰ ์‹œ ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ •ํ•˜๊ธฐ ์œ„ํ•œ get_smallest_node() ์ด๋ ‡๊ฒŒ O(V*V)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค. (V๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜). ์ผ๋ฐ˜์ ์œผ๋กœ ์ „์ฒด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5,000๊ฐœ ์ดํ•˜๋ผ๋ฉด ์œ„ ์ฝ”๋“œ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ. ํ•˜์ง€๋งŒ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10,000๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด TLE.

โ‘ก using Priority Queue

๐Ÿงฟ ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋” ํšจ์œจ์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„์„ ์œ„ํ•ด์„œ๋Š” ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue) ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ(ํฌ์ŠคํŒ… ์ฐธ์กฐ). ์šฐ์„ ์ˆœ์œ„ ํ๋ž€ '์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ'. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊บผ๋‚ด์„œ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ. ์šฐ์„ ์ˆœ์œ„ ํ์—๋Š” ์ตœ์†Œ ํž™(min heap)๊ณผ ์ตœ๋Œ€ ํž™(max heap) ์กด์žฌ. ์ตœ์†Œ ํž™์€ ๊ฐ’์ด ๋‚ฎ์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋จผ์ € ์‚ญ์ œ. ์ตœ๋Œ€ ํž™์€ ๊ฐ’์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋จผ์ € ์‚ญ์ œ. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์— ๋ชจ๋‘ O(logn).

 

๐Ÿงฟ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ '๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •' get_smallest_node()์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ตœ์†Œ ํž™ ์‚ฌ์šฉ. 

 

โ‘  ๊ทธ๋ž˜ํ”„ ์ค€๋น„ / ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ • / ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์„ค์ • / ์šฐ์„ ์ˆœ์œ„ ํ์— ์ถœ๋ฐœ ๋…ธ๋“œ ์‚ฝ์ž…

โ‘ก ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ ๊บผ๋ƒ„. 1๋ฒˆ ๋…ธ๋“œ๋Š” ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ. 1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 2๋ฒˆ ๋…ธ๋“œ / 3๋ฒˆ ๋…ธ๋“œ / 4๋ฒˆ ๋…ธ๋“œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ update. ์„ธ ๊ฐœ ๋…ธ๋“œ ๋ชจ๋‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์œผ๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฝ์ž…

 

โ‘ข ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ ๊บผ๋ƒ„. 3๋ฒˆ ๋…ธ๋“œ๋Š” ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ. 3๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 4๋ฒˆ ๋…ธ๋“œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ. 4๋ฒˆ ๋…ธ๋“œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์œผ๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฝ์ž…

 

โ‘ฃ ๊ณ„์†ํ•ด์„œ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ ๊บผ๋ƒ„. 2๋ฒˆ ๋…ธ๋“œ ์—ญ์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—ฐ๊ฒฐ ๋…ธ๋“œ 5๋ฒˆ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ ๋’ค, ์šฐ์„ ์ˆœ์œ„ ํ์— 5๋ฒˆ ๋…ธ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฝ์ž….

 

โ‘ค ๊ณ„์†ํ•ด์„œ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊ฑฐ๋ฆฌ๊ฐ€ 4์ธ ๋…ธ๋“œ 4๋ฅผ ๊บผ๋‚ด๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ ๋’ค, ์—ฐ๊ฒฐ ๋…ธ๋“œ 5๋ฒˆ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ 10์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฝ์ž….

 

โ‘ฅ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊ฑฐ๋ฆฌ๊ฐ€ 5์ธ ๋…ธ๋“œ 4๋ฅผ ๊บผ๋ƒˆ์œผ๋‚˜, ๋…ธ๋“œ 4๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฏ€๋กœ ํŒจ์Šค. ๊ฑฐ๋ฆฌ๊ฐ€ 10์ธ ๋…ธ๋“œ 5๋ฅผ ๊บผ๋‚ด๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ ๋’ค, ์—ฐ๊ฒฐ ๋…ธ๋“œ 6๋ฒˆ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ 11๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฝ์ž….

 

โ‘ฆ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊ฑฐ๋ฆฌ๊ฐ€ 11์ธ ๋…ธ๋“œ 5๋ฅผ ๊บผ๋ƒˆ์œผ๋‚˜ ๋…ธ๋“œ 5๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฏ€๋กœ ํŒจ์Šค. ๊ฑฐ๋ฆฌ๊ฐ€ 11์ธ ๋…ธ๋“œ 6์„ ๊บผ๋‚ด๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ ๋’ค, ๋…ธ๋“œ 6์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์—†์œผ๋ฏ€๋กœ ํŒจ์Šค. ์šฐ์„ ์ˆœ์œ„ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ๋…ธ๋“œ ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒ

 

๐Ÿงฟ python code

 

โ€ป ์ฃผ์˜: ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊บผ๋‚ธ (๊ฑฐ๋ฆฌ, ๋…ธ๋“œ) ์Œ์„ ์‹ค์ œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•  ๋–„ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ๋ฅผ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์˜ ๊ฐ’๊ณผ ๊ฐ™์€ ์ง€ / ๋‹ค๋ฅธ ์ง€์˜ ์—ฌ๋ถ€๋กœ ๊ฒ€์‚ฌ (๋”ฐ๋กœ visited list ๋งŒ๋“ค ํ•„์š” x)

 

โ€ป ์ฃผ์˜: ๋‹จ๋ฐฉํ–ฅ์ธ์ง€ / ์–‘๋ฐฉํ–ฅ์ธ์ง€ ๊ตฌ๋ถ„. ์–‘๋ฐฉํ–ฅ์ด๋ผ๋ฉด graph[a]์™€ graph[b] ๊ฐ๊ฐ apppend ํ•„์š”

import sys
import heapq
input=sys.stdin.readline
INF = int(1e9)

n,m=map(int,input().split()) #node number, line number
start=int(input()) #start node
graph=[[]for _ in range(n+1)] #graph list
distance=[-1]+[INF]*(n) #shortest-path distance arr

#forms graph
for _ in range(m):
    a,b,c=map(int,input().split())
    graph[a].append((b,c)) #node a -> node b (cost c)

def dijkstra(start):
    q = [] #priority-queue
    heapq.heappush(q, (0, start)) #(shortest distance, node number)
    distance[start] = 0 #initialize 0 in start node in sp distance arr

    while q:
        cur_dist, cur_node = heapq.heappop(q) #get the shortest dist with node
        if cur_dist <= dist_table[cur_node]: #if not visited
            for next_node in graph[cur_node]: #BFS
                next_node_number, next_node_dist = next_node[0], next_node[1]
                cost = cur_dist + next_node_dist #get cost(current + next dist)
                if cost < distance[next_node_number]: #if should it be updated
                    distance[next_node_number] = cost #update
                    heapq.heappush(q,(cost,next_node_number)) #insert in PQ

dijkstra(start)

print(*distance[1:]) #print sp arr table(from node 1)

 

๐Ÿงฟ ์šฐ์„ ์ˆœ์œ„ ํ ๊ด€์ ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ๊ฐ„์„  1๊ฐœ๋‹น ์ตœ๋Œ€ 1๊ฐœ์˜ ์›์†Œ๊ฐ€ ์šฐ์„ ์ˆœ์œ„ ํ์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(ElogE). ์•ž์„œ ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ์ด ์—†๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V^2)๋กœ, E๊ฐ€ V^2์— ๊ฐ€๊น๋‹ค๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋น„์Šทํ•ด, ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ์˜ ํšจ๊ณผ๊ฐ€ ์—†์œผ๋‚˜ ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ์—์„œ๋Š” V๋ฅผ ํฌ๊ฒŒ ๋‘๊ณ (์ฆ‰, ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํฌ๊ฒŒ ๋‘๊ณ ), E๋Š” V^2๊นŒ์ง€ ์•ˆ๊ฐ€๊ฒŒ๋” (๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋Š” ์ž‘๊ฒŒ) ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ ์ƒ๊ด€ x

โ‘ข Dijkstra path ๊ฒฝ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ


BaaaarkingDog

์ด์ฝ”ํ…Œ

 

 

'Computer Science > Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿฆœ Pigeonhole Principle  (0) 2024.02.02
๐Ÿ™ƒ Backtracking  (0) 2024.01.18
๐ŸLIS(Longest Increasing Subsequence) O(n^2)/O(nlogn)  (0) 2024.01.06
๐Ÿ“กKadane's Algorithm  (0) 2024.01.03
๐Ÿ”ฌ Parametric Search  (1) 2023.12.31

๋Œ“๊ธ€