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 }
以上是关于P1122 最大子树和的主要内容,如果未能解决你的问题,请参考以下文章