|
| 1 | +import sys |
| 2 | +import heapq |
| 3 | +from collections import defaultdict |
| 4 | +input = sys.stdin.readline |
| 5 | +INF = int(1e9) |
| 6 | + |
| 7 | +def dijkstra(start, graph, n): |
| 8 | + D = [INF] * (n+1) |
| 9 | + D[start] = 0 |
| 10 | + q = [] |
| 11 | + heapq.heappush(q, (0, start)) # (거리, 노드) |
| 12 | + |
| 13 | + while q: |
| 14 | + dist, now = heapq.heappop(q) # 최단 거리 노드 꺼내기 |
| 15 | + |
| 16 | + if D[now] < dist: # 이미 처리된 노드라면 무시 |
| 17 | + continue |
| 18 | + |
| 19 | + for val, next_node in graph[now]: # 현재 노드와 연결된 노드 탐색 |
| 20 | + cost = dist + val |
| 21 | + if cost < D[next_node]: # 더 짧은 경로 발견 시 |
| 22 | + D[next_node] = cost |
| 23 | + heapq.heappush(q, (cost, next_node)) |
| 24 | + |
| 25 | + return D |
| 26 | + |
| 27 | +# 입력 처리 |
| 28 | +N, M, X = map(int, input().split()) |
| 29 | +graph = defaultdict(list) |
| 30 | +reverse_graph = defaultdict(list) |
| 31 | + |
| 32 | +for _ in range(M): |
| 33 | + start, end, time = map(int, input().split()) |
| 34 | + graph[start].append((time, end)) # 단방향 도로 |
| 35 | + reverse_graph[end].append((time, start)) # X에서 출발하는 경우 대비 |
| 36 | + |
| 37 | +# X에서 모든 마을까지의 최단 거리 계산 (X -> 모든 마을) |
| 38 | +to_X = dijkstra(X, graph, N) |
| 39 | + |
| 40 | +# 모든 마을에서 X까지의 최단 거리 계산 (모든 마을 -> X) -> 역방향 그래프 사용 |
| 41 | +from_X = dijkstra(X, reverse_graph, N) |
| 42 | + |
| 43 | +# 왕복 시간 계산 |
| 44 | +max_time = 0 |
| 45 | +for i in range(1, N+1): |
| 46 | + if i == X: |
| 47 | + continue # X에서 출발하는 학생은 제외 |
| 48 | + max_time = max(max_time, to_X[i] + from_X[i]) |
| 49 | + |
| 50 | +print(max_time) |
0 commit comments