Cod sursa(job #1902762)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 4 martie 2017 19:35:15
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream in("asmax.in");
ofstream out("asmax.out");

int NIV[16005];
vector<int> L[16005],LN[16005];
int C[16005];
int DP[16005];
int n,nmax;

void read(){
    int x,y;
    in>>n;
    for(int i=1;i<=n;i++){
        in>>C[i];
    }
    for(int i=1;i<n;i++){
        in>>x>>y;
        L[x].push_back(y);
        L[y].push_back(x);
    }
}
void nivele(){
    queue<int> Q;
    int nod;
    NIV[1]=1;
    Q.push(1);
    LN[1].push_back(1);
    while(!Q.empty()){
        nod=Q.front();
        Q.pop();
        for(auto x : L[nod]){
            if(NIV[x]==0){
                NIV[x]=NIV[nod]+1;
                nmax=max(nmax,NIV[x]);
                LN[NIV[x]].push_back(x);
                Q.push(x);
            }
        }
    }
}
void solve(){
    int rmax=-16000000;
    nivele();
    for(int i=1;i<=n;i++)
        DP[i]=-16000000;
    for(int niv=nmax;niv>=1;niv--){
        for(auto nod : LN[niv]){
            DP[nod]=C[nod];
            for(auto fiu : L[nod]){
                if(NIV[fiu]>NIV[nod]){
                    DP[nod]=max(DP[nod],DP[nod]+DP[fiu]);
                }
            }
            rmax=max(DP[nod],rmax);
        }
    }
    out<<rmax;
}
int main(){
    read();
    solve();
    return 0;
}