Skip to content

Commit 4ca37cb

Browse files
committed
[BOJ] #1238.파티 / 골드3 / 90(X)
1 parent 10620ef commit 4ca37cb

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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

Comments
 (0)