[백준 1854 : JAVA] K번째 최단경로 찾기 / 다익스트라
문제

풀이
다익스트라 알고리즘 응용 문제다.
일반적으로 다익스트라에서 다른 모든 노드로의 최단경로 비용을 저장하기 위해 int형 1차원 배열을 사용하는데 반해, 우선순위 큐 타입의 1차원 배열을 사용해야 하는게 포인트다.
우선순위 큐의 용량을 K개로 할당한 후, 내림차순으로 정렬을 조정해주면 우선순위 큐의 가장 앞의 원소가 K번 째 최단경로의 비용이 된다.
코드
import java.util.*; import java.io.*; public class Main { private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); private static int N, M, K; private static List<Node>[] edge; private static PriorityQueue<Integer>[] dist; static class Node implements Comparable<Node> { int v, weight; public Node(int v, int weight){ this.v = v; this.weight = weight; } @Override public int compareTo(Node o) { return this.weight - o.weight; } } public static void main(String[] args) throws IOException { StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); init(); 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 weight = Integer.parseInt(st.nextToken()); edge[u].add(new Node(v, weight)); } dijkstra(1); print(); br.close(); } private static void dijkstra(int start) { PriorityQueue<Node> pq = new PriorityQueue<>(); pq.add(new Node(start, 0)); dist[start].add(0); while (!pq.isEmpty()) { Node cur = pq.poll(); for (Node next : edge[cur.v]) { if (dist[next.v].size() < K) { // 저장된 최단비용의 수가 K개 이하 dist[next.v].add((cur.weight + next.weight) * -1); pq.add(new Node(next.v, cur.weight + next.weight)); } else if ((dist[next.v].peek() * -1) > cur.weight + next.weight) { dist[next.v].poll(); dist[next.v].add((cur.weight + next.weight) * -1); pq.add(new Node(next.v, cur.weight + next.weight)); } } } } private static void print() { for (int i = 1; i <= N; ++i){ if (dist[i].size() == K) System.out.println(dist[i].peek() * -1); else System.out.println(-1); } } private static void init() { dist = new PriorityQueue[N + 1]; edge = new ArrayList[N + 1]; for (int i = 0 ; i < N + 1; ++i) { dist[i] = new PriorityQueue<>(K); edge[i] = new ArrayList<>(); } } }
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 2842 : JAVA] 집배원 한상덕 / BFS + 투 포인터 (0) | 2020.10.27 |
---|---|
[백준 2531 : JAVA] 회전 초밥 / 투 포인터 (0) | 2020.10.26 |
[백준 1238 : JAVA] 파티 / 다익스트라 (0) | 2020.10.22 |
[백준 2610 : JAVA] 회의준비 / 플로이드 와샬 + DFS (0) | 2020.10.18 |
[백준 17071 : JAVA] 숨바꼭질 5 / BFS (0) | 2020.10.02 |
댓글
이 글 공유하기
다른 글
-
[백준 2842 : JAVA] 집배원 한상덕 / BFS + 투 포인터
[백준 2842 : JAVA] 집배원 한상덕 / BFS + 투 포인터
2020.10.27 -
[백준 2531 : JAVA] 회전 초밥 / 투 포인터
[백준 2531 : JAVA] 회전 초밥 / 투 포인터
2020.10.26 -
[백준 1238 : JAVA] 파티 / 다익스트라
[백준 1238 : JAVA] 파티 / 다익스트라
2020.10.22 -
[백준 2610 : JAVA] 회의준비 / 플로이드 와샬 + DFS
[백준 2610 : JAVA] 회의준비 / 플로이드 와샬 + DFS
2020.10.18
댓글을 사용할 수 없습니다.