Cod sursa(job #2780209)

Utilizator lucamLuca Mazilescu lucam Data 6 octombrie 2021 14:46:41
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <bits/stdc++.h>

#ifdef ONLINE_JUDGE
#define in std::cin
#define out std::cout
#else
std::ifstream in("asmax.in");
std::ofstream out("asmax.out");
#endif

template<typename T, size_t N>
constexpr size_t length_of(T (&)[N]) { return N; }

constexpr int N = 16e3 + 1;
std::vector<int> g[N];
int v[N];
std::bitset<N> vis;
int dp[N];

void dfs(int node) {
    vis[node] = 1;
    int max_down = 0;
    for (auto x : g[node]) {
        if (!vis[x]) {
            dfs(x);
            max_down += dp[x] > 0 ? dp[x] : 0;
        }
    }
    dp[node] = max_down <= 0 ? v[node] : max_down + v[node];
}

int main() {
    int n;
    in >> n;
    for (int i = 1; i <= n; ++i) {
        in >> v[i];
    }
    for (int i = 1; i < n; ++i) {
        int a, b;
        in >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs(1);
    int ans_max = *std::max_element(dp + 1, dp + n);
    out << ans_max << '\n';
}