자바생
Published 2021. 8. 20. 02:39
자바(백준) 1753 최단경로 BOJ(Java)
728x90

오답 노트 & 새로 알게 된 점

이번에는 최단 경로를 구하는 알고리즘 중 다익스트라를 공부했다.

최단경로 문제는 다익스트라를 이용하는 웰노운 문제로 다익스트라를 제대로 알고있다면

쉽게 풀 수 있는 문제이다.

 


 

코드

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
89
90
91
92
package Graph;
 
import java.io.*;
import java.util.*;
 
public class BOJ1753 {
    static int atoi(String str) {
        return Integer.parseInt(str);
    }
 
    static final int INF = Integer.MAX_VALUE;
    static int nV, nE;
    static ArrayList<Node> node[];
    static int dist[];
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        nV = atoi(st.nextToken());
        nE = atoi(st.nextToken());
 
        node = new ArrayList[nV + 1];
        dist = new int[nV + 1];
 
        for (int i = 0; i <= nV; i++) {
            node[i] = new ArrayList<>();
        }
 
        int start = atoi(br.readLine());
 
        for (int i = 0; i < nE; i++) {
            st = new StringTokenizer(br.readLine());
            int from = atoi(st.nextToken());
            int to = atoi(st.nextToken());
            int wei = atoi(st.nextToken());
 
            node[from].add(new Node(to, wei));
        }
 
        dijkstra(start);
 
        for (int i = 1; i <= nV; i++) {
            if(dist[i] == INF){
                sb.append("INF").append("\n");
                continue;
            } else sb.append(dist[i]).append("\n");
        }
 
        System.out.print(sb);
    }
 
    static void dijkstra(int start) {
        PriorityQueue<Info> pq = new PriorityQueue<>((o1,o2)->{
            return o1.dist - o2.dist;
        });
 
        for(int i = 0; i <= nV; i++) dist[i] = INF;
 
        pq.offer(new Info(start, 0));
        dist[start] = 0;
 
        while (!pq.isEmpty()) {
            Info info = pq.poll();
 
            if(info.dist != dist[info.idx]) continue;
 
            for (Node n : node[info.idx]) {
                if(dist[n.to] <= dist[info.idx] + n.wei) continue;
 
                dist[n.to] = dist[info.idx] + n.wei;
                pq.offer(new Info(n.to, dist[n.to]));
            }
        }
    }
    static class Info{
        int idx, dist;
 
        public Info(int idx, int dist) {
            this.idx = idx;
            this.dist = dist;
        }
    }
 
    static class Node{
        int to, wei;
 
        public Node(int to, int wei) {
            this.to = to;
            this.wei = wei;
        }
    }
}
cs
728x90
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그