AcWing 1220. 生命之树
原题链接
中等
作者:
戾儿
,
2021-03-29 20:19:23
,
所有人可见
,
阅读 296
(树形dp)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=100010,M=200020;
typedef long long LL;
LL f[N];//以N为根节点的树的集合(包括u) 属性:最大权值
int w[N],e[M],ne[M],h[N],idx;
void add(int a,int b)
{
e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
void dfs(int u,int father)
{
f[u]=w[u];
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==father) continue;// 防止回头,因为此时是以u为根,不能再往上爬
dfs(j,u);//计算f[j]
f[u]+=max(f[j],0LL);//用长整型的0
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i];
memset(h,-1,sizeof h);
for(int i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
add(a,b);add(b,a);
}
dfs(1,-1);//随意对某个点开始搜索
LL res=f[1];
for(int i=2;i<n;i++)
res=max(res,f[i]);
cout<<res<<endl;
return 0;
}