Pagini recente » Cod sursa (job #540237) | Cod sursa (job #433785) | Cod sursa (job #635392) | Cod sursa (job #2657610) | Cod sursa (job #51555)
Cod sursa(job #51555)
/* 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 InitSLeafs(void)
{
int i;
for (i=1;i<=F[0];i++)
{
S[F[i]]=V[F[i]];
Mark[F[i]]=1;
}
}
void Solve(void)
{
int i,j;
while (F[0])
{
C[0]=0;
for (i=1;i<=F[0];i++)
{
int x=Tata[F[i]],s=0;
if (x==0) { F[0]=0; break; }
for (j=1;j<=A[x][0];j++)
if (S[A[x][j]] > 0)
s+=S[A[x][j]];
if (s+V[x]>S[x])
S[x]=s+V[x];
C[++C[0]]=x;
}
memcpy(F,C,sizeof(C));
F[0]=C[0];
}
}
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));
InitSLeafs();
Solve();
max=maximum();
PrintData();
return 0;
}