알고리즘/백준
BOJ1516/ C++
내이름은 킹햄찌
2022. 1. 3. 21:08
https://www.acmicpc.net/problem/1516
1516번: 게임 개발
첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부
www.acmicpc.net
백준 온라인저지 1516번 문제입니다.
위상정렬을 이용해서 풀었습니다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n;
int time[501];
int dp[501];
int buildingCnt[501];
vector<int> building[501];
int max(int a, int b) { return a > b ? a : b; }
void Input() {
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> time[i];
dp[i] = time[i];
while (true) {
cin >> x;
if (x == -1) break;
else {
building[x].push_back(i);
buildingCnt[i]++;
}
}
}
}
void solution() {
queue<int> q;
for (int i = 1; i <= n; i++) {
if (buildingCnt[i] == 0)
q.push(i);
}
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = 0; i < building[cur].size(); i++) {
int next = building[cur][i];
dp[next] = max(dp[next], dp[cur] + time[next]); //건물을 짓는데 걸리는 시간의 최댓값
buildingCnt[next]--;
if (buildingCnt[next] == 0)
q.push(next);
}
}
for (int i = 1; i <= n; i++)
cout << dp[i] << "\n";
}
int main(void) {
Input();
solution();
}
아이디어
위상정렬에서 건물을 짓는데 걸리는 시간의 최댓값을 구하는 부분만 구현