danbibibi
article thumbnail
Published 2024. 2. 18. 17:26
BOJ 1005번: ACM Craft 문제 풀이/백준

문제

문제 바로가기> BOJ 1005번: ACM Craft

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부

www.acmicpc.net

 

풀이

건물을 지을 때, 건설 순서 규칙이 존재하므로, 위상정렬을 이용해 문제를 풀었다.

내가 지어지기 이전에 지어져야 하는 건물들 중 가장 오랜 시간이 걸리는 건물 + 내가 지어지는 데 걸리는 시간이 정답이다.

#include<iostream>
#include<vector>
#include<queue>
#define MAX 1005
using namespace std;

int N; // 건물의 개수
int K; // 건물간의 건설순서 규칙의 총 개수
int W; // 백준이가 승리하기 위해 건설해야 할 건물의 번호
int D[MAX]; // 각 건물당 건설에 걸리는 시간
int cost[MAX]; // 순서에 따른 건물 건설에 걸리는 시간
int indegree[MAX]; // 다른 노드로부터 들어오는 간선의 개수
vector<int> v[MAX]; // 건설 순서

void init(){
    for(int i=1; i<MAX; i++){
        cost[i] = 0;
        indegree[i] = 0;
        v[i].clear();
    }
}

void input(){
    cin >> N >> K;
    for(int i=1; i<=N; i++) cin >> D[i];

    int X, Y;
    for(int i=0; i<K; i++){
        cin >> X >> Y;
        indegree[Y]++;
        v[X].push_back(Y);
    }
    cin >> W;
}

void solve(){

    // 1. 시작점 (진입 차수가 0) queue에 넣기
    queue<int> q;
    for(int n=1; n<=N; n++){
        if(indegree[n] == 0) {
            q.push(n);
            cost[n] = D[n];
        }
    }

    // 2. 건물 건설
    while (!q.empty()){

        int cur = q.front();
        q.pop();

        if(cur == W){ // 백준이가 목표한 건물
            cout << cost[W] << "\n";
            return;
        }

        for(int nxt : v[cur]){
            if(--indegree[nxt] == 0){ // 건설 가능한 경우
                cost[nxt] = max(cost[cur], cost[nxt]) + D[nxt];
                q.push(nxt);
            }
            else if(indegree[nxt] > 0){ // 아직 건설 불가능한 경우
                cost[nxt] = max(cost[nxt], cost[cur]);
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    int TC; cin >> TC;
    while(TC--){
        init();
        input();
        solve();
    }
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 12851번: 숨바꼭질 2  (0) 2024.02.21
BOJ 1938번: 통나무 옮기기  (1) 2024.02.18
BOJ 1477번: 휴게소 세우기  (0) 2024.02.11
BOJ 2933번: 미네랄  (0) 2024.01.31
BOJ 2812번: 크게 만들기  (0) 2024.01.30
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로