본문 바로가기

Problem Solving/BaekJoon

1005 ACM Craft

 

 

1005번: ACM Craft

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

www.acmicpc.net

 

 

DP라기 보다는 위상 정렬에 더 무게를 둔 문제이다.

각 건물의 선행 건물들과 선행 건물의 수를 그 건물에 대응되는 배열의 위치에 저장한 후

큐를 이용하여 건물들을 짓는 것에 조건을 만족하며 소요되는 최소 시간을 계산하는 방식으로 해결하였다.

 

더보기
더보기
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int t;
	cin >> t;
	
	for (int i = 0; i < t; ++i) {
		int n, k;
		cin >> n >> k;

		vector<int> time(n);
		for (int j = 0; j < n; ++j) {
			cin >> time[j];
		}

		vector<vector<int>> pres(n);
		vector<int> pres_cnt(n);
		int x, y, w;
		for (int j = 0; j < k; ++j) {
			cin >> x >> y;
			pres[x - 1].push_back(y - 1);
			++pres_cnt[y - 1];
		}
		cin >> w;
		w -= 1;

		queue<int> q;

		for (int j = 0; j < n; ++j) {
			if (pres_cnt[j] == 0) {
				q.push(j);
			}
		}

		vector<int> cost(n);

		while (pres_cnt[w] > 0) {
			int f = q.front();
			q.pop();

			for (auto b : pres[f]) {
				cost[b] = max(cost[b], cost[f] + time[f]);
				--pres_cnt[b];
				if (pres_cnt[b] == 0) {
					q.push(b);
				}
			}
		}

		cout << cost[w] + time[w] << '\n';
	}
	return 0;
}
728x90

'Problem Solving > BaekJoon' 카테고리의 다른 글

16236 아기 상어  (0) 2022.01.21
17142 연구소3  (0) 2022.01.10
14476 최대공약수 하나 빼기  (0) 2022.01.07
2056 작업  (0) 2021.02.06
1987 알파벳  (0) 2021.02.02