树上求和

解题思路
模板题。
设
f
i
,
0
f_{i,0}
fi,0 表示第
i
i
i 个点不选的最大值,
f
i
,
1
f_{i,1}
fi,1 表示第
i
i
i 个点选的最大值。
d
f
s
dfs
dfs 跑图,回溯求和。
code
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int a[6010];
int f[6010][2];
int hd[6010],tot;
struct abc{
int to,nxt;
}b[12010];
void add(int x,int y)
{
b[++tot]=(abc){y,hd[x]};
hd[x]=tot;
}
void dfs(int x,int fa)
{
f[x][1]=max(a[x],0);
for(int i=hd[x];i;i=b[i].nxt)
{
int y=b[i].to;
if(y!=fa)
{
dfs(y,x);
f[x][1]+=max(f[y][0],0);
f[x][0]+=max(f[y][1],0);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
dfs(1,0);
printf("%d",max(f[1][0],f[1][1]));
}

这篇博客介绍了如何使用深度优先搜索(DFS)解决树上求和的问题。作者提供了详细的解题思路和代码实现,通过定义节点不选和选的最大值,递归遍历树的结构,计算每个节点的最大贡献。代码中展示了C++实现的模板,包括邻接表的构建和回溯求和的过程。
914

被折叠的 条评论
为什么被折叠?



