Pagini recente » Cod sursa (job #1521638) | Cod sursa (job #1577009) | Cod sursa (job #1626659) | Cod sursa (job #1738090) | Cod sursa (job #2423433)
#include <bits/stdc++.h>
#define INFINIT (int)(1e8)
#define MAX (int)(16e3+5)
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
int n,Val[MAX],Best[MAX],ans=-INFINIT;
vector<int> Nod[MAX];
int Dp(int,int);
void citire();
int main(){
citire();
Dp(1,1);
fout<<ans<<'\n';
return 0;
}
int Dp(int x,int y){
if(Best[x]!=INFINIT)
return Best[x];
int t=0,maxx=0,maxval=-INFINIT,i,val,sz=Nod[x].size();
bool ok=1;
for(i=0;i<sz;++i){
if(Nod[x][i]!=y){
val=Dp(Nod[x][i],x);
if(val>=0){
t+=val;
ok=0;
}
maxval=max(maxval,val);
}
maxx=max(maxx,t);
}
//daca nu a luat niciun nod pana acum
if(ok)t+=maxval;
t=maxx;
t+=Val[x];
Best[x]=t;
ans=max(ans,t);
return t;
}
void citire(){
int i,x,y;
fin>>n;
for(i=1;i<=n;++i){
fin>>Val[i];
Best[i]=INFINIT;
}
for(i=1;i<n;++i){
fin>>x>>y;
Nod[x].push_back(y);
Nod[y].push_back(x);
}
}