Pagini recente » Cod sursa (job #2862108) | Cod sursa (job #2755024) | Cod sursa (job #1381455) | Cod sursa (job #2502195) | Cod sursa (job #278607)
Cod sursa(job #278607)
#include<stdio.h>
#define max(a,b) (a>b?a:b)
FILE *fin=fopen("asmax.in","r"),
*fout=fopen("asmax.out","w");
int N,c[16005];
struct nod{int inf;nod* next;};
typedef nod* lista;
lista L[16005];
int smax[16005];
char viz[16005];
void dfs(int nod){
if(!L[nod]){
smax[nod]=max(0,c[nod]);
return;
}
for(lista p=L[nod];p;p=p->next)
if(viz[p->inf]==0){
viz[p->inf]=1;
dfs(p->inf);
}
smax[nod]=c[nod];
for(lista p=L[nod];p;p=p->next)
smax[nod]+=smax[p->inf];
smax[nod]=max(smax[nod],0);
}
int main(){
fscanf(fin,"%d",&N);
int max=-1000000000;
for(int i=1;i<=N;i++){
fscanf(fin,"%d",&c[i]);
max=max(max,c[i]);
}
for(int i=1;i<N;i++){
int x,y;
fscanf(fin,"%d %d",&x,&y);
lista aux=new nod;
aux->inf=x;aux->next=L[y];L[y]=aux;
aux=new nod;
aux->inf=y;aux->next=L[x];L[x]=aux;
}
if(max<0)
fprintf(fout,"%d\n",max);
else{
viz[1]=1;
dfs(1);
max=-1;
for(int i=1;i<=N;i++)
max=max(max,smax[i]);
fprintf(fout,"%d\n",max);
}
fclose(fin);
fclose(fout);
return 0;
}