Pagini recente » Cod sursa (job #2732037) | Cod sursa (job #2406735) | Cod sursa (job #341377) | Cod sursa (job #2297615) | Cod sursa (job #2961957)
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
int n, down[16001], v[16001];
vector<int> g[16001];
vector<int> max1, max2;
int rez = INT_MIN;
void dfs1 (int nod, int last) {
down[nod] = v[nod];
for (auto &i: g[nod])
if (i != last) {
dfs1(i, nod);
if (down[i] > 0)
down[nod] += down[i];
}
rez = max(rez, down[nod]);
}
void dfs2 (int nod, int last, int maxi) {
rez = max(rez, maxi + down[nod]);
int sum = maxi;
vector<bool> b(g[nod].size());
for (int i = 0; i < g[nod].size(); i++)
if (g[nod][i] != last && down[g[nod][i]] > 0) {
sum += down[g[nod][i]];
b[i] = true;
}
sum += v[nod];
if (sum < 0) {
for (int i = 0; i < b.size(); i++)
b[i] = false;
sum = 0;
}
for (int i = 0; i < g[nod].size(); i++)
if (g[nod][i] != last) {
if (b[i])
dfs2(g[nod][i], nod, sum - down[g[nod][i]]);
else
dfs2(g[nod][i], nod, sum);
}
}
int main () {
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v[i];
for (int i = 1; i < n; i++) {
int x, y;
fin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs1(1, 0);
dfs2(1, 0, 0);
fout << rez;
return 0;
}