문제풀이/백준
[백준]1916: 최소비용 구하기 - JAVA
빈둥벤둥
2021. 2. 9. 16:08
[백준]1916: 최소비용 구하기
풀이
전형적인 다익스트라 알고리즘을 사용하는 문제였다.
채점할때 50퍼센트에서 계속 틀리길래 이것 저것 건드려 보다가 초기화 하는 값을 변경해 주었더니 맞았다. 거리를 계산하는 문제들을 풀 때에는 초기화 값을 항상 신경써서 설정해 주어야 겠다.
코드
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import java.util.*;
public class Main {
static int[][] node;
static int[][] bus;
static int n, m, start, end;
static int[] dist;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
node = new int[n + 1][n + 1];
m = scan.nextInt();
bus = new int[m][3];
for(int i = 0; i < m; i++) {
bus[i][0] = scan.nextInt();
bus[i][1] = scan.nextInt();
bus[i][2] = scan.nextInt();
}
start = scan.nextInt(); //시작노드
end = scan.nextInt(); //도착노드
dist = new int[n + 1]; //start로부터 각 노드까지 최단거리 계산
//값 초기화
for(int i = 1; i <= n; i++) {
dist[i] = 1000000001; //최대 도시의 개수 1000 * 간선의 최대 비용 1000000 + 1 값이 최대값이 된다.
for(int j = 1; j <= n; j++) {
node[i][j] = 1000000001;
}
}
for(int i = 0; i < m; i++) {
int x = bus[i][0];
int y = bus[i][1];
int value = bus[i][2];
if(node[x][y] > value) { //더 작은 가중치 값으로 갱신
node[x][y] = value;
}
}
dijkstra();
System.out.println(dist[end]);
}
public static void dijkstra() {
PriorityQueue<Integer> q = new PriorityQueue<>(); //최소 힙 사용하여 구현
q.offer(start);
dist[start] = 0;
while(!q.isEmpty()) {
int current = q.poll();
for(int i = 1; i <= n; i++) {
//자기 자신으로 가는 경우를 제외하고, 현재 노드에서 i로 가는 가중치가 더 작은 값이 있다면 갱신해 준다.
if(i != current && dist[i] > dist[current] + node[current][i]) {
dist[i] = dist[current] + node[current][i];
q.offer(i); //해당 노드를 우선순위 큐에 담아서 더 작은 값부터 탐색하도록 한다.
}
}
}
}
}
|
cs |