Cod sursa(job #682676)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 19 februarie 2012 13:02:24
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include<cstdio>
#include<vector>
using namespace std;

int n,i,x,y,sd,rad,S[100010],viz[100010],K[100010],st[100010];
vector<int> V[100010];
void read(),solve(),dfs(int);

int main()
{
	read();
	solve();
	
	return 0;
}

void read()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++){S[i]=-1;scanf("%d",&K[i]);}
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		V[x].push_back(y);
		S[y]=0;
	}
	for(i=1;i<=n;i++)
		if(S[i]==-1)
		{
			S[i]=0;
			rad=i;
			break;
		}
}

void solve()
{
	dfs(rad);
	for(i=1;i<=n;i++)printf("%d ",S[i]);
}

void dfs(int nod)
{
	viz[nod]=1;
	st[++sd]=nod;
	S[nod]=1+S[st[sd-K[nod]]];
	if(K[nod]==0)S[nod]=0;
	for(vector<int>::iterator it=V[nod].begin();it!=V[nod].end();it++)
	{
		int curr=*it;
		if(!viz[*it])
			dfs(curr);
		st[sd--]=0;
	}
}