Cod sursa(job #943772)

Utilizator matei_cChristescu Matei matei_c Data 26 aprilie 2013 13:16:16
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<iostream>
#include<fstream>
#include<cstdio>
#include<vector>
using namespace std ;

#define maxn 100001

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

int n ;
int v[maxn], sol[maxn], tata[maxn] ;

bool sel[maxn] ;

vector<int> graf[maxn] ;
vector<int> coada ;

int rad = 1 ;

void dfs(int nod)
{
    sel[nod] = true ;
    coada.push_back( nod ) ;

    if( v[nod] == 0 )
        sol[nod] = 0 ;
    else
        sol[nod] = sol[ coada[ coada.size() - 1 - v[nod] ] ] + 1 ;

    for(size_t i = 0; i < graf[nod].size(); ++i )
        if( sel[ graf[nod][i] ] == false )
            dfs( graf[nod][i] ) ;

    coada.pop_back() ;
}

void citire()
{
    //freopen("cerere.in", "r", stdin);
    //freopen("cerere.out", "w", stdout);

    //cin >> n ;
    //scanf("%d", &n);
    fin >> n ;

    for(int i = 1; i <= n; ++i )
        //cin >> v[i] ;
        //scanf("%d", &v[i]);
        fin >> v[i] ;

    for(int i = 1; i < n; ++i )
    {
        int a, b ;

        //cin >> a >> b ;
        //scanf("%d%d", &a, &b);
        fin >> a >> b ;

        tata[b] = a ;
        graf[a].push_back( b ) ;
    }
}

void afla_radacina()
{
    sol[0] = -1 ;

    while( tata[rad] != 0 )
        rad = tata[rad] ;
}

void afisare()
{
    for(int i = 1; i <= n; ++i )
        //cout << sol[i] << " " ;
        //printf("%d ", sol[i]);
        fout << sol[i] << " " ;
}

int main()
{
    citire() ;

    afla_radacina() ;

    dfs( rad ) ;

    afisare() ;

    return 0 ;

}