백준 알고리즘/Java
[백준] 1753. 최단경로 - Java
리버🐦🔥
2025. 5. 23. 02:23
https://www.acmicpc.net/problem/1753
⭐️ 중요 포인트
일반적인 다익스트라 문제이다. 다만, 한 번 다익스트라를 돌리고, 나오지 않은 값에 대해서는 Integer.MAX_VALUE를 이용하여 "INF"로 치환해 출력하는 것이 포인트이다.
import java.util.*;
import java.io.*;
public class P1753 {
// Class
static class Edge {
int to;
int weight;
Edge(int to, int weight) {
this.to = to;
this.weight = weight;
}
}
static class Node {
int num;
int cost;
Node(int num, int cost) {
this.num = num;
this.cost = cost;
}
}
// Variable
static BufferedReader br;
static BufferedWriter bw;
static int V;
static int E;
static int K;
static int answer;
static Map<Integer, List<Edge>> graph;
static Set<Integer> nodeNumbers;
static Comparator<Node> comp = new Comparator<>() {
@Override
public int compare(Node n1, Node n2) {
return n1.cost - n2.cost;
}
};
// Method
static void init() throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
graph = new HashMap<>();
nodeNumbers = new HashSet<>();
StringTokenizer st = new StringTokenizer(br.readLine());
V = Integer.parseInt(st.nextToken());
E = Integer.parseInt(st.nextToken());
K = Integer.parseInt(br.readLine());
}
static void solve() throws IOException {
for (int i = 0; i < E; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
addEdge(u, v, w);
}
List<Integer> sortedNodeNumbers = new ArrayList<>(nodeNumbers);
Collections.sort(sortedNodeNumbers);
Map<Integer, Integer> result = dijkstra();
for (int i = 1; i <= V; i++) {
bw.write(result.getOrDefault(i, Integer.MAX_VALUE) != Integer.MAX_VALUE ? String.valueOf(result.getOrDefault(i, Integer.MAX_VALUE)) : "INF");
bw.newLine();
}
}
static Map<Integer, Integer> dijkstra() throws IOException {
Queue<Node> pq = new PriorityQueue<>(comp);
Map<Integer, Integer> distances = new HashMap<>();
pq.offer(new Node(K, 0));
distances.put(K, 0);
while (!pq.isEmpty()) {
Node curNode = pq.remove();
int curNum = curNode.num;
int curCost = curNode.cost;
if (curCost > distances.getOrDefault(curNum, Integer.MAX_VALUE)) {
continue;
}
for (Edge edge: graph.getOrDefault(curNum, Collections.emptyList())) {
int nextNum = edge.to;
int nextCost = curCost + edge.weight;
if (nextCost < distances.getOrDefault(nextNum, Integer.MAX_VALUE)) {
pq.offer(new Node(nextNum, nextCost));
distances.put(nextNum, nextCost);
}
}
}
return distances;
}
static void addEdge(int u, int v, int w) throws IOException {
graph.computeIfAbsent(u, k -> new ArrayList<>()).add(new Edge(v, w));
nodeNumbers.add(u);
nodeNumbers.add(v);
}
public static void main(String[] args) throws IOException {
init();
solve();
bw.flush();
bw.close();
br.close();
}
}