백준 1753번 최단경로

veloger·2023년 1월 20일
0


package test;

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

public class BaekJoonQ1753 {
	private static int INF = Integer.MAX_VALUE >> 2;
	static ArrayList<Node> []graph;
	static PriorityQueue<Node> qu;
	
	static class Node implements Comparable<Node>{
		int node;
		int value;
		
		public Node(int node, int value) {
			this.node=node;
			this.value=value;
		}

		@Override
		public int compareTo(Node n) {
			// TODO Auto-generated method stub
			return this.value - n.value;
		}
		
	}
	
	static int[] dijkstra(int node, int startNode) {
		int[] dist = new int[node+1];
		Arrays.fill(dist, INF);
		dist[startNode] = 0;
		
		qu = new PriorityQueue<>();
		qu.add(new Node(startNode, 0));
		
		while(!qu.isEmpty()) {
			Node crnt = qu.poll();
			if (dist[crnt.node] < crnt.value) continue;
			for(Node next:graph[crnt.node]) {
				if (dist[crnt.node] + next.value < dist[next.node]) {
					dist[next.node] = dist[crnt.node] + next.value;
					qu.add(new Node(next.node, dist[next.node]));
				}
			}
		}
		return dist;
	}
	
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st =new StringTokenizer(br.readLine());
		
		int node = Integer.parseInt(st.nextToken());
		int edge = Integer.parseInt(st.nextToken());
		int startNode =Integer.parseInt(br.readLine());
		
		
		graph = new ArrayList[node+1];
		
		for(int i =1;i<graph.length;i++) {
			graph[i] = new ArrayList<>();
		}
		
		for(int i=0;i<edge;i++) {
			st =new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b =Integer.parseInt(st.nextToken());
			int v = Integer.parseInt(st.nextToken());
			graph[a].add(new Node(b,v));
		}
		

		int[] dist = dijkstra(node, startNode);
		for (int i = 1; i <= node; i++) {
			if (dist[i] == INF) 
				bw.write("INF");
			else 
				bw.write(Integer.toString(dist[i]));
			bw.newLine();
		}
		bw.flush();
	}
}

0개의 댓글