Pagini recente » Cod sursa (job #832406) | Cod sursa (job #76711) | Cod sursa (job #1320117) | Cod sursa (job #1631953) | Cod sursa (job #622)
Cod sursa(job #622)
#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;
}