Pagini recente » Profil lau0097 | Istoria paginii utilizator/costelus13 | Istoria paginii utilizator/motocel | Diferente pentru runda/uvs_runda_1 intre reviziile 10 si 3 | Cod sursa (job #2017789)
#include <stdio.h>
#include <stdlib.h>
#define INF 20000000
int nr,v[16001],lista[16001],nod[16001],next[16001],rez[16001],f[16001];
void add(int x,int y)
{
nr++;
next[nr]=lista[x];
nod[nr]=y;
lista[x]=nr;
}
void dfs(int x)
{
int z;
rez[x]=v[x];
z=lista[x];
while(z)
{
dfs(nod[z]);
if(rez[nod[z]]>0)
rez[x]+=rez[nod[z]];
z=next[z];
}
}
int main()
{
int n,i,x,y,max;
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d",&v[i]);
rez[i]=-INF;
}
for(i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
add(x,y);
f[y]=1;
}
i=1;
while(f[i])
i++;
dfs(i);
max=-INF;
for(i=1; i<=n; i++)
if(rez[i]>max)
max=rez[i];
printf("%d\n",max);
return 0;
}