//f[n][0]表示以u为根节点,但不选u的最大快乐指数
//f[n][1]表示以u为根节点,并选择u的最大快乐指数
//这题要从树的底部开始遍历而不是从1开始线性遍历,所以使用dfs求
#include<bits/stdc++.h>
using namespace std;
const int N = 6007;
int e[N],ne[N],h[N],idx;
int f[N][N],ha[N];
int n,root;
bool is_root[N];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs(int u)
{
for(int i=h[u];i!=-1;i=ne[i])
{
int v=e[i];
dfs(v);
f[u][0]+=max(f[v][0],f[v][1]);//根节点不选,则子节点可选可不选
f[u][1]+=f[v][0];//根节点选,则子节点必不选
}
}
int main()
{
memset(h,-1,sizeof h);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&ha[i]);
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
is_root[a]=true;
add(b,a);
}
for(int i=1;i<=n;i++)
{
if(is_root[i]==false)
{
root=i;//求出根节点
break;
}
}
//初始化
for(int i=1;i<=n;i++)
f[i][1]=ha[i];
//状态转移方程
dfs(root);
//输出结果
cout<<max(f[root][0],f[root][1]);
return 0;
}
03-17
965
03-03
352
09-09
829
09-10
854
09-11
998