Pagini recente » Cod sursa (job #2845934) | Cod sursa (job #81300) | Cod sursa (job #1624804) | Cod sursa (job #2461635) | Cod sursa (job #44175)
Cod sursa(job #44175)
# include <stdio.h>
const long int MAXN=16000;
typedef struct NOD {long int val,ffiu,nfrate;};
NOD nod[MAXN+1];
long int n,rad,maxim=-100000000;
void add(long int a, long int b)
{
long int p=nod[a].ffiu;
if (nod[a].ffiu==0) nod[a].ffiu=b;
else
{
while (nod[p].nfrate) p=nod[p].nfrate;
nod[p].nfrate=b;
}
}
void citire()
{
int sel[MAXN+1]={0};
long int i,aa,bb;
FILE *f=fopen("asmax.in","r");
fscanf(f,"%ld",&n);
for (i=1;i<=n;i++) fscanf(f,"%ld",&nod[i].val);
for (i=1;i<=n-1;i++)
{
fscanf(f,"%ld%ld",&aa,&bb);
if (sel[aa]) add(aa,bb);
else add(bb,aa);
if (!sel[aa]&&!sel[bb]) rad=bb;
sel[aa]=sel[bb]=1;
}
fclose(f);
}
long int max(long int a, long int b) {if (a>b) return a; return b;}
void find_max(long int node,long int &maxg)
{
long int p=nod[node].ffiu;
long int maxl=nod[node].val,maxll;
while (p)
{
maxll=0;
find_max(p,maxll);
p=nod[p].nfrate;
if (maxll>0) maxl+=maxll;
}
maxim=max(maxl,maxim);
if (maxl>0) maxg+=maxl;
}
void scrie()
{
FILE *g=fopen("asmax.out","w");
fprintf(g,"%ld\n",maxim);
fcloseall();
}
int main()
{
citire();
long int max=0;
find_max(rad,max);
scrie();
return 0;
}