어흥
[백준 2056] 작업 (C++) 본문
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