Pagini recente » Cod sursa (job #1947501) | Cod sursa (job #46297) | Cod sursa (job #113187) | Cod sursa (job #399549) | Cod sursa (job #2311)
Cod sursa(job #2311)
#include <stdio.h>
#define N_MAX 16001
int n,val[N_MAX],leg[N_MAX],nd[N_MAX],c[N_MAX],cap=1,coada=0;
struct nod{
int nr;
nod *urm;
}*v[N_MAX];
void adaugare(int i,int nr){
nod *p;
p=new nod;
p->urm=v[i];
p->nr=nr;
v[i]=p;
}
void citire(){
int h,nr;
FILE *fin=fopen("asmax.in","r");
fscanf(fin,"%d\n",&n);
for (int i=1;i<=n;i++)
fscanf(fin,"%d",&val[i]);
for (int i=1;i<n;i++){
fscanf(fin,"%d %d",&h,&nr);
adaugare(h,nr);
adaugare(nr,h);
leg[h]++;
leg[nr]++;
}
fclose(fin);
for (int i=1;i<=n;i++){
if (leg[i]==1){
c[++coada]=i;
}
}
}
void prelucrare(){
nod *j;
while (cap!=(coada+1)){
for (j=v[c[cap]];j!=NULL;j=j->urm)
if (leg[j->nr]>0){
if (val[j->nr]+val[c[cap]]>val[j->nr]){
val[j->nr]+=val[c[cap]];
}
leg[j->nr]--;
leg[c[cap]]--;
if (leg[j->nr]==1){
coada=(coada+1)%N_MAX;
c[coada]=j->nr;
}
}
cap++;
}
}
void afisare(){
FILE *fout=fopen("asmax.out","w");
int max=-16000001;
for (int i=1;i<=n;i++)
if (max<val[i])
max=val[i];
fprintf(fout,"%d\n",max);
fclose(fout);
}
int main(){
citire();
prelucrare();
afisare();
return 0;
}