🟦/백준

[골드 3] ACM Craft

진뚱이용 2023. 9. 4. 22:37

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

 

1005번: ACM Craft

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

www.acmicpc.net

1. 그래프 그려

2. 방향 반대로 해

3. pQ 시간 오래 걸리는 것부터 조사

4. 해당 정점 도착 했을 때 걸린 시간 memorization 해

5. W부터 넣고 해당 정점 도착 했을 때 걸린 시간이 더 적은 액면 아예 안 넣어

6. 모든 정점을 한 번씩 방문했으면 끝내

7. 걸린 시간 최댓값 출력해

8. 왜 시간 초과임?

import java.io.*;
import java.util.*;

class Data {
	int vertex_number;
	int take_time;

	Data(int vertex_number, int take_time) {
		this.vertex_number = vertex_number;
		this.take_time = take_time;
	}
}

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		int T;
		T = Integer.parseInt(br.readLine());

		for (int test_case = 1; test_case <= T; test_case++) {
			int N, K;
			int[] times;
			int[][] order;
			int W;

			st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());

			times = new int[N];
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < N; i++)
				times[i] = Integer.parseInt(st.nextToken());

			order = new int[K][2];
			for (int i = 0; i < K; i++) {
				st = new StringTokenizer(br.readLine());
				order[i][0] = Integer.parseInt(st.nextToken()) - 1;
				order[i][1] = Integer.parseInt(st.nextToken()) - 1;
			}

			W = Integer.parseInt(br.readLine()) - 1;

			///////////////////////////////////////////////////////

			ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
			for (int i = 0; i < N; i++)
				graph.add(new ArrayList<Integer>());

			for (int i = 0; i < K; i++) {
				graph.get(order[i][1]).add(order[i][0]);
			}

			int[] take_times = new int[N];
			for (int i = 0; i < take_times.length; i++)
				take_times[i] = -1;

			PriorityQueue<Data> queue = new PriorityQueue<Data>(new Comparator<Data>() {
				@Override
				public int compare(Data o1, Data o2) {
					if (o1.take_time > o2.take_time)
						return -1;
					else if (o1.take_time == o2.take_time)
						return 0;
					else
						return 1;
				}

			});

			take_times[W] = times[W];
			queue.add(new Data(W, times[W]));

			int count = 0;

			while (!queue.isEmpty()) {
				Data tmp = queue.remove();
				
				if(count >= N)
					break;

				for (int i = 0; i < graph.get(tmp.vertex_number).size(); i++) {
					if (take_times[graph.get(tmp.vertex_number).get(i)] < tmp.take_time
							+ times[graph.get(tmp.vertex_number).get(i)]) {
						if(take_times[graph.get(tmp.vertex_number).get(i)] == -1)
							count++;
						take_times[graph.get(tmp.vertex_number).get(i)] = tmp.take_time
								+ times[graph.get(tmp.vertex_number).get(i)];
						queue.add(new Data(graph.get(tmp.vertex_number).get(i),
								take_times[graph.get(tmp.vertex_number).get(i)]));
						
					}
				}
			}

			long answer = Long.MIN_VALUE;
			for (int i = 0; i < take_times.length; i++)
				answer = Math.max(answer, take_times[i]);
			sb.append(answer).append("\n");

		}
		System.out.println(sb);
	}

}