[BOJ][๐ก3][๋ฐฑ์ค#01238] ํํฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
N๊ฐ์ ์ซ์๋ก ๊ตฌ๋ถ๋ ๊ฐ๊ฐ์ ๋ง์์ ํ ๋ช ์ ํ์์ด ์ด๊ณ ์๋ค. ์ด๋ ๋ ์ด N๋ช ์ ํ์์ด X (1 โคย X โค N)๋ฒ ๋ง์์ ๋ชจ์ฌ์ ํํฐ๋ฅผ ๋ฒ์ด๊ธฐ๋ก ํ๋ค. ์ด ๋ง์ ์ฌ์ด์๋ ์ด M๊ฐ์ ๋จ๋ฐฉํฅ ๋๋ก๋ค์ด ์๊ณ i๋ฒ์งธ ๊ธธ์ ์ง๋๋๋ฐ Ti(1 โค Ti โค 100)์ ์๊ฐ์ ์๋นํ๋ค. ๊ฐ๊ฐ์ ํ์๋ค์ ํํฐ์ ์ฐธ์ํ๊ธฐ ์ํด ๊ฑธ์ด๊ฐ์ ๋ค์ ๊ทธ๋ค์ ๋ง์๋ก ๋์์์ผ ํ๋ค. ํ์ง๋ง ์ด ํ์๋ค์ ์๋ ๊ฒ์๋ฌ์ ์ต๋จ ์๊ฐ์ ์ค๊ณ ๊ฐ๊ธฐ๋ฅผ ์ํ๋ค. ์ด ๋๋ก๋ค์ ๋จ๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ ์๋ง ๊ทธ๋ค์ด ์ค๊ณ ๊ฐ๋ ๊ธธ์ด ๋ค๋ฅผ์ง๋ ๋ชจ๋ฅธ๋ค. N๋ช ์ ํ์๋ค ์ค ์ค๊ณ ๊ฐ๋๋ฐ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ์๋นํ๋ ํ์์ ๋๊ตฌ์ผ์ง ๊ตฌํ์ฌ๋ผ.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 โคย N โค 1,000), M(1 โค M โค 10,000), X๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ ๋ ฅ๋๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค๊น์ง i๋ฒ์งธ ๋๋ก์ ์์์ , ๋์ , ๊ทธ๋ฆฌ๊ณ ์ด ๋๋ก๋ฅผ ์ง๋๋๋ฐ ํ์ํ ์์์๊ฐ Ti๊ฐ ๋ค์ด์จ๋ค. ์์์ ๊ณผ ๋์ ์ด ๊ฐ์ ๋๋ก๋ ์์ผ๋ฉฐ, ์์์ ๊ณผ ํ ๋์ A์์ ๋ค๋ฅธ ๋์ B๋ก ๊ฐ๋ ๋๋ก์ ๊ฐ์๋ ์ต๋ 1๊ฐ์ด๋ค. ๋ชจ๋ ํ์๋ค์ ์ง์์ X์ ๊ฐ์ ์๊ณ , X์์ ์ง์ผ๋ก ๋์์ฌ ์ ์๋ ๋ฐ์ดํฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ N๋ช ์ ํ์๋ค ์ค ์ค๊ณ ๊ฐ๋๋ฐ ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ํ์์ ์์์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
์ถ๋ ฅ
10
My Sol
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
def dijk(S, T):
visit = [0]*N
D = [0xffffff]*N
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))
return D[T]
N, M, X = map(int, input().split())
X = X-1
G = [[] for _ in range(N)]
for _ in range(M):
s, e, w = map(int, input().split())
G[s-1].append((e-1, w))
maxDis = 0
for S in range(N):
maxDis = max(maxDis, dijk(S, X) + dijk(X, S))
print(maxDis)
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ ์ฐจ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ด์๋ค. ๊ฐ ๋ง์์ ์์์ ์ผ๋ก ํ๊ณ ํํฐ์ฅ์ ๋์ฐฉ์ ์ผ๋ก ํ๋ ๋ค์ต์คํธ๋ผ์, ๋ฐ๋์ ๊ฒฝ์ฐ๋ฅผ ๊ฐ๊ฐ ์ต์๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด ๋ํ ๊ฐ์ด ํํฐ์ฅ์ ์ค๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ์ด๋ค.
๋๋ฌธ์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ , ์ด๋ฅผ ํจ์ ์ธ๋ถ์์ ์ต๋๊ฐ์ ๊ตฌํด ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys, heapq
def dijkstra(start, graph):
min_T = [inf] * (N+1)
news = [(0, start)]
min_T[start] = 0
while news:
T, now = heapq.heappop(news)
if T <= min_T[now]:
for new_village, t in graph[now]:
new_T = min_T[now] + t
if new_T < min_T[new_village]:
min_T[new_village] = new_T
heapq.heappush(news, (new_T, new_village))
return min_T
N, M, X = map(int, sys.stdin.readline().rstrip().split())
graph = [[] for _ in range(N+1)]
graph_reverse = [[] for _ in range(N+1)]
inf = float('inf')
for _ in range(M):
s, e, t = map(int, sys.stdin.readline().rstrip().split())
graph[s].append((e, t))
graph_reverse[e].append((s, t))
min_T_go = dijkstra(X, graph_reverse)
min_T_back = dijkstra(X, graph)
ans = 0
for i in range(1, N+1):
T = min_T_go[i] + min_T_back[i]
if T > ans:
ans = T
print(ans)
๋ด๊ฐ 1200ms๋์ ์ฐ์ฐ์๊ฐ์ด ๋์๋๋ฐ, 80ms์ง๋ฆฌ ํ์ด์ด๋ค. ๊ธธ์ ๋จ๋ฐฉํฅ ๋๋ก์ธ๋ฐ, ๊ผญ ์๋ฐฉํฅ์ฒ๋ผ ๋ ๊ฐ์ 3์ฐจ์ ๋ฐฐ์ด graph์ graph_reverse๋ฅผ ๋ง๋ค์ด ๊ฐ์ ๋ฃ์ด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋๋ง๋ค ํ๋ํ๋ ๊ธธ์ด๋ฅผ ๊ตฌํ ๊ฒ์ด ์๋๋ผ, ํํฐ์ฅ์ ๊ธฐ์ค์ผ๋ก ๊ฐ ๋ง์ ๋๋ฌํ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํด์ ์ค๊ฐ๋ ์๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด 2๊ฐ์ ๋ฐฐ์ด์์ ๊ฐ์ ๊บผ๋ด์ค๋ ๋ฐฉ์์ด๋ค.
์ด ๋๋ฌธ์ ๋งค๋ฒ ๊ฐ์ ์ํ๋ฅผ ๋ฐ๋ณตํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ ์๋๊ฐ ๋น ๋ฅธ ๊ฒ์ธ๋ฐ, ์์ง๋ 2๊ฐ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์์์ ๊ณผ ๋์ฐฉ์ ์ ๋ฌ๋ฆฌํ์ฌ ์ ์ฅํ ๋ฐฉ์์ ๋ฌธ์ ์ ๋จ๋ฐฉํฅ ์กฐ๊ฑด์ ์ด๋ป๊ฒ ํผํด๊ฐ ๊ฒ์ธ์ง ์ดํด๊ฐ ์ ๋์ง ์๋๋คโฆ..ใ ใ
๋๊ธ๋จ๊ธฐ๊ธฐ