๋ค์ต์คํธ๋ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์์ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๋ก์ง!
11779๋ฒ: ์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2
boj.ma
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ‘ํน์ ์์ ์ง์ ’์์ ‘์ด๋ค ๋ง์ง๋ง ์ง์ ’์ผ๋ก ์ต์ ๋น์ฉ์ผ๋ก ์ด๋ํ ๋์ '์ต์ ๋น์ฉ'์ ๊ตฌํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ์ถ๊ฐํ ์ ์์๊น?
๋ค์ต์คํธ๋ผ์์ heap queue๋ฅผ pop ํ์ ๋ ๋์ค๋ ์ ๋ณด๋ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ด๋ จ ์ ๋ณด๋ผ๊ณ ํ ์ ์๋ค. ์ฆ, ์ ์๋ฏธํ ์ ๋ณด์ด๋ค. ์ฌ๊ธฐ์ ๊ฒฝ๋ก ์ ๋ณด๊ฐ ํฌํจ๋๋๋ก ํด์ผ ํ๋ค.
path = [st]
hq.heappush(qu, [0, st, path])
while qu:
ํด๋น ์ฝ๋๋ฅผ ๋ณด๋ฉด path ์ ๋ณด๊ฐ heap queue์ ํฌํจ๋๋ ๊ฒ์ ์ ์ ์๋ค. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์ฒซ heap queue๋ถํฐ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ํฌํจ์ํค๋ ๊ฒ์ด๋ค.
for cost, j in graph[st]:
if prev_cost + cost <= vis[j]:
vis[j] = prev_cost + cost
new_his = [h for h in history]
new_his.append(j)
hq.heappush(qu, [prev_cost + cost, j, new_his]) # [๋น์ฉ, ๋์ฐฉ์ง, ๊ฒฝ๋ก]
์ดํ์๋ st๋ผ๋ ๋ ธ๋์์ ๊ฐ ์ ์๋(=for cost, j in graph[st]:) ํ๋ณด๋ฅผ heap์ ๋ฃ์ ๋ new_his์ ํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ heap queue์ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
ํ๊ณ์
์ด๋ ๊ฒ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ ์ฌ๋ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฒฝ๋ก๊ฐ ์์ ๋, ๊ทธ ์ค ํ ๊ฐ์ง ๊ฒฝ๋ก๋ง ์ ์ ์๋ค๋ ํ๊ณ๊ฐ ์๋ค.