Cod sursa(job #2272266)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 29 octombrie 2018 22:00:42
Problema Asmax Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#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;
}