코드와이
[BAEKJOON] 1516. 게임 개발 본문
위상정렬
문제링크
1516번: 게임 개발
첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부
www.acmicpc.net
package acmicpc.Gold3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class 게임_개발 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
List<List<Integer>> list = new ArrayList<List<Integer>>();
for(int i = 0 ; i <= n ; i++) {
list.add(new ArrayList<>());
}
int[] arr = new int[n+1];
int[] cnt = new int[n+1];
for(int i = 1 ; i <= n ; i++) {
st = new StringTokenizer(br.readLine());
arr[i] = Integer.parseInt(st.nextToken());
while(true) {
int x = Integer.parseInt(st.nextToken());
if(x == -1) break;
list.get(x).add(i);
cnt[i]++;
}
}
Queue<Integer> queue = new LinkedList<>();
int[] ans = new int[n+1];
for(int i = 1 ; i <= n ; i++) {
if(cnt[i] == 0) {
queue.offer(i);
}
ans[i] = arr[i];
}
while(!queue.isEmpty()) {
int x = queue.poll();
for(int l : list.get(x)) {
if(--cnt[l] == 0) {
queue.offer(l);
}
ans[l] = Math.max(arr[l] + ans[x], ans[l]);
}
}
for(int i = 1 ; i <= n ; i++)
System.out.println(ans[i]);
}
}
'acmicpc' 카테고리의 다른 글
[BAEKJOON] 16985. Maaaaaaaaaze (0) | 2021.04.21 |
---|---|
[BAEKJOON] 7579. 앱 (0) | 2021.04.19 |
[BAEKJOON] 2056. 작업 (0) | 2021.04.19 |
[BAEKJOON] 2637. 장난감조립 (0) | 2021.04.19 |
[BAEKJOON] 16236. 아기 상어 (0) | 2021.04.16 |