Cod sursa(job #1247378)

Utilizator SmarandaMaria Pandele Smaranda Data 22 octombrie 2014 18:19:53
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <vector>

using namespace std;

const int N = 16010;

int n, maxim = -1;
vector <int> graph [N];
int v [N], s [N];
bool used [N], used2 [N];

void dfs (int x) {
    vector <int> :: iterator it;

    used [x] = 1;
    s [x] = v [x];
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        if (!used [*it]) {
            dfs (*it);
            if (s [*it] > 0)
                s [x] += s [*it];
        }
    if (s [x] > maxim)
        maxim = s [x];
}

void dfs2 (int x) {
    int a, b, root, son;
    vector <int> :: iterator it;

    used2 [x] = 1;
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        if (!used2 [*it]) {
            root = s [x];
            son = s [*it];
            a = s [x];
            if (s [*it] > 0)
                a -= s [*it];
            b = s [*it];
            if (a > 0)
                b = s [*it] + a;
            s [x] = a;
            s [*it] = b;
            dfs2 (*it);
            s [x] = root;
            s [*it] = son;
        }
    if (s [x] > maxim)
        maxim = s [x];
}

int main () {
    int i, x, y;

    freopen ("asmax.in", "r", stdin);
    freopen ("asmax.out", "w", stdout);

    scanf ("%d", &n);
    maxim = -((1ll << 31) - 1);
    for (i = 1; i <= n; i ++)
        scanf ("%d", &v [i]);
    for (i = 1; i < n; i ++) {
        scanf ("%d%d", &x, &y);
        graph [x].push_back (y);
        graph [y].push_back (x);
    }
    dfs (1);
    dfs2 (1);
    printf ("%d\n", maxim);
    return 0;
}