Cod sursa(job #1446409)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 1 iunie 2015 19:31:41
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <unordered_set>
#include <vector>
using namespace std;

void make_padure(const vector<vector<int> >& copii, const vector<int>& al_catelea,
	vector<vector<int> >& padure, const int cur, vector<int>& in_spate){

	if(al_catelea[cur] != 0){
		const int stramos = in_spate[in_spate.size()-al_catelea[cur]];
		padure[stramos].push_back(cur); }
	in_spate.push_back(cur);
	for(const auto next : copii[cur]){
		make_padure(copii, al_catelea, padure, next, in_spate); }
	in_spate.pop_back(); }

void mark_subarbore(const vector<vector<int> >& padure, vector<int>& rez,
	const int adanc, const int cur){
	rez[cur] = adanc;
	for(const auto x : padure[cur]){
		mark_subarbore(padure, rez, adanc+1, x); } }

void citeste_date(vector<vector<int> >& padure, vector<int>& radacini){
	ifstream f("cerere.in");
	int n;
	f >> n;
	padure.resize(n);
	vector<int> al_catelea(n);
	for(int i = 0; i < n; ++i){
		f >> al_catelea[i];
		if(al_catelea[i] == 0){
			radacini.push_back(i); } }
	vector<vector<int> > copii(n);
	unordered_set<int> nevazut;
	for(int i = 0; i < n; ++i){
		nevazut.insert(i); }
	for(int i = 1, t, c; i < n; ++i){
		f >> t >> c;
		--t, --c;
		nevazut.erase(c);
		copii[t].push_back(c); }
	vector<int> in_spate;
	make_padure(copii, al_catelea, padure, *begin(nevazut), in_spate); }

int main(){
	vector<vector<int> > padure;
	vector<int> radacini;
	citeste_date(padure, radacini);
	vector<int> rez(padure.size());
	for(const auto x : radacini){
		mark_subarbore(padure, rez, 0, x); }
	ofstream g("cerere.out");
	for(const auto x : rez){
		g << x << ' '; }
	return 0; }