Cod sursa(job #30948)

Utilizator vlad_popaVlad Popa vlad_popa Data 15 martie 2007 12:50:46
Problema Asmax Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
using namespace std;

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

#define FIN "asmax.in"
#define FOUT "asmax.out"
#define NMAX 16001

int N, nf[NMAX], *f[NMAX], s[NMAX], v[NMAX];
int *fi[NMAX], nfi[NMAX], viz[NMAX], iter;

void citire ()
{
  int i, x, y;

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

void df (int i)
{
  int j;
  for (j = 1; j <= nfi[i]; ++ j)
    df (fi[i][j]);
  if (!nfi[i])
    s[i] = v[i];
  else
   {
     s[i] = v[i];
     for (j = 1; j <= nfi[i]; ++ j)
       if (s[fi[i][j]] > 0)
         s[i] += s[fi[i][j]];
   }
}

void root (int r)
{
  int i;
  viz[r] = iter;
  for (i = 1; i <= nf[r]; ++ i)
    if (viz[f[r][i]] != iter)
     {
       fi[r][++nfi[r]] = f[r][i];
       viz[f[r][i]] = iter;
       root (f[r][i]);
     }
}

void solve ()
{
  int max = 0;

  for (int i = 1; i <= N; ++ i)
   {
     memset (s, 0, sizeof (s));
     memset (nfi, 0, sizeof (nfi));
     ++ iter;
     root (i);
     /*for (int j = 1; j <= N; ++ j)
      {
        for (int k = 1; k <= nfi[j]; ++ k)
           fprintf (stderr, "%d ", fi[j][k]);
         if (nfi[j])
           fprintf (stderr, "    %d\n", j);
      }
     fprintf (stderr, "\n\n");*/
     df (i);
     for (int i = 1; i <= N; ++ i)
       if (s[i] > max)
         max = s[i];
   }
  printf ("%d\n", max);
}

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