반응형
다익스트라를 활용하는 최단거리 문제이다.
문제를 맨처음 보았을 때 단순하게 백트래킹으로 모든 경로를 확인해보았다. 하지만 주어질 수 있는 동굴의 크기의 최대값이 125이기 때문에 시간초과가 발생하게 된다. 따라서 다익스트라를 활용해보았다. 다익스트라는 기본적으로 다음과 같은 원리로 동작한다.
- 출발 노드를 설정
- 최단 거리 테이블을 최대값으로 초기화
- 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택
- 해당 노드를 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블을 갱신
- 위 과정에서 3번 4번을 반복
그래프와 다르게 2차원 배열에서는 4방향을 갈수있다고 가정하고, 우선순위 큐를 이용하여 구현해보았다.
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
package algosutdy1;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main_bj_1916_최소비용구하기 {
static class Edge implements Comparable<Edge> {
int point, weight;
public Edge(int point, int weight) {
this.point = point;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return Integer.compare(weight, o.weight);
}
}
static int N, M;
static List<Edge>[] edgeList;
static int[] d;
static boolean[] visit;
static PriorityQueue<Edge> pq;
static int start, end;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
pq = new PriorityQueue<>();
d = new int[N + 1];
visit = new boolean[N + 1];
edgeList = new ArrayList[N + 1];
for (int i = 0; i <= N; i++) {
d[i] = Integer.MAX_VALUE / 2;
edgeList[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
edgeList[u].add(new Edge(v, w));
}
st = new StringTokenizer(br.readLine());
start = Integer.parseInt(st.nextToken());
end = Integer.parseInt(st.nextToken());
dijkstra(start);
System.out.println(d[end]);
}
static void dijkstra(int begin) {
d[start] = 0;
visit[start] = true;
pq.add(new Edge(begin, 0));
while (!pq.isEmpty()) {
Edge cur = pq.poll();
int startPoint = cur.point;
for (Edge edge : edgeList[startPoint]) {
int endPoint = edge.point;
if (visit[endPoint] == false && d[endPoint] > d[startPoint] + edge.weight) {
d[endPoint] = d[startPoint] + edge.weight;
pq.add(new Edge(endPoint, d[endPoint]));
}
}
visit[startPoint] = true;
}
}
}
|
반응형
'Algorithm' 카테고리의 다른 글
[Programmers] 징검다리 (2) | 2021.06.02 |
---|---|
[BOJ] 8983. 사냥꾼 (0) | 2021.05.25 |
[BOJ] 14442. 벽 부수고 이동하기2 (0) | 2021.05.16 |
[BOJ] 2812. 크게 만들기 (0) | 2021.05.15 |
[BOJ] 3687. 성냥개비 (0) | 2021.05.12 |