Skip to content

Commit 9246821

Browse files
committed
[Gold IV] Title: 특정한 최단 경로, Time: 272 ms, Memory: 126152 KB -BaekjoonHub
1 parent af156da commit 9246821

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [Gold IV] 특정한 최단 경로 - 1504
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1504)
4+
5+
### 성능 요약
6+
7+
메모리: 126152 KB, 시간: 272 ms
8+
9+
### 분류
10+
11+
데이크스트라, 그래프 이론, 최단 경로
12+
13+
### 제출 일자
14+
15+
2025년 5월 5일 15:02:10
16+
17+
### 문제 설명
18+
19+
<p>방향성이 없는 그래프가 주어진다. 세준이는 1번 정점에서 N번 정점으로 최단 거리로 이동하려고 한다. 또한 세준이는 두 가지 조건을 만족하면서 이동하는 특정한 최단 경로를 구하고 싶은데, 그것은 바로 임의로 주어진 두 정점은 반드시 통과해야 한다는 것이다.</p>
20+
21+
<p>세준이는 한번 이동했던 정점은 물론, 한번 이동했던 간선도 다시 이동할 수 있다. 하지만 반드시 최단 경로로 이동해야 한다는 사실에 주의하라. 1번 정점에서 N번 정점으로 이동할 때, 주어진 두 정점을 반드시 거치면서 최단 경로로 이동하는 프로그램을 작성하시오.</p>
22+
23+
### 입력
24+
25+
<p>첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존재하며, 그 거리가 c라는 뜻이다. (1 ≤ c ≤ 1,000) 다음 줄에는 반드시 거쳐야 하는 두 개의 서로 다른 정점 번호 v<sub>1</sub>과 v<sub>2</sub>가 주어진다. (v<sub>1</sub> ≠ v<sub>2</sub>, v<sub>1</sub> ≠ N, v<sub>2</sub> ≠ 1) 임의의 두 정점 u와 v사이에는 간선이 최대 1개 존재한다.</p>
26+
27+
### 출력
28+
29+
<p>첫째 줄에 두 개의 정점을 지나는 최단 경로의 길이를 출력한다. 그러한 경로가 없을 때에는 -1을 출력한다.</p>
30+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import heapq, sys
2+
input = sys.stdin.readline
3+
INF = int(1e9)
4+
5+
def dijkstra(start):
6+
dist = [INF] * (N + 1)
7+
dist[start] = 0
8+
heap = []
9+
heapq.heappush(heap, (0, start))
10+
11+
while heap:
12+
cost, now = heapq.heappop(heap)
13+
14+
if cost > dist[now]:
15+
continue
16+
17+
for next_node, weight in graph[now]:
18+
if dist[next_node] > cost + weight:
19+
dist[next_node] = cost + weight
20+
heapq.heappush(heap, (cost + weight, next_node))
21+
22+
return dist
23+
24+
N, E = map(int, input().split())
25+
26+
graph = [[]for _ in range(N+1)]
27+
distance = [float('inf')] * (N+1)
28+
visited = [False] * (N+1)
29+
30+
for _ in range(E):
31+
a, b, c = map(int, input().split())
32+
graph[a].append((b, c))
33+
graph[b].append((a, c))
34+
35+
v1, v2 = map(int, input().split())
36+
37+
dist1 = dijkstra(1)
38+
distv1 = dijkstra(v1)
39+
distv2 = dijkstra(v2)
40+
41+
route1 = dist1[v1] + distv1[v2] + distv2[N]
42+
route2 = dist1[v2] + distv2[v1] + distv1[N]
43+
44+
result = min(route1, route2)
45+
46+
print(result if result < INF else -1)

0 commit comments

Comments
 (0)