Cod sursa(job #67232)

Utilizator gigi_becaliGigi Becali gigi_becali Data 23 iunie 2007 13:05:39
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <vector>
#include <stack>

using namespace std;

#define NMAX 100004
#define sz size()
#define pb push_back

vector<int> a[NMAX];

int k[NMAX], n;
int nr[NMAX], vf;
int rez[NMAX];
int g[NMAX];

void read()
{
	int i;
	int x, y;
	scanf("%d", &n);
	for(i = 1; i <= n; ++i)
		scanf("%d", k+i);
	for(i = 1; i < n; ++i)
	{
		scanf("%d %d", &x, &y);
		a[x].pb(y);
		g[y]++;
	}
  /*  for(x = 1; x <= 10; ++x)
    {
          for(y = 0; y < a[x].sz; ++y)
                printf("%d ", a[x][y]);
          printf("\n");
    }
    printf("%d %d", a[1][0], a[1][1]);
    */
}
		
void df(int x)
{
	int i;
	nr[vf] = x;
	rez[x] = 1 + rez[ nr[vf-k[x]] ];
	if(!k[x])
		rez[x] = 0;

	for(i = 0; i < a[x].sz; ++i)
	{
		++vf;
		df(a[x][i]);
		--vf;
	}
}

int main()
{
	freopen("cerere.in", "r", stdin);
	freopen("cerere.out", "w", stdout);

	read();
	int rad=0;
	for(int i=1;i<=n;++i) if( k[i]==0 && g[i]==0) { rad=i; break;}
	df(rad);

	for(int i = 1; i <= n; ++i)
		printf("%d ", rez[i]);
	printf("\n");

	fclose(stdin);
	fclose(stdout);
	return 0;
}