Pagini recente » Cod sursa (job #292346) | Cod sursa (job #161456) | Cod sursa (job #1002857) | Cod sursa (job #2843538) | Cod sursa (job #1916133)
#include <stdio.h>
#include <iostream>
#include <vector>
#include <climits>
#include <math.h>
#include <stdlib.h>
using namespace std;
int max_sum = 0;
int dfs(vector<vector<int> > &connections, vector<int> &vals, vector<int> &max_from_node, vector<bool> &visited, int curr_node) {
if (visited[curr_node])
return 0;
visited[curr_node] = true;
if (connections[curr_node].empty())
return vals[curr_node];
bool vis = false;
for (int i = 0; i < connections[curr_node].size(); i ++) {
if (!visited[connections[curr_node][i]]) {
vis = true;
int next_node = dfs(connections, vals, max_from_node, visited, connections[curr_node][i]);
if (next_node > 0)
max_from_node[curr_node] += next_node;
}
}
if (!vis) {
return vals[curr_node];
}
return max_from_node[curr_node];
}
int main() {
freopen("asmax.in", "r", stdin);
freopen("asmax.out", "w", stdout);
int n;
scanf("%d", &n);
vector<int> vals(n);
for (int i = 0; i < n; i ++) {
scanf("%d", &vals[i]);
}
vector<vector<int> > connections(n);
vector<bool> visited(n, false);
vector<int> max_from_node = vals;
for (int i = 0; i < n - 1; i ++) {
int a, b;
scanf("%d %d", &a, &b);
connections[a - 1].push_back(b - 1);
connections[b - 1].push_back(a - 1);
}
for (int i = 0; i < n; i ++) {
max_sum = max(max_sum, dfs(connections, vals, max_from_node, visited, i));
}
printf("%d\n", max_sum);
return 0;
}