1 条题解
-
0
用f[u]表示以u为根的子树的答案,并且要求必选u。对于u的子节点v,如果f[v]大于0,那么它就可以加入f[u]。最终答案为所有节点f值取最大值。
参考代码
#include <bits/stdc++.h> using namespace std; int n, a[100005]; long long f[100005], ans;//f[u]表示以u为根的子树的答案,并且要求必选u vector<int> g[100005]; void dfs(int u, int fa) { f[u] = a[u]; for(int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if(v == fa) continue; dfs(v, u); f[u] += max(f[v], 0ll); } } int main() { cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; for(int i = 1, u, v; i < n; i++) { cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs(1, 0); for (int i = 1; i <= n; i++) ans = max(ans, f[i]); cout << ans; return 0; }
- 1
信息
- ID
- 843
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 21
- 已通过
- 18
- 上传者