Cod sursa(job #358224)

Utilizator funkydvdIancu David Traian funkydvd Data 22 octombrie 2009 11:57:15
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.77 kb
#include<cstdio>
#include<vector>
#define N 1<<17
using namespace std;
int n,k,str[N],v[N],re[N];
bool t[N];
vector<int> a[N];
void dfs(int x)
{
	v[++k]=x;// al k-lea stramos curent
	if(str[x]) re[x]=re[v[k-str[x]]]+1;// adun la maimuta curenta re[al q-lea stramos]+1
	else re[x]=0;
	for(size_t i=0;i<a[x].size();++i) dfs(a[x][i]);
	--k; //scad numarul de stramosi 
}
int main()
{
	int x,y,i,rez;
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i) scanf("%d",&str[i]);
	for(i=1;i<n;++i)
	{
		scanf("%d%d",&x,&y);
		t[y]=1;
		a[x].push_back(y);
	}
	for(int i=1 ; i<=n ; ++i) if(!t[i]) rez=i;
	dfs(rez);//rez este primul stramos, de la care se face dfs
	for(i=1;i<=n;i++)
		printf("%d ",re[i]);
	return 0;
}