diff --git "a/\353\260\261\354\244\200/Gold/2056.\342\200\205\354\236\221\354\227\205/README.md" "b/\353\260\261\354\244\200/Gold/2056.\342\200\205\354\236\221\354\227\205/README.md" new file mode 100644 index 0000000..461ddcd --- /dev/null +++ "b/\353\260\261\354\244\200/Gold/2056.\342\200\205\354\236\221\354\227\205/README.md" @@ -0,0 +1,34 @@ +# [Gold IV] 작업 - 2056 + +[문제 링크](https://www.acmicpc.net/problem/2056) + +### 성능 요약 + +메모리: 5984 KB, 시간: 56 ms + +### 분류 + +방향 비순환 그래프, 다이나믹 프로그래밍, 그래프 이론, 위상 정렬 + +### 제출 일자 + +2024년 4월 20일 00:41:56 + +### 문제 설명 + +

수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다.

+ +

몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해 반드시 먼저 완료되어야 할 작업들이 있다. 이 작업들은 번호가 아주 예쁘게 매겨져 있어서, K번 작업에 대해 선행 관계에 있는(즉, K번 작업을 시작하기 전에 반드시 먼저 완료되어야 하는) 작업들의 번호는 모두 1 이상 (K-1) 이하이다. 작업들 중에는, 그것에 대해 선행 관계에 있는 작업이 하나도 없는 작업이 반드시 하나 이상 존재한다. (1번 작업이 항상 그러하다)

+ +

모든 작업을 완료하기 위해 필요한 최소 시간을 구하여라. 물론, 서로 선행 관계가 없는 작업들은 동시에 수행 가능하다.

+ +### 입력 + +

첫째 줄에 N이 주어진다.

+ +

두 번째 줄부터 N+1번째 줄까지 N개의 줄이 주어진다. 2번째 줄은 1번 작업, 3번째 줄은 2번 작업, ..., N+1번째 줄은 N번 작업을 각각 나타낸다. 각 줄의 처음에는, 해당 작업에 걸리는 시간이 먼저 주어지고, 그 다음에 그 작업에 대해 선행 관계에 있는 작업들의 개수(0 ≤ 개수 ≤ 100)가 주어진다. 그리고 선행 관계에 있는 작업들의 번호가 주어진다.

+ +### 출력 + +

첫째 줄에 모든 작업을 완료하기 위한 최소 시간을 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Gold/2056.\342\200\205\354\236\221\354\227\205/\354\236\221\354\227\205.cc" "b/\353\260\261\354\244\200/Gold/2056.\342\200\205\354\236\221\354\227\205/\354\236\221\354\227\205.cc" new file mode 100644 index 0000000..e162f2f --- /dev/null +++ "b/\353\260\261\354\244\200/Gold/2056.\342\200\205\354\236\221\354\227\205/\354\236\221\354\227\205.cc" @@ -0,0 +1,36 @@ +#include +#include +#include + +using namespace std; + +int main() { + ios_base::sync_with_stdio(0); + cin.tie(0); + + int n, k, p; + cin >> n; + vector t(n+1, 0); + vector> pre(n+1, vector()); + vector dp(n+1, 0); + + for (int i = 1; i <= n; i++) { + cin >> t[i]; + cin >> k; + for (int j = 0; j < k; j++) { + cin >> p; + pre[i].push_back(p); + } + } + + for (int i = 1; i <= n; i++) { + int maxWait = 0; + for (int j = 0; j < pre[i].size(); j++) { + maxWait = max(dp[pre[i][j]], maxWait); + } + dp[i] = maxWait + t[i]; + } + cout << *max_element(dp.begin(), dp.end()); + + return 0; +}