Algorithm/BOJ
[백준] 1005번 ACM Craft
면빈이
2019. 12. 26. 20:04
[적용한 알고리즘]
위상정렬
[아이디어]
위상정렬
[생각의 흐름 / 절차]
[교훈]
기본 문제였다
<코드>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int MAX_N = 1001;
int main(){
int t; scanf("%d", &t);
while (t--){
int N, K;
int indegree[MAX_N] = { 0 };
int time[MAX_N] = { 0 };
vector<int> adj[MAX_N];
scanf("%d %d", &N, &K);
for (int i = 1; i <= N; i++){
scanf("%d", &time[i]);
}
for (int i = 0; i < K; i++){
int from, to;
scanf("%d %d", &from, &to);
adj[from].push_back(to);
indegree[to]++;
}
int W; scanf("%d", &W);
int result[MAX_N] = { 0 };
queue<int> Q;
for (int i = 1; i <= N; i++){
if (indegree[i] == 0){
result[i] = time[i];
Q.push(i);
}
}
for (int i = 1; i <= N; i++){
int cur = Q.front();
Q.pop();
for (int nxt : adj[cur]){
result[nxt] = max(result[nxt], result[cur] + time[nxt]);
if (--indegree[nxt] == 0){
Q.push(nxt);
}
}
}
printf("%d\n", result[W]);
}
return 0;
}