Cod sursa(job #1653629)

Utilizator krityxAdrian Buzea krityx Data 16 martie 2016 12:51:39
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>
#include <vector>
#define NMAX 100001

using namespace std;

int sol[NMAX], k[NMAX];
vector<int> stack;
vector<int> G[NMAX];

void dfs()
{
	int node = stack.back();
	if (k[node] == 0)
	{
		sol[node] = 0;
	}
	else
	{
		sol[node] = sol[stack[stack.size() - k[node] - 1]] + 1;
	}
	for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); it++)
	{
		stack.push_back(*it);
		dfs();
		stack.pop_back();
	}
}

int main()
{
	int n, i, x, y, root;
	vector<int> grad;


	ifstream f("cerere.in");
	f >> n;
	grad.resize(n + 1, 0);
	for (i = 1; i <= n; i++)
	{
		f >> k[i];
	}
	for (i = 1; i <= n - 1; i++)
	{
		f >> x >> y;
		G[x].push_back(y);
		grad[y]++;
	}
	f.close();
	for (i = 1; i <= n; i++)
	{
		if (grad[i] == 0)
		{
			root = i;
			break;
		}
	}
	stack.push_back(root);
	dfs();

	ofstream g("cerere.out");
	for (i = 1; i <= n; i++)
	{
		g << sol[i] << " ";
	}
	g.close();
	return 0;
}