Cod sursa(job #2272283)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 29 octombrie 2018 22:31:33
Problema Asmax Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 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, sol;
vector<int> ad[NMAX];

int totalSum;
int cost[NMAX];

int sum[NMAX];
bool vis[NMAX];

inline int min(int x, int y) {
    return x < y ? x : y;
}

inline int max(int x, int y) {
    return x > y ? x : y;
}

void dfs(int node) {
    vis[node] = true;
    sum[node] = cost[node];

    int minSum = INT_MAX;
    for (int i = 0; i < ad[node].size(); i++)
        if (!vis[ad[node][i]]) {
            dfs(ad[node][i]);
            sum[node] += sum[ad[node][i]];
            minSum = min(minSum, sum[ad[node][i]]);
        }

    minSum = min(minSum, totalSum - sum[node]);
    sol = max(sol, totalSum - minSum);
}

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);
    }

    sol = totalSum;
    dfs(1);
    fout << sol << '\n';

    fout.close();
    return 0;
}