티스토리 뷰

백준

백준 소스코드 [C++] 2056 작업

Hani_Levenshtein 2021. 3. 3. 23:05

www.acmicpc.net/problem/2056

 

2056번: 작업

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

www.acmicpc.net

백준 소스코드 [C++] 2056 작업

#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#include <limits.h>
#include <vector>
#include <math.h>
#include <stack>
#include <bitset>
#include <string>
#include <set>
#include <sstream>
#define all(v) v.begin(), v.end()
#define pii pair<int,int>
#define make_unique(v) v.erase(unique(v.begin(), v.end()), v.end())
typedef long long ll;
using namespace std;

int inDegree[10001], time[10001], accumulatedTime[10001];
queue<int> q;
vector<int> graph[10001];

void topologicalSort() {

	while (q.empty()!=true) {
		int here = q.front(); 
		q.pop();
		for (auto next : graph[here]) {
			accumulatedTime[next] = max(accumulatedTime[next], accumulatedTime[here] + time[next]);
			if (--inDegree[next] == 0) q.push(next);
		}
	}
}

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

	int n,e; cin >> n;
	for (int i = 1; i <= n; i++) {
		int dt, E;
		cin >> dt >> E;
		time[i] = dt;
		inDegree[i] = E;
		if (E == 0) {
			q.push(i);
			accumulatedTime[i] = dt;
		}
		for (int j = 0; j < E; j++) {
			cin >> e;
			graph[e].push_back(i);
		}
	}

	topologicalSort();

	int res = INT_MIN;
	for (int i = 1; i <= n; i++) res = max(res, accumulatedTime[i]);
	cout << res;

	return 0;
}
댓글