π§ λ°±μ€ 1162. λλ‘ν¬μ₯
λ¬Έμ
μ€μμ΄λ λ§€μΌ μμΈμμ ν¬μ²κΉμ§ μΆν΄κ·Όμ νλ€. νμ§λ§ μ μ΄ λ§μ μ€μμ΄λ λ¦μ μ μ ν¬μ²μ λ¦κ² λμ°©νκΈ° μΌμ€λ€. λμ΄ λ§μ μ€μμ΄λ κ³ λ―Ό λμ Kκ°μ λλ‘λ₯Ό ν¬μ₯νμ¬ μμΈμμ ν¬μ²κΉμ§ κ°λ μκ°μ λ¨μΆνλ € νλ€.
λ¬Έμ λ Nκ°μ λμκ° μ£Όμ΄μ§κ³ κ·Έ μ¬μ΄ λλ‘μ μ΄ λλ‘λ₯Ό ν΅κ³Όν λ 걸리λ μκ°μ΄ μ£Όμ΄μ‘μ λ μ΅μ μκ°μ΄ 걸리λλ‘ νλ Kκ°μ μ΄νμ λλ‘λ₯Ό ν¬μ₯νλ κ²μ΄λ€. λλ‘λ μ΄λ―Έ μλ λλ‘λ§ ν¬μ₯ν μ μκ³ , ν¬μ₯νκ² λλ©΄ λλ‘λ₯Ό μ§λλλ° κ±Έλ¦¬λ μκ°μ΄ 0μ΄ λλ€. λν νΈμμ μμΈμ 1λ² λμ, ν¬μ²μ Nλ² λμλΌ νκ³ 1λ²μμ Nλ²κΉμ§ νμ κ° μ μλ λ°μ΄ν°λ§ μ£Όμ΄μ§λ€.
μ λ ₯
첫 μ€μλ λμμ μ N(1 ≤ N ≤ 10,000)κ³Ό λλ‘μ μ M(1 ≤ M ≤ 50,000)κ³Ό ν¬μ₯ν λλ‘μ μ K(1 ≤ K ≤ 20)κ° κ³΅λ°±μΌλ‘ ꡬλΆλμ΄ μ£Όμ΄μ§λ€. Mκ°μ μ€μ λν΄ λλ‘κ° μ°κ²°νλ λ λμμ λλ‘λ₯Ό ν΅κ³Όνλλ° κ±Έλ¦¬λ μκ°μ΄ μ£Όμ΄μ§λ€. λλ‘λ€μ μλ°©ν₯ λλ‘μ΄λ©°, 걸리λ μκ°μ 1,000,000λ³΄λ€ μκ±°λ κ°μ μμ°μμ΄λ€.
μμ
μμ μ λ ₯ | μμ μΆλ ₯ |
4 4 1 1 2 10 2 4 10 1 3 1 3 4 100 |
1 |
https://www.acmicpc.net/problem/1162
π‘ λ¬Έμ νμ΄
λ¨μν λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μΌλ‘λ νλ¦¬μ§ μλ λ¬Έμ μλ€. μ΅λ¨ 거리 λ°°μ΄μ μ λ°μ΄νΈ ν λλ§λ€ κ²½λ‘λ₯Ό 리μ€νΈ νμμΌλ‘ μ μ₯ν΄μ£Όλ λ± μ¬λ¬ λ°©λ²μ μκ°ν΄λ΄€μ§λ§ νμ΄ μ€κ°μ ν λ²μ©μ λ§νλ λ°©λ²λ€μ΄μλ€. κ²°κ΅ κ΅¬κΈλ§μ ν΅ν΄ μ°Ύμ보λ DPλ₯Ό ν¨κ» μ¬μ©ν΄μ ν μ μλ λ¬Έμ μλ€.
λ¨μ λ€μ΅μ€νΈλΌ μ νκ³Όλ λ€λ₯΄κ² Edge ν΄λμ€λ₯Ό μ μνλ€. ν΄λΉ ν΄λμ€λ νμ¬ μ§μ , λλ‘ ν¬μ₯ κ°μ, μ΄ κ±°λ¦¬ λΉμ© μ 보λ₯Ό ν¬ν¨νλ€.
λν, cost κΈ°μ€μΌλ‘ μ€λ¦μ°¨μ μ λ ¬λ μ μλλ‘ compareTo λ©μλλ μ€λ²λΌμ΄λ ν΄μ€λ€.
static class Edge implements Comparable<Edge> {
int end; // λμ°©(νμ¬) μ§μ
int count; // λλ‘ ν¬μ₯ κ°μ
long cost; // μ΄ κ±°λ¦¬ λΉμ©
Edge(int end, int count, long cost) {
this.end = end;
this.count = count;
this.cost = cost;
}
@Override
public int compareTo(Edge o) {
return Long.compare(this.cost, o.cost);
}
}
λ€μμ μ΄κΈ°ν λ¨κ³μ΄λ€.
λλ‘ μ 보λ₯Ό μ μ₯νλ edges, kκ° λλ‘λ₯Ό ν¬μ₯νκ³ iλ² μ§μ κΉμ§ κ°λ λ° κ±Έλ¦¬λ μ΅λ¨ 거리 λΉμ©μ μ μ₯νλ dpλ₯Ό μ΄κΈ°ν νλ€.
List<List<Edge>> edges = new ArrayList<>(); // λλ‘ μ 보
long[][] dp = new long[N + 1][K + 1]; // dp[i][k] : kκ° λλ‘λ₯Ό ν¬μ₯ν΄μ iλ² μ§μ κΉμ§ κ°λ μ΅λ¨ 거리 λΉμ©
// edges, dp μ΄κΈ°ν
for (int i = 0; i <= N; i++) {
edges.add(new ArrayList<>());
Arrays.fill(dp[i], Long.MAX_VALUE);
}
for (int i = 0; i < M; i++) { // λλ‘ μ 보 μ μ₯
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
edges.get(v1).add(new Edge(v2, 0, c));
edges.get(v2).add(new Edge(v1, 0, c));
}
μ΄κΈ°ν ν λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ€ννλ©° dp λ°°μ΄μ μ λ°μ΄νΈ μμΌμ€λ€.
Queue<Edge> pq = new PriorityQueue<>();
pq.add(new Edge(1, 0, 0)); // μμΈ μ§μ , ν¬μ₯ κ°μ 0, 거리 0
dp[1][0] = 0; // 0κ° λλ‘ ν¬μ₯νκ³ 1λ²(μμΈ) μ§μ κΉμ§
while (!pq.isEmpty()) {
Edge now = pq.poll();
if (dp[now.end][now.count] < now.cost) continue;
for (Edge next : edges.get(now.end)) {
if (dp[next.end][now.count] > now.cost + next.cost) {
dp[next.end][now.count] = now.cost + next.cost;
pq.add(new Edge(next.end, now.count, dp[next.end][now.count]));
}
if (now.count < K && dp[next.end][now.count + 1] > now.cost) {
dp[next.end][now.count + 1] = now.cost;
pq.add(new Edge(next.end, now.count + 1, now.cost));
}
}
}
μ°μ μμ νλ₯Ό μ¬μ©νμ¬ cost κ°μ΄ μμ μμλλ‘ μ²λ¦¬νλ€. (μ¬κΈ°μ dp κ°μ΄ now.cost λ³΄λ€ μ΄λ―Έ μμΌλ©΄ λμ΄κ°λ€.)
λλ‘λ₯Ό μ¬μ©νμ¬ λμ΄κ° μ§μ μ dp κ°μ 2κ°μ§ κ²½μ°λ‘ μ λ°μ΄νΈ μμΌμ€λ€.
첫λ²μ§Έλ λλ‘λ₯Ό ν¬μ₯νμ§ μκ³ λμ΄κ°λ κ²½μ°μ΄λ€.
λλ‘λ₯Ό ν¬μ₯νμ§ μμμΌλ―λ‘ λμ΄κ°λ©΄ now.cost + next.cost λ§νΌμ 거리 λΉμ©μ΄ λ°μνλ€. dp κ°μ΄ ν΄λΉ 거리 λΉμ©λ³΄λ€ ν¬λ©΄ μ΅μκ°μΌλ‘ ν΄μ£Όκ³ , μ°μ μμ νμ λ€μ Edge μ 보λ₯Ό μΆκ°νλ€.
λλ²μ§Έλ λλ‘λ₯Ό ν¬μ₯νκ³ λμ΄κ°λ κ²½μ°μ΄λ€.
λ¨Όμ λλ‘λ₯Ό ν¬μ₯ν μ μλ 쑰건μΈμ§ νμΈνλ€. μ΄λ―Έ ν¬μ₯ν λλ‘μ κ°μκ° Kλ³΄λ€ μμΌλ©΄(now.count < K) ν¬μ₯ν μ μλ€.
λλ‘λ₯Ό ν¬μ₯νλ―λ‘ 0μ λΉμ©μΌλ‘ λμ΄κ°κ³ now.cost λ§νΌμ 거리 λΉμ©μ΄ λ°μνλ€. dp κ°λ³΄λ€ μμ λΉμ©μ΄λ©΄ dp κ°μ μ΅μκ°μΌλ‘ μ λ°μ΄νΈ ν΄μ£Όκ³ , μ°μ μμ νμ λ€μ Edge μ 보λ₯Ό μΆκ°νλ€. λλ‘λ₯Ό ν¬μ₯νμΌλ―λ‘ count κ°μ now.count + 1μ΄ λλ€.
λ§μ§λ§μΌλ‘ Nλ² μ§μ (ν¬μ²)κΉμ§ κ° μ μλ μ΅μ 거리 λΉμ©μ ꡬνλ€.
long min = Long.MAX_VALUE;
for (long cost : dp[N]) {
min = Math.min(min, cost);
}
dp[N][0] ~ dp[N][K] κ° μ€μμ μ΅μκ°μ ꡬνλ€.
μ νμ΄ λ°©μμ μ 체 μ½λλ‘ νμ΄λ΄λ©΄ λ€μκ³Ό κ°λ€.
import java.util.*;
import java.io.*;
public class Main {
static class Edge implements Comparable<Edge> {
int end; // λμ°©(νμ¬) μ§μ
int count; // λλ‘ ν¬μ₯ κ°μ
long cost; // μ΄ κ±°λ¦¬ λΉμ©
Edge(int end, int count, long cost) {
this.end = end;
this.count = count;
this.cost = cost;
}
@Override
public int compareTo(Edge o) {
return Long.compare(this.cost, o.cost);
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
List<List<Edge>> edges = new ArrayList<>(); // λλ‘ μ 보
long[][] dp = new long[N + 1][K + 1]; // dp[i][k] : kκ° λλ‘λ₯Ό ν¬μ₯ν΄μ iλ² μ§μ κΉμ§ κ°λ μ΅λ¨ 거리 λΉμ©
// edges, dp μ΄κΈ°ν
for (int i = 0; i <= N; i++) {
edges.add(new ArrayList<>());
Arrays.fill(dp[i], Long.MAX_VALUE);
}
for (int i = 0; i < M; i++) { // λλ‘ μ 보 μ μ₯
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
edges.get(v1).add(new Edge(v2, 0, c));
edges.get(v2).add(new Edge(v1, 0, c));
}
// dijkstra
Queue<Edge> pq = new PriorityQueue<>();
pq.add(new Edge(1, 0, 0));
dp[1][0] = 0;
while (!pq.isEmpty()) {
Edge now = pq.poll();
if (dp[now.end][now.count] < now.cost) continue;
for (Edge next : edges.get(now.end)) {
if (dp[next.end][now.count] > now.cost + next.cost) { // λλ‘ ν¬μ₯ X
dp[next.end][now.count] = now.cost + next.cost;
pq.add(new Edge(next.end, now.count, dp[next.end][now.count]));
}
if (now.count < K && dp[next.end][now.count + 1] > now.cost) { // λλ‘ ν¬μ₯
dp[next.end][now.count + 1] = now.cost;
pq.add(new Edge(next.end, now.count + 1, now.cost));
}
}
}
long min = Long.MAX_VALUE;
for (long cost : dp[N]) {
min = Math.min(min, cost);
}
System.out.println(min);
}
}
Reference
https://velog.io/@dls4585/%EB%B0%B1%EC%A4%80-1162-%EB%8F%84%EB%A1%9C%ED%8F%AC%EC%9E%A5-JAVA
β¨ ν¬μ€ν μ λ§μΉλ©°
λ€μ΅μ€νΈλΌμ DP μ νκΉμ§ μμ¬μ μ λ΅ νμ΄λ₯Ό λ³΄κ³ μ΄ν΄νλ λ°λ μκ°μ΄ κ½€ λ€μλ€. μ°Έμ ν λ¬Έμ μλ€κ³ μκ°νλ€. π€©
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νλ‘κ·Έλλ¨Έμ€ LV2] λ€λ¦¬λ₯Ό μ§λλ νΈλ(Queue, ν) (2) | 2023.10.17 |
---|---|
[νλ‘κ·Έλλ¨Έμ€ LV2] κΈ°λ₯κ°λ° (Queue, ν) (0) | 2023.10.17 |
[λ°±μ€ 1446] μ§λ¦κΈΈ (Dijkstra, λ€μ΅μ€νΈλΌ) (0) | 2023.10.15 |
[νλ‘κ·Έλλ¨Έμ€ LV3] λ² μ€νΈ μ¨λ² (Hash, ν΄μ) (2) | 2023.10.14 |
[νλ‘κ·Έλλ¨Έμ€ LV2] μ νλ²νΈ λͺ©λ‘ (Hash, ν΄μ) (0) | 2023.10.14 |