Skip to content

Commit b1da5ea

Browse files
authored
[20250719] / BOJ / G4 / 두 단계 최단 경로 / 이강현
1 parent c565c74 commit b1da5ea

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
public class Main{
6+
static class Edge{
7+
int v,w;
8+
Edge(int v,int w){
9+
this.v=v;
10+
this.w=w;
11+
}
12+
}
13+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
15+
static StringTokenizer st;
16+
static int N,M;
17+
static List<Edge>[] edges;
18+
19+
public static void main(String[] args) throws Exception {
20+
st = new StringTokenizer(br.readLine());
21+
N = Integer.parseInt(st.nextToken());
22+
M = Integer.parseInt(st.nextToken());
23+
edges = new List[N+1];
24+
for (int i = 1; i <= N; i++) {
25+
edges[i] = new ArrayList<>();
26+
}
27+
28+
for (int i = 1; i <= M; i++) {
29+
st = new StringTokenizer(br.readLine());
30+
int u = Integer.parseInt(st.nextToken());
31+
int v = Integer.parseInt(st.nextToken());
32+
int w = Integer.parseInt(st.nextToken());
33+
edges[u].add(new Edge(v,w));
34+
}
35+
36+
st = new StringTokenizer(br.readLine());
37+
int start = Integer.parseInt(st.nextToken());
38+
int middle = Integer.parseInt(st.nextToken());
39+
int end = Integer.parseInt(st.nextToken());
40+
41+
int[] dist1 = new int[N+1];
42+
int[] dist2 = new int[N+1];
43+
int[] dist3 = new int[N+1];
44+
dijkstra(start,dist1);
45+
dijkstra(middle,dist2);
46+
if(dist1[middle] == Integer.MAX_VALUE || dist2[end] == Integer.MAX_VALUE){
47+
bw.write("-1 ");
48+
}else{
49+
bw.write(dist1[middle] + dist2[end] + " ");
50+
}
51+
dijkstra2(start,middle,dist3);
52+
if(dist3[end] == Integer.MAX_VALUE){
53+
bw.write("-1 ");
54+
}else{
55+
bw.write(dist3[end]+"");
56+
}
57+
bw.close();
58+
}
59+
static void dijkstra(int start, int[] dist){
60+
PriorityQueue<Edge> pq = new PriorityQueue<>((a,b) -> a.w - b.w);
61+
Arrays.fill(dist, Integer.MAX_VALUE);
62+
dist[start] = 0;
63+
pq.add(new Edge(start,0));
64+
65+
while(!pq.isEmpty()){
66+
Edge cur = pq.poll();
67+
68+
if(dist[cur.v] < cur.w) continue;
69+
70+
for (Edge edge : edges[cur.v]) {
71+
int newDist = cur.w + edge.w;
72+
if(newDist < dist[edge.v]){
73+
dist[edge.v] = newDist;
74+
pq.offer(new Edge(edge.v, newDist));
75+
}
76+
}
77+
}
78+
}
79+
static void dijkstra2(int start, int noAccess, int[] dist){
80+
PriorityQueue<Edge> pq = new PriorityQueue<>((a,b) -> a.w - b.w);
81+
Arrays.fill(dist, Integer.MAX_VALUE);
82+
dist[start] = 0;
83+
pq.add(new Edge(start,0));
84+
85+
while(!pq.isEmpty()){
86+
Edge cur = pq.poll();
87+
88+
if(dist[cur.v] < cur.w) continue;
89+
90+
for (Edge edge : edges[cur.v]) {
91+
if(edge.v == noAccess) continue;
92+
int newDist = cur.w + edge.w;
93+
if(newDist < dist[edge.v]){
94+
dist[edge.v] = newDist;
95+
pq.offer(new Edge(edge.v, newDist));
96+
}
97+
}
98+
}
99+
}
100+
}
101+
```

0 commit comments

Comments
 (0)