Cod sursa(job #1653625)

Utilizator krityxAdrian Buzea krityx Data 16 martie 2016 12:43:51
Problema Cerere Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <fstream>
#include <vector>

using namespace std;

vector<int> sol;

void dfs(vector<vector<int>> G, vector<int> stack, vector<int> k)
{
	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(G, stack, k);
		stack.pop_back();
	}
}

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

	ifstream f("cerere.in");
	f >> n;

	k.resize(n + 1);
	grad.resize(n + 1, 0);
	G.resize(n + 1);
	sol.resize(n + 1);
	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;
		}
	}
	st.push_back(root);
	dfs(G, st, k);

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