P1122 最大子树和

Posted pangbi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1122 最大子树和相关的知识,希望对你有一定的参考价值。

题意:给出一棵树,每个节点有一个权值,问如何剪枝能让剩下的这一颗树的权值最大

思路:建完树后,随便确立一个点为根,然后从这个点开始遍历

     在遍历到每个节点的时候,我们更新答案权值

        在对某一个节点进行操作的时候,假如他的子节点的权值小于0,则减去

          即:只需要加上大于0的子节点

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e4+10;
 4 int a[maxn];
 5 struct node
 6 {
 7     int v,nxt;
 8 }G[maxn<<1];
 9 int head[maxn];int num;
10 int siz[maxn];
11 void add(int u,int v)
12 {
13     G[++num].v=v;G[num].nxt=head[u];head[u]=num;
14 }
15 int ans;
16 void dfs(int u,int fa)
17 {
18     for(int i=head[u];i;i=G[i].nxt){
19         if(G[i].v==fa) continue;
20         dfs(G[i].v,u);
21         if(siz[G[i].v]>0)
22             siz[u]+=siz[G[i].v];
23     }
24     ans=max(ans,siz[u]);
25 }
26 int main()
27 {
28     int n;
29     scanf("%d",&n);
30     for(int i=1;i<=n;i++)
31         scanf("%d",&siz[i]);
32     for(int i=1;i<n;i++){
33         int u,v;
34         scanf("%d%d",&u,&v);
35         add(u,v);
36         add(v,u);
37     }
38     ans=a[1];
39     dfs(1,0);
40     printf("%d
",ans);
41     return 0;
42 }
View Code

 

以上是关于P1122 最大子树和的主要内容,如果未能解决你的问题,请参考以下文章

P1122 最大子树和

洛谷P1122 最大子树和 树形DP

P1122 最大子树和(树形dp)

P1122 最大子树和

Luogu P1122 最大子树和

P1122最大子树和(21.11.3)