1+ """
2+
3+ https://www.acmicpc.net/problem/1238
4+
5+ goal : ๊ฐ N ๊ฐ์ ๋ง์์์ X (๋๋ค)์ ์๋ณตํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐ -> ์ต๋๊ฐ ๋ฐํ
6+ - ์กฐ๊ฑด
7+ 1. ๋จ๋ฐฉํฅ M๊ฐ์ ๊ธธ : root
8+ 2. ์๋ณต ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ ๋ ค
9+ (1) ๊ฐ๋ณ N ๊ฐ -> X ์ต๋จ ๊ฑฐ๋ฆฌ
10+ (2) X -> ๊ฐ๋ณ N ๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ
11+ ์ ์ดํฉ ์ค ์ต๋๊ฐ
12+
13+ 3. ์๋ณต ๊ธธ์ ๊ฐ์๋, ๋ฌ๋ผ๋ ์๊ด ์์ -> ๋จ๋ฐฉํฅ์ด๋ผ ์งํผ ๋ค๋ฅธ ๋ฃจํธ ์ฌ์ฉ
14+
15+ - ์ ํ : ํ์ด 2๊ฐ์ง ์์
16+ 1. ๋ค์ต์คํธ๋ผ
17+ 2 .ํ๋ก์ด๋ ์์ฌ
18+
19+ FLOW
20+ (1) ๊ฐ๋ณ N ๊ฐ -> X ์ต๋จ ๊ฑฐ๋ฆฌ
21+ (2) X -> ๊ฐ๋ณ N ๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ
22+
23+ """
24+ import sys
25+ import heapq
26+ # 1. ์ธ์ ๋ฆฌ์คํธ field ๋ง๋ค๊ธฐ (๋จ๋ฐฉํฅ)
27+ input = sys .stdin .readline
28+ INF = int (1e9 ) #1<=Time<=100
29+ N , M , start_town = map (int , input ().split ()) # ์์ note
30+ # ๊ฐ road (edge)์ Time ์ ๋ณต๊ฐ ๋ด๊น ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
31+ field = [[] for _ in range (N + 1 ) ] # idx : 1~ N+1
32+ #๋ฌดํ์ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ์ด๊ธฐํ
33+ to_X_distance = [ [INF for _ in range (N + 1 )] for k in range (N + 1 )]
34+ # 1-2. ๋ชจ๋ road ๋ฐ time ์ ๋ณด ๋ฐ๊ธฐ
35+
36+ for m in range (M ) :
37+ start , end , time = map (int , input ().split ())
38+ field [start ].append ((end , time ))
39+
40+
41+ # ๋ค์ต์คํธ๋ผ
42+ def dijkstra (start , distance ) :
43+ q = [] # ์ฐ์ ์์ ํ
44+ #1. ์์ ๋
ธ๋์ ๋ํด ์ต๋จ๊ฒฝ๋ก = 0 , ํ ์ฝ์
(์๊ฐ = 0 , ๋
ธ๋)
45+ heapq .heappush (q , (0 ,start ))
46+ distance [start ] = 0
47+ #2. q๊ฐ ๋น์ด ์๊ธฐ ์ ๊น์ง
48+ while q :
49+ # ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ ์งง์ ๋
ธ๋์ ๋ํ ์ ๋ณด ์ถ์ถ
50+ time , now = heapq .heappop (q ) # A -> now(์ค๊ฐ)
51+ # ํ์ฌ ๋
ธ๋๊ฐ ์ด๋ฏธ ์ฒ๋ฆฌ = ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์ธ
52+ if distance [now ] < time :
53+ continue
54+ # ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ธ์ ๋
ธ๋ ํ์ธ
55+ for near_road , near_time in field [now ] :
56+ duration = near_time + time # A -> now -> B
57+ #๊ธฐ์กด ๋ฐฉ๋ฒ ๋ณด๋ค ํ์ฌ ๋
ธ๋ ๊ฒฝ์ ํด์ ๊ฐ๋ ์๊ฐ์ด ์ ๊ฒ ๊ฑธ๋ฆด๋
58+ # ํ ์ฝ์
& ์ต๋จ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ์
๋ฐ์ดํธ
59+ if duration < distance [near_road ] :
60+ distance [near_road ] = duration # ์
๋ฐ์ดํธ
61+ heapq .heappush (q , (duration , near_road )) # ํ์ ๋ฃ๊ธฐ
62+
63+ return distance
64+
65+ # N-1 ๋ฒ ๋ค์ต์คํธ๋ผ ์ํ
66+ for i in range (1 ,N + 1 ) :
67+ to_X_distance [i ] = dijkstra (i ,to_X_distance [i ] )
68+
69+ # 1. X -> N ๋์ด๊ฐ
70+ # go_X_distance = to_X_distance[start_town]
71+
72+ # 2. N ->X ๋ก ์ถ๋ฐ
73+ result = [0 for _ in range (N + 1 )]
74+ for town in range (1 ,N + 1 ):
75+ result [town ] = to_X_distance [town ][start_town ] + to_X_distance [start_town ][town ] # {twon -> x} + {x-> town} : ๊ฐ ๋ง์๋ณ ์๋ณต ์ต๋จ ์๊ฐ
76+
77+ print (max (result ))
0 commit comments