๋ฌธ์
๊ธฐ๋ณธ์ ์ผ๋ก๋ ๊ทธ๋ํ ์์์ 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]))
'๐ค ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[backjoon] 10217 KCM Travel (python) (0) | 2021.08.06 |
---|---|
[baekjoon] 2243 ์ฌํ ์์ (cpp) (0) | 2021.08.03 |
[baekjoon] 11003 ์ต์๊ฐ ์ฐพ๊ธฐ (python) (0) | 2021.07.27 |
[baekjoon] 1806 ๋ถ๋ถํฉ (python) (0) | 2021.07.27 |
[baekjoon] 2580 ์ค๋์ฟ (python) (0) | 2021.07.26 |