최단 거리 문제!
다익스트라로 문제를 해결하자.
import java.util.*;
import java.io.*;
class Node implements Comparable<Node>{
int v;
int cost;
public Node(int v, int cost) {
this.v = v;
this.cost = cost;
}
// PriorityQueue를 사용하기 위한 compareTo
@Override
public int compareTo(Node o) {
return Integer.compare(this.cost, o.cost);
}
}
public class Main {
static ArrayList<Node>[] graph;
static boolean[] visit;
static int[] dist;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(br.readLine());
graph = new ArrayList[V + 1];
dist = new int[V + 1];
visit = new boolean[V + 1];
for (int i = 1; i <= V; i++) {
graph[i] = new ArrayList<>();
dist[i] = Integer.MAX_VALUE; // 최대값으로 초기화
}
for (int i = 0; i < E; i++) {
// u -> v 로 가는 가중치 w가 주어진다.
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
graph[u].add(new Node(v, w));
}
// 다익스트라 알고리즘 수행
dijkstra(k);
for (int i = 1; i <= V; i++) {
System.out.println(dist[i] == Integer.MAX_VALUE ? "INF" : dist[i]);
}
}
static void dijkstra(int start) {
//우선 순위 큐 사용, 가중치를 기준으로 오름차순한다.
PriorityQueue<Node> q = new PriorityQueue<>();
//시작 노드에 대해서 초기화
q.add(new Node(start, 0));
dist[start] = 0;
while (!q.isEmpty()) {
//현재 최단 거리가 가장 짧은 노드를 꺼내서 방문 처리 한다.
Node now = q.poll();
if (visit[now.v] == false) {
visit[now.v] = true;
}
for (Node next : graph[now.v]) {
//방문하지 않았고, 현재 노드를 거쳐서 다른 노드로 이동하는 거리가 더 짧을 경우
if (!visit[next.v] && dist[next.v] > now.cost + next.cost) {
dist[next.v] = now.cost + next.cost;
q.add(new Node(next.v, dist[next.v]));
}
}
}
}
}
이전에 파이썬으로 다익스트라를 구현할 때는, 이정도로 코드가 길진 않았는데 자바로 풀면 정말 길구나를 다시 한번 느끼게 되었다.
PriorityQueue<Node>
에서 Node의 cost 값을 비교해야하기 때문에 compareTo
를 오버라이딩했다.