728x90
SMALL
백준 문제 풀이: 1005 [ACM Craft]
문제 링크: https://www.acmicpc.net/problem/1005
문제 설명:
건물 건설 순서와 각 건물의 건설 시간을 이용해 특정 건물 완공까지 걸리는 최소 시간을 계산하는 문제입니다.
- 각 건물은 선행 건설 조건을 가집니다.
- 선행 조건이 충족된 후 해당 건물을 건설할 수 있습니다.
- 특정 건물 W를 완성하는 데 필요한 최소 시간을 구해야 합니다.
문제 해결 코드
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> v[1001];
queue<int> q;
int arr[1001];
int dp[1001];
int len[1001];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
while (T--) {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
dp[i] = arr[i];
}
for (int i = 0; i < k; i++) {
int x, y;
cin >> x >> y;
v[x].push_back(y);
len[y]++;
}
int w;
cin >> w;
for (int i = 1; i <= n; i++) {
if (len[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int k = q.front();
q.pop();
for (int i = 0; i < v[k].size(); i++) {
int h = v[k][i];
dp[h] = max(dp[h], arr[h] + dp[k]);
len[h]--;
if (len[h] == 0) {
q.push(h);
}
}
}
cout << dp[w] << '\n';
for (int i = 1; i <= n; i++) {
dp[i] = 0;
arr[i] = 0;
v[i].clear();
len[i] = 0;
}
}
}
예제
입력:
2
4 4
10 1 100 10
1 2
1 3
2 4
3 4
4
8 8
1 2 3 4 5 6 7 8
1 2
2 3
3 4
4 5
5 6
6 7
7 8
1 8
8
출력:
120
36
코드 설명
- 입력 처리: 건물 개수(n), 선행 조건 수(k), 각 건물의 건설 시간, 선행 조건(x, y), 목표 건물 W를 입력받습니다.
- 위상 정렬: 건물 간의 선행 조건을 그래프로 표현하고, 위상 정렬을 이용해 건설 순서를 결정합니다.
- 동적 프로그래밍: dp 배열에 각 건물까지 걸리는 최소 시간을 저장합니다.
- 출력: 목표 건물 W의 완공 시간을 출력합니다.
시간 복잡도
- 그래프 탐색: O(V + E) (건물 수와 간선 수)
- 최종 시간 복잡도: O(T * (V + E)) (테스트 케이스 T 포함)
결과
코드는 위상 정렬과 동적 프로그래밍을 결합하여 문제를 효율적으로 해결합니다. 추가적인 테스트를 통해 최적화를 확인할 수 있습니다.
728x90
LIST
'BAEKJOON > 다이나믹 프로그래밍' 카테고리의 다른 글
백준 2098번 [외판원 순회](C++) -yes6686- 티스토리 (0) | 2025.01.04 |
---|---|
백준 1562번 [계단 수](C++) -yes6686- 티스토리 (2) | 2025.01.04 |
백준 17070번 [파이프 옮기기 1](C++)-yes6686- 티스토리 (0) | 2024.12.30 |
백준 21600번 [계단](C++)-yes6686- 티스토리 (0) | 2024.12.29 |
백준 1890번 [점프](C++)-yes6686- 티스토리 (0) | 2024.12.29 |