코딩테스트/C++
[백준 BOJ] 1005번 - ACM Craft (C++)
최-코드
2023. 12. 22. 23:00
1005번: ACM Craft (acmicpc.net)
1005번: ACM Craft
첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부
www.acmicpc.net
전의 것이 모두 건설이 되어야 하므로 메모이제이션 방법을 사용하여 Y->X 순으로 재귀를 돌리면 충분히 해결될 거라 생각했다.
#include <iostream>
#include <vector>
#include <cmath>
#include <queue>
#include <memory.h>
#define pii pair<int,int>
#define endl "\n"
#define inf 987654321
using namespace std;
int T,N,K;
int D[1001];
vector<int> edge[1001];
bool check[1001];
int W;
int memo(int x)
{
if(edge[x].empty())
return D[x];
else if(check[x])
return D[x];
else
{
check[x]=true;
int max = 0;
for(int i = 0; i<edge[x].size(); i++)
{
int tmp = memo(edge[x][i]);
if(max<tmp)
max = tmp;
}
D[x]+=max;
return D[x];
}
}
int main()
{
cin>>T;
while(T--)
{
cin>>N>>K;
for(int i =1; i<=N; i++)
{
cin>>D[i];
}
int X,Y;
for(int i = 0; i<K; i++)
{
cin>>X>>Y;
edge[Y].push_back(X);
}
cin>>W;
memo(W);
cout<<D[W]<<endl;
memset(check, false, sizeof(check));
for(int i = 1; i<=N; i++)
edge[i].clear();
}
return 0;
}