본문 바로가기

Problem Solving/BaekJoon

2056 작업

 

2056번: 작업

수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해

www.acmicpc.net

 

DP와 DFS를 활용하여 해결했다.

각 작업을 노드로, 그리고 각 작업과 선행작업을 방향이 있는 간선으로 연결했다.

그래프를 구성한 다음에는 각 노드에 연결된 선행 작업들을 DFS 방식으로 순회하며 최대 작업 시간을 가진

노드를 찾고, 그 노드의 작업시간과 해당 노드의 수행 시간을 더해 작업시간으로 정했다.

그리고 이 과정에서 각 노드의 작업시간을 구하면 메모리제이션을 이용하여 한번만 찾도록 했다.

이 과정을 수행하면서 모든 작업을 완료하기 위한 최소 시간을 구하여 출력했다.

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

using namespace std;

int minimum_time = -1;

int search(vector<pair<int, vector<int>>>& jobs, vector<int>& times, int target) {
	int& target_time = times[target];
	if (target_time == -1) {
		if (jobs[target].second.size() != 0) {
			int time = -1;
			for (auto prev : jobs[target].second)
				time = max(time, search(jobs, times, prev));
			target_time = time + jobs[target].first;
		}
		else
			target_time = jobs[target].first;
		if (minimum_time < target_time)
			minimum_time = target_time;
	}
	return target_time;
}

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

	int n;
	cin >> n;

	vector<pair<int,vector<int>>> jobs(n + 1);
	vector<int> times(n + 1, -1);

	for (int i = 1, time, nums; i <= n; ++i) {
		cin >> time >> nums;
		jobs[i].first = time;
		jobs[i].second = vector<int>(nums);
		for (int j = 0; j < nums; ++j)
			cin >> jobs[i].second[j];
	}

	for (int i = 1; i <= n; ++i)
		search(jobs, times, i);

	cout << minimum_time;
	
	return 0;
}
728x90

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

17142 연구소3  (0) 2022.01.10
14476 최대공약수 하나 빼기  (0) 2022.01.07
1987 알파벳  (0) 2021.02.02
1806 부분합  (0) 2021.02.02
2228 구간 나누기  (0) 2021.01.15