Cod sursa(job #51558)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 14 aprilie 2007 18:22:18
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 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 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;
}