[BOJ][๐ก5][๋ฐฑ์ค#01916] ์ต์๋น์ฉ ๊ตฌํ๊ธฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
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์งธ ์ค์๋ ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ ํ๋ ๊ตฌ๊ฐ ์ถ๋ฐ์ ์ ๋์๋ฒํธ์ ๋์ฐฉ์ ์ ๋์๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ถ๋ฐ์ ์์ ๋์ฐฉ์ ์ ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ถ๋ฐ ๋์์์ ๋์ฐฉ ๋์๊น์ง ๊ฐ๋๋ฐ ๋๋ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
5
8
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5
์ถ๋ ฅ
4
My Sol
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
N = int(input())
M = int(input())
D = [0xffffff]*N
visit = [0]*N
G = [[] for _ in range(N)]
for _ in range(M):
s, e, w = map(int, input().split())
s, e = s-1, e-1
G[s].append((e, w))
S, E = map(int, input().split())
S, E = S-1, E-1
D[S] = 0
Q = [(D[S], S)]
while Q:
val, u = heappop(Q)
if visit[u]: continue
visit[u] = 1
for v, w in G[u]:
if not visit[v] and D[v] > D[u]+w:
D[v] = D[u]+w
heappush(Q, (D[v], v))
print(D[E])
์ฐ์ ์์ ํ์ธ heap๊ณผ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ ํ์ ์ธ ๋ฌธ์ ์๋ค. ํ ํ๋ฆฟ์ ์ ์๋๋ก ์ฌ์ฉํ๋ฉด ๋๋ ๋ถ๋ถ์ด์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์๋ค. ๋ค๋ง visit ์ฒดํฌ๋ฅผ ์ธ์ ์ ์ v์์ ํด์ฃผ๋ ์ค ์์๋๋ฐ, Q์์ ๋นผ๋ธ ๊ธฐ์ค ์ ์ ์์ฒด๋ฅผ visit ์ฒดํฌํ๋ ์ ์ด ๋ด๊ฐ ์ ์์ง๋ฅผ ๋ชปํ๊ณ ์์์์ ์๊ฒ ๋์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ