Cod sursa(job #159697)

Utilizator rethosPaicu Alexandru rethos Data 14 martie 2008 12:26:03
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <stdio.h>
#define NM 100001
long v[NM],x[NM],n,gr[NM],str[NM];
struct lista{long nod;lista* urm;} *g[NM];
long st[NM],vf;
void dfs(long k)
{lista *p=new lista;
 vf++;
 st[vf]=k;
 str[k]=st[vf-x[k]];//?
 for (p=g[k];p;p=p->urm) dfs(p->nod);
 vf--;
}
long det(long k)
{long s;
 if(x[k]==0) return 0;
 s=str[k];
 if(v[s]==-1) v[s]=det(s);
 return v[s]+1;
}

void add(long a,long b)
{lista *p=new lista;
 p->nod=b;
 p->urm=g[a];
 g[a]=p;
}

int main()
{long i,z,y;
 freopen("cerere.in","r",stdin);
 freopen("cerere.out","w",stdout);
 scanf("%ld",&n);
 for (i=1;i<=n;i++) v[i]=-1;
 for (i=1;i<=n;i++) scanf("%ld",&x[i]);
 for (i=1;i<n;i++)
    {scanf("%ld %ld",&y,&z);
     add(y,z);
     gr[z]++;
    }
 for (i=1;i<=n;i++) if(gr[i]==0) break;
 dfs(i);
 for (i=1;i<=n;i++) if(v[i]==-1) v[i]=det(i);
 for (i=1;i<=n;i++) printf("%ld ",v[i]);
 return 0;
}