Cod sursa(job #1257344)

Utilizator xtreme77Patrick Sava xtreme77 Data 7 noiembrie 2014 17:04:59
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
/*
 * Code by Spiromanul
 */

#include <fstream>
#include <vector>

#define pb push_back

const char IN  [ ] = "cerere.in" ;
const char OUT [ ] = "cerere.out" ;
const int MAX = 100014 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

vector < int > gr [ MAX ] ;

int st [ MAX ] , grad [ MAX ] , panalaspecialist [ MAX ] , sol [ MAX ] ;

void dfs ( int nod )
{
    st [ ++ st [ 0 ] ] = nod ;
    if ( panalaspecialist [ nod ] )
        sol [ nod ] = sol [ st [ st [ 0 ] - panalaspecialist [ nod ] ] ] + 1 ;
    for ( auto x : gr [ nod ] )
    {
        dfs ( x ) ;
        -- st [ 0 ] ;
    }
}

int main(              )
{
    int n ;
    fin >> n ;
    for ( int i = 1 ; i <= n ; ++ i )
        fin >> panalaspecialist [ i ] ;
    for ( int i = 1 ; i < n ; ++ i )
    {
        int tata , fiu ;
        fin >> tata >> fiu ;
        gr [ tata ].pb ( fiu ) ;
        grad [ fiu ] ++ ;
    }
    int rad ;
    for ( int i = 1 ; i <= n ; ++ i )
        if ( grad [ i ] == 0 )
        {
            rad = i ;
            break ;
        }
    dfs ( rad ) ;
    for ( int i = 1 ; i <= n ; ++ i )
        fout << sol [ i ] << ' ' ;
    return 0;
}