Pagini recente » Cod sursa (job #74108) | Cod sursa (job #3231467) | Cod sursa (job #378186) | Cod sursa (job #2745301) | Cod sursa (job #1426604)
#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; }