알고리즘문제풀이/백준

[BOJ]1005_ACM Craft_Java

초보개발자.. 2021. 5. 13. 22:59

--문제--

https://www.acmicpc.net/problem/1005

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N 과 건물간의 건설순서규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부

www.acmicpc.net

--문제접근--

문제를 읽어보면 위상정렬을 사용하면 되는 문제란 것을 볼 수 있다.

그래서 저는 위상정렬을 사용하기 위하여

하나의 건물을 짓기까지 총 걸리는 시간 을 구해주기 위한 value

연결되어있는 것을 확인해주기 위한 배열 ADJ배열

건물을 건설할 수 있는지 확인하기 위한 indgeree 배열

시간이 얼마나 걸리는지 확인하기 위한 timetable배열

그리고 마지막으로 Queue를 통해 indegree0인것을 하나씩 넣어줄것입니다.

쉽게말해

맨처음 indegree0인것을 한번 Queue에 넣어주고 시작을하여 계속 최신화과정을 거친다음 마지막 value[목표]를 출력하면 답이 나온다고생각하였습니다.

package 백준문제풀이;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class BOJ_1005 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int TC=sc.nextInt();
		for(int t=0;t<TC;t++) {
			int N=sc.nextInt();
			int M=sc.nextInt();
			int[][] adj=new int[N+1][N+1];
			int[] timetable=new int[N+1];
			int[] indegree=new int[N+1];
			int[] value=new int[N+1];
			for(int i=1;i<=N;i++) {
				timetable[i]=sc.nextInt();
			}
			for(int i=0;i<M;i++) {
				int from=sc.nextInt();
				int to=sc.nextInt();
				adj[from][to]=1;
				indegree[to]++;
			}
			int goal=sc.nextInt();//목표지점
			int ans=0;
			Queue<Integer> queue=new LinkedList<Integer>();
			for(int i=1;i<N+1;i++) {
				if(indegree[i]==0) {
					queue.add(i);
					value[i]=timetable[i];
				}
			}
			while(!queue.isEmpty()) {
				int curr=queue.poll();
				for(int i=1;i<=N;i++) {
					if(adj[curr][i]==1) {
						indegree[i]-=1;
						value[i]=Math.max(value[i], value[curr]+timetable[i]);
						if(indegree[i]==0) {
							queue.add(i);
						}
					}
				}
			}
			System.out.println(value[goal]);
			
		}
	}

}