Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 1516 게임 개발 본문

Programming/BOJ

[백준/BOJ] 1516 게임 개발

he1fire 2020. 9. 29. 15:32
728x90

문제 : 1516 게임 개발

 

1516번: 게임 개발

첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부

www.acmicpc.net

건물을 짓는데 걸리는 시간과 그 건물을 짓기 전에

먼저 지어져야 하는 건물의 번호가 주어졌을 때,

그 건물을 짓는데 걸리는 최소 시간을 출력하는 문제이다.

위상 정렬을 사용해 현재 지을 수 있는 건물부터 순차적으로 지으면서

그 건물을 짓는 시간을 구해주면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, build[505], chk[505], ans[505];
vector<ll> arr[505];
void TopologySort(){
    queue<ll> q;
    for (int i=1;i<=N;i++){
        if (chk[i]==0)
            q.push(i);
    }
    for (int i=1;i<=N;i++){
        ll x=q.front();
        q.pop();
        ans[x]+=build[x];
        for (int j=0;j<arr[x].size();j++){
            ll dx=arr[x][j];
            ans[dx]=max(ans[x],ans[dx]);
            if (--chk[dx]==0)
                q.push(dx);
        }
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for (int i=1;i<=N;i++){
        cin >> build[i];
        while (1){
            ll a;
            cin >> a;
            if (a==-1)
                break;
            arr[a].push_back(i);
            chk[i]++;
        }
    }
    TopologySort();
    for (int i=1;i<=N;i++){
        cout << ans[i] << "\n";
    }
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 1766 문제집  (0) 2020.09.29
[백준/BOJ] 2056 작업  (0) 2020.09.29
[백준/BOJ] 17251 힘 겨루기  (0) 2020.09.29
[백준/BOJ] 2879 코딩은 예쁘게  (0) 2020.09.28
[백준/BOJ] 1577 도로의 개수  (0) 2020.09.28
Comments