Pagini recente » Cod sursa (job #1655441) | Cod sursa (job #2794636) | Cod sursa (job #359610) | Cod sursa (job #3196163) | Cod sursa (job #2272266)
#include <vector>
#include <fstream>
#include <climits>
#define NMAX 16010
using std::vector;
std::ifstream fin("asmax.in");
std::ofstream fout("asmax.out");
int n;
vector<int> ad[NMAX];
int totalSum;
int cost[NMAX];
int sol = INT_MIN;
int sum[NMAX];
bool vis[NMAX];
inline int max(int x, int y) {
return x > y ? x : y;
}
void dfs(int node) {
bool ok = false;
int localSum = 0;
vector<int> v, dp;
vis[node] = true;
sum[node] = cost[node];
for (int i = 0; i < ad[node].size(); i++)
if (!vis[ad[node][i]]) {
dfs(ad[node][i]);
localSum += sum[ad[node][i]];
v.push_back(sum[ad[node][i]]);
dp.push_back(0);
if (sum[ad[node][i]] >= 0)
ok = true;
}
v.push_back(totalSum - localSum - cost[node]);
dp.push_back(0);
if (sum[totalSum - localSum - cost[node]] >= 0)
ok = true;
if (ok) {
dp[0] = max(v[0], 0);
for (int i = 1; i < v.size(); i++)
dp[i] = max(dp[i - 1] + v[i], 0);
}
else {
dp[v.size() - 1] = INT_MIN;
for (int i = 0; i < v.size(); i++)
if (v[i] > dp[v.size() - 1])
dp[v.size() - 1] = v[i];
}
sol = max(dp[dp.size() - 1] + cost[node], sol);
}
int main() {
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> cost[i];
totalSum += cost[i];
}
int x, y;
for (int i = 1; i < n; i++) {
fin >> x >> y;
ad[x].push_back(y);
ad[y].push_back(x);
}
dfs(1);
fout << sol << '\n';
fout.close();
return 0;
}