본문 바로가기
Problem Solving

[BOJ 1005] ACM Craft

by Ladun 2020. 4. 20.

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