๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜

[baekjoon] 1162 ๋„๋กœํฌ์žฅ

be__simon 2021. 8. 5. 23:05

1162 ๋„๋กœํฌ์žฅ Link

๋ฌธ์ œ


๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๊ทธ๋ž˜ํ”„ ์ƒ์—์„œ 1๋ฒˆ -> N๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๊ฑฐ๊ธฐ์— K๊ฐœ์˜ ๋„๋กœ๋ฅผ ํฌ์žฅํ•ด์„œ ์†Œ์š”์‹œ๊ฐ„์„ 0์œผ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ถ”๊ฐ€ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

์ ‘๊ทผ


๊ฐ€์ค‘์น˜๋Š” ์‹œ๊ฐ„ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์–‘์ˆ˜์ด๊ณ  ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
๊ฑฐ๊ธฐ์— ๊ณ ๋ คํ•ด์•ผํ•  ์ ์€ K๊ฐœ์˜ edge์˜ weight๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค ๋ผ๋Š” ๊ฒƒ.
๊ทธ๋ฆฌ๊ณ  ๊ผญ K๊ฐœ๋ฅผ ์ฑ„์›Œ์„œ ํฌ์žฅํ•  ํ•„์š”๋Š” ์—†๋‹ค.

์ž์ฃผ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ ์œ ํ˜•์ธ๋ฐ, ๋‹ค์ต์ŠคํŠธ๋ผ๋„ DP ๊ธฐ๋ฐ˜์ด๋‹ˆ๊นŒ 2์ฐจ์› DP๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.
2์ฐจ์› DP ๋ฐฐ์—ด์—์„œ row๋Š” node ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , column์€ ํฌ์žฅํ•œ ๋„๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด์„œ
์ตœ์ข…์ ์œผ๋กœ dp[i][j] ๋Š” 1 -> i ๋ฒˆ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š”๋ฐ ๋„๋กœ ํฌ์žฅ์„ j๋ฒˆ ํ–ˆ์„ ๋•Œ์˜ ์ตœ์†Œ ์‹œ๊ฐ„ ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ทธ ๋‹ค์Œ์—๋Š” ๊ธฐ์กด ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๋™์ผํ•˜๊ฒŒ min heap์„ ํ•˜๋‚˜ ์šด์˜ํ•˜๋ฉด์„œ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ„๋‹ค.
heap์—๋Š” city, 1 -> city๋กœ ๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ์ด ๋•Œ์˜ ํฌ์žฅ ํšŸ์ˆ˜ ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  heap์—์„œ ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ๋ฝ‘์•˜์„ ๋•Œ, ์ธ๊ทผ city๋“ค๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๊ทธ ๊ธธ์„ ํฌ์žฅํ•˜๋Š” ๊ฒฝ์šฐ ์™€ ํฌ์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฅผ ๋”ฐ๋กœ ๊ฐฑ์‹ ํ•ด์ค˜์•ผํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด dp[N]์— 1 -> N ๊นŒ์ง€ ์ด๋™ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์ด ํฌ์žฅ ํšŸ์ˆ˜ ๋ณ„๋กœ ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.
ํฌ์žฅ์„ ๊ผญ K๋ฒˆ ํ•  ํ•„์š”๋Š” ์—†์œผ๋‹ˆ ๊ทธ ์ค‘์— ์ตœ์†Œ๊ฐ’์ด ์ •๋‹ต์ด ๋œ๋‹ค.

Code

import sys
from heapq import heappush, heappop
from math import inf
input = sys.stdin.readline

N, M, K = map(int, input().split())

# dp[][] -> 1 ~ N๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ K๊ฐœ ํฌ์žฅ์„ ์จ์„œ ๊ฐ€๋Š” ์ตœ์†Œ๊ฐ’
dp = [[inf for _ in range(K + 1)] for _ in range(N + 1)]
g = [[] for _ in range(N + 1)]

for _ in range(M):
    s, e, t = map(int, input().split())
    g[s].append([e, t])
    g[e].append([s, t])

dp[1][0] = 0
h = [(0, 1, 0)] # time, cur, k
while h:
    time, city, kcnt = heappop(h)
    if dp[city][kcnt] < time:
        continue

    for e, t in g[city]:
        nt = time + t
        # ์ด๋ฒˆ์—” ํฌ์žฅ ์•ˆํ•จ
        if nt < dp[e][kcnt]:
            dp[e][kcnt] = nt
            heappush(h, (nt, e, kcnt))

        # ์ด๋ฒˆ์— ํฌ์žฅํ•˜๋Š” ๊ฒฝ์šฐ
        nt = time
        if kcnt < K and nt < dp[e][kcnt + 1]:
            dp[e][kcnt + 1] = nt
            heappush(h, (nt, e, kcnt + 1))

print(min(dp[N]))