Cod sursa(job #1036171)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 19 noiembrie 2013 00:25:38
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <vector>

using namespace std;

const int NMAX = 100010;

vector <int> V[NMAX];
int a[NMAX], tata[NMAX], st[NMAX], sol[NMAX];
bool viz[NMAX];

int main(){

    freopen( "cerere.in", "r", stdin );

    int n;
    scanf( "%d", &n );
    for( int i = 1; i <= n; ++i )
        scanf( "%d", &a[i] );

    long long sum = 0, m = n;
    for( int i = 1; i < n; ++i ){

        int x, y;
        scanf( "%d %d", &x, & y );
        V[x].push_back( y );
        tata[y] = x;
        sum += y;
        }
    fclose( stdin );
    int rad = m*(m+1)/2 - sum;
    int k = 1;
    st[1] = rad, viz[rad] = 1;
    while( k > 0 ){

         bool e = false;
         int x = V[st[k]].size();
         for( int i = 0; i < x && !e; ++i ){

                int y = V[st[k]][i];
                if( !viz[y] ){
                        e = true;
                        st[++k] = y;
                        viz[y] = 1;
                        }
                }
         if( !e ) --k;
            else {
                if( a[st[k]] != 0 ){

                        int nr = 0, aux = k, nod = st[k];
                        while( a[nod] !=0 && aux > 0 ){

                            ++nr;
                            aux = aux - a[nod];
                            nod = st[aux];
                            }
                        sol[ st[k] ] = nr;
                        }
                }
         }
    freopen( "cerere.out", "w", stdout );

    for( int i = 1; i <= n; ++i )
       printf( "%d ", sol[i] );

    fclose( stdout );
    return 0;
}