Pagini recente » Cod sursa (job #3122085) | Cod sursa (job #2855439) | Istoria paginii runda/26_februarie_simulare_oji_2024_clasa_10 | Cod sursa (job #573847) | Cod sursa (job #1154856)
#include <cstdio>
#include <vector>
FILE* in;
FILE* out;
const int Q=16002,INF=1999999999;
std::vector<int> f[Q];
int v[Q+1],tat[Q+1];
int max(int a, int b)
{
return a>b?a:b;
}
void dfs(int act, int tata, int& valmaxsubarb, int& valmaxradacin)
{
if(f[act].size()==1)
{
valmaxsubarb=v[act];
valmaxradacin=v[act];
return;
}
int kv,xv;
valmaxsubarb=-INF;
valmaxradacin=-INF;
for(int i=0; i<f[act].size(); i++)
{
if(f[act][i]==tata)
continue;
dfs(f[act][i],act,kv,xv);
if(kv>valmaxsubarb)
valmaxsubarb=kv;
if(xv>0)
{
valmaxradacin=max(valmaxradacin+xv,xv);
}
}
valmaxradacin=max(v[act],valmaxradacin+v[act]);
if(valmaxradacin>valmaxsubarb)
valmaxsubarb=valmaxradacin;
}
int main()
{
in=fopen("asmax.in","r");
out=fopen("asmax.out","w");
int n;
fscanf(in,"%d",&n);
for(int i=1; i<=n; i++)
fscanf(in,"%d",&v[i]);
int a,b;
for(int i=1; i<n; i++)
{
fscanf(in,"%d%d",&a,&b);
f[a].push_back(b);
f[b].push_back(a);
}
int act=-INF,ma=-INF,k,x;
for(int i=0; i<f[1].size(); i++)
{
dfs(f[1][i],1,k,x);
if(k>ma)
ma=k;
if(x>0)
{
act=max(act+x,x);
}
}
act=max(v[1],act+v[1]);
fprintf(out,"%d",max(act,ma));
return 0;
}