μ΅μλΉμ© ꡬνκΈ° 2 (λ°±μ€, JAVA)
μ΄ κΈμ λͺ©μ°¨8κ°
- π λ¬Έμ μμ μꡬνλ κ²μ ν¬κ² 3κ°μ§ μ΄λ€.
- β μ€λ΅ μμ΄λμ΄
- β λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ DFS, BFSμ λΉν΄μ μκ° λ³΅μ‘λκ° μκΈ° λλ¬Έμ DFS, BFSλ₯Ό μ¬μ©νκΈ° μ΄λ ΅λ€.
- β μμ΄λμ΄
- 3. μ΅μ λΉμ©μ κ°λ κ²½λ‘μ λ Έλ λ°©λ¬Έ μμ
- βλλ μ΄ λ Έλμμ μμ΄μ!β
- π λ¬Έμ μμ
- π» μμ€ μ½λ (Java)
https://www.acmicpc.net/problem/11779

π λ¬Έμ μμ μꡬνλ κ²μ ν¬κ² 3κ°μ§ μ΄λ€.
1. μΆλ° λ Έλμμ λμ°© λ ΈλκΉμ§μ μ΅μ λΉμ©
2. μ΅μ λΉμ©μ κ°λ κ²½λ‘μ ν¬ν¨λ λ Έλμ κ°μ
3. μ΅μ λΉμ©μ κ°λ κ²½λ‘μ λ Έλ λ°©λ¬Έ μμ
β
β μ€λ΅ μμ΄λμ΄
1. μΆλ° λ Έλμμ λμ°© λ ΈλκΉμ§μ μ΅μ λΉμ©
λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ κ΅¬νλ€
β
2. μ΅μ λΉμ©μ κ°λ κ²½λ‘μ ν¬ν¨λ λ Έλμ κ°μ
λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦ λ‘μ§μ BFSμ²λΌ νλ₯Ό μ¬μ©νλ―λ‘ νμ λ°©λ¬Έ λ Έλ κ°―μ μμλ₯Ό μΆκ°νλ€.
β
3. μ΅μ λΉμ©μ κ°λ κ²½λ‘μ λ Έλ λ°©λ¬Έ μμ
DFSλ₯Ό μ΄μ©ν΄μ ꡬν
β
λμ μ€λ΅ μμ΄λμ΄μμλ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦, DFS μκ³ λ¦¬μ¦ 2κ°μ§λ₯Ό μ¬μ©νμ¬ μκ° μ΄κ³Όκ° λ°μνλ€.

β λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ DFS, BFSμ λΉν΄μ μκ° λ³΅μ‘λκ° μκΈ° λλ¬Έμ DFS, BFSλ₯Ό μ¬μ©νκΈ° μ΄λ ΅λ€.
κ·Έλ κΈ°μ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦ μμμ 3κ°μ 쑰건μ λͺ¨λ ꡬνν΄μΌ νλ€.
β
β μμ΄λμ΄
1, 2 쑰건μ μκ°νκΈ° μ¬μ μ§λ§ 3λ² μ‘°κ±΄μ μκ°ν΄λ΄μ§ λͺ»νλ€.
β
3. μ΅μ λΉμ©μ κ°λ κ²½λ‘μ λ Έλ λ°©λ¬Έ μμ
λ Έλ λ°°μ΄μ νλ λ§λ€μ΄μ ν΄κ²°νλ€. (moving[])

μ΅μ λΉμ© λ Έλλ₯Ό μ°Ύμμ λ, μ΄λν λ Έλ λ°°μ΄μ μ΄μ μμΉλ₯Ό ν λΉνλ€.
moving[list[now].get(i)[0]] = now;
// moving[now] = list[now].get(i)[0]; μμ κ°μ΄ νλ©΄ μλλ€.
μ΄λν λ Έλμ μ΄μ μμΉλ₯Ό ν λΉνλ©°
βλλ μ΄ λ Έλμμ μμ΄μ!β
λΌλ κ²μ κΈ°λ‘νλ€.
β
π λ¬Έμ μμ

μ λ ₯μ΄ μμ κ°μ λ moving λ°°μ΄μ κ°μ μλμ κ°λ€.

0λ² μΈλ±μ€ : 무μ (nodeμ κ°μ + 1μ ν¬κΈ°λ‘ μ μΈνμμΌλ―λ‘)
1λ² μΈλ±μ€ : μμ μ§μ μ΄λ―λ‘ -1
2, 3, 4 μΈλ±μ€ : 1λ² λ Έλλ‘λΆν° μΆλ°νλ€
5 μΈλ±μ€ : 4λ² λ Έλλ‘λΆν° μΆλ°νλ€
β
μ΄ λ, 5λ² μΈλ±μ€κ° λμ°© λ Έλμ΄λ―λ‘ 5λ² μΈλ±μ€λΆν° μμΆμ νμ¬ λ Έλμ μ§ν κ³Όμ μ νμΈνλ€.

리μ€νΈλ₯Ό λ§λ€μ΄ λμ°© λ Έλμμ λΆν° μμλ ΈλκΉμ§ μμΆμ νμ¬ μΆλ ₯νκ² λλ€.

moving λ°°μ΄μ -1λ‘ μ΄κΈ°ν νκΈ° λλ¬Έμ forλ¬Έμ μ‘°κ±΄μ΄ μμ κ°λ€.
β
π» μμ€ μ½λ (Java)
package backjoon;
import java.io.*;
import java.util.*;
public class Main {
static int max = Integer.MIN_VALUE;
static int min = Integer.MAX_VALUE;
static boolean flag = false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//StringTokenizer st = new StringTokenizer(br.readLine());
int node = Integer.parseInt(br.readLine());
int edge = Integer.parseInt(br.readLine());
List<int[]>[] list = new List[node + 1];
for(int i=0;i<list.length;i++) list[i] = new ArrayList<>();
for(int i=0;i<edge;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int temp1 = Integer.parseInt(st.nextToken());
int temp2 = Integer.parseInt(st.nextToken());
int temp3 = Integer.parseInt(st.nextToken());
list[temp1].add(new int[]{temp2, temp3});
}
StringTokenizer st2 = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st2.nextToken());
int end = Integer.parseInt(st2.nextToken());
int[] distance = new int[node + 1];
Arrays.fill(distance, Integer.MAX_VALUE);
distance[start] = 0;
PriorityQueue<int[]> queue = new PriorityQueue<>((a,b)->{
if(a[1]<b[1]) return -1;
else if(a[1]>b[1]) return 1;
else return 0;
});
// now, cost, νμ
queue.add(new int[]{start, 0, 1});
int move = 0;
int[] moving = new int[node + 1];
Arrays.fill(moving, -1);
while(!queue.isEmpty()){
int[] temp = queue.poll();
int now = temp[0];
int cost = temp[1];
int length = temp[2];
if(distance[now] < cost) continue;
for(int i=0;i<list[now].size();i++){
if(distance[list[now].get(i)[0]] > cost + list[now].get(i)[1]){
distance[list[now].get(i)[0]] = cost + list[now].get(i)[1];
moving[list[now].get(i)[0]] = now;
if(list[now].get(i)[0] == end) move = length + 1;
queue.add(new int[]{list[now].get(i)[0], cost + list[now].get(i)[1], length + 1});
}
}
}
System.out.println(distance[end]);
System.out.println(move);
List<Integer> print = new ArrayList<>();
for(int i = end; i != -1;i = moving[i]){
print.add(i);
}
for(int i=print.size()-1;i>=0;i--){
System.out.print(print.get(i)+" ");
}
}
}