Cod sursa(job #180793)

Utilizator MarquiseMarquise Marquise Data 17 aprilie 2008 15:54:19
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>

#define NMAX 100001

int st[NMAX], N, p[NMAX], t[NMAX], r[NMAX];

struct NOD
{
	int info;
	NOD *next;
};

NOD *m[NMAX];


void adaug(int a, int b)
{
	NOD *aux;

	aux = new NOD;
	aux -> info = b;
	aux -> next = m[a];
	m[a] = aux;
}


void DF(int nod, int nr)
{
	NOD *aux;

	st[nr] = nod;
	if ( p[nod] != 0)
		r[nod] = r[ st[nr - p[nod]] ] + 1;

	for ( aux = m[nod]; aux; aux = aux -> next)
		DF( aux->info, nr + 1);

}


int main()
{
	int i, a, b, R;

	freopen("cerere.in", "r", stdin);
	freopen("cerere.out", "w", stdout);
	scanf("%d", &N);
	for ( i = 1; i <= N; i++)
		scanf("%d", &p[i]);

	for ( i = 1; i < N; i++)
	{
		scanf("%d %d", &a, &b);
		adaug(a, b);
		t[b] = a;
	}

	for ( i = 1; i <= N; i++)
		if ( !t[i] )
		{
			R = i;
			break;
		}

	DF(R, 1);

	for ( i = 1; i <= N; i++)
		printf("%d ", r[i]);

	return 0;
}