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