1 条题解

  • 0
    @ 2024-6-28 17:19:59

    用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
    上传者