Pagini recente » Cod sursa (job #1164473) | Cod sursa (job #2226442) | Cod sursa (job #1204156) | Cod sursa (job #523541) | Cod sursa (job #371693)
Cod sursa(job #371693)
#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;
}