Cod sursa(job #1142929)

Utilizator PatrikStepan Patrik Patrik Data 14 martie 2014 13:55:00
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    #define NMAX 100001
    #define pb push_back
    int N , K[NMAX] , L[NMAX] , r , rad  , sol[NMAX];
    vector<int> G[NMAX] , g[NMAX];
    bool u[NMAX];

    void read();
    void solve();
    void write();
    void DFS(int nod);

    int main()
    {
        read();
        solve();
        write();
        return 0;
    }

    void read()
    {
        int x , y;
        freopen("cerere.in" , "r" , stdin );
        scanf("%d" , &N );
        for(int i = 1 ; i <= N ; ++i )
            scanf("%d" , &K[i] );
        for(int i = 1 ; i < N ; ++i )
        {
            scanf("%d%d" , &x , &y );
            G[x].pb(y);
            u[y] = 1;
        }
    }

    void solve()
    {
        for(int i = 1 ; i <= N ; ++i )
            if(!u[i])
        {
            rad = i;
            break;
        }
        DFS(rad);
    }

    void DFS(int nod)
    {
        L[++r] = nod;
        if(K[nod])sol[nod] = sol[L[r-K[nod]]]+1;
        for(int i = 0 ; i<(int)G[nod].size()  ; ++i )
            DFS(G[nod][i]);
        r--;
    }

    void write()
    {
        freopen("cerere.out" , "w" , stdout );
        for(int i = 1 ; i <= N ; ++i )
            printf("%d " , sol[i]);
    }