Cod sursa(job #361264)

Utilizator mgntMarius B mgnt Data 4 noiembrie 2009 12:53:38
Problema Asmax Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
using namespace std;

int const maxn= 16 * 1000;

typedef int A1 [ 2 * (maxn-1) ]; typedef int A2 [ 1 + maxn ];
typedef int A3 [ 2 + maxn ];     typedef int A4 [ maxn ];

A1 E,A; A2 V,D,P,L,M; A3 S; A4 Q;

int
main ( ) {
  int n,i,s,a,b,qi,qo,t,z,y;

  ifstream is ( "asmax.in" ) ;
  ofstream os ( "asmax.out" ) ;
  is >> n;
  y=-1;
  for ( i=1; n>=i; ++i ) {
    is >> V[i]; D[i]=0; L[i]=0;
    if ( y<V[i] ) { y=V[i]; }
  }
  if ( 0 >= y ) {
    os << y << endl;
    return 0;
  }

  s=2*(n-1);
  for ( i=0; s>i; ++i ) {
    is >> E[i]; ++ D[E[i]];
  }
  
  S[1]=0;
  for ( i=2; n>=i; ++i ) {
    P[i]=S[i]=S[-1+i]+D[-1+i];
  }
  S[1+n]=S[n]+D[n];

  for ( i=0; s>i; i+=2 ) {
    a=E[i]; b=E[1+i];
    A[P[a]++]=b; A[P[b]++]=a;
  }

  L[1]=1; Q[0]=1; qi=1; qo=0;
  while (qo<qi) {
    a=Q[qo++]; t=S[1+a];
    for ( i=S[a]; t>i; ++i ) {
      b=A[i];
      if ( 0 == L[b] ) {
        L[b]=1+L[a]; Q[qi++]=b;
      }
    }
  }

  y=0;
  --qo;
  while ( 0 <= qo ) {
    a=Q[qo--]; z=V[a]; t=S[1+a];
    for ( i=S[a]; t>i; ++i ) {
      b=A[i];
      if ( L[a]<L[b] ) {
        z += M[b];
      }
    }
    M[a]=(0<z)?z:0;
    if ( y<M[a] ) { y=M[a]; }
  }
  
  os << y << endl;
  return 0;  
}