Cod sursa(job #183121)

Utilizator alecmanAchim Ioan Alexandru alecman Data 21 aprilie 2008 19:05:56
Problema Asmax Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 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;

    util[ Y ] = 1;
  }
}

void DF(int Rad)
{
  Graph *adr;

  adr = List[ Rad ];

  Cost[ Rad ] = 0;

  while(adr != NULL)
  {
    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, Root;

  Root = -1;
  for(int i = 0; i < N; ++i)
    if(util[ i + 1 ] == 0)
    {
      Root = i + 1;
      break;
    }

  DF(Root);

  Max = INFI;

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

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

int main()
{
  readValues();

  solveFunction();

  fclose(fin);
  fclose(fout);

  return 0;
}