Cod sursa(job #622)

Utilizator pocaituDavid si Goliat pocaitu Data 11 decembrie 2006 16:42:51
Problema Asmax Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<fstream.h>
int val[16003],n,i,j,rad,urm[16003],p[16003],x,y,fiu[16003];//,frunza[163],viz[163];
int long v[16003],max;
int long det_max(int rad)
 {int x=0;
  v[rad]=val[rad];
  x=fiu[rad];
  while(x)
	{if(v[x]!=-10000)
	   {if(v[x]>=0)
		 v[rad]+=v[x];}
	 else if(det_max(x)>=0)
	   v[rad]+=v[x];
	 x=urm[x];
	 }
  return v[rad];
  }

int main()
{ifstream f("asmax.in");
ofstream g("asmax.out");

 f>>n;
 for(i=1;i<=n;i++)
   f>>val[i];
 for(i=1;i<=n-1;i++)
  {f>>x>>y;
   p[y]=x;
   if(!fiu[x])
	fiu[x]=y;
   else
	{x=fiu[x];
	 while(urm[x])
	  x=urm[x];
	 urm[x]=y;
	 }
  }
 for(i=1;i<=n;i++)
  v[i]=-10000;
 /*for(i=1;i<=n;i++)
  if(!fiu[i])
   frunza[++frunza[0]]=i;
 /*for(i=1;i<=n;i++)
	v[i]=val[i];

  for(i=1;i<=frunza[0];i++)
   {if(v[frunza[i]]>=0)
	v[p[frunza[i]]]+=v[frunza[i]];
	  if(!viz[p[frunza[i]]])
		{viz[p[frunza[i]]]=1;
		 frunza[++frunza[0]]=p[frunza[i]];
		 }
	}
							   */
 for(i=1;i<=n;i++)
  if(!p[i])
 	{rad=i;break;}
 det_max(rad);
 for(i=1,max=-1000000;i<=n;i++)
  if(v[i]>max)
   max=v[i];
 g<<max;
 g.close();
 return 0;
 }