Cod sursa(job #546524)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 5 martie 2011 00:07:05
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <stdio.h>
#include <vector>
#define pb push_back
#define maxn 100005
using namespace std;

int i,N,R;
int K[maxn],G[maxn],t[maxn],S[maxn];
vector <int> A[maxn];

void citire()
{
	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);
		t[y]=1;
	}
	for(i=1;i<=N;i++)
		if(!t[i])
		{
			R=i;
			break;
		}
}

void dfs()
{
	int p,n=0;
	S[++n]=R;
	while(n)
	{
		p=S[n];
		if(K[p]==0) G[p]=0;
		else G[p]=G[S[n-K[p]]]+1;
		if(!A[p].empty())
		{
			S[++n]=A[p][A[p].size()-1];
			A[p].pop_back();
		}
		else
			n--;
	}
}

void afisare()
{
	for(i=1;i<=N;i++)
		printf("%d ",G[i]);
}

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