Cod sursa(job #1002293)

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

int k[100005];
int stk[100005],stp;
int res[100005];
bool exb[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++;
    int size = v[n].size();
    for (int i=0;i<size;i++) {
        int nod = v[n][i];
        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);
        exb[b] = true;
    }
    for (int i=0;i<=n;i++) if (!exb[i]) k[i] = 0;
    dfs(0);
    for (int i=1;i<=n;i++) printf("%d ",res[i]);
    printf("\n");
    return 0;
}