본문 바로가기
Programming/BOJ

[C/C++] 백준 #1516 게임 개발(위상 정렬)

by 작은별하나 2022. 8. 23.
반응형

게임 개발 문제는 위상정렬(Topology sort)를 사용해서 풀 수 있는 문제입니다.

 

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

 

1516번: 게임 개발

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

www.acmicpc.net

 

건물을 짓기 위해서 필요한 건물이 있게 되는데요.  이 필요한 건물을 위상으로 생각하면 됩니다.

건물을 짓는데 걸리는 시간이 있는데, 이것은 여러개의 입력 간선이 있다면, 그 입력 간선중 가장 긴 시간이 소요된 것으로 시간을 적으면 되죠.

 

위상 정렬(Topology sort)

기존의 위상정렬이 순서대로 나열하는 것이었다면, 여기서는 입력 간선의 노드값에 따라서 현재의 노드값을 업데이트를 하는 부분만 추가하면 됩니다.

 

다음은 제가 작성한 코드입니다.  참조용으로만 봐주세요.

//----------------------------------------------------------------------------------------
//    baekjoon #1516 - Game development
//        - by Aubrey Choi
//        - created at 2019-11-26
//----------------------------------------------------------------------------------------
#include <stdio.h>
#include <vector>
#include <queue>

int main()
{
    int i, n, s; static int v[500], c[500], t[500];
    std::vector<int> e[500]; std::queue<int> q;
    scanf("%d", &n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&t[i]);
        while(scanf("%d",&s) && s!=-1) e[s-1].push_back(i),c[i]++;
    }
    for(i=0;i<n;i++) if(!c[i]) q.push(i);
    while(!q.empty())
    {
        s=q.front(); q.pop();
        v[s]+=t[s];
        for(auto k:e[s]) { if(v[k]<v[s]) v[k]=v[s]; if(!(--c[k])) q.push(k); }
    }
    for(i=0;i<n;i++) printf("%d\n", v[i]);
}
728x90

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

#1520 내리막 길  (0) 2022.08.29
#1517 버블 소트  (0) 2022.08.23
#1509 팰린드롬 분할  (0) 2022.08.22
#1504 특정한 최단 경로  (0) 2022.08.22
#1494 절대값 수열  (0) 2022.08.22

댓글