위상정렬인데, 특정 건물을 짓기 전 소요되는 가장 긴 시간을 기준으로 완성 시간을 구해나가면 된다. 개인적으로 1766이나 2252번 보다 더 어려운 것 같은데 난이도가 더 낮아서 의아하다... 두 문제가 overrated된 느낌
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
using namespace std;
vector<int> adj[501];
int indegree[501], arr[501], cost[501];
int n;
void input() {
fastio;
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> arr[i];
int req;
while(cin >> req) {
if(req == -1) break;
++indegree[i];
adj[req].push_back(i);
}
}
}
int main() {
input();
queue<int> q;
for(int i = 1; i <= n; ++i) {
if(!indegree[i]){
q.push(i);
cost[i] = arr[i];
}
}
while(!q.empty()) {
int from = q.front(); q.pop();
for(int to : adj[from]) {
--indegree[to];
cost[to] = max(cost[to], cost[from] + arr[to]);
if(!indegree[to]) {
q.push(to);
}
}
}
for(int i = 1; i <= n; ++i)
cout << cost[i] << "\n";
}
백준 2252 줄 세우기 혼내주기 (0) | 2021.08.01 |
---|---|
백준 1766 문제집 혼내주기 (0) | 2021.08.01 |
백준 17298 오큰수 혼내주기 (0) | 2021.08.01 |
백준 11062 카드 게임 혼내주기 (0) | 2021.08.01 |
백준 10714 케이크 자르기 2 혼내주기 (0) | 2021.08.01 |
댓글 영역