Pagini recente » Cod sursa (job #1402470) | Cod sursa (job #1620397) | Cod sursa (job #84629) | Cod sursa (job #129222) | Cod sursa (job #356732)
Cod sursa(job #356732)
#include<cstdio>
#include<climits>
#define N 16001
int x[N],y[N],d[N],*a[N],n;
int rez=-10000,v[N];
bool viz[N];
void citire()
{
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&n);
for (int i=1; i<=n; ++i)
scanf("%d",&v[i]);
for (int i=1; i<n; ++i)
{
scanf("%d%d",&x[i],&y[i]);
++d[x[i]];
++d[y[i]];
}
for (int i=1;i<=n; ++i)
{
a[i]=new int [1+d[i]];
a[i][0]=0;
}
for (int i=1; i<n; ++i)
{
a[x[i]][++a[x[i]][0]]=y[i];
a[y[i]][++a[y[i]][0]]=x[i];
}
}
void dfs(int x0)
{
viz[x0]=true;
int max=-10000;
for (int i=1; i<=a[x0][0]; ++i)
{
if (viz[a[x0][i]])
continue;
dfs(a[x0][i]);
if (v[a[x0][i]]>0)
{
v[x0]+=v[a[x0][i]];
if (rez<v[a[x0][i]])
rez=v[a[x0][i]];
}
else
{
if(max<v[a[x0][i]])
max=v[a[x0][i]];
if (rez<max)
rez=max;
}
}
}
/*void afis()
{
for (int i=1; i<=n; ++i)
{
printf("%d: ",i);
for(int j=1; j<=a[i][0]; ++j)
printf("%d ",a[i][j]);
printf("\n");
}
}*/
int main()
{
citire();
//afis();
dfs(1);
if (v[1]>0)
{
if (rez<v[1])
rez=v[1];
}
else
{
int max=-1000;
if(max<v[1])
max=v[1];
if (rez<max)
rez=max;
}
printf("%d",rez);
return 0;
}