코딩테스트/백준_골드 [C++][백준 2056] 작업 - [문제] 2056번: 작업 (acmicpc.net) 2056번: 작업 수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해 www.acmicpc.net [문제 풀이] 위상정렬 알고리즘을 이용하면 바로 풀리는 문제이다. source로부터 이어지는 숫자들이 저장될 vector<int> graph[n]과 가중치가 저장될 cost[n] 그리고 해당 source로부터 이어진 숫자가 몇개인지 파악할 deg[n] 3가지 요소를 이용하면 바로 풀린다. 자세한 사항은 위상정렬 알고리즘 참조. [회고] (2023.04.06) 어디를 고쳐서 해결이 된지 아직 못찾음. 알고리즘 로직 자체의 문제는 아니고 변수를 바꾸다가 해결이 되어서 변수의 문제라고 추측. [코드] #include <iostream> #include <vector> #include <algorithm> #include <queue> using namespace std; vector<int> adj[10010]; int deg[10010]; int cost[10010]; int cost2[10010]; int n; int max_answer; void solve(){ queue<int> q; for(int i = 1;i<=n;i++){ if(deg[i] == 0){ q.push(i); } cost2[i] = cost[i]; } while(q.size() > 0){ int cur = q.front(); q.pop(); for(int i = 0;i<adj[cur].size();i++){ int next = adj[cur][i]; deg[next]--; if(deg[next] == 0){ q.push(next); } cost2[next] = max(cost2[next],cost2[cur] + cost[next]); } } return; } int main(){ cin>>n; for(int i = 1;i<=n;i++){ int source = i; int price,num; cin>>price>>num; cost[i] = price; for(int j = 0;j<num;j++){ int temp; cin>>temp; adj[temp].push_back(i); deg[i]++; } } solve(); for(int i = 1;i<=n;i++){ max_answer = max(max_answer,cost2[i]); } cout<<max_answer<<endl; return 0; } 공유하기 URL 복사카카오톡 공유페이스북 공유엑스 공유 게시글 관리 구독하기Yoon-1212 Contents 당신이 좋아할만한 콘텐츠 [C++][백준 1062] 가르침 2023.04.15 [C++][백준 13460] 구슬 탈출 2 2023.04.14 [C++][백준 1922] 네트워크 연결 2023.04.05 [C++] 도시 분할 계획 2023.04.05 댓글 0 + 이전 댓글 더보기