Cod sursa(job #44175)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 30 martie 2007 22:20:53
Problema Asmax Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
# 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;
}