Pagini recente » Cod sursa (job #3203041) | Cod sursa (job #2886728) | Cod sursa (job #2721633) | Cod sursa (job #1634637) | Cod sursa (job #446010)
Cod sursa(job #446010)
#include <cstdio>
#define infile "cerere.in"
#define outfile "cerere.out"
#define MaxN 100024
struct edge{
int x;
edge *next;
} *G[MaxN];
int sol[MaxN],a[MaxN],uz[MaxN],K[MaxN];
int N,R;
void add(int x,int y)
{
edge *q=new edge;
q->x=y; q->next=G[x]; G[x]=q;
}
void read()
{
int i,A,B;
scanf("%d",&N);
for(i=1;i<=N;i++)
scanf("%d",&K[i]);
for(i=1;i<N;i++)
{
scanf("%d%d",&A,&B);
add(A,B);
uz[B]=1;
}
}
void dfs(int nod,int niv)
{
a[niv]=nod;
if(K[nod])
sol[nod]=sol[a[niv-K[nod]]]+1;
else
sol[nod]=0;
edge *q;
for(q=G[nod];q;q=q->next)
dfs(q->x,niv+1);
}
void solve()
{
int i;
for(i=1;i<=N && !R;i++)
if(!uz[i])
R=i;
dfs(R,1);
}
void write()
{
int i;
for(i=1;i<=N;i++)
printf("%d ",sol[i]);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}