๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Coding Test/Algorithms

[๋ฐฑ์ค€] 1753. ์ตœ๋‹จ๊ฒฝ๋กœ/Python - ๊ณจ๋“œ4

by The Future Engineer, Lucy 2025. 1. 20.
728x90
๋ฐ˜์‘ํ˜•

โ“๋ฌธ์ œ

์„ฑ๋Šฅ ์š”์•ฝ

๋ฉ”๋ชจ๋ฆฌ: 136204 KB, ์‹œ๊ฐ„: 380 ms

๋ถ„๋ฅ˜

๋‹ค์ต์ŠคํŠธ๋ผ, ๊ทธ๋ž˜ํ”„ ์ด๋ก , ์ตœ๋‹จ ๊ฒฝ๋กœ

 

๋ฌธ์ œ ์„ค๋ช…

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

โœ๐Ÿปํ’€์ด

์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ ‘ํ–‰๋ ฌ๊ณผ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ์ ‘ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(V²)์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(E * logV)์ด ๋˜๋ฏ€๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” Heap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฆ…๋‹ˆ๋‹ค.

heapq๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด pq๋ฅผ ์ƒ์„ฑํ•ด (๊ฐ€์ค‘์น˜, ์‹œ์ž‘ ์ •์ ) ์Œ์œผ๋กœ ํž™ํ์— ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  dist๋Š” ๊ฐ ์ •์ ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” 0์ด๋ฏ€๋กœ dist[K] = 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

ํž™ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

ํž™ํ์—์„œ ํ˜„์žฌ ๊ฑฐ๋ฆฌ์™€ ํ˜„์žฌ ์ •์  ์œ„์น˜๋ฅผ ๊บผ๋‚ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์ •์ ์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด ํ˜„์žฌ ๊ฑฐ๋ฆฌ์™€ ์ •์ ์„ ํž™ํ์— ๋„ฃ๋Š”๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ dist๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ๊ฐ ์ •์ ์—์„œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ’ป์ฝ”๋“œ

import sys
import heapq

input = sys.stdin.readline

V, E = map(int, input().split())
K = int(input())
adjlist = [[] for _ in range(V+1)]

for i in range(E):
    u, v, w = map(int, input().split())
    adjlist[u].append((v, w))

pq = []
heapq.heappush(pq, (0, K))
dist = [1e9] * (V+1)
dist[K] = 0

while pq:
    d, cur = heapq.heappop(pq)

    for v, w in adjlist[cur]:
        if dist[v] > dist[cur] + w:
            dist[v] = dist[cur] + w
            heapq.heappush(pq, (dist[v], v))

for i in range(1, V+1):
    if dist[i] == 1e9:
        print("INF")
    else:
        print(dist[i])

๐Ÿ“ํ›„๊ธฐ

๊ทธ๋ž˜ํ”„ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ DFS, BFS๋งŒ ์ƒ๊ฐํ•˜๋Š”๋ฐ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

728x90
๋ฐ˜์‘ํ˜•