Cod sursa(job #1639288)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 8 martie 2016 11:40:46
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <cstdio>
#include <vector>
using namespace std;

const int NMAX=100005;

int v[NMAX],st[NMAX],dad[NMAX],solve[NMAX],cnt;
vector <int> G[NMAX];

void dfs(int x)
{
    cnt++;
    st[cnt]=x;

    if(v[x]==0) solve[x]=0;
    else solve[x]=solve[st[cnt-v[x]]]+1;

    for(int i=0;i<(int)G[x].size();i++) dfs(G[x][i]);

    cnt--;
}

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

    int n,i,j,a,b;

    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%d",&v[i]);
    for(i=1;i<n;i++)
    {
        scanf("%d%d",&a,&b);
        G[a].push_back(b);
        dad[b]=1;
    }

    for(i=1;i<=n;i++)
        if(dad[i]==0) dfs(i);

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

    return 0;
}