Cod sursa(job #1661373)

Utilizator TincaMateiTinca Matei TincaMatei Data 23 martie 2016 20:32:36
Problema Asmax Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODURI 16000
#define NECALCULAT -1000000000

int din[ MAX_NODURI ] , v[ MAX_NODURI ];
struct LAdiacenta {
  int* vec;
  int top;
  int size;
}liste[ MAX_NODURI ];

void alocare( struct LAdiacenta *n ) {
  int *vechi;
  int i;
  n -> size = n -> size * 2;
  vechi = n -> vec;
  n -> vec = ( int* )malloc( sizeof( int ) * n -> size );
  for( i = 0 ; i < n -> size / 2 ; i++ )
    n -> vec[ i ] = vechi[ i ];
}

void add( struct LAdiacenta *n , int x ) {
  if( n -> top == n -> size )
    alocare( n );
  n -> vec[ n -> top ] = x;
  n -> top++;
}

void init( struct LAdiacenta *n ) {
  n -> top = 0;
  n -> size = 1;
  n -> vec = ( int* )malloc( sizeof( int ) );
}

//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 tata ) {
  //daca suma nu este calculata o calculam
  if( din[ varf ] == NECALCULAT ) {
    int i;
    //includ si nodul curent
    din[ varf ] = v[ varf ];
    for( i = 0 ; i < liste[ varf ].top ; i++ )
      if( liste[ varf ].vec[ i ] != tata )
        din[ varf ] += max( 0 , asmax( liste[ varf ].vec[ i ] , 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;
    init( &liste[ i ] );
  }

  //citim muchiile
  for( i = 0 ; i < n - 1 ; i++ ) {
    fscanf( fin , "%d%d" , &a , &b );
    a--;
    b--;
    add( &liste[ a ] , b );
    add( &liste[ b ] , a );
  }

  fclose( fin );

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

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