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

1. 문제

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

 

1005번: ACM Craft

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

www.acmicpc.net

 

2. 풀이

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

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

<cpp />
#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

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