Cod sursa(job #833891)

Utilizator sebii_cSebastian Claici sebii_c Data 13 decembrie 2012 11:35:15
Problema Asmax Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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 indeg[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;
        ssum += max(0, max_sum(*neigh));
    }

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

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

    int max_in = 0, snode;
    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);
        indeg[x]++, indeg[y]++;
        if (indeg[x] > max_in) max_in = indeg[x], snode = x;
        if (indeg[y] > max_in) max_in = indeg[y], snode = y;
    }
    printf("%d\n", max_sum(snode));

    return 0;
}