Cod sursa(job #1002288)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 27 septembrie 2013 11:38:55
Problema Cerere Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <cstdio>
#include <vector>
using namespace std;

int k[100005];
int stk[100005],stp;
int res[100005];
vector <int> v[100005];
int n;

void dfs(int n) {
    stk[stp] = n;
    if (k[n] == 0) res[n] = 0;
    else res[n] = res[stk[stp-k[n]]]+1;
    stp++;
    while (!v[n].empty()) {
        int nod = v[n].back(); v[n].pop_back();
        dfs(nod);
    }
    stp--;
}

int main() {
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++) {
        scanf("%d",&k[i]);
        if (k[i] == 0) v[0].push_back(i);
    }
    for (int i=1;i<n;i++) {
        int a,b;
        scanf("%d %d",&a,&b);
        v[a].push_back(b);
    }
    dfs(0);
    for (int i=1;i<=n;i++) printf("%d ",res[i]);
    printf("\n");
    return 0;
}