Pagini recente » Cod sursa (job #2158320) | Cod sursa (job #935637) | Cod sursa (job #2884100) | Cod sursa (job #1401292) | Cod sursa (job #299237)
Cod sursa(job #299237)
#include <stdio.h>
#define NM 100001
int st[NM],r[NM],ka[NM];
int n,vf;
int v[NM];
int gr[NM];
int str[NM];
struct list{int nod; list* urm;} *g[NM];
void df(int);
int calc(int);
inline void add(int x,int y)
{list *p=new list;
p->nod=y;
p->urm=g[x];
g[x]=p;
}
int main()
{freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
int i;
for (i=1;i<=n;i++)
{v[i]=-1;
scanf("%d",&ka[i]);
}
int x,y;
for (i=1;i<n;i++)
{scanf("%d %d",&x,&y);
add(x,y);
gr[y]++;
}
for (i=1;i<=n;i++)
if (gr[i]==0) break;
df(i);
for (i=1;i<=n;i++)
if (v[i]==-1)
v[i]=calc(i);
for (i=1;i<=n;i++) printf("%d ",v[i]);
return 0;
}
void df(int k)
{++vf;
st[vf]=k;
str[k]=st[vf-ka[k]];
list *p;
for (p=g[k];p;p=p->urm)
{df(p->nod);
}
vf--;
}
int calc(int k)
{if (str[k]==k) return 0;
if (v[str[k]]==-1) v[str[k]]=calc(str[k]);
return v[str[k]]+1;
}