본문 바로가기
Algorithm/BOJ

[boj] 2056 - 작업 C++ 풀이(DAG, BFS)

by Ellery 2021. 3. 28.

www.acmicpc.net/problem/2056

 

2056번: 작업

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

www.acmicpc.net

작업의 선행관계가 주어졌을 때, 모두 마치는 가장 빠른 시간을 구하는 문제이다.

전형적인 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;
}