P8625 题解
题目传送门 / 可能有更好的阅读体验
题意
对于一棵树,找到其点权和最大的一个连通分量(注意可以为空),输出这个连通分量的点权和。相似于 P1122。
思路:树形 dp
我们用
因为对于
最终答案即为
代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a[100005]; // 每个点的点权
long long dp[100005]; // 注意开 long long
vector<int> adj[100005]; // 邻接表存储
void dfs(int u, int fa) {
dp[u] = a[u];
for(int v : adj[u]) {
if(v == fa) continue;
dfs(v, u);
dp[u] += max(dp[v], 0ll);
}
// 状态转移方程
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1, u, v; i < n; i++) {
scanf("%d%d", &u, &v);
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(1, 0);
printf("%lld", max(*max_element(dp + 1, dp + n + 1), 0ll)); // 输出答案。
return 0;
}