์ƒˆ์†Œ์‹

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ต์ŠคํŠธ๋ผ(dijkjstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? with Python

  • -

 ๐Ÿ’ก ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

๊ทธ๋ž˜ํ”„์—์„œ ํŠน์ • ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ๋ฌธ์ œ
๋งค๋ฒˆ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ์ •์ ์„ ์„ ํƒํ•˜์—ฌ ํƒ์ƒ‰ ๋ฐ˜๋ณต 

 

 

๐ŸŒฑ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠน์ง• 

๋„์ฐฉ๋…ธ๋“œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ธธ์„ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. 
๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์ค‘์น˜๊ฐ€ ์–‘์ˆ˜์ผ ๋•Œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

โ˜ ๋™์ž‘ ๋‹จ๊ณ„ 

1. ์ถœ๋ฐœ๋…ธ๋“œ์™€ ๋™์ž‘๋…ธ๋“œ ์„ค์ •ํ•ด์ฃผ๊ณ  ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. 

2. ํ˜„์žฌ ์œ„์น˜์—์„œ์˜ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ ๋’ค,   

    ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ํ•ด์ค€๋‹ค. 

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

4. 3~4๋ฒˆ ๊ณผ์ • ๋ฐ˜๋ณต 

 

- ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” : 1์ฐจ์› ๋ฐฐ์—ด๋กœ N๊ฐœ ๋…ธ๋“œ๊นŒ์ง€ ์˜ค๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋ก //  N๊ฐœ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ํฐ ๊ฐ’์„ ๋„ฃ์–ด ์ดˆ๊ธฐํ™” 

- ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ๋ฐฐ์—ด : ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด๋กœ, ์ „์ฒด ๋ฐฐ์—ด์„ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ False๋กœ ๋‘๊ณ  ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” True๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. 

 

โœŒ ๋™์ž‘ ์˜ˆ์‹œ 

์ถœ๋ฐœ ๋…ธ๋“œ๋Š” 1๋ฒˆ, ๋„์ฐฉ ๋…ธ๋“œ๋Š” 6๋ฒˆ 

๊ฑฐ๋ฆฌํ…Œ์ด๋ธ”์€ ํฐ ๊ฐ’์ธ ๋ฌดํ•œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. 

๋…ธ๋“œ๋“ค์„ ์ž‡๋Š” ์ค‘๊ฐ„์—๋Š” ๊ฐ„์„  ๋น„์šฉ(๊ฐ€์ค‘์น˜)๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค. 

 

์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ 1, ๋„์ฐฉ๋…ธ๋“œ๋ฅผ 6์œผ๋กœ ์„ค์ •ํ•ด์ค€๋’ค, ์ถœ๋ฐœ๋…ธ๋“œ์—์„œ ์ž๊ธฐ ์ž์‹ ์˜ ๊ฑฐ๋ฆฌ๋Š” 0์ด๋ฏ€๋กœ ๊ฑฐ๋ฆฌ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

1๋ฒˆ์—์„œ ์ถœ๋ฐœํ•  ๋•Œ ์ธ์ ‘ ๋…ธ๋“œ๋Š” 2์™€ 4์ด๋‹ค. 1์—์„œ 2๋กœ ๊ฐˆ๋•Œ์˜ ๊ฐ’์€ 2, 1์—์„œ 4๋กœ ๊ฐˆ๋•Œ์˜ ๊ฐ’์€ 1์ด๋‹ค.

์ธ์ ‘๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์กด์˜ ๊ฑฐ๋ฆฌ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์ตœ์†Œ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. ์ธ์ ‘ ๋…ธ๋“œ 2๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋Š” 2์™€ inf ์ค‘์— 2, ์ธ์ ‘๋…ธ๋“œ 4๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋Š” 1๊ณผ inf์ค‘์— 1์ด๋‹ค. 

๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค€ ๋’ค, ์ธ์ ‘ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ ํ•œ ๋…ธ๋“œ 1์€ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค. 

๊ทธ ํ›„ 1์—์„œ ์ธ์ ‘ ๋…ธ๋“œ๋กœ ๊ฐˆ ๋•Œ ๊ฑฐ๋ฆฌ๋น„์šฉ์ด ์ ์€ 4๋ฒˆ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค. 

 

๋…ธ๋“œ 4์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ธ์ ‘ ๋…ธ๋“œ๋Š” 2์™€ 5์ด๋‹ค. 

4๋ฒˆ๊ณผ ์—ฐ๊ฒฐ๋œ 2, 5๋ฒˆ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด, ๋จผ์ € 4์—์„œ 2๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด์˜ 1๋ฒˆ-> 4๋ฒˆ์œผ๋กœ ์˜ฌ๋•Œ ๊ฑฐ๋ฆฌ๋น„์šฉ 1๊ณผ 4์—์„œ 2๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๋น„์šฉ 2๋ฅผ ๋”ํ•œ 3์ด๋‹ค. 

ํ•˜์ง€๋งŒ ๊ธฐ์กด์— ๋…ธ๋“œ 2๋ฒˆ์— ๊ฑฐ๋ฆฌ๋น„์šฉ์ด 2๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” 1์—์„œ 2๋กœ ๊ฐˆ๋•Œ์˜ ์ตœ์†Œ๊ฐ’์„ ๊ฐฑ์‹ ํ–ˆ๋˜ ๊ฐ’์ด๋‹ค. 

2์™€ 3์„ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฑฐ๋ฆฌ๋น„์šฉ์ด 2๊ฐ€ ๋” ์ ๊ฒŒ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์—…๋ฐ์ดํŠธํ•ด์ฃผ์ง€ ์•Š๊ณ  2๋ฅผ ์œ ์ง€ํ•ด์ค€๋‹ค. 

4๋ฒˆ-> 5๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐˆ ๋•Œ์—๋Š” ์œ„์™€ ๊ฐ™์ด 1+ 1 = 2, ๊ฑฐ๋ฆฌ๋น„์šฉ์€ inf์™€ 2๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ตœ์†Œ ๊ฐ’์ด 2๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. 

 

 

๋‹ค์Œ์œผ๋กœ ๊ฐˆ ๋…ธ๋“œ๋Š” ๊ฑฐ๋ฆฌ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ 2๋ฒˆ ๋…ธ๋“œ์™€ 5๋ฒˆ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๊ฑฐ๋ฆฌ ๊ฐ’์ด ๊ฐ™์„ ๋•Œ์—๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ž‘์€ ๋…ธ๋“œ์ธ 2๋ถ€ํ„ฐ ์ด๋™ํ•ด๋ณธ๋‹ค. 

 

 

2๋ฒˆ๋…ธ๋“œ์—์„œ ์ธ์ ‘ ๋…ธ๋“œ๋Š” 3๋ฒˆ, 4๋ฒˆ๋…ธ๋“œ์ด๋‹ค. 

2๋ฒˆ-> 4๋ฒˆ์œผ๋กœ ๊ฐˆ๋•Œ์˜ ๊ฑฐ๋ฆฌ๋น„์šฉ์€ 2+2 = 4์ด๋‹ค. 

๊ฑฐ๋ฆฌ๋น„์šฉ 4์™€ ๊ธฐ์กด์˜ ๊ฑฐ๋ฆฌ๋น„์šฉ 1์„ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ตœ์†Œ๊ฐ’์€ ๊ธฐ์กด ๊ฐ’์ด๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

2๋ฒˆ-> 3๋ฒˆ์œผ๋กœ ์ด๋™ํ•  ๋•Œ์˜ ๊ฑฐ๋ฆฌ๋น„์šฉ์€ 2+ 3 = 5์ด๋‹ค. ๊ธฐ์กด์˜ ๊ฑฐ๋ฆฌ๋น„์šฉ inf์™€ 5๋ฅผ ๋น„๊ตํ•˜์˜€์„ ๋•Œ ์ตœ์†Œ๊ฐ’์€ 5์ด๋ฏ€๋กœ 5๋ฒˆ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ 5๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. 

๋‹ค์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ 3,5,6๋ฒˆ ์ค‘ ๊ฑฐ๋ฆฌ๋น„์šฉ์ด ์ž‘์€ 5๋ฒˆ์œผ๋กœ ์ด๋™ํ•ด์ค€๋‹ค. 

 

 

5๋ฒˆ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ธ์ ‘๋…ธ๋“œ๋Š” 4๋ฒˆ๊ณผ 6๋ฒˆ์ด๋‹ค. 

4๋ฒˆ์€ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜์ง€์•Š๋Š”๋‹ค. 

5๋ฒˆ-> 6๋ฒˆ ๋…ธ๋“œ๋กœ ์ด๋™ํ•  ๋•Œ์—๋Š” ๊ธฐ์กด ๋…ธ๋“œ 5๋ฒˆ์˜ ๊ฑฐ๋ฆฌ๋น„์šฉ 2์™€ 5๋ฒˆ->6๋ฒˆ ์ด๋™ํ• ๋•Œ์˜ ๊ฑฐ๋ฆฌ๋น„์šฉ 2๋ฅผ ๋”ํ•œ  4์ด๋ฏ€๋กœ , 6๋ฒˆ ํ…Œ์ด๋ธ”์˜ ๊ธฐ์กด ๊ฑฐ๋ฆฌ๋น„์šฉ inf์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ  4๋กœ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. 

 

์ตœ์ข…์ ์œผ๋กœ 1๋ฒˆ ๋…ธ๋“œ์—์„œ 6๋ฒˆ ๋…ธ๋“œ ๊นŒ์ง€ ์˜ค๋Š”๋ฐ ๊ฑฐ์น˜๋Š” ๋…ธ๋“œ๋Š” 1-> 4-> 5-> 6 ์ด๊ณ , ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋น„์šฉ์€ 4์ด๋‹ค. 

 

 

๐Ÿ•’ ์‹œ๊ฐ„ ๋ณต์žก๋„ 

๊ฐ„์„ ์˜ ์ˆ˜: E(Edge) 
๋…ธ๋“œ์˜ ์ˆ˜: V(Vertex)
 => O(E logV)
ํ•˜๋‚˜์˜ ๊ฐ„์„ ์— ๋Œ€ํ•ด์„œ๋Š” O(logE)์ด๊ณ ,  ์ตœ์•…์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋Š” O(E logV)์ด๋‹ค.

 

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์ฝ”๋“œ ๊ตฌํ˜„ 

1. ๊ธฐ๋ณธ ๋™์ž‘ - heapq ๋ฐฉ์‹ 

INF = int(1e9)

n,m=map(int,input().split())
start = int(input())
graph=[[] for i in range(n+1)]
distance=[INF]*(n+1)

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

    while q:
        # ๊ฐ€์žฅ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ์ฒ˜๋ฆฌ๋œ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด pass
        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(start)

for i in range(1,n+1):
    if distance[i]==INF:
        print("INFINITY")
    else:
        print(distance[i])

 

2. ์ตœ๋‹จ ๊ฒฝ๋กœ ์ถ”์  

mport heapq
INF = int(1e9)

n,m = 8,14 # ๋…ธ๋“œ ์ˆ˜
start = 1 # ์ถœ๋ฐœ ๋…ธ๋“œ
graph=[[] for i in range(n+1)]
# ์ตœ๋‹จ๊ฑฐ๋ฆฌ + ๋ถ€๋ชจ๋…ธ๋“œ ์ €์žฅ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
distance=[[INF,i] for i in range(n+1)]

# ์–‘๋ฐฉํ–ฅ ์ž…๋ ฅ
# ๋…ธ๋“œ a์™€ ๋…ธ๋“œ b์˜ ๋น„์šฉ c
for _ in range(m):
    a,b,c = map(int, input().split())
    graph[a].append((b,c))
    graph[b].append((a,c))

def dijkstra(start):
    q=[]
    heapq.heappush(q,(0,start))
    distance[start][0]=0

    while q:
        # ๊ฐ€์žฅ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ์ฒ˜๋ฆฌ๋œ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด pass
        if distance[now][0]<dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]][0]:
                distance[i[0]][0]=cost # ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
                distance[i[0]][1]=now  # ๋ถ€๋ชจ๋…ธ๋“œ ์ €์žฅ
                heapq.heappush(q,(cost,i[0]))
                
dijkstra(start)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
for i in range(1,n+1):
    length,_= distance[i] # ์ตœ๋‹จ ๊ธธ์ด
    parent_node=i
    path=[]
    while parent_node!=1:        
        path.append(parent_node)    
        _,parent_node = distance[parent_node]
        distance[parent_node]
    path.append(1)
    print("%s๋ฒˆ ๋…ธ๋“œ : %s (%s)" % (i,">".join(map(str,path[::-1])),length))
1๋ฒˆ ๋…ธ๋“œ : 1 (0)
2๋ฒˆ ๋…ธ๋“œ : 1>2 (3)
3๋ฒˆ ๋…ธ๋“œ : 1>3 (4)
4๋ฒˆ ๋…ธ๋“œ : 1>3>4 (12)
5๋ฒˆ ๋…ธ๋“œ : 1>3>5 (9)
6๋ฒˆ ๋…ธ๋“œ : 1>2>6 (12)
7๋ฒˆ ๋…ธ๋“œ : 1>3>5>7 (13)
8๋ฒˆ ๋…ธ๋“œ : 1>2>6>8 (14)
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.