Pagini recente » Cod sursa (job #2624981) | Cod sursa (job #838939) | Cod sursa (job #2274002) | Cod sursa (job #668935) | Cod sursa (job #2500708)
#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], v[N], n, nr, smax = -INF; // nr = pozitia curenta
bool visit[N];
void add(int x, int y) {
vf[++nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
int dfs(int x) {
visit[x] = true;
int p = lst[x], y, d, s = v[x];
while (p != 0) {
y = vf[p];
if (!visit[y]) if ((d = dfs(y)) >= 0) s += d;
p = urm[p];
}
if (s > smax) smax = s;
return s;
}
int main() {
int a, b;
in >> n;
for (int i = 1; i <= n; i++) in >> v[i];
for (int i = 1; i <= n - 1; i++) {
in >> a >> b;
add(a, b);
add(b, a);
}
dfs(1);
out << smax;
return 0;
}