Cod sursa(job #1658854)

Utilizator TincaMateiTinca Matei TincaMatei Data 21 martie 2016 20:32:15
Problema Asmax Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#define MAX_VARFURI 16000
#define NECALCULAT -1000000
#define INFINIT 1000000000

int v[ MAX_VARFURI ];
int din[ MAX_VARFURI ];
int nrm[ MAX_VARFURI ];
int list[ MAX_VARFURI ][ MAX_VARFURI - 1 ];
struct muchie {
  int a , b;
} muchii[ MAX_VARFURI - 1 ];

//maximul dintre a si b
int max( int a , int b ) {
  if( a > b )
    return a;
  else
    return b;
}

//calculeaza subarborele maxim cu radacina in varf
int asmax( int varf , int n , int tata ) {
  //daca suma nu este calculata o calculam
  if( din[ varf ] == NECALCULAT ) {
    int i , nod , m;
    //includ si nodul curent
    din[ varf ] = v[ varf ];
    //iau fiecare copil al nodului curent si caut suma maxima in acel nod
    //il adaug la suma daca este pozitiv
    for( i = 0 ; i < nrm[ varf ] ; i++ ) {
      nod = list[ varf ][ i ];
      if( nod != tata )
        din[ varf ] += max( 0 , asmax( nod , n , varf ) );
    }
  }
  return din[ varf ];
}

int main() {
  int n , i , rez , a , b;
  FILE *fin = fopen( "asmax.in" , "r" );
  fscanf( fin , "%d" , &n );
  //citim valorile din fiecare nod
  for( i = 0 ; i < n ; i++ ) {
    fscanf( fin , "%d" , &v[ i ] );
    din[ i ] = NECALCULAT;
  }
  //citim muchiile
  for( i = 0 ; i < n - 1 ; i++ ) {
    fscanf( fin , "%d%d" , &a , &b );
    a--;
    b--;
    list[ a ][ nrm[ a ] ] = b;
    nrm[ a ]++;
    list[ b ][ nrm[ b ] ] = a;
    nrm[ b ]++;
  }
  fclose( fin );

  //cautam suma maxima
  rez = -INFINIT;
  for( i = 0 ; i < n ; i++ )
    rez = max( rez , asmax( i , n , -1 ) );

  FILE *fout = fopen( "asmax.out" , "w" );
  fprintf( fout , "%d" , rez );
  fclose( fout );
  return 0;
}