Pagini recente » Cod sursa (job #122529) | Cod sursa (job #1663357) | Cod sursa (job #2428666) | Cod sursa (job #1728433) | Cod sursa (job #1596732)
#include <cstdio>
#include <iostream>
#include <set>
#include <climits>
#include <map>
#include <algorithm>
#include <list>
#include <vector>
#include <utility>
#include <cstdlib>
#include <iomanip>
#include <cstring>
#include <string>
using namespace std;
list<int> e[16001];
int v[16001], dp[16001];
int dfs(int node, int root) {
dp[node] = v[node];
for (list<int>::iterator it = e[node].begin(); it != e[node].end(); it++) {
if ((*it) == root)
continue;
dp[node] += dfs((*it), node);
}
return ((dp[node] < 0) ? 0 : dp[node]);
}
int main() {
// freopen("tt.txt", "r", stdin);
freopen("asmax.in", "r", stdin);
freopen("asmax.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
for (int i = 1; i < n; i++) {
int a, b;
cin >> a >> b;
e[a].push_back(b);
e[b].push_back(a);
}
dfs(1, 0);
int ans = INT_MIN;
for (int i = 1; i <= n; i++) {
if (dp[i] > ans)
ans = dp[i];
}
cout << ans;
return 0;
}