Pagini recente » Cod sursa (job #2657403) | Cod sursa (job #1832947) | Cod sursa (job #1335371) | Cod sursa (job #99896) | Cod sursa (job #14481)
Cod sursa(job #14481)
#include <stdio.h>
#define FIN "asmax.in"
#define FOUT "asmax.out"
#define nmax 1<<14
#define FOR(i,a,b) for(i= (a); i<= (b); ++i)
int a[nmax][(1<<8)+100];
int c[nmax], v[nmax], MAX=-(1<<20), NEG, APP;
int s[nmax], n;
void DFS(int nod)
{
if(v[nod])
return ;
int i;
v[nod]=1;
++APP;
FOR(i,1,a[nod][0])
if(v[a[nod][i]]==0)
{
DFS(a[nod][i]);
if( s[a[nod][i]] > 0 )
{
s[nod] += s[a[nod][i]];
NEG=1;
}
}
s[nod]+= c[nod];
if( s[nod] > MAX)
MAX = s[nod];
if(APP>=n)
return ;
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
int i,x,y;
scanf("%i\n", &n);
FOR(i,1,n)
scanf("%i", &c[i]);
--n;
FOR(i,1,n)
{
scanf("%i%i", &x,&y);
a[x][++a[x][0]]=y;
a[y][++a[y][0]]=x;
}
++n;
FOR(i,1,n)
if(a[i][0]!=1)
{
DFS(1);
break;
}
if(NEG)
printf("%i\n", MAX);
else
{
MAX=c[1];
FOR(i,2,n);
if(c[i] > MAX)
MAX = c[i];
printf("%i\n", MAX);
}
return 0;
}