Pagini recente » Cod sursa (job #104220) | Cod sursa (job #43812) | Cod sursa (job #982597) | Cod sursa (job #566444) | Cod sursa (job #2780746)
#include <iostream>
#include <vector>
FILE *in = fopen("asmax.in", "r"), *out = fopen("asmax.out", "w");
const int nmax = 2e5 ;
const int INF = 2e9;
int val[1 + nmax];
int dp[1 + nmax];
std::vector<int> G[1 + nmax];
int answer;
void runDp(int node, int parent) {
bool isLeaf = true;
for (auto son : G[node]) {
if (son != parent) {
isLeaf = false;
runDp(son, node);
dp[node] += dp[son] * (dp[son] >= 0);
}
}
if (isLeaf) {
dp[node] = std::max(val[node], 0);
} else {
dp[node] += val[node];
}
answer = std::max(answer, dp[node]);
}
int main() {
int n, maxim(-INF);
fscanf(in, "%d", &n) ;
for (int i = 1 ; i <= n ; ++ i) {
fscanf(in, "%d", val + i) ;
maxim = std::max(maxim, val[i]);
}
int x, y ;
for (int i = 1 ; i < n ; ++ i) {
fscanf(in, "%d %d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
runDp(1, 0);
if (answer == 0) {
answer = maxim;
}
fprintf(out, "%d", answer);
}