Cod sursa(job #833887)

Utilizator sebii_cSebastian Claici sebii_c Data 13 decembrie 2012 11:25:44
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>

using namespace std;

const int MAXN = 16001;

int n;
vector<int> G[MAXN];
int cost[MAXN];
bool viz[MAXN];
int sum[MAXN];

int max_sum(int node) 
{
    bool found = false;
    viz[node] = true;
    
    int ssum = 0;
    vector<int>::iterator neigh;
    for (neigh = G[node].begin(); neigh != G[node].end(); ++neigh) {
        if (viz[*neigh]) continue;
        found = true;
        sum[*neigh] = max_sum(*neigh);
        ssum += max(0, sum[*neigh]);
    }

    if (!found) {
        return max(0, cost[node]);
    } else {
        return ssum + cost[node];
    }
}

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

    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) 
        scanf("%d", &cost[i]);
    for (int i = 0; i < n - 1; ++i) {
        int x, y; scanf("%d %d", &x, &y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    printf("%d\n", max_sum(1));

    return 0;
}