Skip to content

Commit 060ed8f

Browse files
committed
[BOJ] #1238. 파티 / 골드3 / 그래프, 다익스트라 / 60분 / 실패
1 parent d4691b9 commit 060ed8f

2 files changed

Lines changed: 118 additions & 0 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import sys
2+
import heapq
3+
4+
input = sys.stdin.readline
5+
6+
7+
def dijkstra(graph, start, n):
8+
INF = int(1e9)
9+
distance = [INF] * (n + 1)
10+
distance[start] = 0 # 시작노드의 거리 0
11+
# 최소 힙(우선순위 큐)을 사용하여 (거리, 노드) 튜플을 저장
12+
queue = []
13+
heapq.heappush(queue, (0, start)) # (거리, 노드)
14+
15+
while queue:
16+
dist, current = heapq.heappop(queue)
17+
# 만약 이미 처리된 노드라면 continue
18+
if distance[current] < dist:
19+
continue
20+
# 현재 노드와 인접한 모든 노드를 확인
21+
for next_node, cost in graph[current]:
22+
# 현재 노드를 거쳐서 인접 노드로 가는 새로운 거리
23+
new_dist = dist + cost
24+
# 만약 새로 계산한 거리가 기존의 거리보다 짧으면 업데이트하고, 큐에 추가한다.
25+
if new_dist < distance[next_node]:
26+
distance[next_node] = new_dist
27+
heapq.heappush(queue, (new_dist, next_node))
28+
29+
return distance
30+
31+
32+
# 입력: 마을의 수 N, 도로의 수 M, 모이는 마을 X
33+
N, M, X = map(int, input().split())
34+
35+
graph = [[] for _ in range(N + 1)]
36+
reverse_graph = [[] for _ in range(N + 1)]
37+
38+
for _ in range(M):
39+
u, v, w = map(int, input().split())
40+
# u번 마을에서 v번 마을로 가는 도로
41+
graph[u].append((v, w))
42+
# 역방향 그래프: v번 마을에서 u번 마을로 가는 도로
43+
reverse_graph[v].append((u, w))
44+
45+
# 1. X번 마을에서 각 마을까지의 최단 경로 (파티 후 돌아가는 시간)을 구한다.
46+
distance_from_X = dijkstra(graph, X, N)
47+
# 2. 각 마을에서 X번 마을까지의 최단 경로 (파티 갈 때 걸리는 시간)을 구한다.
48+
distance_to_X = dijkstra(reverse_graph, X, N)
49+
50+
# 각 학생의 왕복 시간 중 최댓값을 저장한다.
51+
max_time = 0
52+
for i in range(1, N + 1):
53+
# 왕복 시간 = (i번 마을에서 X까지 가는 시간) + (X에서 i번 마을까지 가는 시간)
54+
round_trip = distance_to_X[i] + distance_from_X[i]
55+
# 최댓값 갱신
56+
max_time = max(max_time, round_trip)
57+
58+
# 최댓값 출력
59+
print(max_time)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import sys
2+
import heapq
3+
4+
input = sys.stdin.readline
5+
6+
7+
def dijkstra(graph, start, n):
8+
INF = int(1e9)
9+
distance = [INF] * (n + 1)
10+
distance[start] = 0 # 시작노드의 거리 0
11+
# 최소 힙(우선순위 큐)을 사용하여 (거리, 노드) 튜플을 저장
12+
queue = []
13+
heapq.heappush(queue, (0, start)) # (거리, 노드)
14+
15+
while queue:
16+
dist, current = heapq.heappop(queue)
17+
# 만약 이미 처리된 노드라면 continue
18+
if distance[current] < dist:
19+
continue
20+
# 현재 노드와 인접한 모든 노드를 확인
21+
for next_node, cost in graph[current]:
22+
# 현재 노드를 거쳐서 인접 노드로 가는 새로운 거리
23+
new_dist = dist + cost
24+
# 만약 새로 계산한 거리가 기존의 거리보다 짧으면 업데이트하고, 큐에 추가한다.
25+
if new_dist < distance[next_node]:
26+
distance[next_node] = new_dist
27+
heapq.heappush(queue, (new_dist, next_node))
28+
29+
return distance
30+
31+
32+
# 입력: 마을의 수 N, 도로의 수 M, 모이는 마을 X
33+
N, M, X = map(int, input().split())
34+
35+
graph = [[] for _ in range(N + 1)]
36+
reverse_graph = [[] for _ in range(N + 1)]
37+
38+
for _ in range(M):
39+
u, v, w = map(int, input().split())
40+
# u번 마을에서 v번 마을로 가는 도로
41+
graph[u].append((v, w))
42+
# 역방향 그래프: v번 마을에서 u번 마을로 가는 도로
43+
reverse_graph[v].append((u, w))
44+
45+
# 1. X번 마을에서 각 마을까지의 최단 경로 (파티 후 돌아가는 시간)을 구한다.
46+
distance_from_X = dijkstra(graph, X, N)
47+
# 2. 각 마을에서 X번 마을까지의 최단 경로 (파티 갈 때 걸리는 시간)을 구한다.
48+
distance_to_X = dijkstra(reverse_graph, X, N)
49+
50+
# 각 학생의 왕복 시간 중 최댓값을 저장한다.
51+
max_time = 0
52+
for i in range(1, N + 1):
53+
# 왕복 시간 = (i번 마을에서 X까지 가는 시간) + (X에서 i번 마을까지 가는 시간)
54+
round_trip = distance_to_X[i] + distance_from_X[i]
55+
# 최댓값 갱신
56+
max_time = max(max_time, round_trip)
57+
58+
# 최댓값 출력
59+
print(max_time)

0 commit comments

Comments
 (0)