Cod sursa(job #810573)

Utilizator ichigo2908mantu radu ichigo2908 Data 10 noiembrie 2012 15:49:08
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream in("cerere.in");
ofstream out("cerere.out");
const int N=100001;
vector <int> v[N];
int n, sol[N], k[N], a[N];
bool r[N];

void citire()
{
	int iTemp1, iTemp2;
	in>>n;
	for(int i=1;i<=n;i++)
		in>>k[i];
	for(int i=0;i<n-1;i++)
	{
		in>>iTemp1>>iTemp2;
		v[iTemp1].push_back(iTemp2);
		r[iTemp2]=1;
	}
}

void dfs(size_t x, int lvl)
{
	if(!k[x])
	{
		sol[x]=0;
		a[lvl]=0;
	}
	else
	{
		sol[x]=a[lvl-k[x]]+1;
		a[lvl]=a[lvl-k[x]]+1;
	}
	for(size_t i=0;i<v[x].size();i++)
		dfs(v[x][i],lvl+1);
}

int radacina()
{
	for(int i=1;i<N;i++)
		if(!r[i])
			return i;
	return -1;
}

int main()
{
	citire();
	dfs(radacina(),0);

	for(int i=1;i<=n;i++)
		out<<sol[i]<<' ';

	in.close();
	out.close();

	return 0;
}