Cod sursa(job #295969)

Utilizator drag0shSandulescu Dragos drag0sh Data 3 aprilie 2009 21:07:17
Problema Asmax Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <stdio.h>
#include <stdlib.h>

FILE *in=fopen("asmax.in","r"),*out=fopen("asmax.out","w");
#define INF 0x3f3f3f 
int *g[16001],n,v[16001],best[16001],max=-INF;



void citire(){
  int i,a,b;
  fscanf(in,"%d",&n);
  for(i=1;i<=n;i++){
    fscanf(in,"%d",&v[i]);
    g[i]=(int *)realloc(g[i],sizeof(int));
    g[i][0]=0;
  }
  for(i=n-1;i>0;i--){
    fscanf(in,"%d%d",&a,&b);
    g[a][0]++;
    g[a]=(int*)realloc(g[a],sizeof(int)*(g[a][0]+1));
    g[a][g[a][0]]=b;
    
    g[b][0]++;
    g[b]=(int*)realloc(g[b],sizeof(int)*(g[b][0]+1));
    g[b][g[b][0]]=a;
    
  }
  
}

void df(int nod,int t){
  best[nod]=v[nod];
  for(int i=1;i<=g[nod][0];i++)
    if(!best[i]&&i!=t){
      df(i,nod);
      if(best[i]>0) best[nod]+=best[i];
    }
  max=max>best[nod]?max:best[nod];
}

int main(){
  citire();
  df(1,0);
  int i;
  //  for(i=1;i<=3;i++)fprintf(out," %d) ",g[1][i]);
  fprintf(out,"%d",max);
  fclose(in);
  fclose(out);
  return 0;
}