Pagini recente » Cod sursa (job #2760125) | Cod sursa (job #2873382) | Cod sursa (job #2320493) | Cod sursa (job #2434452) | Cod sursa (job #1902762)
#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;
}