#include<iostream>
#include<string.h>
#include<cstdlib>
#include<algorithm>
using namespace std;
int f[2][6010] , ch[6010][6010] , v[6010];
int search(bool sel,int n)
{
if(f[sel][n]) return f[sel][n];
if(!ch[n][0]) return sel ? v[n] : 0; //如果没有下属了,返回相应选或不选的快乐指数,(快1ms。。。(其实可能不必这么纠结于这1ms))
int i,j;
int tmp = (sel == 1) ? v[n] : 0;
if(sel)
{
for(i = 1; i <= ch[n][0]; i++)
{
tmp += search(0,ch[n][i]);
}
}
else
{
for(i = 1; i <= ch[n][0]; i++)
{
tmp += max(search(0,ch[n][i]) , search(1,ch[n][i]));
}
}
return f[sel][n] = tmp;
}
int main()
{
int *fa;
fa = (int*)malloc(sizeof(int)*6010);
memset(f,0,sizeof(f));
int n,i,j,k = 1;
cin>>n;
for(i = 1; i <= n; i++)
{
cin>>v[i];
}
for(i = 1; i < n; i++)
{
int p,c;
cin>>c>>p;
fa[c] = p;
ch[p][++ch[p][0]] = c;
}
while(fa[k] != 0) k = fa[k]; //从root开始
free(fa);
cout<<max(search(0,k) , search(1,k))<<endl;
}
其他都还好,最主要是 注意是从root节点开始(即 最大上司 开始)
用了12mb左右。。待优化
***************************************************************************************可供吐槽