Pagini recente » Cod sursa (job #767496) | Cod sursa (job #2987497) | Cod sursa (job #2319413) | Cod sursa (job #601074) | Cod sursa (job #51558)
Cod sursa(job #51558)
/* Ivan Nicolae - Bucuresti */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NMAX 16002
#define Infinity 0x3f3f3f3f
#define _fin "asmax.in"
#define _fout "asmax.out"
int i,j,n,m,*A[NMAX],Gr[NMAX],S[NMAX],V[NMAX],F[NMAX],Mark[NMAX],Tata[NMAX],C[NMAX],max;
void AlocaMemorie(void)
{
int i;
for (i=1;i<=n;i++)
{
A[i]=(int*) malloc((Gr[i]+1)*sizeof(int));
memset(A[i],0,sizeof(A[i]));
}
}
void ReadData(void)
{
int i;
freopen(_fin,"r",stdin);
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&V[i]);
for (i=1;i<=n-1;i++)
{
int x, y;
scanf("%d%d",&x,&y);
Gr[x]++; Gr[y]++;
}
fseek(stdin,0,SEEK_SET);
AlocaMemorie();
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&V[i]);
for (i=1;i<=n-1;i++)
{
int x, y;
scanf("%d%d",&x,&y);
A[x][++A[x][0]]=y;
A[y][++A[y][0]]=x;
}
fclose(stdin);
}
void DFS(int nod)
{
int i,gasit=0;
Mark[nod]=1;
for (i=1;i<=A[nod][0];i++)
if (!Mark[A[nod][i]])
{
gasit=1;
Tata[A[nod][i]]=nod;
DFS(A[nod][i]);
}
if (!gasit)
F[++F[0]]=nod;
}
void InitSums(void)
{
int i;
for (i=1;i<=n;i++)
S[i]=V[i];
}
void Solve(int nod)
{
int i;
Mark[nod]=1;
for (i=1;i<=A[nod][0];i++)
if (!Mark[A[nod][i]])
{
Solve(A[nod][i]);
if (S[A[nod][i]]>0)
S[nod]+=S[A[nod][i]];
}
}
int maximum(void)
{
int i,max=-Infinity;
for (i=1;i<=n;i++)
if (S[i]>max)
max=S[i];
return max;
}
void PrintData(void)
{
freopen(_fout,"w",stdout);
printf("%d",max);
fclose(stdout);
}
int main()
{
ReadData();
DFS(1);
memset(Mark,0,sizeof(Mark));
InitSums();
Solve(1);
max=maximum();
PrintData();
return 0;
}