Pagini recente » Cod sursa (job #550392) | Cod sursa (job #2818760) | Cod sursa (job #501407) | Cod sursa (job #131688) | Cod sursa (job #53243)
Cod sursa(job #53243)
#include <stdio.h>
#include <stdlib.h>
long int *p[100005] , k[100005] , rasp[100005] , ind[100005] , gr[100005] , st[100005] ;
int main()
{
long int n , i , j , x , y , niv ;
FILE *in , *out ;
in = fopen("cerere.in" , "rt") ;
out = fopen("cerere.out" , "wt") ;
fscanf(in , "%ld" , &n) ;
for(i = 1 ; i <= n ; i++) fscanf(in , "%ld" , &k[i]) ;
for(i = 1 ; i <= n ; i++)
{
p[i] = (long int *) malloc(sizeof(long int)) ;
p[i][0] = 0 ;
}
for(i = 1 ; i <= n -1 ; i++)
{
fscanf(in , "%ld %ld" , &x , &y) ;
p[x] = (long int *)realloc(p[x] , (p[x][0] + 2) * sizeof(long int)) ;
p[x][0]++ ;
p[x][p[x][0]] = y ;
gr[y]++ ;
}
for(i = 1 ; i <= n ; i++) if(!gr[i]) break ;
// for(j = 1 ; j <= n ; j++) ind[j] = 1 ;
st[0] = i ;
niv = 1 ;
ind[st[0]]++ ;
while(niv > 0)
{
x = p[st[niv-1]][ind[st[niv-1]]] ;
st[niv] = x ;
if(!k[x]) rasp[x] = 0 ;
else rasp[x] = rasp[st[niv - k[x]]] + 1 ;
if(ind[st[niv]] == p[st[niv-1]][0])
{
int i = 1 ;
while(i <= niv && ind[st[niv-i]] == p[st[niv-i]][0]) i++ ;
niv -= i ;
ind[st[niv]]++ ;
niv++ ;
}
else
{
if(p[x][0] == 0)
{
if(ind[st[niv-1]] < p[st[niv-1]][0]) ind[st[niv-1]]++ ;
else
{
int i = 2 ;
while(i <= niv && ind[st[niv-i]] == p[st[niv-i]][0]) i++ ;
niv -= i ;
if(niv >= 0) ind[st[niv]]++ ;
niv++ ;
}
}
else
{
niv ++ ;
ind[x]++ ;
}
}
}
for(i = 1 ; i <= n ; i++) fprintf(out , "%ld " , rasp[i]) ;
fclose(in) ;
fclose(out) ;
return 0 ;
}