어흥

[백준 2056] 작업 (C++) 본문

알고리즘/백준

[백준 2056] 작업 (C++)

라이언납시오 2020. 3. 4. 16:08
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/2056

 

2056번: 작업

수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해 반드시 먼저 완료되어야 할 작업들이 있다. 이 작업들은 번호가 아주 예쁘게 매겨져 있어서, K번 작업에 대해 선행 관계에 있는(즉, K번 작업을 시작하기 전에 반드시 먼저 완료되어야 하는) 작업들의 번호는 모두 1 이상 (K-1) 이하이다. 작업들

www.acmicpc.net

1. 주의할 점

- 위상정렬이 1개가 아니다

 

2. 구현

- 모든 Node의 작업이 끝나는 시간의 최댓값을 result 배열에 저장한다

- Result 배열의 원소 중 최대값을 구한다.

#define MAX 987654321
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v[10001];
int result[10001];
int val[10001];
struct info {
	int idx, val;
};
info tmp;
int main() {
	int num, ntime, m, tt;
	cin >> num;
	queue<info> q;
	for (int i = 1; i <= num; i++) {
		cin >> ntime >> m;
		val[i] = ntime;
		if (m == 0) {
			tmp.idx = i;
			tmp.val = ntime;
			q.push(tmp);
			result[i] = ntime;
		}
		for (int j = 0; j < m; j++) {
			cin >> tt;
			v[tt].push_back(i);
		}
	}

	int ans = 0;
	while (!q.empty()) {
		int cidx = q.front().idx;
		int cv = q.front().val;
		q.pop();
		for (int i = 0; i < v[cidx].size(); i++) {
			int next = v[cidx][i];
			if (result[next] < result[cidx] + val[next]) {
				result[next] = result[cidx] + val[next];
				tmp.idx = next;
				tmp.val = result[next];
				q.push(tmp);
			}
		}
	}
	for (int i = 1; i <= num; i++)
		ans = max(ans, result[i]);
	cout << ans;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 12100] 2048 (Easy) (C++)  (0) 2020.03.05
[백준 14500] 테트로미노 (C++)  (0) 2020.03.05
[백준 16953] A → B (C++)  (0) 2020.03.04
[백준 2186] 문자판 (C++)  (0) 2020.03.04
[백준 10830] 행렬제곱 (C++)  (0) 2020.03.04
Comments