Algorithm/백준
[백준] 11779 최소비용 구하기2
SSONGMI
2021. 3. 22. 22:45
반응형
문제 출처: www.acmicpc.net/problem/11779
11779번: 최소비용 구하기 2
첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스
www.acmicpc.net
: 정점들 간의 가중치 정보가 주어지고 출발점에서 도착점까지의 최소비용과 도착점까지 가는데 거치는 정점들을 구해야한다.
: 스페셜 저지 문제이기 때문에 여러 정답이 가능하다.
: 1916최소비용 구하기 문제에서 조금 더 응용된 버전이다.
[백준] 1916 최소비용 구하기
문제 출처: www.acmicpc.net/problem/1916 1916번: 최소비용 구하기 첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄..
ssongmi1002.tistory.com
: 최소비용을 구하기 위해서 다익스트라 알고리즘을 사용하고
: 정점의 최소비용값이 갱신될 때마다 그 전 정점을 저장해둔다.
: 그 후 최소비용을 모두 구한 후에 저장해놓았던 정점들을 따라가면 그 경로를 구할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class 최소비용구하기2 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static class Edge {
int to;
long weight;
public Edge(int to, long weight) {
super();
this.to = to;
this.weight = weight;
}
}
public static void main(String[] args) throws IOException {
int V = Integer.parseInt(br.readLine());
int E = Integer.parseInt(br.readLine());
ArrayList<Edge>[] list = new ArrayList[V+1];
for(int i = 0; i < V+1; i++) {
list[i] = new ArrayList<>();
}
for(int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
long weight = Long.parseLong(st.nextToken());
list[from].add(new Edge(to, weight));
}
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
long[] D = new long[V+1];
boolean[] v = new boolean[V+1];
int[] prev = new int[V+1];
for(int i = 1; i < V+1; i++) {
D[i] = Long.MAX_VALUE;
}
D[start] = 0;
for(int i = 1; i < V+1; i++) {
Long min = Long.MAX_VALUE;
int minIdx = 0;
for(int j = 1; j < V+1; j++) {
if(!v[j] && min > D[j]) {
minIdx = j;
min = D[j];
}
}
v[minIdx] = true;
for(int j = 0, size = list[minIdx].size(); j < size; j++) {
Edge cur = list[minIdx].get(j);
if(!v[cur.to] && D[cur.to] > D[minIdx] + cur.weight) {
D[cur.to] = D[minIdx] + cur.weight;
prev[cur.to] = minIdx;
}
}
}
sb.append(D[end] + "\n");
int root = end;
ArrayList<Integer> route = new ArrayList<>();
while(root != 0) {
route.add(root);
root = prev[root];
}
sb.append(route.size() + "\n");
// System.out.println(Arrays.toString(prev));
for(int i = route.size()-1; i >= 0; i--) {
sb.append(route.get(i) + " ");
}
System.out.println(sb);
}
}
반응형