Cod sursa(job #1007993)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 9 octombrie 2013 23:16:41
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>

#define pb push_back

using namespace std;
const int Nmax = 100005;
vector<int> G[ Nmax ];
int N,daddy[ Nmax ],stra[ Nmax ],root,D[ Nmax ];
int S[ Nmax ],top;

/*inline void scan(int &A)
{
    char c = 0;A=0;
    do
    {
        c = fgetc(stdin);
        if('0'<=c && c<='9')
            A=A*10+c-48;
    }while('0'<=c && c<='9');
}*/

inline void read()
{
    scanf("%d",&N);
    int i,a,b;
    for(i = 1 ; i <= N; ++i)
            scanf("%d",&stra[ i ]);

    for(i = 1 ; i < N; ++i){
        scanf("%d%d",&a,&b);
        G[a].pb(b);
        daddy[b] = a;
    }
    for(i = 1; i <= N; ++i)
        if(!daddy[i]) {
            root = i;
            break;
        }
}

inline void DFS(int k)
{
    S[++top] = k;
    if(stra[k]) // vecinu'cautat se afla cu stra[k] mai putine poz in stiva
        D[ k ] = D[ S[ top - stra[k] ] ] +1;
    for(vector<int>::iterator it= G[k].begin();it!=G[k].end();++it)
        DFS(*it);
    -- top;
}

inline void solve()
{
    DFS(root);
    for(int i = 1; i <= N ; ++i)
        printf("%d ",D[i]);
}

int main()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);

    read();
    solve();

    return 0;
}