์ด๋ฒ ๊ธ์์๋ ๋ฐฑ์ค 1753๋ฒ ๋ฌธ์ ์ธ “์ต๋จ๊ฒฝ๋ก” ๋ฌธ์ ๋ฅผ ํจ๊ป ํด๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๊ทธ๋ํ์์ ํน์ ์์ ์ ์ ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ก, ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ , ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ ํ, ์ต์ข ์ ์ธ ์ ๋ต ์ฝ๋๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ URL: https://www.acmicpc.net/problem/1753
1. ๋ฌธ์ ์ค๋ช
1) ๋ฌธ์ ๊ฐ์
์ฃผ์ด์ง ๊ทธ๋ํ์์ ํน์ ์์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ ๋๋ค. ๊ทธ๋ํ๋ ๋ฐฉํฅ์ฑ๊ณผ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง ๊ฐ์ ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ผ ํฉ๋๋ค.
2) ์ ๋ ฅ
• ์ฒซ ๋ฒ์งธ ์ค: ์ ์ ์ ์ V (1 ≤ V ≤ 20,000)์ ๊ฐ์ ์ ์ E (1 ≤ E ≤ 300,000)
• ๋ ๋ฒ์งธ ์ค: ์์ ์ ์ K (1 ≤ K ≤ V)
• ๋ค์ E๊ฐ์ ์ค: ๊ฐ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ u, v, w (u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ธ ๊ฐ์ )
3) ์ถ๋ ฅ
• ์์ ์ ์ K๋ก๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๋๋ฌํ ์ ์๋ ์ ์ ์ ๊ฒฝ์ฐ “INF”๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
2. ์ ๊ทผ๋ฒ
1) ์ ๋ ฅ๋ฐ๊ธฐ
• ๋น ๋ฅธ ์ ๋ ฅ์ ์ํด sys.stdin.readline์ ์ฌ์ฉํฉ๋๋ค.
• ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ํํํ์ฌ, ๊ฐ ์ ์ ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
2) ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
• ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ต๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ฉฐ, ๊ฐ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก์ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
• ์์ ์ ์ K๋ก๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํ๊ณ , ์ฒ์์๋ ๋ฌดํ๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ํฐ ๊ฐ(10^9)์ ์ฌ์ฉํฉ๋๋ค.
• ์ฐ์ ์์ ํ์ ์์ ์ ์ ๊ณผ ๊ทธ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฃ๊ณ , ํ๊ฐ ๋น ๋๊น์ง ๊ฐ ์ ์ ์์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ํ์ํ๋ฉฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
3) ๊ฒฐ๊ณผ ์ถ๋ ฅ
• ๊ฐ ์ ์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ 1๋ฒ ์ ์ ๋ถํฐ V๋ฒ ์ ์ ๊น์ง ์ถ๋ ฅํฉ๋๋ค. ๋๋ฌํ ์ ์๋ ์ ์ ์ ๊ฒฝ์ฐ “INF”๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
3. ์ ๋ต ์ฝ๋
import sys
input = sys.stdin.readline
from queue import PriorityQueue
V, E = map(int, input().split()) # ์ ์ ์ ์ V์ ๊ฐ์ ์ ์ E ์
๋ ฅ ๋ฐ์
K = int(input()) # ์์ ์ ์ K ์
๋ ฅ ๋ฐ์
adj = [[] for _ in range(V+1)] # ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ, ์ ์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ๋ฏ๋ก V+1 ํฌ๊ธฐ๋ก ์์ฑ
for _ in range(E):
u, v, w = map(int, input().split()) # ๊ฐ์ ์ ๋ณด ์
๋ ฅ ๋ฐ์: u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ธ ๊ฐ์
adj[u].append((v, w)) # ์ธ์ ๋ฆฌ์คํธ์ ๊ฐ์ ์ ๋ณด ์ถ๊ฐ
pq = PriorityQueue() # ์ฐ์ ์์ ํ ์์ฑ
dist = [0] + [10**9] * V # ๊ฑฐ๋ฆฌ ๋ฆฌ์คํธ ์ด๊ธฐํ, ๋ฌดํ๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ํฐ ์(10**9) ์ฌ์ฉ
dist[K] = 0 # ์์ ์ ์ K์ ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ์ค์
pq.put((0, K)) # ์์ ์ ์ ์ ์ฐ์ ์์ ํ์ ์ฝ์
while pq.qsize() > 0: # ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
w, u = pq.get() # ํ์์ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์ ๊บผ๋ด๊ธฐ
for v, w1 in adj[u]: # ํ์ฌ ์ ์ u์์ ์ด๋ํ ์ ์๋ ๋ชจ๋ ์ ์ v์ ๋ํด
if dist[v] > dist[u] + w1: # ๊ธฐ์กด ๊ฑฐ๋ฆฌ๋ณด๋ค ํ์ฌ ๊ฒฝ๋ก๋ฅผ ํตํ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง๋ค๋ฉด
dist[v] = dist[u] + w1 # ๊ฑฐ๋ฆฌ ๊ฐฑ์
pq.put((dist[v], v)) # ๊ฐฑ์ ๋ ๊ฑฐ๋ฆฌ์ ์ ์ ์ ํ์ ์ฝ์
for i in range(1, V+1): # 1๋ฒ ์ ์ ๋ถํฐ V๋ฒ ์ ์ ๊น์ง ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
if dist[i] == 10**9: # ๋ฌดํ๋ ๊ฑฐ๋ฆฌ๋ผ๋ฉด ๋๋ฌํ ์ ์๋ ์ ์ ์ด๋ฏ๋ก
print('INF') # 'INF' ์ถ๋ ฅ
else:
print(dist[i]) # ๋๋ฌ ๊ฐ๋ฅํ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
4. ์ฝ๋ ์ค๋ช
1) ์ ๋ ฅ ๋ฐ๊ธฐ
• ๊ทธ๋ํ์ ์ ์ ์ V์ ๊ฐ์ ์ E๋ฅผ ์ ๋ ฅ ๋ฐ์
• ์์ ์ ์ K๋ฅผ ์ ๋ ฅ ๋ฐ์
• E๊ฐ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ ๋ฐ์ ์ธ์ ๋ฆฌ์คํธ๋ก ์ ์ฅ
2) ์ด๊ธฐํ
• ๊ฑฐ๋ฆฌ ๋ฆฌ์คํธ dist๋ฅผ ๋ฌดํ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ, ์์ ์ ์ K์ ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ์ค์
• ์ฐ์ ์์ ํ์ ์์ ์ ์ ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๊ฐ
3) ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์คํ
• ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
• ํ์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์ u์ ๊ทธ ๊ฑฐ๋ฆฌ๋ฅผ ๊บผ๋
• ์ ์ u์ ์ธ์ ํ ๋ชจ๋ ์ ์ v์ ๋ํด ๊ฑฐ๋ฆฌ ๊ฐฑ์ ์๋
• ๋ง์ฝ dist[v] > dist[u] + w (๊ธฐ์กด ๊ฑฐ๋ฆฌ๋ณด๋ค ํ์ฌ ๊ฒฝ๋ก๊ฐ ์งง๋ค๋ฉด)
• dist[v] ๊ฐฑ์
• ํ์ ๊ฐฑ์ ๋ ๊ฑฐ๋ฆฌ์ ์ ์ v ์ถ๊ฐ
4) ๊ฒฐ๊ณผ ์ถ๋ ฅ
• ๊ฑฐ๋ฆฌ ๋ฆฌ์คํธ์์ ๊ฐ ์ ์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
• ๋๋ฌํ ์ ์๋ ์ ์ ์ “INF”๋ก ์ถ๋ ฅ
[์์๋]
5. Github์ผ๋ก ํ์ธ
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ(๋ฐฑ์ค)_Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ(๋ฐฑ์ค) 1463[1๋ก ๋ง๋ค๊ธฐ] (0) | 2024.08.01 |
---|---|
BOJ(๋ฐฑ์ค) 4179[๋ถ!] (0) | 2024.07.29 |
BOJ(๋ฐฑ์ค) 11725[ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ] (0) | 2024.07.25 |
BOJ(๋ฐฑ์ค) 1389[์ผ๋น ๋ฒ ์ด์ปจ์ 6๋จ๊ณ ๋ฒ์น] (0) | 2024.07.23 |
BOJ(๋ฐฑ์ค) 11724[์ฐ๊ฒฐ ์์์ ๊ฐ์] (0) | 2024.07.22 |