-
[1516] 게임 개발BOJ 2021. 10. 12. 18:31
https://www.acmicpc.net/problem/1516
1516번: 게임 개발
첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부
www.acmicpc.net
<문제>
위상정렬을 사용했다.
dist[]가 최적해를 저장하는 배열, cur이 현재 정점, next가 cur과 연결된 정점, a[]가 각 정점의 가중치일때
각 건물을 짓기까지 걸리는 시간은 dist[next]=max(dist[cur]+a[next], dist[next])로 표현된다.
그 외에는 기본적인 위상정렬과 동일하다.
<소스코드>
1234567891011121314151617181920212223242526272829303132333435#include <bits/stdc++.h>using namespace std;int n, dist[501], ind[501], a[501];vector<int> adj[501];queue<int> q;int main(void) {int i, j;cin >> n;for (i = 1; i <= n; i++) {cin >> a[i];while (1) {int x;cin >> x;if (x == -1) break;adj[x].push_back(i);ind[i]++;}}for (i = 1; i <= n; i++)if (ind[i] == 0) {q.push(i);dist[i] = a[i];}while (!q.empty()) {int cur = q.front();q.pop();for (auto& next : adj[cur]) {ind[next]--;dist[next] = max(dist[cur] + a[next], dist[next]);if (ind[next] == 0) q.push(next);}}for (i = 1; i <= n; i++) cout << dist[i] << '\n';return 0;}cs 'BOJ' 카테고리의 다른 글
[1436] 영화감독 숌 (0) 2021.10.12 [2839] 설탕 배달 (0) 2021.10.12 [9660] 돌 게임 6 (0) 2021.10.12 [9659] 돌 게임 5 (0) 2021.10.12 [2670] 연속부분최대곱 (0) 2021.10.12