백준 11779 - 최소비용 구하기2
Updated:
Java
11779 번 - 최소비용 구하기 2
문제
접근 방법
이전 문제에서, 시작 도시에서 도착 도시까지 경유한 도시들과 그 총 도시의 개수를 구하는 것이 추가 된 문제이다.
다익스트라를 계산할 때, 새로운 경유 도시를 거쳐 더 짧은 비용으로 도착 도시를 갈 수 있으면,
- 기존의 도착 루트를 초기화한 뒤
- 경유하는 도시까지 도달한 루트 정보로 수정하고
- 경유 도시를 넣어 새로운 루트로 갱신한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, result;
static int MAX_VALUE = 987654321;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = stoi(br.readLine());
m = stoi(br.readLine());
StringTokenizer stk;
// ---------- 초기화 시작 -----------
int[][] bus = new int[n + 1][n + 1];
for(int i = 1; i <= n; i++)
Arrays.fill(bus[i], 100001);
int a,b,v;
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
v = stoi(stk.nextToken());
// A -> B 도시까지 가는 버스가 하나가 아닐 수 있다.
if(v < bus[a][b])
bus[a][b] = v;
}
int startCity, endCity;
stk = new StringTokenizer(br.readLine());
startCity = stoi(stk.nextToken());
endCity = stoi(stk.nextToken());
int[] city = new int[n + 1];
boolean[] vis = new boolean[n + 1];
Arrays.fill(city, MAX_VALUE);
city[startCity] = 0;
// 최소 비용 구하기 2 초기화 시작
List<List<Integer>> route = new ArrayList<>();
for(int i = 0; i <= n; i++) {
route.add(new ArrayList<>());
}
// ---------- 초기화 끝 -----------
// 다익스트라
int min;
int curN = -1;
while(true) {
min = MAX_VALUE;
for(int i = 1; i <= n; i++) {
if(!vis[i] && city[i] < min) {
min = city[i];
curN = i;
}
}
if(min == MAX_VALUE)
break;
vis[curN] = true;
for(int i = 1; i <= n; i++) {
if(!vis[i] && bus[curN][i] != 100001 && city[i] > city[curN] + bus[curN][i]) {
city[i] = city[curN] + bus[curN][i];
// 도착 루트를 초기화한다.
route.get(i).clear();
// 경유하는 도시까지 도달한 루트 정보를 도착 루트에 넣는다.
for(int c : route.get(curN))
route.get(i).add(c);
// 경유 도시도 루트에 추가하여, 시작 점에서 해당 도시까지의 루트를 갱신한다.
route.get(i).add(curN);
}
}
}
// 결과 출력
route.get(endCity).add(endCity);
System.out.println(city[endCity]);
System.out.println(route.get(endCity).size());
for(int c : route.get(endCity)) {
System.out.print(c);
System.out.print(" ");
}
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
후기
그래프 문제일 경우 A → B로 가는 간선이 하나가 아닐 수 있다.