일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 프림
- 코딩테스트
- union find
- Pirogramming
- 자바
- SQL
- OrderBy
- 다익스트라
- 피로그래밍
- 누적합
- Database
- django
- EC2
- db
- Baekjoon
- 구현
- 그래프 탐색
- JOIN
- 알고리즘
- BFS
- Java
- SQL코딩테스트
- MST
- GROUPBY
- 백준
- 크루스칼
- AWS
- 최단경로
- 프로그래머스
- 배포
- Today
- Total
NullNull
[백준 P1916] 최소비용 구하기 자바 Java 본문
P1916 최소비용 구하기
1916번: 최소비용 구하기
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그
www.acmicpc.net
문제
N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 M개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. A번째 도시에서 B번째 도시까지 가는데 드는 최소비용을 출력하여라. 도시의 번호는 1부터 N까지이다.
입력값
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.
그리고 M+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.
5
8
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5
출력값
첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.
4
알고리즘
N개의 도시가 있으며, 한 도시에서 출발하여 다른 도시에 도착하는 버스가 있다. A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 해보자가 문제의 핵심이다.
도시를 정점으로 바꾸고, 버스를 간선으로 바꾸어 문제를 다시 읽어보자. N개의 정점이 있으며, 한 정점과 다른 정점을 연결하는 단방향 간선이 있다. A번째 정점에서 B번째 정점까지 가는데 드는 비용을 최소화 해야한다. 다익스트라를 이용한 최단 경로를 찾는 문제처럼 보이지 않는가?
문제 해석만 성공하면 이 문제는 순수 다익스트라로 쉽게 풀린다. 심지어 출발점에서 도착점을 무조건 갈 수 있는 경우만 인풋으로 주어진다고 문제에 명시되어 있기 때문에 별도의 예외처리 또한 필요없다.
path 배열에는 출발점에서 각 정점까지 가는데 필요한 최소 비용이 저장될 것이다. 처음에는 INF로 초기화했다. 그래프는 인접리스트 방식으로 저장하여 각 도시에서 다른 도시로 얼만큼의 비용을 지불해야 이동할 수 있는지를 기록해둔다.
마지막으로 findPath라는 메소드에 다익스트라 알고리즘을 구현했다. 출발 도시를 우선순위 큐에 넣어주고, 각 도시를 방문하면서 path 배열을 업데이트 해준다.
모든 코드의 진행이 끝나고 path[목적지 노드 번호] 를 출력하면 답을 구할 수 있다.
아래는 전체 코드이다.
코드
import java.util.*;
import java.io.*;
public class Main {
static final int INF = Integer.MAX_VALUE;
static int N, M;
static int start, end;
static List<int[]>[] graph;
static int[] path;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
path = new int[N + 1];
Arrays.fill(path, INF);
graph = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
graph[from].add(new int[] {to, weight});
}
st = new StringTokenizer(br.readLine());
start = Integer.parseInt(st.nextToken());
end = Integer.parseInt(st.nextToken());
findPath();
System.out.println(path[end]);
}
public static void findPath() {
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> {
return a[1] - b[1];
});
path[start] = 0;
pq.add(new int[] {start, 0});
while (!pq.isEmpty()) {
int[] current = pq.poll();
if (path[current[0]] < current[1]) continue;
for (int[] next: graph[current[0]]) {
int weight = path[current[0]] + next[1];
if (path[next[0]] > weight) {
pq.add(new int[] {next[0], weight});
path[next[0]] = weight;
}
}
}
}
}
'알고리즘' 카테고리의 다른 글
[백준 P13904] 과제 Java (0) | 2023.01.02 |
---|---|
[백준 P11779] 최소비용 구하기 2 자바 Java (0) | 2022.12.07 |
[백준 P10423] 전기가 부족해 Java (0) | 2022.11.29 |
[백준 P15681] 트리와 쿼리 Java (0) | 2022.11.11 |
[백준 P21924] 도시 건설 Java (0) | 2022.11.03 |