Pagini recente » Cod sursa (job #1713039) | Cod sursa (job #2990025) | Cod sursa (job #3030356) | Cod sursa (job #1159668) | Cod sursa (job #2500709)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("asmax.in");
ofstream out ("asmax.out");
const int N = 16001, INF = 1000001;
int vf[2*N], urm[2*N], lst[N], n, nr, smax = -INF, v[N];
bool viz[N];
void adauga(int x, int y){
vf[++nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
int dfs(int x){
viz[x] = true;
int p = lst[x], y, d, s = v[x];
while (p != 0) {
y = vf[p];
if (!viz[y]) {
if ((d = dfs(y)) >= 0){
s += d;
}
}
p = urm[p];
}
if (s > smax) {
smax = s;
}
return s;
}
int main()
{
int x, y;
in >> n;
for (int i = 1 ; i <= n ; i++){
in >> v[i];
}
for (int i = 1 ; i <= n - 1; i++) {
in >> x >> y;
adauga(x, y);
adauga(y, x);
}
dfs(1);
out << smax;
return 0;
}