Cod sursa(job #1750216)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 29 august 2016 18:59:37
Problema Asmax Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I, Semestrul 2 Marime 1.38 kb
#include <cstdio>
#include <vector>
#include <cstring>

#define in "asmax.in"
#define out "asmax.out"
#define NMAX 16000 + 7
#define pb push_back

int n, v[NMAX], tata[NMAX], dp[NMAX], X, Y, mxn;
using namespace std;
vector <int> adj[NMAX];

inline void addEdge(const int &A, const int &B)
{
    adj[A].pb(B);
    adj[B].pb(A);
}

inline void citire()
{
    //memset(dp, 3, sizeof(int));
    scanf("%d", &n);
    for(int i = 1; i<= n; ++i) scanf("%d", &v[i]);
    for(int i = 1; i<= n-1; ++i)
    {
        scanf("%d %d", &X, &Y);
        addEdge(X, Y);
    }
    tata[1] = -1;
}
int sum(const int &node)
{
    if(dp[node] == 0) /// posibil fail
    {
        //printf("check node %d\n", node);
        int sze = adj[node].size();
        dp[node] = v[node];
        for(int i = 0; i< sze; ++i)
        {
            int tmp = adj[node][i];
            if(tata[node] == tmp) continue;
            tata[tmp] = node;
            int aux = sum(tmp);
            if(aux > 0) dp[node] += sum(tmp);
        }
    }
    return dp[node];
}
inline void solve()
{
    mxn = dp[1];
    for(int i = 2; i<= n; ++i) mxn = max(mxn, dp[i]);
}

int main()
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    citire();
    //printf("%d\n", dp[1]);
    dp[1] = sum(1);
    //printf("%d\n", dp[1]);
    solve();
    printf("%d\n", mxn);
    return 0;
}