N๋ฒ ๋ง์ โ X๋ฒ ๋ง์ โ N๋ฒ ๋ง์ ๋ก ์ฌ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค. M๊ฐ์ ๊ฒฝ๋ก๋ฅผ ํตํด ๊ฐ ๋ง์์์ ๋ค๋ฅธ ๋ง์๋ค๋ก ๊ฐ ์ ์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ตฌํ ๋ค์์ (1) N โ X (2) X โ N ์ด ๋ ๊ฐ์ง ๊ฒฝ๋ก๋ฅผ ๋ํ ๊ฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
๋ฒ์๊ฐ ํฌ์ง ์๋ค๋ฉด ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ ์ ์๊ฒ ์ง๋ง ์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(n^3)์ด๊ณ N์ ์ต๋๊ฐ์ 1000์ด๋ฏ๋ก ๋ถ๊ฐ๋ฅํ๋ค.
๋์ ๊ฐ๊ฐ์ N์ ๋ํด์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ๋ค์ต์คํธ๋ผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ ์ด๋ N๋ง์๋ค์์๋ X๋ง์๊น์ง์ ์์น๋ง ๊ตฌํ๋ฉด ๋๊ณ , ๋ชจ๋ ๋ง์๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฑด X๋ง์๋ง ํ๋ฉด ๋๋ค. ์ผ๋จ ์ด ๋ถ๋ถ์ ์์ธ ์ฒ๋ฆฌ๋ ํ์ง ์์ ์ํ์์ ์๋์ ๊ฐ์ด ๋ชจ๋ N๋ง์์ ๋ํ ๋ค๋ฅธ ๋ง์๋ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
์ค์ํ ์
์ด๋ time์ ์ฒ์๋ถํฐ 2์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ธํ๊ณ ๊ฐ์ ธ๋ค ์ฐ๋ ๋ฐฉ์์ ํํ๋๋ฐ, ์๊ฐํด๋ณด๋ ์ด์ฐจํผ ๋ค์ต์คํธ๋ผ๋ n๋ง์์์ ๋ค๋ฅธ ๋ง์๋ก์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๋ 1์ฐจ์ ๋ฐฐ์ด์ ๋ฐํํ๊ฒ ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ง์์ ๋ํ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐ๋ค์ ๊ตฌํ ๋ค์์ return ํด์ time ๋ฐฐ์ด์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
ํ์์ ๋ค์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ธฐ ์ํ ์์น๊ฐ์ ๊บผ๋ผ ๋, ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋๋ ์ฌ์ฉํ๊ฒ ๋๋ res[i] != t
์์๋ continue๋ฅผ ์ฌ์ฉํด์ ์ด๋ฒ ํ์ฐจ๋ง ๋์ด๊ฐ๋๋ก ํ์ด์ผ ํ๋๋ฐ return์ ์ฌ์ฉํด์ ๊ณ์ ์๋ฌ๋ฅผ ๋๋ค.
import heapq
def dijk(s, x): # s: ์์ํ๊ฒ ๋๋ ์ง์
res = [1e9]*n
res[s] = 0
pq = [(0, s)]
while pq:
t, i = heapq.heappop(pq)
if res[i] != t:
continue
for j, jt in arr[i]:
dist = t + jt
if res[j] > dist:
res[j] = dist
heapq.heappush(pq, (dist, j))
return res
n, m, x = map(int, input().split())
x -= 1
arr = [[]*n for _ in range(n)]
for _ in range(m):
a, b, t = map(int, input().split())
arr[a-1].append((b-1, t))
time = []
for i in range(n):
time.append(dijk(i, x))
mv = 0
for i in range(n):
mv = max(mv, time[i][x]+time[x][i])
print(mv)
๊ฐ๊ฐ์ N๋ง์์์๋ X๋ง์๊น์ง์ ๊ฑฐ๋ฆฌ๋ง ๊ตฌํ๋ฉด ๋๋ค
์ด ์ ์ ์๊ฐํด๋ณด๋ฉด N๋ง์์์ X๋ง์๊น์ง ๊ฐ๋ ๋จ๋ฐฉํฅ ๊ฑฐ๋ฆฌ๋ค์ ๊ฑฐ๊พธ๋ก ์ค์ (์ญ๋ฐฉํฅ)ํ ๋ค์์ X๋ง์๋ก๋ถํฐ ๋ค๋ฅธ ๋ง์๋ค๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๊ทธ๊ฒ N๋ง์์์ X๋ง์๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๋์ง ์์๊น?
X = 1์ผ ๋ ์๋์ ๊ฐ์ ์ํฉ์ด๋ผ๋ฉด, ์ด ๋ฐฉํฅ์ ๊ฑฐ๊พธ๋ก ํด์ฃผ๋ฉด 1์์ ๋ค๋ฅธ ๋ง์๋ค๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ = ๋ค๋ฅธ ๋ง์์์ 1๋ก ์ค๋ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๋ ์ ์๋ ๊ฒ์ด๋ค. ์ฌ์ค ์ฐ๋ฆฌ๋ 2๋ฒ์์ 1๋ฒ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ง ์๋ฉด ๋๋๋ฐ ์์ ํ์ด์์๋ 2๋ฒ์์ 3๋ฒ, 4๋ฒ, 5๋ฒ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ด์ฉ ์ ์์ด ๋ค ๊ตฌํด์ผ ํ๋ค.
import heapq
import sys
input = sys.stdin.readline
def dijk(arr, s): # s: ์์ํ๊ฒ ๋๋ ์ง์
res = [1e9]*n
res[s] = 0
pq = [(0, s)]
while pq:
t, i = heapq.heappop(pq)
if res[i] != t:
continue
for j, jt in arr[i]:
dist = t + jt
if res[j] > dist:
res[j] = dist
heapq.heappush(pq, (dist, j))
return res
n, m, x = map(int, input().strip().split())
x -= 1
graph = [[]*n for _ in range(n)]
reverse = [[]*n for _ in range(n)]
for _ in range(m):
a, b, t = map(int, input().strip().split())
graph[a-1].append((b-1, t))
reverse[b-1].append((a-1, t))
graph_dist = dijk(graph, x) # x๋ก๋ถํฐ ๋ค๋ฅธ ๊ณณ๊น์ง์ ๊ฑฐ๋ฆฌ
reverse_dist = dijk(reverse, x) # ๋ค๋ฅธ ๊ณณ์ผ๋ก๋ถํฐ x๊น์ง์ ๊ฑฐ๋ฆฌ
print(max([graph_dist[i] + reverse_dist[i] for i in range(n)]))