Cod sursa(job #1830554)

Utilizator cristinamateiCristina Matei cristinamatei Data 16 decembrie 2016 20:40:19
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("cerere.in");
ofstream out("cerere.out");

const int N = 100003;
int n, nr, lst[N], vf[N], urm[N], k[N], rasp[N], pred[N],pr;
bool viz[N], radacina[N];

void adauga( int x, int y )
{
    nr++;
    vf[nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void raspuns( int x )
{
    int p, y;
    viz[x] = true;
    pred[++pr] = x;
    if ( k[x] == 0 )
        rasp[x] = 0;
    else
    {
        rasp[x] = 1+ rasp[ pred[ pr-k[x]] ];
    }
    p = lst[x];
    while( p!= 0 )
    {
        y = vf[p];
        if ( viz[y] == false )
        {
            raspuns(y);
            //pr--;
        }
        p = urm[p];
    }
    pr--;
}

int main()
{
    in >> n;
    int i, x, y, r;
    for ( i = 1; i <= n; i++ )
        in >> k[i];
    for ( i = 1; i < n; i++ )
    {
        in >> x >> y;
        adauga(x,y);
        radacina[y] = true;
    }

    for ( i = 1; i <= n; i++ )
        if ( radacina[i] == false )
        {
            r = i;
            continue;
        }
    raspuns(r);

    for ( i = 1; i <= n; i++ )
        out << rasp[i]<<' ';
    return 0;
}