Pagini recente » Cod sursa (job #2035170) | Cod sursa (job #1603859) | Diferente pentru runda/viata_periculoasa_pe_infoarena2 intre reviziile 1 si 2 | Cod sursa (job #438734) | Cod sursa (job #1442943)
#include <cstdio>
using namespace std;
FILE *in=fopen ("asmax.in","r");
FILE *out=fopen ("asmax.out","w");
const int N=16001;
int n,vf[2*N],lst[N],urm[2*N],m,a[N],suma[N],s;
bool viz[N];
void adauga (int x,int y)
{
vf[++m]=y;
urm[m]=lst[x];
lst[x]=m;
}
int rezolvare (int x)
{
int p,y;
viz[x]=true;
suma[x]=a[x];
p=lst[x];
while (p!=0)
{
y=vf[p];
if (!viz[y])
{
//viz[y]=true;
rezolvare(y);
if (suma[y]+suma[x]>suma[x])
suma[x]+=suma[y];
}
p=urm[p];
}
}
void citire ()
{
fscanf (in,"%d",&n);
for (int i=1;i<=n;i++)
fscanf (in,"%d",&a[i]);
for (int i=1;i<n;i++)
{
int x,y;
fscanf (in,"%d%d",&x,&y);
adauga (x,y);
adauga (y,x);
}
rezolvare(1);
int s=-999999999;
for (int i=1;i<=n;i++)
if (s<suma[i]) s=suma[i];
fprintf (out,"%d",s);
}
int main()
{
citire();
return 0;
}