202
La o firmă de software se lucrează la un mare proiect. Proiectul constă în executarea a n
(n
număr natural) faze de dezvoltare, numerotate cu numerele 1
, 2
, …, n
. Unele faze pot fi executate în paralel (în acelaşi timp), însă executarea altor faze nu poate fi începută până când nu se finalizează executarea anumitor faze.
Cerinţă
Să se scrie un program care să se determine:
a) timpul minim t
în care se poate finaliza executarea proiectului
Exemplu
pm.in
7 2 3 5 3 3 3 2 0 0 1 2 1 1 1 1 3 3 4 5 1 3
pm.out
11 0 3 0 0 3 3 2 5 2 5 8 8 8 9
#include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; ifstream cin("pm.in"); ofstream cout("pm.out"); int n , m , x , timp[105] , dist[105] , cost[105] , v[105]; vector <int> G[105]; int dfs(int node) { if(dist[node] != 0) return dist[node]; for(auto i : G[node]) dist[node] = max(dist[node], dfs(i)); dist[node] += cost[node]; return dist[node]; } void dfs2( int node, int val) { if(timp[node] > val) timp[node] = val; for(auto i : G[node]) { if(timp[i] > timp[node] - cost[i]) dfs2(i , timp[node] - cost[i]); } } int main() { cin >> n; for(int i = 1 ; i <= n ; i++) cin >> cost[i]; for(int i = 1 ; i <= n ; i++) { cin >> m; for(int j = 1 ; j <= m ; j++) { cin >> x; G[i].push_back(x); v[x] = 1; } } for(int i = 1 ; i <= n ; i++) if(!v[i]) G[n + 1].push_back(i); dfs(n + 1); cout << dist[n + 1] << '\n'; for(int i = 1 ; i <= n + 1 ; i++) timp[i] = INF; dfs2(n + 1, dist[n + 1]); for(int i = 1 ; i <= n ; i++) cout << dist[i] - cost[i] << " " << timp[i] << '\n'; return 0; }
Comentarii