Pagini recente » Cod sursa (job #1706060) | Cod sursa (job #1744351) | Cod sursa (job #2754023) | Romanii medaliati la IOI | Cod sursa (job #289)
Cod sursa(job #289)
#include<stdio.h>
long n , i , j , k , x , y;
long cit[100001];
long bif1[100001] , nodd;
long bif[100001];
long stiva[100001];
long nr = 1 , ind ;
long int sir[100001] ;
struct Nod
{
long nod;
Nod* adr_urm;
};
Nod *L[100001];
void df1(long nodd)
{
Nod *p;
stiva[nr] = nodd;
p = L[nodd];
bif1[nodd] = 1;
ind = 0;
while(p)
{
if (bif1[p->nod]==0)
{
nr++;
stiva[nr] = p->nod;
bif1[p->nod] = 1;
if (cit[p->nod] == 0)
sir[p->nod] = 0;
else
sir[p->nod] = sir[stiva[nr-cit[p->nod]]]+1;
ind = 1;
df1(p->nod);
}
p = p->adr_urm;
}
if (ind==0)
nr--;
}
void citire()
{
Nod *p;
long i , j;
scanf("%ld",&n);
for (i = 1 ; i<= n ; i++) scanf("%ld",&cit[i]);
for (i = 1 ; i<= n ; i++) L[i] = 0;
for (i = 1 ; i< n ; i++)
{
scanf("%ld%ld",&x,&y);
bif[y] = 1;
p = new Nod;
p->adr_urm=L[x];
p->nod = y;
L[x] = p;
}
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
citire();
for (i = 1 ; i<= n ; i++) if (bif[i]==0)
{
nodd = i;
break;
}
df1(nodd);
sir[nodd] = 0;
for (i = 1 ; i<= n ; i++)
{
if (cit[i]==0)
printf("0 ");
else
printf("%ld ",sir[i]);
}
return 0;
}