Cod sursa(job #183140)

Utilizator alecmanAchim Ioan Alexandru alecman Data 21 aprilie 2008 19:20:18
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>

#define INPUT "asmax.in"
#define OUTPUT "asmax.out"
#define NMAX 16001
#define INFI -32000

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

typedef struct Graph
{
  int node;
  Graph *next;
};

Graph *List[ NMAX ];

int N;
int A[ NMAX ], Cost[ NMAX ], util[ NMAX ];

void readValues()
{
  Graph *adr;
  int X, Y;

  fscanf(fin, "%d", &N);

  for(int i = 0; i < N; ++i)
    fscanf(fin, "%d", &A[ i ]);

  for(int i = 0; i < N - 1; ++i)
  {
    fscanf(fin, "%d %d", &X, &Y);

    adr = new Graph;
    adr -> node = Y;
    adr -> next = List[ X ];
    List[ X ] = adr;

    adr = new Graph;
    adr -> node = X;
    adr -> next = List[ Y ];
    List[ Y ] = adr;
  }
}

void DF(int Rad)
{
  Graph *adr;

  adr = List[ Rad ];

  util[ Rad ] = 1;

  Cost[ Rad ] = 0;

  while(adr != NULL)
  {
    if(!util[ adr -> node ])
    {
      DF(adr -> node);

      if(Cost[ adr -> node ] > 0)
	Cost[ Rad ] += Cost[ adr -> node ];

    }
    adr = adr -> next;
  }

  Cost[ Rad ] += A[ Rad - 1];
}

void solveFunction()
{
  int Max;

  DF(1);

  Max = INFI;

  for(int i = 0; i < N; ++i)
    if(Cost[ i + 1] > Max)
      Max = Cost[ i + 1];

  fprintf(fout, "%d\n", Max);
}

int main()
{
  readValues();

  solveFunction();

  fclose(fin);
  fclose(fout);

  return 0;
}