Cod sursa(job #14477)

Utilizator crawlerPuni Andrei Paul crawler Data 9 februarie 2007 02:47:15
Problema Asmax Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>

#define FIN "asmax.in"
#define FOUT "asmax.out"
#define nmax 1<<14

#define FOR(i,a,b) for(i= (a); i<= (b); ++i)

int a[nmax][1<<10];
int c[nmax], v[nmax], MAX=-(1<<20), NEG, APP;
int s[nmax], n;

void DFS(int nod)
 {
  if(v[nod])
   return ;
  int i;

  v[nod]=1;
  ++APP;

  if(a[nod][0]==1)
   s[nod]=c[nod];
    else
  {
   FOR(i,1,a[nod][0])
   if(v[a[nod][i]]==0)
    {
     DFS(a[nod][i]);
     if( s[a[nod][i]] > 0 )
      {
       s[nod] += s[a[nod][i]];
       NEG=1;
      }
    }
   s[nod]+= c[nod];
   }

  if( s[nod] > MAX)
   MAX = s[nod];

  if(APP>=n)
   return ;
 
 }
int main()
 {
   freopen(FIN,"r",stdin);
   freopen(FOUT,"w",stdout);

   int i,x,y;
   
   scanf("%i\n", &n);

   FOR(i,1,n) 
    scanf("%i", &c[i]);
  
   --n;
   FOR(i,1,n)   
   {
     scanf("%i%i", &x,&y);
     a[x][++a[x][0]]=y;
     a[y][++a[y][0]]=x;
   }

   ++n;
   FOR(i,1,n)
    if(a[i][0]!=1)
     {
      DFS(1);
      break;
     }
    

   if(NEG)
    printf("%i\n", MAX);
     else
    {
     MAX=c[1];
     FOR(i,2,n);
      if(c[i] > MAX)
       MAX = c[i];
     printf("%i\n", MAX);
    }
 
   return 0;
 }