Pagini recente » Cod sursa (job #1583193) | Cod sursa (job #2761671) | Cod sursa (job #1489846) | Cod sursa (job #662467) | Cod sursa (job #197031)
Cod sursa(job #197031)
#include <stdio.h>
#include <stdlib.h>
#define N 100010
#define FIN "cerere.in"
#define FOUT "cerere.out"
int n;
int *cine[N],cati[N],viz[N],grad[N],k[N],strm[N];
void scan(void){
int i,a,b;
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d",&n);
for (i=1;i<=n;++i)
scanf("%d",&k[i]);
for (i=1;i<=n-1;++i){
scanf("%d%d",&a,&b);
++grad[b];
++cati[a];
cine[a]=(int*)realloc(cine[a],cati[a]*sizeof(int)+4);
cine[a][cati[a]]=b;
}
}
int stiva[N],nrs=0;
void df(int x){
int i;
viz[x]=1;
stiva[++nrs]=x;
if (k[x]!=0)
strm[x]=stiva[nrs-k[x]];
else
strm[x]=x;
for (i=1;i<=cati[x];++i)
if (!viz[cine[x][i]])
df(cine[x][i]);
--nrs;
}
int vizitat[N],ord[N];
void bf(int x){
int coada[N],p,u,i,e;
p=u=0;
coada[u++]=x;ord[u]=x;
while (p<u){
e=coada[p++];
for (i=1;i<=cati[e];++i){
if (!vizitat[cine[e][i]]){
coada[u++]=cine[e][i];
ord[u]=cine[e][i];
}
}
}
}
int sol[N];
void solve(void){
int i,parent=1;
for (i=1;i<=n;++i)
if (grad[i]==0)
parent=i;
df(parent);
bf(parent);
for (i=1;i<=n;++i){
if (k[ord[i]]==0)
sol[ord[i]]=0;
else
sol[ord[i]]=sol[strm[ord[i]]]+1;
}
for (i=1;i<=n;++i)
printf("%d ",sol[i]);
}
void print(void){
fclose(stdin);
fclose(stdout);
exit(0);
}
int main(void){
scan();
solve();
print();
}