Skip to content

Commit 8b743ef

Browse files
authored
Merge pull request #775 from AlgorithmWithGod/Ukj0ng
[20250830] BOJ / P5 / 도로포장 / 한종욱
2 parents b3b6e86 + ab2272f commit 8b743ef

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
```
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
8+
private static final long INF = (long) 5e10 + 10;
9+
private static List<Node>[] graph;
10+
private static long[][] dist;
11+
private static int N, M, K;
12+
13+
public static void main(String[] args) throws IOException {
14+
init();
15+
dijkstra(1);
16+
long answer = INF;
17+
for (int i = 0; i <= K; i++) {
18+
answer = Math.min(answer, dist[N][i]);
19+
}
20+
bw.write(answer + "\n");
21+
bw.flush();
22+
bw.close();
23+
br.close();
24+
}
25+
26+
private static void init() throws IOException {
27+
StringTokenizer st = new StringTokenizer(br.readLine());
28+
N = Integer.parseInt(st.nextToken());
29+
M = Integer.parseInt(st.nextToken());
30+
K = Integer.parseInt(st.nextToken());
31+
32+
graph = new List[N+1];
33+
dist = new long[N+1][K+1];
34+
35+
for (int i = 1; i <= N; i++) {
36+
graph[i] = new ArrayList<>();
37+
}
38+
39+
for (int i = 1; i <= M; i++) {
40+
st = new StringTokenizer(br.readLine());
41+
int start = Integer.parseInt(st.nextToken());
42+
int end = Integer.parseInt(st.nextToken());
43+
int cost = Integer.parseInt(st.nextToken());
44+
45+
graph[start].add(new Node(end, cost));
46+
graph[end].add(new Node(start, cost));
47+
}
48+
}
49+
50+
private static void dijkstra(int start) {
51+
PriorityQueue<Node> pq = new PriorityQueue<>((o1, o2) -> Long.compare(o1.cost, o2.cost));
52+
for (int i = 1; i <= N; i++) {
53+
Arrays.fill(dist[i], INF);
54+
}
55+
dist[start][0] = 0;
56+
pq.add(new Node(start, dist[start][0], 0));
57+
58+
while (!pq.isEmpty()) {
59+
Node current = pq.poll();
60+
61+
if (current.cost > dist[current.dest][current.pavement]) continue;
62+
63+
for (Node next : graph[current.dest]) {
64+
if (current.pavement+1 <= K && dist[current.dest][current.pavement]< dist[next.dest][current.pavement+1]) {
65+
dist[next.dest][current.pavement+1] = dist[current.dest][current.pavement];
66+
pq.add(new Node(next.dest, dist[next.dest][current.pavement+1], current.pavement+1));
67+
}
68+
69+
if (dist[current.dest][current.pavement] + next.cost < dist[next.dest][current.pavement]) {
70+
dist[next.dest][current.pavement] = dist[current.dest][current.pavement] + next.cost;
71+
pq.add(new Node(next.dest, dist[next.dest][current.pavement], current.pavement));
72+
}
73+
}
74+
}
75+
}
76+
77+
static class Node {
78+
int dest;
79+
long cost;
80+
int pavement;
81+
82+
Node (int dest, long cost) {
83+
this.dest = dest;
84+
this.cost = cost;
85+
this.pavement = 0;
86+
}
87+
88+
Node (int dest, long cost, int pavement) {
89+
this.dest = dest;
90+
this.cost = cost;
91+
this.pavement = pavement;
92+
}
93+
}
94+
}
95+
```

0 commit comments

Comments
 (0)