Skip to content

Commit 08c8bce

Browse files
committed
[Gold IV] Title: 특정한 최단 경로, Time: 616 ms, Memory: 70660 KB -BaekjoonHub
1 parent acc4424 commit 08c8bce

2 files changed

Lines changed: 128 additions & 0 deletions

File tree

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+
메모리: 70660 KB, 시간: 616 ms
8+
9+
### 분류
10+
11+
그래프 이론, 최단 경로, 데이크스트라
12+
13+
### 제출 일자
14+
15+
2025년 7월 1일 17:22:01
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: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Comparator;
7+
import java.util.LinkedList;
8+
import java.util.PriorityQueue;
9+
import java.util.Queue;
10+
import java.util.StringTokenizer;
11+
12+
public class Main {
13+
14+
static int N,E;
15+
static ArrayList<int []> A[];
16+
static int INF = Integer.MAX_VALUE;
17+
public static void main(String[] args) throws IOException {
18+
19+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
20+
21+
StringTokenizer st = new StringTokenizer(br.readLine());
22+
23+
N = Integer.parseInt(st.nextToken());
24+
25+
E = Integer.parseInt(st.nextToken());
26+
27+
A = new ArrayList[N+1];
28+
29+
for(int i =1; i<=N; i++) {
30+
A[i] = new ArrayList<>();
31+
}
32+
33+
for(int i =0; i<E; i++) {
34+
st = new StringTokenizer(br.readLine());
35+
36+
int u = Integer.parseInt(st.nextToken());
37+
int v = Integer.parseInt(st.nextToken());
38+
int w = Integer.parseInt(st.nextToken());
39+
40+
A[u].add(new int[] {v,w});
41+
A[v].add(new int[] {u,w});
42+
}
43+
st = new StringTokenizer(br.readLine());
44+
45+
int v1 = Integer.parseInt(st.nextToken());
46+
int v2 = Integer.parseInt(st.nextToken());
47+
48+
long d1 = dijstra(1, v1);
49+
long d2 = dijstra(v1, v2);
50+
long d3 = dijstra(v2, N);
51+
long routeA = (d1 >= INF || d2 >= INF || d3 >= INF) ? INF : d1 + d2 + d3;
52+
53+
// 경로 B: 1 → v2 → v1 → N
54+
long e1 = dijstra(1, v2);
55+
long e2 = dijstra(v2, v1);
56+
long e3 = dijstra(v1, N);
57+
long routeB = (e1 >= INF || e2 >= INF || e3 >= INF) ? INF : e1 + e2 + e3;
58+
59+
long answer = Math.min(routeA, routeB);
60+
System.out.println(answer >= INF ? -1 : answer);
61+
}
62+
63+
static long dijstra(int startNode, int endNode) {
64+
65+
PriorityQueue<long []> pq = new PriorityQueue<>(Comparator.comparingLong(a -> a[1]));
66+
67+
pq.add(new long[] {startNode, 0});
68+
69+
long diff[] = new long[N+1];
70+
71+
Arrays.fill(diff, Integer.MAX_VALUE);
72+
73+
diff[startNode] = 0;
74+
75+
while(!pq.isEmpty()) {
76+
long now[] = pq.poll();
77+
78+
int currentNode = (int) now[0];
79+
long currentValue = now[1];
80+
81+
if(currentValue > diff[currentNode]) {
82+
continue;
83+
}
84+
85+
for(int next[] : A[currentNode]) {
86+
int nextNode = next[0];
87+
int nextValue = next[1];
88+
89+
if(diff[nextNode] > currentValue + nextValue) {
90+
diff[nextNode] = currentValue + nextValue;
91+
pq.add(new long[] { nextNode, diff[nextNode]});
92+
}
93+
}
94+
}
95+
96+
return diff[endNode];
97+
}
98+
}

0 commit comments

Comments
 (0)