알고리즘

[백준/자바] #1753

룰루루 2025. 6. 25. 00:49

다익스트라 알고리즘을 쓴다는 것까지는 알았는데, java로 구현 방법이 생각나지 않아 다른 풀이를 참고해서 풀었다. 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Main {

    static class Node implements Comparable<Node> {
        public int index;
        public int distance;

        public Node(int index, int distance) {
            this.index = index;
            this.distance = distance;
        }

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

    }

    static int V, E, K;
    static List<Node>[] list;
    static int[] dist;
    static final int INF = 100000000;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        V = Integer.parseInt(st.nextToken());
        E = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(br.readLine());

        list = new ArrayList[V+1];
        for(int i=1; i<V+1; i++) {
            list[i] = new ArrayList<>();
        }
        dist = new int[V+1];
        Arrays.fill(dist, INF);

        for(int i=0; i<E; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            list[start].add(new Node(end, weight));
        }
        
        dijkstra(K);

        StringBuilder sb = new StringBuilder();
        for(int i=1; i<V+1; i++) {
            if(dist[i] == INF) {
                sb.append("INF\n");
            } else {
                sb.append(dist[i] + "\n");
            }
        }
        bw.write(sb.toString());
        br.close();
        bw.flush();
        bw.close();
    }

    private static void dijkstra(int start) {
        boolean[] visited = new boolean[V+1];
        PriorityQueue<Node> queue = new PriorityQueue<>();
        queue.offer(new Node(start, 0));
        dist[start] = 0;

        while(!queue.isEmpty()) {
            int index = queue.peek().index;
            queue.poll();

            if(visited[index]) {
                continue;
            }
            visited[index] = true;

            for(Node node : list[index]) {
                if(dist[node.index] > dist[index] + node.distance) {
                    dist[node.index] = dist[index] + node.distance;
                    queue.add(new Node(node.index, dist[node.index]));
                }
            }
        }
    }
}