Cod sursa(job #2454774)

Utilizator alexradu04Radu Alexandru alexradu04 Data 9 septembrie 2019 20:32:20
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;
int v[100007];
int tata[100007];
int len[100007];
int st[100007];
int f[100007];
int st_len = 0;
vector< int > g[100007];

void dfs1(int poz)
{
    tata[poz] = st[st_len - v[poz]];
    st[st_len] = poz;
    st_len++;
    for(int i = 0; i < g[poz].size(); i++)
    {
        dfs1(g[poz][i]);
    }
    st_len--;
}

int dfs(int poz)
{
    if(len[poz] != -1)
        return len[poz];
    int track = poz;
    track = tata[track];
    len[poz] = dfs(track) + 1;
    return len[poz];
}

int main()
{
    //freopen("cerere.in","r",stdin);
    //freopen("cerere.out","w",stdout);
    int n, x, y;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d",&v[i]);
        len[i] = -1;
        if(v[i] == 0)
            len[i] = 0;
    }

    int start;
    for(int i = 1; i < n; i++)
    {
        scanf("%d %d",&x,&y);
        g[x-1].push_back(y-1);
        f[y-1] = 1;
    }
    for(int i = 0; i < n; i++)
    {
        if(f[i] == 0)
            start = i;
    }

    st[0] = start;
    dfs1(start);
    for(int i = 0; i < n; i++)
        printf("%d ",dfs(i));


}