Cod sursa(job #353449)

Utilizator SheepBOYFelix Liviu SheepBOY Data 5 octombrie 2009 11:04:51
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
#include<vector>
#define N 100000
using namespace std;
int n,ptr;
vector <int> a[N];
bool tacsu_lui_Epure[N];
int cretin[N];
int EpureLung[N];
int Telemea_de_epure[N];
void Epure_sufera()
{
	int x,y,k=0,u;
	scanf("%d",&n);
	for(int i=0;i<n;++i)
		scanf("%d",cretin+i);
	for(int i=1;i<n;++i)
	{
		scanf("%d%d",&x,&y);
		tacsu_lui_Epure[y] = true;
		a[x].push_back(y);
	}
}
int tatalluiEpure()
{
	for(int i=1;i<=n;++i)
		if(!tacsu_lui_Epure[i])
			return i;
}
void DFS(int nod)
{
	Telemea_de_epure[++ptr]=nod;
	
	if(cretin[nod])
		EpureLung[nod]=EpureLung[Telemea_de_epure[ptr-cretin[nod]]]+1;
	else
		EpureLung[nod]=0;
	
	for(int i=0;i<a[nod].size();++i)
		DFS(a[nod][i]);
	--ptr;
}
int main()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	Epure_sufera();
	DFS(tatalluiEpure());
	for(int i=0;i<n;++i)
		printf("%d ",*(EpureLung+i));
	return 0;
}