Pagini recente » Cod sursa (job #35754) | Borderou de evaluare (job #1500590) | Monitorul de evaluare | Borderou de evaluare (job #1535766) | Cod sursa (job #3336955)
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
void parcurgere(
int v, int parent,
const vector<vector<int>> &adj,
const vector<int> &val,
vector<int> &dp)
{
if (adj[v].size() == 1) {
dp[v] = val[v];
}
else {
int suma = val[v];
for (auto x : adj[v]) {
if (x != parent) {
parcurgere(x, v, adj, val, dp);
if (dp[x] > 0) {
suma += dp[x];
}
}
}
dp[v] = suma;
}
}
int main()
{
ifstream fin("asmax.in");
ofstream fout("asmax.out");
int n;
fin >> n;
vector<int> val(n+1), dp(n+1, INT_MIN);
for (int i = 1; i <= n; i++)
fin >> val[i];
vector<vector<int>> adj(n+1);
for (int i = 1; i <= n-1; i++) {
int a, b;
fin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
parcurgere(1, -1, adj, val, dp);
int solutie = INT_MIN;
for (int i = 1; i <= n; i++)
solutie = max(solutie, dp[i]);
fout << solutie << "\n";
return 0;
}