Cod sursa(job #446397)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 25 aprilie 2010 19:31:18
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <vector>

using namespace std;

#define file_in "cerere.in"
#define file_out "cerere.out"

#define nmax 101000

int n,m,v[nmax],st[nmax],k[nmax],rez[nmax],vf;
vector<int> G[nmax];

void citire()
{
	int i,a,b;
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	
	scanf("%d", &n);
	for (i=1;i<=n;++i)
		 scanf("%d", &k[i]);
	for (i=1;i<n;++i)
	{
		scanf("%d %d", &a, &b);
		G[a].push_back(b);
		v[b]++;
	}
}

void dfs(int nod)
{
	st[++vf]=nod;
	if (k[nod]==0)
			rez[nod]=0;
		else
			rez[nod]=rez[st[vf-k[nod]]]+1;
	vector<int> :: iterator it;
	for (it=G[nod].begin();it!=G[nod].end();++it) dfs(*it);	
	vf--;
}


void solve()
{
	int i;
	
	memset(st,0,sizeof(st));
	vf=0;
	for (i=1;i<=n;++i)
		 if (v[i]==0)
			 dfs(i);
		 
	for (i=1;i<=n;++i)
         printf("%d ", rez[i]);

}

int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}