Cod sursa(job #2380814)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 15 martie 2019 15:30:07
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>
using namespace std ;
const int NR = 100005 ;
ifstream in ("cerere.in") ;
ofstream out ("cerere.out") ;

vector < int > v [ NR ] ;
deque < int > s ;
deque < int > :: iterator it ;
int n , i , c [ NR ] , x , y , sol [ NR ] ;
bool notroot [ NR ] ;

void dfs ( int nod )    {

    if ( c [ nod ] )    {
        it = s.end() - c [ nod ] - 1 ;
        sol [ nod ] = sol [ *it ] + 1 ;
    }
    for ( vector < int > :: iterator e = v [ nod ].begin() ; e != v [ nod ].end() ; ++ e )    {
        s.push_back( *e ) ;
        dfs ( *e ) ;
        s.pop_back() ;
    }
}

int main () {

    in >> n ;
    for ( i = 1 ; i <= n ; ++ i )   in >> c [ i ] ;
    for ( i = 1 ; i <  n ; ++ i )   {
        in >> x >> y ;
        v [ x ].push_back( y ) ;
        notroot [ y ] = 1 ;
    }
    i = 0 ;
    while ( ++ i ) {
        if ( !notroot [ i ] )   {
            s.push_back( i ) ;
            dfs( i ) ;
            s.pop_back() ;
            break ;
        }
    }
    for ( i = 1 ; i <= n ; ++ i ) out << sol [ i ] << ' ' ;
}