자기개발👨‍💻/코딩 알고리즘

[C++] 백준 2056 작업

천숭이 2023. 11. 2. 17:47

https://www.acmicpc.net/problem/2056

 

2056번: 작업

수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해

www.acmicpc.net

 

깔끔코드

//작업
#include <vector>
#include <iostream>
#include <queue>
#define MAX 10001  // 최대 노드 개수 
using namespace std;


int n, inDegree[MAX]; 
vector<int> a[MAX];
int result;
int t[MAX];
int dp[MAX];

void topologySort(){
   queue<int> q;
   
   // 진입차수가 0이면 q에 삽입 
   for (int i=1;i<=n;i++){
      if (inDegree[i] == 0) q.push(i);
   }
   
   for (int i=1;i<=n;i++){
      int x = q.front();  // now
      q.pop();
      for (int j=0;j<a[x].size();j++){
         int next = a[x][j];
         dp[next] = max(dp[next], dp[x]+t[next]);
         inDegree[next]--; // 진입차수-- 
         if(inDegree[next] == 0) q.push(next); // 진입차수 0일때 
      }
      
   }
   
   for (int i=1;i<=n;i++) 
      result = max(result, dp[i]);
   cout << result;
}

int main(){
   cin >> n;
   for (int i=1;i<=n;i++){
		int dist, m;
		cin >> dist >> m ;
		t[i]=dist;
		dp[i] = dist;

		for (int j=0;j<m;j++){
			int x; cin >> x;
			a[x].push_back(i);
			inDegree[i]++;
      }
   }
   
   topologySort();
}

 

 

출력확인코드

//작업
#include <vector>
#include <iostream>
#include <queue>
#define MAX 10001  // 최대 노드 개수 
using namespace std;


int n, inDegree[MAX]; 
vector<int> a[MAX];
int result;
int t[MAX];
int dp[MAX];

void topologySort(){
   queue<int> q;
   
   // 진입차수가 0이면 q에 삽입 
   for (int i=1;i<=n;i++){
      if (inDegree[i] == 0) q.push(i);
   }
   
   for (int i=1;i<=n;i++){
      int x = q.front();  // now
      q.pop();
      for (int j=0;j<a[x].size();j++){
         int next = a[x][j];
         cout << "next : " << next << endl;
         dp[next] = max(dp[next], dp[x]+t[next]);
         inDegree[next]--; // 진입차수-- 
         if(inDegree[next] == 0) q.push(next); // 진입차수 0일때 
      }
      cout << "dp array : " ;
      for (int k=0;k<n;k++){
      	cout << dp[k] << " ";
	  }
	  cout << endl;
      
   }
   
   for (int i=1;i<=n;i++) 
      result = max(result, dp[i]);
   cout << result;
}

int main(){
   cin >> n;
   for (int i=1;i<=n;i++){
		int dist, m;
		cin >> dist >> m ;
		t[i] = dist;
		dp[i] = dist;

		for (int j=0;j<m;j++){
			int x; cin >> x;
			a[x].push_back(i);
			inDegree[i]++;
      }
   }
   
   topologySort();
}