Cod sursa(job #51555)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 14 aprilie 2007 18:04:58
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
/* 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;
}