Dijkstra with Python

์œ ๊ฑด์šฐยท2024๋…„ 9์›” 23์ผ

์ฝ”ํ…Œ์ค€๋น„

๋ชฉ๋ก ๋ณด๊ธฐ
12/13

๐Ÿ’ก ๋ฌธ์ œ ์„ค๋ช…

๋ฌธ์ œ : https://www.acmicpc.net/problem/1753

  • ๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ฃผ์–ด์ง„ ์‹œ์ž‘์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ๋‹จ, ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋Š” 10 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ž…๋ ฅ

  • ์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • (1 โ‰ค V โ‰ค 20,000, 1 โ‰ค E โ‰ค 300,000) ๋ชจ๋“  ์ •์ ์—๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
  • ๋‘˜์งธ ์ค„์—๋Š” ์‹œ์ž‘ ์ •์ ์˜ ๋ฒˆํ˜ธ K(1 โ‰ค K โ‰ค V)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ์…‹์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ ๊ฐ„์„ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ (u, v, w)๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.
  • ์ด๋Š” u์—์„œ v๋กœ ๊ฐ€๋Š” ๊ฐ€์ค‘์น˜ w์ธ ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.
  • u์™€ v๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋ฉฐ w๋Š” 10 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ •์  ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ„์„ ์ด ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์Œ์— ์œ ์˜ํ•œ๋‹ค.

์ถœ๋ ฅ

  • ์ฒซ์งธ ์ค„๋ถ€ํ„ฐ V๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ, i๋ฒˆ์งธ ์ค„์— i๋ฒˆย ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฒฝ๋กœ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • ์‹œ์ž‘์  ์ž์‹ ์€ 0์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ , ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” INF๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.







โ“๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด

  • ๊ทธ๋ž˜ํ”„์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์˜ ๊ฐ„์„  ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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







๐Ÿง‘โ€๐Ÿ’ป ์ฝ”๋“œ ํ’€์ด

import heapq # ์šฐ์„ ์ˆœ์œ„ ํ
import sys 

INF = int(1e9) # ์ตœ๋Œ€๊ฐ’ 

n, m = map(int, sys.stdin.readline().split()) 
start = int(sys.stdin.readline())

graph = [[] for i in range(n + 1)] # ๊ทธ๋ž˜ํ”„ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ 

distance = [INF] * (n + 1) # ๊ฐ ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ 

for i in range(m):
    x, y, cost = map(int, sys.stdin.readline().split())
    graph[x].append([y, cost]) # x ๋…ธ๋“œ์—์„œ y ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” cost๋ฅผ ๊ฐ„์„  ๊ทธ๋ž˜ํ”„์— ์ถ”๊ฐ€ 

def dijkstra(start):
    q = [] # ์šฐ์„ ์ˆœ์œ„ ํ ์ƒ์„ฑ
    heapq.heappush(q, (0, start)) # ํ˜„์žฌ๊ฑฐ๋ฆฌ, ์‹œ์ž‘ ๋…ธ๋“œ ์ตœ์†Œ ํž™์— ์ถ”๊ฐ€ 
    distance[start] = 0 # ์‹œ์ž‘๋…ธ๋“œ ์ตœ๋‹จ ๊ฒฝ๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™” 

    while q:
        dist, now = heapq.heappop(q) # ํ์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋…ธ๋“œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

        if distance[now] < dist: # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ dist ๋ณด๋‹ค ์ž‘์œผ๋ฉด continue
            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('INF')
    else:
        print(distance[i])
profile
โœ…ย ์ ๋‹นํ•œ ์ถ”์ƒํ™”๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€