Cod sursa(job #1608602)

Utilizator felixiPuscasu Felix felixi Data 22 februarie 2016 10:57:24
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int NMAX = 100000;

int t[NMAX+2];
vector <int> G[NMAX+2];
int d[NMAX+2];
int N, c[NMAX+2];
int st[NMAX+2], lv;

void DFS( int nod ) {
    st[ ++lv ] = nod;
    d[nod] = d[ st[ lv - c[nod] ] ] + 1;
    if( c[nod] == 0 )  d[nod] = 0;
    for( int i = 0;  i < (int)G[nod].size();  ++i ) {
        int x = G[nod][i];
        if( !d[x] ) {
            DFS( x );
        }
    }
    st[ lv-- ] = 0;
}

int main()
{
    in >> N;
    for( int i = 1;  i <= N;  ++i )  in >> c[i];
    for( int i = 1;  i <  N;  ++i ) {
        int x,y;
        in >> x >> y;
        t[y] = x;
        G[x].push_back( y );
    }
    int radacina = 1;
    while( t[radacina] )  ++radacina;
    DFS( radacina );
    for( int i = 1;  i <= N;  ++i )  out << d[i] << ' ';
    return 0;
}