Cod sursa(job #31039)

Utilizator vlad_popaVlad Popa vlad_popa Data 15 martie 2007 13:31:37
Problema Asmax Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
using namespace std;

#include <cstdio>
#include <cassert>
#include <string>

#define FIN "asmax.in"
#define FOUT "asmax.out"
#define NMAX 16001
#define INF 0x3f3f3f3f

int N, nf[NMAX], *f[NMAX], s[NMAX], v[NMAX], viz[NMAX], iter, x, y;
char sir[16];

void get ()
{
  int l = strlen (sir), i = l - 1, ct = 1;
  x = y = 0;
  while (sir[i] != ' ')
   {
     x += (sir[i] - '0') * ct;
     ct *= 10;
     -- i;
   }
  -- i;
  ct = 1;
  while (i >= 0)
   {
     y += (sir[i] - '0') * ct;
     ct *= 10;
     -- i;
   }
}

void read ()
{
  int i;

  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);
  
  scanf ("%d\n", &N);
  for (i = 1; i <= N; ++ i)
    scanf ("%d ", &v[i]);
  scanf ("\n");
  for (i = 1; i < N; ++ i)
   {
     gets (sir);
     get ();
     ++ nf[x];
     ++ nf[y];
   }
  for (i = 1; i <= N; ++ i)
   {
     f[i] = new int [nf[i] + 1];
     nf[i] = 0;
   }
   
  fseek (stdin, 0, SEEK_SET);
  
  scanf ("%d\n", &N);
  for (i = 1; i <= N; ++ i)
    scanf ("%d ", &v[i]);
  scanf ("\n");
  for (i = 1; i < N; ++ i)
   {
     gets (sir);
     get ();
     f[x][++nf[x]] = y;
     f[y][++nf[y]] = x;
   }
}

void df (int i)
{
  int j;
  bool verif = false;
  viz[i] = iter;
  s[i] = v[i];
  for (j = 1; j <= nf[i]; ++ j)
    if (viz[f[i][j]] != iter)
     {
       df (f[i][j]);
       if (s[f[i][j]] > 0)
         s[i] += s[f[i][j]];
       verif = true;
     }
  if (!verif)
    s[i] = v[i];
}

void solve ()
{
  int max = -INF;

  for (int i = 1; i <= N; ++ i)
   {
     ++ iter;
     df (i);
     if (s[i] > max)
       max = s[i];
   }
  printf ("%d\n", max);
}

int
 main ()
{
  read ();
  solve ();
  return 0;
}