백준 1753 - 최단경로

Updated:

Java

1753번 - 최단경로

문제

방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다.

접근 방법

다익스트라를 통하여 시작 점에서 각 정점으로 가는 최단 거리를 구한다.
간선의 정보를 2차원 배열로 저장하면, 정점의 개수가 최대 20,000이므로, 20000 x 20000 x 4byte > 256MB가 된다.
따라서 주어진 간선의 정보만 들어가 있는 Node class와 Priority Queue를 통하여 Dijkstra를 구현하였다.

코드

import java.util.*;
import java.io.*;

public class Main {
	
	static class Node implements Comparable<Node> {
		int end;			// 현재 정과 연결 되어 있는 끝 정점
		int weight;			// 가중치
		
		public Node(int end, int weight) {
			this.end = end;
			this.weight = weight;
		}
		@Override
		public int compareTo(Node o) {
			return Integer.compare(weight,o.weight);
		}
	}
	
	static int v, e, start;
	static int[] distance;
	static boolean[] vis;
	static List<List<Node>> graph;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	v = stoi(stk.nextToken());
    	e = stoi(stk.nextToken());
    	graph = new ArrayList<List<Node>>();
    	
    	distance = new int[v + 1];		// 시작점에서 각 정점으로 가는데 걸리는 최소 비용
    	vis = new boolean[v + 1];
    	for(int i = 0; i < v + 1; i++) {
    		graph.add(new ArrayList<Node>());
    	}
    	
    	start = stoi(br.readLine());
    	
    	for(int i = 0; i < e; i++) {
    		stk = new StringTokenizer(br.readLine());
    		int st = stoi(stk.nextToken());
    		int end = stoi(stk.nextToken());
    		int w = stoi(stk.nextToken());
    		graph.get(st).add(new Node(end, w));	// 각 정점 st에서 이어지는 정점 end와 weight
    	}
    	
    	Arrays.fill(distance, Integer.MAX_VALUE);
    	distance[start] = 0;
    	
    	PriorityQueue<Node> queue=new PriorityQueue<Node>();
		queue.offer(new Node(start,distance[start]));
    	
		while(!queue.isEmpty()){
			Node current=queue.poll();
        	
			int curN = current.end;
        	if(vis[curN])continue;
        	
        	vis[curN]=true; // 선택 정점 방문 처리
			
			//step2: current정점을 경유지로 하여 갈수 있는 다른 방문하지 않은 정점들에 대한 처리
			for(Node node : graph.get(curN)) {
				if(node.weight + distance[curN] < distance[node.end]) {
					distance[node.end] = distance[curN] + node.weight;
	                queue.add(new Node(node.end, distance[node.end]));
				}
			}
		}
    	
    	for(int i = 1; i <= v; i++) {
    		if(distance[i] != Integer.MAX_VALUE)
    			System.out.println(distance[i]);
    		else
    			System.out.println("INF");
    	}
    	br.close();
	}

	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐⭐⭐⭐⭐

후기

개선할 점