Cod sursa(job #1653637)

Utilizator krityxAdrian Buzea krityx Data 16 martie 2016 12:57:56
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>
#include <vector>
#include <unordered_set>
#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;
	unordered_set<int> h;
	ifstream f("cerere.in");
	f >> n;
	for (i = 1; i <= n; i++)
	{
		h.insert(i);
		f >> k[i];
	}
	for (i = 1; i <= n - 1; i++)
	{
		f >> x >> y;
		G[x].push_back(y);
		h.erase(y);
	}
	f.close();
	//for (i = 1; i <= n; i++)
	//{
	//	if (grad[i] == 0)
	//	{
	//		root = i;
	//		break;
	//	}
	//}
	stack.push_back(*(h.begin()));
	dfs();

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