문제링크 : https://www.acmicpc.net/problem/1005
1005번: ACM Craft
첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int T, N, K, W;
int X, Y;
vector<int>t, inDegree, result;
vector<vector<int>>graph;
queue<int>q;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while(T--)
{
cin >> N >> K;
t.resize(N+1); t.clear();
inDegree.resize(N+1); inDegree.clear();
result.resize(N+1); result.clear();
graph.resize(N+1); graph.clear();
for(int i=1; i<=N; i++)
{
cin >> t[i];
}
while(K--)
{
cin >> X >> Y;
graph[X].push_back(Y);
inDegree[Y]++; //진입 차수 증가 (X가 우선)
}
cin >> W;
for(int i=1; i<=N; i++) //진입차수가 0인 정점들을 큐에 삽입
{
if(inDegree[i]==0) q.push(i);
result[i]=t[i];
}
while(!q.empty()) //큐가 비면 사이클 발생이므로 종료
{
int cur = q.front(); //현재 방문 노드
q.pop();
for(int i=0; i<graph[cur].size(); i++) //인접한 노드들의 진입 차수를 1씩 줄이고, 0이면 다시 큐에 삽입
{
int next = graph[cur][i];
result[next] = max(result[next], result[cur] + t[next]); //작업시간 갱신
if(--inDegree[next]==0) q.push(next);
}
}
cout << result[W] << "\n";
}
return 0;
}
위상정렬 문제이다.
기본적인 틀은 전에 풀었던 2056번 작업 문제와 비슷하므로 해당 문제 링크를 첨부하였다.
https://blob-thinking.tistory.com/282
[백준 2056번] 작업 (C++)
문제링크 : https://www.acmicpc.net/problem/2056 2056번: 작업 수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행
blob-thinking.tistory.com
여기서 조금 다른 것은 해당 문제는 W에 해당하는 건물에 도달하는 시간이 필요하다는 것이다.
이는 result[next] = max(result[next], result[cur] + t[next]로 인해 저장되므로, 출력 시에 result[W]를 출력해주면 된다.
그리고 테스크 케이스가 여러가지이므로 매 테스트케이스 마다 사용한 벡터들을 초기화 해주어야 한다.
'백준 > 골드' 카테고리의 다른 글
[백준 2342번] Dance Dance Revolution (C++) (0) | 2023.10.09 |
---|---|
[백준 2623번] 음악프로그램 (C++) (0) | 2023.10.04 |
[백준 2629번] 양팔저울 (C++) (0) | 2023.09.29 |
[백준 4781번] 사탕 가게 (C++) (0) | 2023.09.28 |
[백준 7579번] 앱 (C++) (0) | 2023.09.27 |