Algorithm/백준

백준 1753 자바 최단경로

chbong 2024. 8. 5. 13:48
package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Boj1753 {

    static int V,E,K;
    public static int[] distance;
    public static boolean[] visited;
    public static ArrayList<Edge>[] list;
    public static PriorityQueue<Edge> q = new PriorityQueue<Edge>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        V = Integer.parseInt(st.nextToken());
        E = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(br.readLine());
        visited = new boolean[V+1];
        distance = new  int[V+1];
        list = new ArrayList[V+1];
        for(int i = 1; i<= V; i++){
            list[i] = new ArrayList<Edge>();
        }

        for(int i=0; i<= V; i++){
            distance[i] = Integer.MAX_VALUE;
        }

        for(int i=0; i< E; i++){
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

            list[u].add(new Edge(v,w));
        }

        q.add(new Edge(K,0));
        distance[K] = 0;
        while(!q.isEmpty()){
            Edge poll = q.poll();
            int vertex = poll.vertex;
            if(visited[vertex]) continue;
            visited[vertex] = true;

            for (Edge edge : list[vertex]) {
                int next = edge.vertex;
                int value = edge.value;
                if(distance[next] > distance[vertex] + value){
                    distance[next] = distance[vertex] + value;
                    q.add(new Edge(next, distance[next]));
                }
            }

        }

        for(int i = 1; i<= V; i++){
            if(visited[i]) System.out.println(distance[i]);
            else System.out.println("INF");
        }

    }

    static class Edge implements Comparable<Edge>{

        int vertex;
        int value;

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

        @Override
        public int compareTo(Edge o) {
            if(this.value > o.value) return 1;
            else return -1;
        }
    }
}