fbpx

Problema #1101 – Project – Rezolvari PBInfo

de Mihai-Alexandru

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

S-ar putea sa iti placa