https://www.acmicpc.net/problem/1005
1005번: ACM Craft
첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N 과 건물간의 건설순서규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부터 N번까지 존재한다) 둘째 줄에는 각 건물당 건설에 걸리는 시간 D가 공백을 사이로 주어진다. 셋째 줄부터 K+2줄까지 건설순서 X Y가 주어진다. (이는 건물 X를 지은 다음에 건물 Y를 짓는 것이 가능하다는 의미이다) 마지막 줄에는 백준이가 승리하기 위해 건
www.acmicpc.net
위 문제는 [BOJ 1516] 게임 개발 와 거의 유사한 문제이다. 똑같이 위상정렬을 통해 건물이 지어지는 시간을 갱신하여 출력하면 된다.
ACM Craft는 1516번 문제와는 다르게 1개의 건물만 출력하면 되기 때문에 그 부분만 수정하면 된다.
#include <stdio.h>
#include <vector>
#include <queue>
#define max(a, b) ((a) > (b) ? (a) :(b))
using namespace std;
int n, k, w;
int time[1001];
int indgree[1001];
int ans[1001];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
vector<vector<int>> g;
scanf("%d%d", &n, &k);
g.resize(n + 1);
for (int i = 1; i <= n; i++)
scanf("%d", time + i);
for (int i = 0; i < k; i++)
{
int x, y;
scanf("%d%d", &x, &y);
g[x].push_back(y);
indgree[y]++;
}
scanf("%d", &w);
queue<int> q;
for (int i = 1; i <= n; i++)
{
if (indgree[i] == 0)
q.push(i);
ans[i] = time[i];
}
while (!q.empty())
{
int p = q.front(); q.pop();
for (auto s = g[p].begin(); s != g[p].end(); s++)
{
if (--indgree[*s] == 0)
q.push(*s);
ans[*s] = max(ans[*s], ans[p] + time[*s]);
}
}
printf("%d\n", ans[w]);
}
}'Problem Solving' 카테고리의 다른 글
| [BOJ 2623] 음악프로그램 (0) | 2020.04.20 |
|---|---|
| [BOJ 2252] 줄 세우기 (0) | 2020.04.20 |
| [BOJ 1516] 게임 개발 (0) | 2020.04.20 |
| [BOJ 1806] 부분합 (0) | 2020.04.17 |
| [BOJ 13398] 연속합 2 (0) | 2020.04.17 |