Cod sursa(job #1443676)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 28 mai 2015 13:53:31
Problema Asmax Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
//0111
#include <cstdio>
#include <list>
#define li list<int>::iterator
#define VM -16000000

using namespace std;
list<int> e[16000];
int v[16000];
long dp[16000][16000];

long arb(int nod, int rad) {
    long ans = v[nod];

    if (rad != -1 && dp[nod][rad] != VM)
        return dp[nod][rad];

    for (li it = e[nod].begin(); it != e[nod].end(); it++)
        if (*it != rad) {
            long aux = arb(*it, nod);
            ans += (aux >= 0) ? aux : 0;
        }
    if (rad != -1)
        dp[nod][rad] = ans;
    return ans;
}

void elimina(int i) {
    if (e[i].size() != 1)
        return;
    int tata = *e[i].begin();
    e[i].clear();
    e[tata].remove(i);
    v[tata] += (v[i] > 0) ? v[i] : 0;
    elimina(tata);
}

int main() {
    FILE* fi = fopen("asmax.in", "rt");
    FILE* fo = fopen("asmax.out", "wt");

    int n;
    fscanf(fi, "%d", &n);
    for (int i = 0; i < n; i++)
        fscanf(fi, "%d", &v[i]);
    for (int i = 1; i < n; i++) {
        int a, b;
        fscanf(fi, "%d%d", &a, &b);
        a--; b--;
        e[a].push_back(b);
        e[b].push_back(a);
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            dp[i][j] = VM;
    }

    for (int i = 0; i < n; i++) {
        elimina(i);
    }
    long minim = VM;
    for (int i = 0; i < n; i++) {
        long val = arb(i, -1);
        if (val > minim)
            minim = val;
    }
    fprintf(fo, "%ld", minim);

    return 0;
}