Cod sursa(job #1007989)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 9 octombrie 2013 23:09:26
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 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;

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');
}

void read()
{
    scan(N);
    int i,a,b;
    for(i = 1 ; i <= N; ++i)
            scan(stra[ i ]);

    for(i = 1 ; i < N; ++i){
        scan(a);scan(b);
        G[a].pb(b);
        daddy[b] = a;
    }
    for(i = 1; i <= N; ++i)
        if(!daddy[i]) {
            root = i;
            break;
        }
}

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;
    else D[ k ] = 0;
    for(vector<int>::iterator it= G[k].begin();it!=G[k].end();++it)
        DFS(*it);
    -- top;
}

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;
}