Cod sursa(job #1438310)

Utilizator cldmeClaudiu Ion cldme Data 19 mai 2015 16:42:27
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 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],t[N];

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

void dfs(int p)
{
    viz[p] = true;
    t[++nr] = p;
    if(v[p] == 0) cost[p] = 0;
    else
    cost[p] = cost[t[nr - v[p]]] + 1;
    p = lst[p];
    while(p != 0)
    {
        int y = vf[p];
        if(!viz[y]) dfs(y);
        p = urm[p];
    }
    nr--;
}

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;
    nr = 0;
    dfs(p);
    for(i=1;i<=n;i++)
        printf("%d ",cost[i]);
    return 0;
}