Pagini recente » Diferente pentru utilizator/popoiu.george intre reviziile 49 si 64 | Scandura | Profil Verde Flaviu-Cristian | Colectie | Cod sursa (job #356540)
Cod sursa(job #356540)
#include <stdio.h>
#include <limits.h>
int n;
int viz[16001]={0};
int val[16001];
int S;
int max;
struct nod
{
int val;
nod* urm;
};
nod *vf[16001]={0}, *sf[16001]={0};
nod *aux;
void AddInList(int ListNo, int Val)
{
if (vf[ListNo]==NULL)
{
vf[ListNo] = new nod;
vf[ListNo]->val = Val;
vf[ListNo]->urm = NULL;
sf[ListNo] = vf[ListNo];
}
else
{
nod *aux = new nod;
aux->val = Val;
aux->urm = NULL;
sf[ListNo]->urm = aux;
sf[ListNo]=aux;
}
}
int Rez(int Nod)
{
int s=val[Nod], saux=0;
for(nod *aux=vf[Nod]; aux!=NULL; aux=aux->urm)
if(!viz[aux->val])
{ viz[aux->val]=1;
saux=Rez(aux->val);
if(saux>0)
s+=saux;
if(saux>max) max=saux;
if(s>max) max=s;
}
return s;
}
int main()
{
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d", &n);
for (int i=0; i<n;i++)
scanf("%d",&val[i]);
int a,b;
for (int i=0;i<n-1;i++)
{
scanf("%d%d",&a,&b);
AddInList(a-1,b-1);
AddInList(b-1,a-1);
}
max=val[0];
viz[0]=1;
S = Rez(0);
printf("%d",S);
return 0;
}