Cod sursa(job #1438303)

Utilizator cldmeClaudiu Ion cldme Data 19 mai 2015 16:32:50
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
using namespace std;
int const N = 100001;

int nr,vf[N],urm[N],lst[N],v[N];
bool rad[N],viz[N];
int cost[N];

void addEdge(int x, int y)
{
    vf[++nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void update(int p)
{
    if(v[p] == 0) cost[p] = 0;
    else cost[p] = cost[p - v[p] + 1] + 1;
}

void dfs(int p)
{
    viz[p] = true;
    update(p);
    p = lst[p];
    while(p != 0)
    {
        int y = vf[p];
        if(!viz[y]) dfs(y);
        p = urm[p];
    }
}

int main()
{
    int i,n,p,x,y;
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    for(i=1;i<n;i++)
    {
        scanf("%d %d",&x,&y);
        addEdge(x,y);
        rad[y] = true;
    }
    for(i=1;i<=n;i++)
        if(!rad[i]) p = i;
    dfs(p);
    for(i=1;i<=n;i++)
        printf("%d ",cost[i]);
    return 0;
}