Algorithm Problem/Python

[python] ๋ฐฑ์ค€ - 1916. ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

deo2kim 2020. 9. 23. 08:05
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

  • G5 | ๋‹ค์ต์ŠคํŠธ๋ผ, ๊ทธ๋ž˜ํ”„

ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๋“ค์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ฐ„์„ , ์ตœ์†Œ ๋“ฑ๋“ฑ ๋ง์ด ๋‚˜์˜ค๋ฉด ๋‹ค์ต์ŠคํŠธ๋ผ?

 

๋‚˜์˜ ๊ฒฝ์šฐ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ํ’€ ๋•Œ ํ•ญ์ƒ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ๋‹ค. (ํŒŒ์ด์ฌ์˜ ํž™ํ๋ฅผ ์‚ฌ์šฉ)

A ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ •์ ๋“ค์˜ ์ตœ์†Œ๋น„์šฉ์„ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์•„๋‘๊ณ 

B ์ง€์ ์„ ๋‹ต์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

 

  • ๋จผ์ € (๊ฐ€์ค‘์น˜, ์‹œ์ž‘์ )์„ ํž™ํ์— ๋„ฃ๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.
  • ์‹œ์ž‘์ ์—์„œ ๊ฐ ์ •์ ๊นŒ์ง€์˜ ๋น„์šฉ์€ ๊ฐ€์žฅ ํฐ ๊ฐ’(ํŒŒ์ด์ฌ์—์„œ float('inf')๋ฅผ ๋„ฃ์–ด๋‘๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.)
  • ํž™ํ์—์„œ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ธ๋‹ค. 
  • ๊บผ๋‚ธ ์ •์ ์—์„œ ์ด์›ƒํ•œ ์ •์ ๋“ค ์ค‘์—์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ , ์ด์›ƒํ•œ ์ •์ ๊นŒ์ง€์˜ ๋น„์šฉ๋ณด๋‹ค ํ˜„์žฌ๋น„์šฉ + ๊บผ๋‚ธ ์ •์ ์—์„œ ์ด์›ƒํ•œ ์ •์ ๊นŒ์ง€์˜ ๊ฐ„์„ ๋น„์šฉ์ด ์ž‘์œผ๋ฉด ๊ฐ ์ •์ ๊นŒ์ง€์˜ ๋น„์šฉ์„ ํ˜„์žฌ๋น„์šฉ + ๊บผ๋‚ธ ์ •์ ์—์„œ ์ด์›ƒํ•œ ์ •์ ๊นŒ์ง€์˜ ๊ฐ„์„ ๋น„์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ํž™ํ์— ๋„ฃ์–ด์ค€๋‹ค.
  • ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ์— ์‹œ์ž‘์ ์—์„œ ๋ชจ๋“ ์ •์ ๊นŒ์ง€์˜ ์ตœ์†Œ๋น„์šฉ์ด ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.

๐Ÿ’จ

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

import sys
import heapq as h

input = sys.stdin.readline


def dijkstra(S, E):
    pq = []
    h.heappush(pq, (0, S))
    visited = [0] * (N + 1)
    key = [float('inf')] * (N + 1)
    key[S] = 0
    while pq:
        k, u = h.heappop(pq)

        if visited[u]:
            continue

        visited[u] = 1
        for nei_u, nei_k in adj[u]:
            if not visited[nei_u] and k + nei_k < key[nei_u]:
                key[nei_u] = k + nei_k
                h.heappush(pq, (key[nei_u], nei_u))
    print(key[E])


if __name__ == '__main__':
    N = int(input())  # ๋„์‹œ์˜ ๊ฐœ์ˆ˜
    M = int(input())  # ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜

    adj = {x + 1: [] for x in range(N)}
    for bus in range(M):
        s, e, k = map(int, input().split())
        adj[s].append((e, k))

    A, B = map(int, input().split())

    dijkstra(A, B)

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: BACKJOON ONLINE JUDGE

๋งํฌ: https://www.acmicpc.net/problem/1916

 

1916๋ฒˆ: ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 1,000)์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ M(1 โ‰ค M โ‰ค 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ M+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ

www.acmicpc.net


๋ฌธ์ œ

N๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋„์‹œ์— ๋„์ฐฉํ•˜๋Š” M๊ฐœ์˜ ๋ฒ„์Šค๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋ฒ„์Šค ๋น„์šฉ์„ ์ตœ์†Œํ™” ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ๋น„์šฉ์„ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋„์‹œ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 1,000)์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ M(1 โ‰ค M โ‰ค 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ M+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” ๋„์ฐฉ์ง€์˜ ๋„์‹œ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๋˜ ๊ทธ ๋ฒ„์Šค ๋น„์šฉ์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฒ„์Šค ๋น„์šฉ์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100,000๋ณด๋‹ค ์ž‘์€ ์ •์ˆ˜์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  M+3์งธ ์ค„์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„ ์ถœ๋ฐœ์ ์˜ ๋„์‹œ๋ฒˆํ˜ธ์™€ ๋„์ฐฉ์ ์˜ ๋„์‹œ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ถœ๋ฐœ์ ์—์„œ ๋„์ฐฉ์ ์„ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ถœ๋ฐœ ๋„์‹œ์—์„œ ๋„์ฐฉ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€์ˆ˜0