알고리즘 문제 해결/BOJ

[위상 정렬] BOJ 2056 작업

jmkimmessi 2022. 6. 19. 11:56
반응형

https://www.acmicpc.net/problem/2056

 

2056번: 작업

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

www.acmicpc.net

 

문제 해결 알고리즘

 

전형적인 위상 정렬 알고리즘을 활용한 문제이다.

 

작업 시간이 있는 것이 좀 다른데, 이것은 계속해서 결괏값을

먼저 해야할 작업이 걸린 시간 + 현재 해야할 작업이 걸리는 시간과 계속 비교해주면서 더 큰 쪽을 결괏값에 대입해준다.


아래의 링크에 위상 정렬 알고리즘에 대한 자세한 설명이 나와있다.

https://kimmessi.tistory.com/207

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

int N;
int indegree[10002];
int Time[10002];
vector<int> graph[10002];
int ans = 0;


void topologySort(){

    vector<int> result(10001);
    queue<int> q;

    for(int i=1;i<=N;i++){ 
        if(indegree[i] == 0){
            q.push(i);
            result[i] = Time[i];
            ans = max(ans, Time[i]);
        }
    }

    while(!q.empty()){
        
        int now = q.front();
        q.pop();

        for(int i=0;i<graph[now].size();i++){
            
            indegree[graph[now][i]]--;

            result[graph[now][i]] = max(result[graph[now][i]], result[now] + Time[graph[now][i]]);

            if(indegree[graph[now][i]] == 0){
                q.push(graph[now][i]);

                ans = max(ans, result[graph[now][i]]);
            }
        }
    }
    
    cout << ans;

}

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

    for(int i=1;i<=N;i++){
        int a, b; cin >> a >> b;

        Time[i] = a;

        for(int j=0;j<b;j++){
            int c; cin >> c;
            graph[c].push_back(i);
            indegree[i]++;
        }
    }

    topologySort();
}
반응형