반응형
[Gold V] 최소비용 구하기 - 1916
성능 요약
메모리: 56844 KB, 시간: 512 ms
분류
데이크스트라, 그래프 이론, 최단 경로
제출 일자
2024년 11월 19일 03:29:38
문제 설명
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째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.
출력
첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.
제출 코드
완전 탐색이 필요한 최소비용 문제는 다익스트라 알고리즘을 사용하여 해결할 수 있다.
//https://www.acmicpc.net/problem/1916
import java.io.*;
import java.util.*;
class Node{
int idx; // 도착노드
int cost; // 비용
public Node(int idx, int cost) {
this.idx = idx;
this.cost = cost;
}
}
public class Main {
static int start, end; // 출발노드, 목적지노드
static ArrayList<Node>[] graph;
static Integer[] dist;
static void dijkstra(){
PriorityQueue<Node> pq = new PriorityQueue<>((o1, o2) -> o1.cost - o2.cost); // 방문할 노드
pq.offer(new Node(start, 0)); // 출발 노드 추가
dist[start] = 0; // 출발 노드 비용 추가
while(!pq.isEmpty()){
Node cur = pq.poll(); // 현재 노드
if(cur.cost > dist[cur.idx]) continue; // 최소비용이 아니면 continue
if(cur.idx == end) return; // 목적지 도착했으면 return
if(graph[cur.idx] == null) continue; // 인접 노드 없으면 continue
for(Node next : graph[cur.idx]){ // 인접 노드 순회
int nextCost = dist[cur.idx] + next.cost; // 다음 노드 비용 계산
if(dist[next.idx] == null || nextCost < dist[next.idx]){ // 저장된 최소비용보다 작으면
dist[next.idx] = nextCost; // 최소비용바꿔주고
pq.offer(new Node(next.idx, nextCost)); // 경로 추가
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 노드 개수
int M = Integer.parseInt(br.readLine()); // 간선 개수
graph = new ArrayList[N+1]; // 그래프 초기화
dist = new Integer[N+1]; // 최소비용배열 초기화
// 입력 받고 그래프 채우기
StringTokenizer st;
int s, e, c; // 출발지, 도착지, 비용
for(int i = 0; i <M ; i++) {
st = new StringTokenizer(br.readLine());
s = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
if(graph[s] == null) graph[s] = new ArrayList<>();
graph[s].add(new Node(e, c));
}
// 출발노드, 도착노드 저장
st = new StringTokenizer(br.readLine());
start = Integer.parseInt(st.nextToken());
end = Integer.parseInt(st.nextToken());
// dijkstra 탐색
dijkstra();
// 결과 출력
System.out.println(dist[end]);
}
}
728x90
반응형
'코딩 테스트 정복기 > 백준' 카테고리의 다른 글
[백준/Silver I] 정수 삼각형 - 1932 (0) | 2024.11.30 |
---|---|
[백준/Silver I] 곱셈 - 1629 (1) | 2024.11.29 |
[백준/Gold IV] 최단경로 - 1753 (0) | 2024.11.27 |
[백준/Gold IV] 거짓말 - 1043 (0) | 2024.11.26 |
[백준/Silver II] 알고리즘 수업 - 깊이 우선 탐색 1 - 24479 (0) | 2024.11.23 |