Pagini recente » Cod sursa (job #3147695) | Cod sursa (job #2868512) | Cod sursa (job #3213770) | Cod sursa (job #2824156) | Cod sursa (job #2824747)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int sumMaxSubarbore(int nod, int &sumMax, vector<bool> &viz, const vector<int> &valoriNoduri, const vector<vector<int>> &listaAd){
int sumNodCrt = valoriNoduri[nod];
viz[nod] = true;
for (auto vecin : listaAd[nod]){
if (!viz[vecin]){
int sumVecin = sumMaxSubarbore(vecin, sumMax, viz, valoriNoduri, listaAd);
if (sumNodCrt + sumVecin > sumNodCrt){
sumNodCrt += sumVecin;
}
}
}
sumMax = max(sumNodCrt, sumMax);
return sumMax;
}
int main() {
ifstream fin ("asmax.in");
ofstream fout ("asmax.out");
int n;
fin >> n;
vector<bool> viz(n + 1);
vector<int> valoriNoduri(n + 1);
vector<vector<int>> listaAd(n + 1, vector<int>());
for (int i = 1; i <= n; i ++){
int valNod;
fin >> valNod;
valoriNoduri[i] = valNod;
}
for (int i = 1; i < n; i++){
int x, y;
fin >> x >> y;
listaAd[x].push_back(y);
listaAd[y].push_back(x);
}
int sMax = -1001;
int nodStart = 1;
fout << sumMaxSubarbore(nodStart, sMax, viz, valoriNoduri, listaAd);
return 0;
}