Pagini recente » Cod sursa (job #2749727) | Cod sursa (job #2923995) | Cod sursa (job #2645432) | Cod sursa (job #2676632) | Cod sursa (job #2199653)
#include <fstream>
#define N 100001
#define M 200001
int n, nr, nodes[2 * M], next[2 * M], list[M], v[N], r = -1000;
bool vis[N];
inline void add(int from, int to) {
++nr;
nodes[nr] = to;
next[nr] = list[from];
list[from] = nr;
}
inline int dfs(int x) {
if (vis[x]) return 0;
vis[x] = true;
int p = list[x];
int t;
while (p != 0) {
t = dfs(nodes[p]);
if (t > 0) v[x] += t;
p = next[p];
}
if (v[x] > r) r = v[x];
return v[x];
}
int main() {
std::ifstream in("asmax.in");
std::ofstream out("asmax.out");
in >> n;
int x, y;
for (int i = 1; i <= n; ++i) {
in >> v[i];
}
for (int i = 1; i < n; ++i) {
in >> x >> y;
add(x, y);
add(y, x);
}
dfs(1);
out << r;
return 0;
}