[Java]BaekJoon.AC
[Java]백준 BaekJoon.AC 1916 : 최소비용 구하기(1753 최단경로+, 다익스트라 사용)
스뇨잉
2021. 11. 6. 04:50
728x90
728x90

https://www.acmicpc.net/problem/1916
1916번: 최소비용 구하기
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그
www.acmicpc.net
직전에 해결했던 1753번 문제의 알파 문제다.
이 문제에서 조금만 수정해도 충분히 통과할 수 있다.
(짚을 부분은 INF가 없어도 된다는 점 정도.
구해야 하는 값이 정해져있기 때문에 그 값만 필요하니 굳이 INF를 설정할 필요가 없었다. 굿--!)
하지만 해결이 아닌 실력 향상이 목적이기에 복습겸 다시 작성해봤다.
직전에 통과한 문제라 이 문제는 술술 풀렸다,,
그래도 못다 이해한 부분을 다시 이해하기 너무 좋았다.
다른 사람의 코드를 참고했던 부분도 내 도출로 이끌어냈고 문법들(Node 리스트 생성과 오버라이딩 부분)도 다시 학습했다.
보다 깔끔해진 코드가 마음에 든다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int N;
static ArrayList<Node>[] list;
static int answer[];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
list = new ArrayList[N+1];
answer = new int[N+1];
for(int i=0; i<N+1; i++) {
list[i] = new ArrayList<Node>();
}
Arrays.fill(answer, Integer.MAX_VALUE);
for(int i=0; i<M; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int go = Integer.parseInt(st.nextToken());
int stop = Integer.parseInt(st.nextToken());
int money = Integer.parseInt(st.nextToken());
list[go].add(new Node(stop, money));
}
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
boongboong(start);
System.out.print(answer[end]);
}
public static void boongboong(int start) {
PriorityQueue<Node> queue = new PriorityQueue<>();
boolean[] check = new boolean[N+1];
answer[start] = 0;
queue.add(new Node(start, 0));
while(!queue.isEmpty()) {
Node nod = queue.poll();
if(!check[nod.arrive]) {
for(Node temp : list[nod.arrive]) {
if(temp.pay + answer[nod.arrive] < answer[temp.arrive]) {
answer[temp.arrive] = temp.pay + answer[nod.arrive];
queue.add(new Node((temp.arrive), answer[temp.arrive]));
}
}
check[nod.arrive] = true;
}
}
}
}
class Node implements Comparable<Node>{
int arrive;
int pay;
Node(int arrive, int pay){
this.arrive = arrive;
this.pay = pay;
}
@Override
public int compareTo(Node o) {
return this.pay-o.pay;
}
}
728x90
728x90