码迷,mamicode.com
首页 > 其他好文 > 详细

P1122 最大子树和

时间:2020-03-24 21:35:30      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:int   技术   name   onclick   clu   这一   printf   ace   大于   

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

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

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

        在对某一个节点进行操作的时候,假如他的子节点的权值小于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\n",ans);
41     return 0;
42 }
View Code

 

P1122 最大子树和

标签:int   技术   name   onclick   clu   这一   printf   ace   大于   

原文地址:https://www.cnblogs.com/pangbi/p/12562207.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!