Cod sursa(job #371693)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 6 decembrie 2009 08:06:36
Problema Asmax Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#define M 32001
#define N 16001
int val[N];
int p[N],urm[M],nod[M],cost[M];
int main ()
{freopen("asmax.in","r",stdin);
 freopen("asmax.out","w",stdout);
 int i,j,k,l,n,x,y,c,flag,s,max,vf;
 scanf("%d",&n);
 
 for (i=1;i<=n;i++)
 {scanf("%d",&val[i]);}
 
 for (i=0,vf=0;i<n-1;i++)
 {scanf("%d %d",&x,&y);
  c=val[x]+val[y];
  nod[++vf]=x;
  cost[vf]=c;
  urm[vf]=p[y];
  p[y]=vf;

  nod[++vf]=y;
  cost[vf]=c;
  urm[vf]=p[x];
  p[x]=vf;
 }
/*    printf("val: ");
 for (i=1;i<=n;i++)
  printf("%d ",val[i]);
 printf("\np:   ");
 for  (i=1;i<=n;i++)
  printf("%d ",p[i]);
 printf("\nurm: ");
 for (i=1;i<=vf;i++)
  printf("%d ",urm[i]);
 printf("\nnod: ");
 for (i=1;i<=vf;i++)
  printf("%d ",nod[i]);
 printf("\ncost:");
  for (i=1;i<=vf;i++)
 printf("%d ",cost[i]);
  printf("\n     ");
  */
 do
 {flag=0;
  for (i=1;i<=n;i++) //pentru fiecare nod
  {for (j=p[i];j;j=urm[j]) //pentru fiecare vecin al nodului
   {s=0;
    for (k=p[nod[j]];k;k=urm[k]) //pentru celelalte legaturi
    {if(nod[k]!=i)
     {s+=cost[k]-val[nod[j]];
     }
    }
    if(cost[j]<s+val[i]+val[nod[j]])
    {cost[j]=s+val[i]+val[nod[j]];
     flag=1;
    }
   }
  /* for (l=1;l<=vf;l++)
  printf("%d ",cost[l]);
  printf("\n     ");*/
  }
 }
 while(flag); //pana cand nu se mai modifica costurile
 max=0;
 for (i=0;i<=vf;i++)
 {if(max<cost[i])
  {max=cost[i];
  }
 }
 printf("%d",max);
  
 return 0;
}