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