Cod sursa(job #1442761)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 26 mai 2015 10:54:20
Problema Asmax Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
//0120
#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];
bool alese[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;
            alese[*it] = (aux >= 0);
        }
    if (rad != -1)
        dp[nod][rad] = ans;
    return ans;
}

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++) {
        alese[i] = false;
        for (int j = 0; j < n; j++)
            dp[i][j] = VM;
    }

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

    return 0;
}