[백준] 1005: ACM Craft - JAVA
in Algorithm on 다이나믹 프로그래밍
https://www.acmicpc.net/problem/1005
풀이
위상정렬을 이용해 건물을 건설하는 시간을 구하는 문제.
어떤 건물을 짓기 위해 우선적으로 지어져야 할 건물이 있다.
특정 번호의 앞에 지어져야할 건물이 여러개가 있다면 그중 가장 오래걸리는 것이 끝난 후 지을 수 있게 된다.
따라서 걸리는 시간을 오름차순으로 하기 위해 우선순위큐를 이용했다.
목표한 건물에 도달했으면 시간을 출력하면 끝.
메모리: 245956KB
시간: 864ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static class Node implements Comparable<Node> {
int num;
int time;
public Node(int num, int time) {
this.num = num;
this.time = time;
}
@Override
public int compareTo(Node o) {
return Integer.compare(this.time, o.time);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] time = new int[N + 1];
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= N; j++) {
time[j] = Integer.parseInt(st.nextToken());
}
int[] in_degree = new int[N + 1];
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
for (int j = 1; j <= N + 1; j++) {
list.add(new ArrayList<>());
}
for (int j = 0; j < K; j++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
in_degree[y]++;
list.get(x).add(y);
}
int W = Integer.parseInt(br.readLine());
PriorityQueue<Node> pq = new PriorityQueue<>();
for (int j = 1; j < N + 1; j++) {
if (in_degree[j] == 0) {
pq.add(new Node(j, time[j]));
}
}
while (!pq.isEmpty()) {
Node node = pq.poll();
if (node.num == W) {
sb.append(node.time).append("\n");
break;
}
for (int next : list.get(node.num)) {
in_degree[next]--;
if (in_degree[next] == 0) {
pq.add(new Node(next, node.time + time[next]));
}
}
}
}
System.out.println(sb);
}
}