최소 비용을 구하는 문제로, 1753번 문제랑 동일하게 풀면 되지 않나?라는 생각을 하였다.
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 = null;
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
graph = new ArrayList[N + 1];
dist = new int[N + 1];
visit = new boolean[N + 1];
for (int i = 1; i <= N; i++) {
graph[i] = new ArrayList<>();
dist[i] = Integer.MAX_VALUE;
}
for (int i = 0; i < M; i++) {
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));
}
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
// 다익스트라 알고리즘 수행
dijkstra(start);
System.out.println(dist[end]);
}
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]));
}
}
}
}
}
1753번과 동일하게 다익스트라로 풀었을 때 시간 초과
가 발생하였다.
시간 제한을 보니까 0.5초
였다.
하지만 딱히 어느 부분에서 개선을 해야할지 갈피가 안 잡혀서 다른 분들의 풀이 방법을 찾아봤다.
크게 다른 점을 못 느끼던 와중에, 아 혹시 else 문 때문인가?하고 추가했는데 통과되었다.
continue로 바로 넘어가냐, 아니면 진행하냐의 차이였는데 이 한 줄로 통과가 결정된다는 것에 다시 한번 예외처리의 중요성을 느꼈다.
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 = null;
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
graph = new ArrayList[N + 1];
dist = new int[N + 1];
visit = new boolean[N + 1];
for (int i = 1; i <= N; i++) {
graph[i] = new ArrayList<>();
dist[i] = Integer.MAX_VALUE;
}
for (int i = 0; i < M; i++) {
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));
}
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
// 다익스트라 알고리즘 수행
System.out.println(dijkstra(start, end));
}
static int dijkstra(int start, int end) {
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;
}
else continue;
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]));
}
}
}
return dist[end];
}
}