프로그래밍/문제풀이(boj)
[BOJ] 1005 ACM Craft
진형
2018. 10. 11. 15:39
1. 문제링크
https://www.acmicpc.net/problem/1005
2. 문제해설
이 문제는 간단한 위상정렬 문제이다.
1. 각 노드까지 오는데 걸리는 시간을 저장하는 배열을 만든다.
2. 위상정렬을 하면서 축적하며 가장 큰 값들을 들고 온다.
3. 원하는 노드에 왔을 때 그 노드를 만드는데 걸리는 시간을 더한 후 출력한다.
3. 소스코드
#include<iostream> #include<algorithm> #include<vector> #include<cstring> #include<queue> using namespace std; #define fio ios_base::sync_with_stdio(0); cin.tie(0); #define NODE 1000 void testcase(); struct node{ int e, w; }; int main(){ fio int t; cin >> t; while (t--) { testcase(); } return 0; } void testcase(){ int n, m, goal; int idegree[NODE+1] = {0}; int delay[NODE+1] = {0}; int ans[NODE+1] = {0}; vector<int> edge[NODE+1]; queue<int> q; cin >> n >> m; for (int i=1; i<=n; i++) { cin >> delay[i]; } for (int i=0; i<m; i++) { int s, e; cin >> s >> e; edge[s].push_back(e); idegree[e]++; } cin >> goal; for (int i=1; i<=n; i++) { if (!idegree[i]) { q.push(i); } } while (!q.empty()) { int cur = q.front(); q.pop(); for(int next : edge[cur]){ ans[next] = max(delay[cur] + ans[cur], ans[next]); if(--idegree[next] == 0){ if(next == goal){ ans[next] += delay[next]; cout << ans[goal] << '\n'; return; } q.push(next); } } } }
4. 추가언급
마지막에 더하는 것을 까먹으면 틀린 답이 나올 수도 있다.