본문 바로가기

Algorithm/백준

백준 1916 최소비용구하기 - 자바 다익스트라

package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Boj1916_다익스트라 {

    static int N, M;
    static int INF = Integer.MAX_VALUE / 2;
    static ArrayList<Node>[] list;
    static int[] distance;
    static boolean[] visited;
    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());
        visited = new boolean[N + 1];
        list = new ArrayList[N+1];
        for(int i = 1; i<=N; i++){
            list[i] = new ArrayList<>();
        }

        distance = new int[N+1];
        for (int i = 1; i <= N; i++) {
                distance[i] = INF;
        }
        for(int i = 0; i< M; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            list[a].add(new Node(b,c));
        }
        StringTokenizer st = new StringTokenizer(br.readLine());
        int x = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());
        PriorityQueue<Node> qe = new PriorityQueue<>();
        qe.add(new Node(x,0));
        distance[x] = 0;

        while(!qe.isEmpty()){
            Node poll = qe.poll();
            int pv = poll.vertex;
            if(!visited[pv]) {
                visited[pv] = true;
                for (Node node : list[pv]) {
                    int nv = node.vertex;
                    int value = node.value;
                    if (distance[nv] > poll.value)
                        distance[nv] = Math.min(distance[nv], distance[pv] + value);
                    qe.add(new Node(nv, distance[nv]));
                }
            }
        }
        System.out.println(distance[y]);
    }

    static class Node implements Comparable<Node>{
        int vertex;
        int value;

        public Node(int vertex, int value) {
            this.vertex = vertex;
            this.value = value;
        }

        @Override
        public int compareTo(Node o) {
            return this.value - o.value;
        }
    }

  }