Pagini recente » Cod sursa (job #1986703) | Cod sursa (job #1809108) | Cod sursa (job #2896215) | Cod sursa (job #322340) | Cod sursa (job #2825152)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int sumaMaxima = -1001;
int sumaMaximaSubarbore(int nodCurent, vector<bool> &vizitate, const vector<int>& costuri, const vector<vector<int>>& listaAdiacenta){
vizitate[nodCurent] = true;
int sumaCurenta = costuri[nodCurent];
for(auto vecin : listaAdiacenta[nodCurent]){
if(!vizitate[vecin]){
int sumaSubarbore = sumaMaximaSubarbore(vecin, vizitate, costuri, listaAdiacenta);
// daca suma subarborelui este pozitiva, o adaugam la suma curenta
if(sumaSubarbore > 0){
sumaCurenta += sumaSubarbore;
}
}
}
sumaMaxima = max(sumaCurenta, sumaMaxima);
return sumaMaxima;
}
int main() {
ifstream in("asmax.in");
ofstream out("asmax.out");
int noduri, extremitateInitiala, extremitateFinala;
in >> noduri;
vector<vector<int>> listaAdiacenta (noduri, vector<int>());
vector<int> costuriVarfuri(noduri);
for(int i = 1; i <= noduri; i++){
in >> costuriVarfuri[i];
}
for(int i = 0; i < noduri - 1; i++){
in >> extremitateInitiala >> extremitateFinala;
listaAdiacenta[extremitateInitiala].push_back(extremitateFinala);
listaAdiacenta[extremitateFinala].push_back(extremitateInitiala);
}
vector<bool> vizitate(noduri, false);
out << sumaMaximaSubarbore(1, vizitate, costuriVarfuri, listaAdiacenta);
in.close();
out.close();
return 0;
}