AcWing 1220. 生命之树
原题链接
中等
作者:
哈基咪
,
2020-10-07 20:40:32
,
所有人可见
,
阅读 416
//生命之树
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005,M=2*N;
//采取临接表的存储结构来存储树
typedef long long LL;
LL h[N],e[M],ne[M],idx,f[N];
LL n,score[N];
void add(LL a,LL b)
{
//加边函数
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
//更新dp数组的值采取dfs的方式来做,依次枚举每个结点
//为了重复枚举,设置father变量,避免向下找子结点的时候再返回去
void dfs(LL u,LL father)
{
f[u]=score[u];//先将u结点的值赋给fu
//遍历与u结点相连的结点
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j!=father)
{
dfs(j,u);
f[u]+=max(0LL,f[j]);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>score[i];
memset(h,-1,sizeof(h));
LL u,v;
for(int i=0;i<n-1;i++)
{
cin>>u>>v;
add(u,v),add(v,u);
}
dfs(1,-1);
LL res=f[1];
for(int i=2;i<=n;i++)
res=max(res,f[i]);
cout<<res<<endl;
return 0;
}