Pagini recente » Borderou de evaluare (job #967538) | Borderou de evaluare (job #3043295) | Cod sursa (job #545081) | Cod sursa (job #1262239) | Cod sursa (job #1199961)
#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){
sus[a[nod][i]] = sus[nod] + jos[nod] + v[a[nod][i]];
if(jos[a[nod][i]]>0)sus[a[nod][i]]-= jos[a[nod][i]];
maxim = max(maxim,sus[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;
}