알고리즘 문제 해결/BOJ

[위상 정렬] BOJ 1516 게임 개발 (C++)

jmkimmessi 2022. 6. 22. 15:02
반응형

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

 

1516번: 게임 개발

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

www.acmicpc.net

 

문제 해결 알고리즘

 

전형적인 위상 정렬 알고리즘 문제였다.

 

아래의 링크에 위상 정렬에 대해 자세히 설명 되어 있다.

 

https://kimmessi.tistory.com/207

 

소스 코드

 

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

int N;

int indegree[502], Time[502];
vector<int> graph[502];

void topologySort(){

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

    for(int i=1;i<=N;i++){
        if(indegree[i] == 0){
            q.push(i);
            result[i] = 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]);
            }
        }
    }

    for(int i=1;i<=N;i++){
        cout << result[i] << '\n';
    }
}

int main(){
    ios::sync_with_stdio(0);
	cin.tie(0);
    cin >> N; 

    for(int i=1;i<=N;i++){
        cin >> Time[i];

        while(true){
            int n; cin >> n;

            if(n == -1) break;
            graph[n].push_back(i);
            indegree[i]++;
        }
    }

    topologySort();
}
반응형