새소식

코딩테스트/백준_골드

[C++][백준 2056] 작업

  • -

[문제]

2056번: 작업 (acmicpc.net)

 

2056번: 작업

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

www.acmicpc.net

[문제 풀이]

위상정렬 알고리즘을 이용하면 바로 풀리는 문제이다.

source로부터 이어지는 숫자들이 저장될  vector<int> graph[n]과 가중치가 저장될 cost[n] 그리고 해당 source로부터 이어진 숫자가 몇개인지 파악할 deg[n] 3가지 요소를 이용하면 바로 풀린다.

자세한 사항은 위상정렬 알고리즘 참조.

[회고]

(2023.04.06) 어디를 고쳐서 해결이 된지 아직 못찾음. 알고리즘 로직 자체의 문제는 아니고 변수를 바꾸다가 해결이 되어서 변수의 문제라고 추측.

[코드]

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

vector<int> adj[10010];
int deg[10010];
int cost[10010];
int cost2[10010];
int n;
int max_answer;

void solve(){

    queue<int> q;
    for(int i = 1;i<=n;i++){
        if(deg[i] == 0){
            q.push(i);
        }
        cost2[i] = cost[i];
    }
    
    while(q.size() > 0){
        int cur = q.front();
        q.pop();
        for(int i = 0;i<adj[cur].size();i++){
            int next = adj[cur][i];
            deg[next]--;
            if(deg[next] == 0){
                q.push(next);
            }
            cost2[next] = max(cost2[next],cost2[cur] + cost[next]);
        }
    }
    return;
}

int main(){
    cin>>n;
    for(int i = 1;i<=n;i++){
        int source = i;
        int price,num;
        cin>>price>>num;
        cost[i] = price;
        for(int j = 0;j<num;j++){
            int temp;
            cin>>temp;
            adj[temp].push_back(i);
            deg[i]++;
        }
    }
    solve();

    for(int i = 1;i<=n;i++){
        max_answer = max(max_answer,cost2[i]);
    }
    cout<<max_answer<<endl;

    return 0;
}

'코딩테스트 > 백준_골드' 카테고리의 다른 글

[C++][백준 1062] 가르침  (1) 2023.04.15
[C++][백준 13460] 구슬 탈출 2  (0) 2023.04.14
[C++][백준 1922] 네트워크 연결  (0) 2023.04.05
[C++] 도시 분할 계획  (0) 2023.04.05
[C++][백준 10026] 적록색약  (0) 2023.04.04
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.