๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/Shortest Path

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ (python)

by syLim___ 2023. 2. 28.
728x90

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Dijkstra Algorithm)

 -ํŠน์ • ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ

 -๋งค ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“œ๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค (๊ทธ๋ฆฌ๋””์ž„)

 -๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์–‘์ˆ˜์ผ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค


๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  1) ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (์ถœ๋ฐœ๋…ธ๋“œ๋Š” 0, ๋‚˜๋จธ์ง€๋Š” INF)

  2) ํ˜„์žฌ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•˜๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒ

  3) 2์—์„œ ์„ ํƒํ•œ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐ, ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ 

  4) 2,3๋ฒˆ ๊ณผ์ • ๋ฐ˜๋ณต


ํ˜„์žฌ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ ์„ ํƒํ•˜๊ธฐ

๊ฐ„๋‹จํ•˜๊ฒŒ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋งค๋ฒˆ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 ๊ทธ๋Ÿฌ๋‚˜ ์„ ํ˜•ํƒ์ƒ‰์œผ๋กœ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)์œผ๋กœ,

 ์ž…๋ ฅ๋ฐ›์€ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ๋‹ค๋ฉด(์˜ˆ๋ฅผ ๋“ค๋ฉด, 1๋งŒ ๊ฐœ ์ด์ƒ) ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ์„ ํ˜•ํƒ์ƒ‰ ๋Œ€์‹ , ์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ์ด์šฉํ•˜๋„๋ก ํ•œ๋‹ค!

 ์šฐ์„ ์ˆœ์œ„ํ ๊ตฌํ˜„์— ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋Š” ํž™์ธ๋ฐ,

 ํž™์€ ์‚ฝ์ž… ๋˜๋Š” ์‚ญ์ œ์‹œ O(logN)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฏ€๋กœ ์—ฐ์‚ฐ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 ์ฐธ๊ณ ๋กœ, ํŒŒ์ด์ฌ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” heapq ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ตœ์†Œํž™์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.

 


ํŒŒ์ด์ฌ ์ฝ”๋“œ

import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) #๋งค์šฐ ํฐ ์ˆซ์ž์ธ 10์–ต์„ ๋ฌดํ•œ๋Œ€๋กœ ์ •์˜ํ•œ๋‹ค

#n(๋…ธ๋“œ ์ˆ˜), m(๊ฐ„์„  ์ˆ˜), x(์ถœ๋ฐœ๋…ธ๋“œ) ์ž…๋ ฅ๋ฐ›๊ธฐ
n,m = map(int,input().split())
x = int(input())

#๊ฐ„์„  ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ
graph = [[] for i in range(n+1)]
#์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ (์ดˆ๊ธฐ๊ฐ’์€ ์ „๋ถ€ ๋ฌดํ•œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”)
distance = [INF]*(n+1)

#๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ (a์—์„œ b ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c)
for _ in range(m):
	a,b,c = map(int,input().split())
    graph[a].append((b,c))
    
   
def dijkstra(start):
	q=[]
    heapq.heappush(q,(0,start)) # ์šฐ์„ ์ˆœ์œ„ํ์— ์‹œ์ž‘๋…ธ๋“œ์™€ ๊ทธ ์ตœ๋‹จ๊ฒฝ๋กœ ์ •๋ณด๋ฅผ ์‚ฝ์ž…
    distance[start]=0 #์ถœ๋ฐœ๋…ธ๋“œ ์ž๊ธฐ์ž์‹ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋Š” 0
    
    #์šฐ์„ ์ˆœ์œ„ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์ฒดํฌ
    while q:
    	dist, now = heapq.heappop(q) #์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€ ๋…ธ๋“œ๋ฒˆํ˜ธ
        
        #ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์  ์žˆ๋‹ค๋ฉด ๋ฌด์‹œํ•œ๋‹ค
        if distance[now] < dist: continue
        
        #ํ˜„์žฌ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ์ฒดํฌํ•˜๋ฉด์„œ, ๊ฐ’์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐฑ์‹ ํ•ด์ค€๋‹ค
        for i in graph[now]:
        	cost = dist+i[1]
            if cost < distance[i[0]]:
            	distance[i[0]] = cost
                heapq.heappush(q, (cost,i[0]))
           
#๋‹ค์ต์ŠคํŠธ๋ผ ์ˆ˜ํ–‰
dijkstra(x)

#๊ฐ ๋…ธ๋“œ๋ณ„๋กœ ์ตœ๋‹จ๊ฒฝ๋กœ ์ถœ๋ ฅ
for i in range(1,n+1):
	if distance[i]==INF:
    	print("๋„๋‹ฌํ•  ์ˆ˜ ์—†์Œ")
    else:
    	print(distance[i])
728x90