[BOJ][๐ก5][๋ฐฑ์ค#05972] ํ๋ฐฐ ๋ฐฐ์ก
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋๋ถ ํ์๋ ๋๋ถ ์ฐฌํ์ด์๊ฒ ํ๋ฐฐ๋ฅผ ๋ฐฐ๋ฌํด์ค์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ,ย ๊ฐ ์ค๋น๋ฅผ ํ๊ณ ์์ต๋๋ค. ํํ๋กญ๊ฒ ๊ฐ๋ ค๋ฉด ๊ฐ๋ ๊ธธ์ ๋ง๋๋ ๋ชจ๋ ์๋ค์๊ฒ ๋ง์๋ ์ฌ๋ฌผ์ ์ค์ผย ํฉ๋๋ค. ๋ฌผ๋ก ํ์๋ ๊ตฌ๋์ ๋ผ์ ์ต์ํ์ย ์๋ค์ ๋ง๋๋ฉด์ ์ง๋๊ฐ๊ณ ์ถ์ต๋๋ค. ๋๋ถ ํ์์๊ฒ๋ ์ง๋๊ฐ ์์ต๋๋ค.ย Nย (1 <= N <= 50,000) ๊ฐ์ ํ๊ฐ๊ณผ, ์๋ค์ ๊ธธ์ธ M (1 <= Mย <= 50,000) ๊ฐ์ ์๋ฐฉํฅ ๊ธธ์ด ๊ทธ๋ ค์ ธ ์๊ณ ,ย ๊ฐ๊ฐ์ ๊ธธ์ C_i (0 <= C_iย <= 1,000) ๋ง๋ฆฌ์ ์๊ฐย ์์ต๋๋ค. ์๋ค์ ๊ธธ์ ๋ ๊ฐ์ ๋จ์ด์ง ํ๊ฐ์ธย A_i ์ย B_i (1 <= A_i <= N; 1 <= B_i <= N; A_i != B_i)๋ฅผ ์์ต๋๋ค. ๋ย ๊ฐ์ ํ๊ฐ์ ํ๋ ์ด์์ ๊ธธ๋ก ์ฐ๊ฒฐ๋์ด ์์ ์๋ ์์ต๋๋ค. ๋๋ถ ํ์๋ ํ๊ฐ 1์ ์๊ณ ๋๋ถ ์ฐฌํ์ด๋ ํ๊ฐ N์ ์์ต๋๋ค. ๋ค์ ์ง๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
[2]---
/ | \
/1 | \ 6
/ | \
[1] 0| --[3]
\ | / \2
4\ | /4 [6]
\ | / /1
[4]-----[5]
3 ๋๋ถ ํ์๊ฐ ์ ํํ ์ ์๋ย ์ต์ ์ ํต๋ก๋ย 1 -> 2 -> 4 -> 5 -> 6 ์
๋๋ค. ์๋ํ๋ฉด ์ฌ๋ฌผ์ ์ดํฉ์ด 1 + 0 + 3 + 1 = 5 ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ถ ํ์์ ์ง๋๊ฐ ์ฃผ์ด์ง๊ณ ,ย ์ง๋๊ฐ๋ ๊ธธ์ ์๋ฅผ ๋ง๋๋ฉด ์ค์ผํ ์ฌ๋ฌผ์ ๋น์ฉ์ด ์ฃผ์ด์ง ๋ ์ต์ ์ฌ๋ฌผ์ ์ผ๋ง์ผ๊น์?ย ๋๋ถ ํ์๋ย ๊ฐ๋ ๊ธธ์ ๊ธธ์ด๋ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N๊ณผ M์ด ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค. ๋์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค๊น์ง ์ธ ๊ฐ์ ์ ์ย A_i, B_i,ย C_i๊ฐ ์ฃผ์ด์ง๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋๋ถ ํ์๊ฐ ๊ฐ์ ธ๊ฐ์ผ ๋ ์ต์ ์ฌ๋ฌผ์ ์ถ๋ ฅํฉ๋๋ค.
์์
์ ๋ ฅ
6 8
4 5 3
2 4 0
4 1 4
2 1 1
5 6 1
3 6 2
3 2 6
3 4 4
์ถ๋ ฅ
5
My Sol
import sys
input = sys.stdin.readline
from collections import deque
N, M = map(int, input().split())
rels = [[] for _ in range(N+1)]
minns = [1e8]*(N+1)
minns[1] = 0
Q = deque([1])
for _ in range(M):
u, v, k = map(int, input().split())
rels[u].append((v, k))
rels[v].append((u, k))
while Q:
u = Q.popleft()
for v, k in rels[u]:
if minns[u]+k < minns[v]:
minns[v] = minns[u]+k
Q.append(v)
print(minns[N])
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์ต์ ๋น์ฉ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์์ง๋ง, ํ์ด๊ฐ ์๊ฐ์ด ๋์ง ์์ ํจ์จ์ ์ผ๋ก ํ์ง๋ ๋ชปํ๋ ๋ฌธ์ ์๋ค. ์ผ๋จ ๊ธฐ๋ณธ ์ปจ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๊ธด ํ์ง๋ง, ๋ฐฉ๋ฌธํ๋ ๋ ธ๋๋ฅผ ๋๋ฌด ์์ฃผ ๋ฐฉ๋ฌธํ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ์๊ฐ์ด ๊ธธ๊ฒ ๋์ค๋ ํ์ด์ด๋ค.
- ์ ๋ ฅ์ ๋ฐ์ ์๋ฐฉํฅ ๋ ธ๋์ ๋ฐฐ์ด์ ๊ฐ์ค์น์ ํจ๊ป ๋ฃ๋๋ค.
- ํด๋น ๋
ธ๋๊น์ง์ ๊ฐ์ค์น ์ ์ฅ ๋ฐฐ์ด์ธ
minns
๋ฅผ 1e8๋ก ์ด๊ธฐํํ๋ค. ์ต๋๊ฐ์ 5000๋ง์ด๋ฉฐ, ํธ์์ 1์ต์ ํฌ๊ธฐ๋ก ๊ฐ์ค์น๋ฅผ ์ด๊ธฐํํ๋ค. - ์์๋ ธ๋์ธ 1๋ฒ ๋ ธ๋์ ๊ฐ์ค์น์ธ minns[1]์ 0์ผ๋ก ๋๊ณ , ํด๋น ๋ ธ๋๋ถํฐ ๊ฐ์ค์น๋งํผ ๋ํด ์ฐ๊ฒฐ๋ ์ด์ ๋ ธ๋๋ค์ ํ์ฌ ๊ฐ์ค์น ๊ฐ๊ณผ ๋น๊ตํด ํ์ฌ ๋ ธ๋์์ ์ถ๋ฐํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ผ๋ฉด ๊ฐ์ค์น ๋์ ๊ฐ์ ๊ฐฑ์ ํ๊ณ Q์ ๋ฃ๋๋ค.
- ์ด๋ฅผ Q๊ฐ ๋น ๋๊น์ง ์งํํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import heapq
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
arr = [[]for _ in range(N+1)]
for _ in range(M):
a, b, cost = map(int, input().split())
arr[a].append((cost, b))
arr[b].append((cost, a))
def dijkstra():
q = []
heapq.heappush(q, (0, 1))
total = [sys.maxsize] * (N+1)
total[1] = 0
while q:
cost, node = heapq.heappop(q)
if node == N:
return total[node]
if total[node] < cost:
continue
for ncost, nnode in arr[node]:
if cost+ncost < total[nnode]:
total[nnode] = cost+ncost
heapq.heappush(q, (cost+ncost, nnode))
print(dijkstra())
๋ค์ต์คํธ๋ผ๋ฅผ ์ ์์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ์ฐ์ฐ์๊ฐ์ด ํจ์ฌ ์งง์ ํ์ด๋ฅผ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ๋น๊ฒฐ์ heap์ ์ฌ์ฉํ์ฌ ๊ฐ์ค์น๊ฐ ์์ ์ฐ๊ฒฐ๋ถ๋ถํฐ ์ ์ฅํ๋ค๋ ๊ฒ์ด๋ค.
- ์ด๊ธฐํ์ ๊ฐ์
sys.maxsize
๋ผ๋ ๊ฐ์ผ๋ก ์ค์ ํ๋ค. - ๊ฐ์ค์น์ธ
cost
๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ํ๋ heapq์ ์ ์ฅํ๋ค. - ๊ฐ์ค์น๊ฐ ์ ์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ถํฐ heappopํ๋ฉฐ ๋์ ๊ฐ์ค์น๋ฅผ ๊ฐฑ์ ํด๊ฐ๋ค.
- ๋
ธ๋๊ฐ ์ฒ์์ผ๋ก N์ ๋ฐ๋ผ๋ณด๋, ์ฆ ์ต์ ๊ฒฝ๋ก๋ก๋ง ์ด๋ํ๋ฉฐ N์ ๋ง์ฃผ์น ๊ฒฝ์ฐ ๊ฐ์ฅ ์ ์ ๊ฐ์ค์น ๋์ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก ์ด๋์
total[node]
๋ฅผ ์ถ๋ ฅํ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ