//大数组的定义最好不要写在函数里,这样会使函数栈控件不足
#include
#include
#include
#define M 1000//数组最大长度
int shu[M][M],xb[M][M],shs[M],qf[M],f[M][2];
int main()
{
int i,j,l,k,n,maxlev,s,x,a,b;
memset(shu,0,sizeof(shu));
memset(xb,0,sizeof(xb));
memset(shs,0,sizeof(shs));
memset(f,0,sizeof(f));
//1、建树
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&qf[i]);
l=k=1;
while(l&&k)
{
scanf("%d%d",&l,&k);
shs[l]=k;
xb[k][0]++;
xb[k][xb[k][0]]=l;
}
maxlev=-1;
for(i=1;i<=n;i++)
{
x=shs[i],s=1;
while(x!=0){s++;x=shs[x];}
shu[s][0]++;
shu[s][shu[s][0]]=i;
if(s>maxlev)maxlev=s;
}
//2、动态规划
for(i=maxlev;i>0;i--)
{
for(j=1;j<=shu[i][0];j++)
{
if(xb[shu[i][j]][0]==0)
{
f[shu[i][j]][0]=0;
f[shu[i][j]][1]=qf[shu[i][j]];
}
else
{
f[shu[i][j]][0]=0;
f[shu[i][j]][1]=qf[shu[i][j]];
for(k=1;k<=xb[shu[i][j]][0];k++)
{
a=f[xb[shu[i][j]][k]][0];b=f[xb[shu[i][j]][k]][1];
f[shu[i][j]][1] +=a;//如果要当前节点,则不能取下部节点
//如果不要当前节点,则可要可不要下部节点,取使得气氛值最大的方案
if(b>a)a=b;
f[shu[i][j]][0] +=a;
}
}//状态转移
}
}
s=0;
for(i=1;i<=shu[1][0];i++)//从树根获取最优方案
{
a=f[shu[1][i]][0];b=f[shu[1][i]][1];
if(b>a)a=b;
s+=a;
}
printf("最大气氛值:%d\n",s);
return 0;
}