Cod sursa(job #323886)

Utilizator pcinfoCarmen Popescu pcinfo Data 13 iunie 2009 23:23:48
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<cstdio> 
#include <vector>

using namespace std;

struct nod {
	int gr;
	vector<int> fii;
};

int main()
{
	int n,vf,i,j;
	
	freopen("cerere.in","r",stdin);   
	freopen("cerere.out","w",stdout);   
	
	scanf("%d",&n);
	
	vector<int> viz(n+1,0), p(n+1,0), s(n+1,0), k(n+1,0);
	vector<nod> arb(n+1);
	
	for (i=1;i<=n;i++)
	{
		scanf("%d", &k[i]);
		arb[i].gr=0;
	}
	
	for (i=0;i<n-1;i++)
	{
		scanf("%d %d",&j,&vf);
		arb[j].fii.push_back(vf);
		arb[vf].gr++;
	}
	
	vf=0;
	for (i=1;i<=n;i++)
		if (arb[i].gr==0)
		{
			vf=i;
			break;
		}
	
	s[1]=vf; 
	p[vf]=0; 
	vf=1;
	
	while (vf>0)
	{
		i=s[vf];
		
		j=0;
		if (arb[i].fii.size()>0)
		{
			j=arb[i].fii.back();
			arb[i].fii.pop_back();
		}
			
		if (j>0)
		{
			viz[j]=1;
			vf++;
			s[vf]=j;
			if (k[j]==0)
				p[j]=0;
			else
				p[j]=p[s[vf-k[j]]]+1;
		}
		else
			vf--;
	}
	
	for (i=1;i<=n;i++)
		printf("%d ",p[i]); 
	
	return 0;
}