Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Scanner
- 열거형
- 제네릭
- 와일드카드
- 추상화
- 프림알고리즘
- abstract
- 백준
- Encapsulation
- 버퍼비우기
- 추상 클래스
- 상속
- polymorphism
- nextInt
- Final
- 객체 지향
- this
- 인터페이스
- enum
- 캡슐화
- java
- 객체지향
- 17472
- 생성자
- 최소신장트리
- 내부 클래스
- python
- inheritance
- 다형성
Archives
- Today
- Total
쫑쫑이의 블로그
백준 1516 게임 개발 Java [위상정렬, DP] 본문
https://www.acmicpc.net/problem/1516
위상정렬을 사용하여 먼저 지어야하는 건물 갯수만큼 가중치를 주고,
건물이 완성될 때마다 그 다음 지을 수 있는 건물의 시간 값을 최대값을 비교하여 넣어주고,
가중치가 0이 되면 건물 완성 큐에 넣는다
예제를 예시로 하면 가중치는 [0, 0, 1, 1, 2, 1]이 된다 (0번 인덱스는 사용안함)
가중치가 0인 값을 큐에 넣으면 1번만 큐에 들어간다
1 다음에 지을 수 있는 건물은 2, 3, 4이고
2, 3, 4의 건설 완료 시간에 10 + @(해당 인덱스 건설 시간)로 최대값을 넣는다 (20, 14, 14)
2, 3은 가중치가 0이고 4는 1이므로 2, 3만 큐에 넣는다
2는 다음 건물이 없으니 넘어가고 3은 다음 건물이 4, 5이다
4, 5의 건설 완료 시간에 14 + @로 최대값을 넣는다 (18, 17)
이전에 4에 저장된 값이 14인데 18보다 작으므로 18로 바뀐다
둘다 가중치가 0이니 큐에 넣지만 다음 건물이 없으므로 반복문이 종료된다
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[] dp = new int[N + 1];
int[] times = new int[N + 1];
int[] weights = new int[N + 1];
ArrayList<Integer>[] childs = new ArrayList[N + 1];
for (int n = 1; n <= N; n++) childs[n] = new ArrayList<>();
for (int n = 1; n <= N; n++) {
int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
times[n] = arr[0];
weights[n] += arr.length - 2;
for (int i = 1; i < arr.length - 1; i++) {
childs[arr[i]].add(n);
}
}
Queue<Integer> queue = new LinkedList<>();
for (int n = 1; n <= N; n++) {
if (weights[n] == 0) {
queue.add(n);
dp[n] = times[n];
}
}
while (!queue.isEmpty()) {
int now = queue.poll();
for (int child : childs[now]) {
dp[child] = Math.max(dp[child], dp[now] + times[child]);
weights[child]--;
if (weights[child] == 0) queue.add(child);
}
}
for (int n = 1; n <= N; n++) sb.append(dp[n]).append("\n");
System.out.println(sb);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 11000 강의실 배정 Java [우선순위 큐] (0) | 2022.11.27 |
---|---|
백준 7662 이중 우선순위 큐 Java [우선순위 큐] (0) | 2022.11.26 |
백준 11085 군사 이동 Java [분리집합 Union find] (0) | 2022.11.24 |
백준 1976 여행 가자 Java [분리집합, Union find] (0) | 2022.11.23 |
백준 1717 집합의 표현 Java [분리집합, Union find] (0) | 2022.11.22 |