-
๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ (๊ธธ ์ฐพ๊ธฐ)
-
์ฃผ๋ก ๊ทธ๋ํ๋ฅผ ํตํด ํํ
-
๊ฐ ์ง์ ์ '๋ ธ๋', ์ง์ ๊ฐ ์ฐ๊ฒฐ๋ ๋๋ก๋ '๊ฐ์ '์ผ๋ก ํํ
-
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ, ํ๋ก์ด๋ ์์ , ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ
-
ํน์ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
-
'์์ ๊ฐ์ '์ด ์์ ๋ ์ ์์ ์ผ๋ก ์๋
- ์์ ๊ฐ์ : 0๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง๋ ๊ฐ์
'๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋'๋ฅผ ์ ํํ๋ ์์์ ๊ณผ์ ๋ฐ๋ณต์ด๋ฏ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ
-
์ถ๋ฐ ๋ ธ๋๋ฅผ ์ ํ
-
์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ๋ก ์ด๊ธฐํ
-
๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค, ๊ฐ์ฅ ์งง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ ธ๋๋ฅผ ์ ํ
-
ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ ๊ณ์ฐ ํ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐฑ์
-
3๊ณผ 4 ๊ณผ์ ์ ๋ฐ๋ณต
'ํ์ฌ๊น์ง ๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ' ์ ๋ณด๋ฅผ ํญ์ 1์ฐจ์ ๋ฆฌ์คํธ์ ์ ์ฅํ๋ฉฐ ๋ฆฌ์คํธ๋ฅผ ๊ฐฑ์
-
O(V^2)์ ์๊ฐ ๋ณต์ก๋ (V: ๋ ธ๋์ ๊ฐ์)
-
ํน์ ๋ ธ๋๋ฅผ ์ถ๋ฐ์ผ๋ก ํ๋ 1์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑ
-
๊ฐ ๋จ๊ณ๋ง๋ค '๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ ธ๋๋ฅผ ์ ํ' -> 1์ฐจ์ ๋ฆฌ์คํธ ๋ชจ๋ ์์ ํ์
๊ทธ๋ํ๋ฅผ ํํํ ๋๋ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๋ฅผ (๋ ธ๋์ ๊ฐ์ + 1)๋ก ํ ๋นํ์.
๋ ธ๋์ ๋ฒํธ๋ฅผ ์ธ๋ฑ์ค๋ก ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ๋ก ์ ๊ทผํ๊ธฐ ์ข๋ค.
-
์ ์ฒด ๋ ธ๋์ ๊ฐ์๊ฐ 5000๊ฐ ์ดํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํด๋น ๋ฐฉ๋ฒ์ ์ฌ์ฉ ๊ฐ๋ฅ
-
๋ ธ๋์ ๊ฐ์๊ฐ 10000๊ฐ๋ฅผ ๋์ด๊ฐ๋ฉด ๊ฐ์ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํจ
-
O(ElogV)์ ์๊ฐ ๋ณต์ก๋ (V: ๋ ธ๋์ ๊ฐ์, E: ๊ฐ์ ์ ๊ฐ์)
-
ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ์ ๋ ธ๋๋ฅผ ๋์ฑ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์
- ์ด์ 1์ฐจ์ ๋ฆฌ์คํธ ์ธ๋ฑ์ค๋ฅผ ๋ชจ๋ ๋๋ ์ ํ ์๊ฐ์ด ์๋ ๋ก๊ทธ ์๊ฐ์ด ๊ฑธ๋ฆผ
์ฐ์ ์์ ํ ๊ตฌํ ๋ฐฉ์ | ์ฝ์ ์๊ฐ | ์ญ์ ์๊ฐ |
---|---|---|
๋ฆฌ์คํธ | O(1) | O(N) |
ํ | O(logN) | O(logN) |
PriorityQueue๋ณด๋ค ํต์์ ์ผ๋ก heapq๊ฐ ๋น ๋ฅด๋ค.
- ์ดํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ 1๋ฒ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๋ค.
์ถ๊ฐ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ํตํด ๊ฐ์ ๊ณผ ์๊ฐ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํ๋ฉด ๋ ๋น ๋ฅด๊ฒ ๊ณ์ฐ ๊ฐ๋ฅ
import sys
import heapq
input = sys.stdin.readline
N, M, X = map(int,input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a,b,c = map(int, input().split())
# ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํด์ ์ ๋ณด ์ฒ๋ฆฌ
graph[a].append((b,c))
def dijkstra(start, g):
# ์์์ ์์ ๋ชจ๋ ๊ฒฝ๋ก ์ด๊ธฐํ
dist = [float('inf')] * (N+1)
dist[start] = 0
q = [(0, start)]
while q:
now_t, now = heapq.heappop(q)
if now_t > dist[now]:
continue
for next, weight in g[now]:
total_t = now_t + weight
if total_t < dist[next]:
dist[next] = total_t
heapq.heappush(q, (total_t, next))
return dist
# X์์ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก
all_from_X = dijkstra(X, graph)
# ๋ชจ๋ ์ ์ ์์ X๋ก์ ์ต๋จ ๊ฒฝ๋ก
all_to_X = [0] * (N+1)
for i in range(1, N+1):
if i != X:
all_to_X[i] = dijkstra(i, graph)[X]
max_t = max(all_from_X[i] + all_to_X[i] for i in range(1, N+1) if i != X)
print(max_t)
๋ชจ๋ ๋ ธ๋์์ ํน์ ๋ ธ๋ X๋ก ํฅํ๋ ์ต๋จ์๊ฐ๊ณผ
ํน์ ๋ ธ๋ X์์ ๋ชจ๋ ๋ ธ๋๋ก ํฅํ๋ ์ต๋จ์๊ฐ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ณ์ฐํด์ผํ๋ค.
ํด๋น ๋ฌธ์ ์์ ๋์ผํ ๋ค์ต์คํธ๋ผ ๋ฉ์๋ dijkstra(start, g) ์ ์ฌ์ฉํด ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ณ์ฐํ๋ค.
2์ฐจ์ ๋ฐฐ์ด ๋์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํด์ ์ฒ๋ฆฌํ๊ฒ๋๋ฉด ํฌ์ ๊ทธ๋ํ(๊ฐ์ ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ทธ๋ํ)์ ๋ํด์ ๋ ํจ์จ์ ์ผ๋ก ๊ฐ์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.