Cod sursa(job #1426604)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 29 aprilie 2015 23:44:20
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <vector>
#include <fstream>
#include <iostream>
#include <stack>
#include <utility>
using namespace std;

void citeste_arbore(vector<int>& val, vector<vector<int> >& copii){
	ifstream f("asmax.in");
	int n;
	f >> n;
	val.resize(n, 0);
	copii.resize(n);
	for(auto& x : val){
		f >> x; }
	vector<vector<int> > adiacente(n);
	for(int i = 1, a, b; i < n; ++i){
		f >> a >> b;
		--a, --b;
		adiacente[a].push_back(b);
		adiacente[b].push_back(a); }
	stack<pair<int, int> > de_viz;
	de_viz.emplace(0, -1);
	pair<int, int> cur;
	while(!de_viz.empty()){
		cur = de_viz.top();
		de_viz.pop();
		for(const auto x : adiacente[cur.first]){
			if(x != cur.second){
				copii[cur.first].push_back(x);
				de_viz.emplace(x, cur.first); } } } }

int fa_suma_max_pentru(const int x, const vector<vector<int> >& copii, const vector<int>& val, int& rez){
	int pana_aici = val[x], suma_cur;
	for(auto& y : copii[x]){
		suma_cur = fa_suma_max_pentru(y, copii, val, rez);
		if(suma_cur > 0){
			pana_aici += suma_cur; } }
	if(pana_aici > rez){
		rez = pana_aici; }
	return pana_aici; }

int main(){
	vector<int> val;
	vector<vector<int> > copii;
	citeste_arbore(val, copii);
	int rez = -1001;
	fa_suma_max_pentru(0, copii, val, rez);
	ofstream g("asmax.out");
	g << rez;
	return 0; }