작업의 선행관계가 주어졌을 때, 모두 마치는 가장 빠른 시간을 구하는 문제이다.
전형적인 DAG문제이고, 위상정렬 로직을 bfs로 구현해서 모든 노드를 순서대로 순회했을 때의 최종 시간을 구하면 된다.
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int n;
vector<int> graph[10001];
vector<int> ind(10001); // indegree 갯수
vector<int> t(10001); // 소요시간
vector<int> d(10001); // 전체작업 끝나는 시간
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; ++i) {
int m;
cin >> t[i] >> m;
for (int j = 0; j < m; ++j) {
int u;
cin >> u;
graph[u].push_back(i);
ind[i]++;
}
}
queue<int> q;
for (int i = 1; i <= n; ++i) {
if (ind[i] == 0) {
q.push(i);
d[i] = t[i];
}
} // 초기화
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < graph[u].size(); ++i) {
int v = graph[u][i];
ind[v]--;
if (ind[v] == 0) {
q.push(v);
}
if (d[v] < d[u] + t[v]) {
d[v] = d[u] + t[v];
}
}
}
cout << *max_element(d.begin(), d.end());
return 0;
}
'Algorithm > BOJ' 카테고리의 다른 글
boj 1197 - 최소 스패닝 트리(MST, kruskal) (0) | 2021.03.28 |
---|---|
1922- 네트워크 연결 C++(MST, prim or kruskal, BFS) (0) | 2021.03.28 |
[boj] 2252 - 줄 세우기 C++(DAG, topological sort) (0) | 2021.03.26 |
[boj] 1941 - 소문난 칠공주 C++ 풀이(완전탐색, 비트마스크, BFS) (0) | 2021.03.25 |
[boj]20366 - 같이 눈사람 만들래? 풀이(투포인터, 정렬) (0) | 2021.03.25 |