Cod sursa(job #129156)

Utilizator pishtymatei silviu pishty Data 28 ianuarie 2008 18:17:33
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
 #include <stdio.h>  
 #define N 16005  
 #define M 32005  
   
 int x[M], y[M], a[M], b[M];  
 int n, i, j, v[N], t[N], s[N], ps[N], pe[N], c[N], cs, cd;  
   
 void sort(int l, int r);  
   
 int main () {  
 freopen ("asmax.in", "r", stdin);  
 freopen ("asmax.out", "w", stdout);  
   
 scanf ("%d", &n);  
 v[0]=0; for (i=1;i<=n;i++) scanf ("%d", &v[i]);  
   
 for (i=0;i<2*(n-1);i+=2) { scanf ("%d%d", &x[i], &y[i]); x[i+1]=y[i]; y[i+1]=x[i]; }  
 x[2*(n-1)]=y[2*(n-1)]=n+1;  
 sort (0, 2*(n-1));  
   
 ps[0]=ps[1]=0; pe[0]=0;  
 for (i=1;x[i]<n;i++) if (x[i]!=x[i+1]) { pe[x[i]]=i; ps[x[i+1]]=i+1; }  
 pe[n]=i;  
   
 cs=cd=0;  
 c[0]=1;  
 t[0]=t[1]=1;  
 while (cs<=cd) {  
   for (i=ps[c[cs]];i<=pe[c[cs]];i++)  
     if (t[y[i]]==0) {  
       t[y[i]]=x[i];  
       cd++;  
       c[cd]=y[i]; }  
   cs++; }  
   
 for (i=n-1;i>0;i--) {  
   s[c[i]]+=v[c[i]];  
   if (s[c[i]]>0)  
     s[t[c[i]]]+=s[c[i]]; }  
 s[1]+=v[1];  
   
 cs=s[1];  
 for (i=2;i<=n;i++) if (cs<s[i]) cs=s[i];  
 printf ("%d\n", cs);  
   
 return 0;  
 }  
   
 void sort(int l, int r) {  
 int c, i, j, k;  
 if (l==r) return;  
 c=(l+r)/2;  
 sort(l, c);  
 sort(c+1, r);  
   
 i=l; j=c+1; k=l;  
 while (i<=c && j<=r)  
   if (x[i]<x[j]) {  
     b[k]=y[i];  
     a[k++]=x[i++]; }  
   else {  
     b[k]=y[j];  
     a[k++]=x[j++]; }  
   
 while (i<=c) { b[k]=y[i]; a[k++]=x[i++]; }  
 while (j<=r) { b[k]=y[j]; a[k++]=x[j++]; }  
   
 for (k=l; k<=r; k++) { x[k]=a[k]; y[k]=b[k]; } }