문제
레벨: G4
알고리즘: 다익스트라
풀이시간: 1시간
힌트 참조 유무: 유
https://www.acmicpc.net/problem/1753
1 번째 시도
[다익스트라 알고리즘에서 우선순위 큐를 쓰는 이유]
최소거리 값 갱신 횟수의 감소때문이다. 먼저 우선순위 큐를 쓰지 않고 일반 큐를 써도 결과에는 차이가 없다. 하지만 우선순위 큐를 쓰는 이유는 속도에 이점이 있기 때문이다.
import java.io.*;
import java.util.*;
class Node implements Comparable<Node>{
int end, weight;
public Node(int end, int weight){
this.end = end;
this.weight = weight;
}
@Override
public int compareTo(Node o) {
return weight - o.weight;
}
}
public class Main {
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static final int INF = 100_000_000;
static int v,e,k;
static List<Node>[] list;
static int[] dist;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
v = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
k = Integer.parseInt(br.readLine());
list = new ArrayList[v + 1];
dist = new int[v + 1];
Arrays.fill(dist, INF);
for(int i = 1; i <= v; i++){
list[i] = new ArrayList<>();
}
// 리스트에 그래프 정보를 초기화
for(int i = 0 ; i < e; i++){
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
// start에서 end로 가는 weight 가중치
list[start].add(new Node(end, weight));
}
StringBuilder sb = new StringBuilder();
// 다익스트라 알고리즘
dijkstra(k);
// 출력 부분
for(int i = 1; i <= v; i++){
if(dist[i] == INF) sb.append("INF\n");
else sb.append(dist[i] + "\n");
}
bw.write(sb.toString());
bw.close();
br.close();
}
private static void dijkstra(int start){
PriorityQueue<Node> queue = new PriorityQueue<>();
boolean[] check = new boolean[v + 1];
queue.add(new Node(start, 0));
dist[start] = 0;
while(!queue.isEmpty()){
Node curNode = queue.poll();
int cur = curNode.end;
if(check[cur] == true) continue;
check[cur] = true;
for(Node node : list[cur]){
if(dist[node.end] > dist[cur] + node.weight){
dist[node.end] = dist[cur] + node.weight;
queue.add(new Node(node.end, dist[node.end]));
}
}
}
}
}
'알고리즘 > 다익스트라' 카테고리의 다른 글
[백준 13549] 숨바꼭질3 / 자바 / 다익스트라 알고리즘 (2) | 2024.09.14 |
---|---|
[백준 28707] 배열 정렬 / 자바 / 다익스트라 알고리즘 (3) | 2024.09.11 |
[프로그래머스 LV3] 스킬 체크 / 자바 / 다익스트라 알고리즘 (0) | 2024.07.02 |
[백준] 파티 / 자바 (0) | 2024.05.27 |