Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[BAEKJOON] 1005. ACM Craft 본문

acmicpc

[BAEKJOON] 1005. ACM Craft

코드와이 2021. 4. 5. 22:51

 

위상정렬

문제링크

www.acmicpc.net/problem/1005

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N 과 건물간의 건설순서규칙의 총 개수 K이 주어진다. (건물의 번호는 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 ACM_Craft {
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		
		for(int tc = 1 ; tc <= T ; tc++) {
			
			st = new StringTokenizer(br.readLine());
			
			int n = Integer.parseInt(st.nextToken());
			int k = Integer.parseInt(st.nextToken());
			
			// 건물 당 건설 시간 배열
			int[] times = new int[n+1];
			
			st = new StringTokenizer(br.readLine());
			for(int i = 1 ; i <= n ; i++) 
				times[i] = Integer.parseInt(st.nextToken());
			
			List<List<Integer>> list = new ArrayList<List<Integer>>();
			for(int i = 0 ; i <= n ; i++) 
				list.add(new ArrayList<Integer>());
			
			int[] arr = new int[n+1];
			for(int i = 0 ; i < k ; i++) {
				st = new StringTokenizer(br.readLine());
				
				int s = Integer.parseInt(st.nextToken());
				int e = Integer.parseInt(st.nextToken());
				
				list.get(s).add(e);
				arr[e]++;
			}
			
			Queue<Integer> queue = new LinkedList<Integer>();
			int[] dp = new int[n+1];		// 각 건물 번호 당 건설에 걸리는 시간의 최솟값
			for(int i = 1 ; i <= n ; i++) {
				dp[i] = times[i];
				if(arr[i] == 0) {
					queue.add(i);
				}
			}
			
			while(!queue.isEmpty()) {
				int q = queue.poll();
				
				for(int i : list.get(q)) {
					dp[i] = Math.max(dp[i], times[i] + dp[q]);
					arr[i]--;
					
					if(arr[i] == 0) queue.add(i);
					
				}
			}
			int ans = Integer.parseInt(br.readLine());
			sb.append(dp[ans]).append("\n");
		}
		sb.setLength(sb.length() - 1);
		System.out.println(sb);
	}
	
}

'acmicpc' 카테고리의 다른 글

[BAEKJOON] 10844. 쉬운 계단 수  (0) 2021.04.06
[BAEKJOON] 1912. 연속합  (0) 2021.04.05
[BAEKJOON] 2252. 줄 세우기  (0) 2021.04.05
[BAEKJOON] 14888. 연산자 끼워넣기  (0) 2021.04.04
[BAEKJOON] 9663. N-Queen  (0) 2021.04.04