Cod sursa(job #1658788)

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

int v[ MAX_VARFURI ];
int din[ MAX_VARFURI ];
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 ) {
  //daca suma nu este calculata o calculam
  if( din[ varf ] == NECALCULAT ) {
    int i , nod;
    //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 < n - 1 ; i++ )
      if( muchii[ i ].a == varf || muchii[ i ].b == varf ) {
        nod = muchii[ i ].a + muchii[ i ].b - varf;
        muchii[ i ].a = muchii[ i ].b = -1;
        din[ varf ] += max( 0 , asmax( nod , n ) );
      }
  }
  return din[ varf ];
}

int main() {
  int n , i , rez;
  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" , &muchii[ i ].a , &muchii[ i ].b );
    muchii[ i ].a--;
    muchii[ i ].b--;
  }
  fclose( fin );

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

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