Pagini recente » Cod sursa (job #1773667) | Cod sursa (job #1873084) | Cod sursa (job #1069574) | Cod sursa (job #896430) | Cod sursa (job #1199966)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream f("asmax.in");
ofstream o("asmax.out");
vector <int> a[20000];
int v[20000],m,n,parc[20000],maxim=-100000000,sus[20000],jos[20000];
void df(int nod){
parc[nod]=1;
jos[nod] = v[nod];
maxim = max(maxim,jos[nod]);
for(int i=0;i<a[nod].size();i++)if(parc[a[nod][i]]!=1){
df(a[nod][i]);
if(jos[a[nod][i]]>0)
jos[nod]+=jos[a[nod][i]];
maxim = max(maxim,jos[nod]);
}
parc[nod]=0;
}
void df1(int nod){
parc[nod]=1;
for(int i=0;i<a[nod].size();i++)
if(parc[a[nod][i]]!=1){
// if(v[a[nod][i]])sus[a[nod][i]]=v[a[nod][i]];
if(sus[nod]>0)sus[a[nod][i]] += sus[nod];
for(int j=0;j<a[nod].size();j++){
if(i!=j && parc[a[nod][j]]!=1){
if(v[nod]+jos[a[nod][j]]>0)
sus[a[nod][i]]+=v[nod]+jos[a[nod][j]];
}
}
maxim = max(maxim,sus[a[nod][i]]);
maxim = max(maxim,sus[a[nod][i]]+jos[a[nod][i]]);
maxim = max(maxim,sus[a[nod][i]]+v[a[nod][i]]);
// o<<maxim<<" " <<a[nod][i]<<endl;
df1(a[nod][i]);
}
parc[nod]=0;
}
int main(){
f>>n;
for(int i=1;i<=n;i++)f>>v[i],sus[i]=jos[i]=0;
int x,y;
for(int i=1;i<n;i++){
f>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
df(1);
df1(1);
o<<maxim;
}