Cod sursa(job #53243)

Utilizator arenakadaffKadaff arenakadaff Data 21 aprilie 2007 16:58:27
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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 ;
}