Pagini recente » Profil usordememorat | Cod sursa (job #1171) | Cod sursa (job #2070431) | Cod sursa (job #1093078) | Cod sursa (job #3137294)
#include <bits/stdc++.h>
using namespace std;
long long ssm[16001],maxim = -2000000000; /// subarbore de suma maxima
int v[16001]; /// valorile din nod
vector <int> mu[16001]; /// lista de adiacenta
void DFS(int nod, int p)
{
ssm[nod] = v[nod]; /// initial subarborele de suma maxima e valoarea nodului
for(int i = 0; i < mu[nod].size(); i++){
int vecin = mu[nod][i];
if(vecin != p){ /// mergem pe rand in fii (lista de adiacenta fara parinte)
DFS(vecin, nod);
if(ssm[vecin] > 0){ /// mereu e avantajos sa adaugam un subarbore daca suma e pozitiva
ssm[nod] += ssm[vecin]; /// adaugam la subarborele de suma maxima din nod
}
}
}
maxim = max(maxim, ssm[nod]); /// actualizam maximul global (de peste tot)
}
int main()
{
ifstream cin("asmax.in");
ofstream cout("asmax.out");
int n, i;
cin >> n;
for(i = 1; i <= n; i++){
cin >> v[i]; /// citim valorile
}
for(i = 1; i < n; i++){
int x, y;
cin >> x >> y; /// citim muchiile
mu[x].push_back(y);
mu[y].push_back(x);
}
DFS(1, 0);
cout << maxim;
return 0;
}