题目链接

感觉自己DP好烂啊   道道看题解

钦定1为根,DFS搜索子树权值。如果子树权值大于0就将当前节点加上子树权值,反之就把子树扔掉。最后在所有节点的权值中寻找最优解。

void dfs(int x,int fa){if(f[x]>0)    return;f[x]+=que[x];for(int i=head[x];i;i=edge[i].next){int to=edge[i].to;if(to==fa)    continue;dfs(to,x);if(f[to]>0)    f[x]+=f[to];}if(ans<f[x])    ans=f[x];
}

这就是DFS。第一行是个记忆化,如果f[x]已经被计算过返回。但我写错了……

然后 f[x]+=que[x]。因为f[x]是节点x及x子树的权值,如果不加上自己怎么行。

接下来是一个遍历,寻找自己所有的儿子节点。如果计算得出f[to]>0,那么说明这个子节点需要留着,因此f[x]+=f[to]

最后ans在所有f[x]中取得最优解。

代码如下

#include<cstdio>
#include<cctype>
inline long long read(){long long num=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')    f=-1;ch=getchar();}while(isdigit(ch)){num=num*10+ch-'0';ch=getchar();}return num*f;
}struct Edge{int next,to;
}edge[1000000];
int head[1000000],num;
inline void add(int from,int to){edge[++num]=(Edge){head[from],to};head[from]=num;
}int que[1000000];
int f[1000000];
int ans=-0x7fffffff;
void dfs(int x,int fa){if(f[x]>0)    return;f[x]+=que[x];for(int i=head[x];i;i=edge[i].next){int to=edge[i].to;if(to==fa)    continue;dfs(to,x);if(f[to]>0)    f[x]+=f[to];}if(ans<f[x])    ans=f[x];
}int main(){int n=read();for(int i=1;i<=n;++i)    que[i]=read();for(int i=1;i<n;++i){int from=read(),to=read();add(from,to);add(to,from);}dfs(1,1);printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/cellular-automaton/p/7497972.html

【Luogu】P1122最大子树和(DFS,树上DP)相关推荐

  1. Luogu P1122 最大子树和 树形DP

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  2. 牛客网CSP-S提高组赛前集训营1题解(仓鼠的石子游戏 [博弈论] + 乃爱与城市的拥挤程度 [树上DP] + 小w的魔术扑克[dfs + 离线])

    文章目录 T1:仓鼠的石子游戏 题目 题解 代码实现 T2:乃爱与城市拥挤程度 题目 题解 代码实现 T3:小w的魔术扑克 题目 题解 代码实现 T1:仓鼠的石子游戏 题目 仓鼠和兔子被禁止玩电脑,无 ...

  3. P3387 【模板】缩点 Tarjan强连通分量/树上dp

    P3387 [模板]缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 首先,什么是强连通分量 极大强连通子图 叫做强连通分量             首先要明确,         ...

  4. 洛谷 P1122 最大子树和 题解

    题目:P1122 最大子树和 DP - 树形DP - dfs 这题的做法被题目名字给暴露了 设 f [ i ] f[i] f[i] 为以点 i i i 为根的子树中的最大子树和 设 j j j 为 i ...

  5. 【ZJOI2019】线段树【线段树上dp】【大讨论】

    题意:有一个 [1,n][1,n][1,n] 的线段树和 mmm 个区间赋值操作,求任取一个操作的子集并按顺序在线段树上跑后线段树上有 lazy 标记的点的个数之和 模 998244353998244 ...

  6. bzoj2435: [Noi2011]道路修建 树上dp

    点击打开链接 RE了一辈子... 思路:树上dp,直接dfs找到每个点v的子节点有多少, 那么对答案的贡献是 w*abs((n-size[v])-size[v]); RE代码: 1 #include ...

  7. LeetCode 549. 二叉树中最长的连续序列(树上DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉树,你需要找出二叉树中最长的连续序列路径的长度. 请注意,该路径可以是递增的或者是递减. 例如,[1,2,3,4] 和 [4,3,2,1] 都 ...

  8. 2019长安大学ACM校赛网络同步赛C LaTale (树上DP)

    链接:https://ac.nowcoder.com/acm/contest/897/C 来源:牛客网 LaTale 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他 ...

  9. 算法提高——树上DP(树的直径)

    文章目录 前言 一.什么是树的直径? 二.例题 三.树上DP 总结 前言 树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视. 一.什么是树的直径? 树上最远两点(叶子结点) ...

  10. 警卫站岗(树上dp)

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

最新文章

  1. centos 6 编译安装httpd-2.4
  2. 嵌入式软件开发的特点、设计流程、嵌入式软件的结构
  3. sidekiq安装及使用
  4. MyBatis代码生成器(逆向工程)MBG使用
  5. Office2013 分享
  6. linux 修改用户组_linux小白到大神的成长之路:linux系统用户组的管理!
  7. Windows Terminal 完全配置教程(主题以及启动设置)
  8. 将url参数字符串转成数组
  9. C++笔记-二维棋盘数组转邻接表(使用QTL)
  10. python---(6)函数
  11. MySQL回放_mysql回顾
  12. python 边缘计算_OpenEdge首页、文档和下载 - 边缘计算平台 - OSCHINA - 中文开源技术交流社区...
  13. Angular - - ng-focus、ng-blur
  14. SAP资产评估组名_SAP软件 财务月结步骤
  15. Windows 10开机Windows聚焦壁纸不更新解决方法
  16. 微信小程序picker选择器(下拉框)以及传值问题
  17. 阿里巴巴Xin公益大会揭示个人参与公益事业的力量
  18. 区域生长算法原理及实现
  19. 单文件PHP版视频解析源码(中间件)
  20. git从本地添加项目到远程仓库

热门文章

  1. Qos拥塞避免原理与实验
  2. Linux异常进程kill无效的解决办法
  3. 使用tcpdump抓包工具来捕捉三次握手和四次挥手
  4. Linux学习(第十七周)
  5. activiti processEngineLifecycleListener使用
  6. Core Animation演示
  7. 无法创建 ActiveX 组件(转载)
  8. 熊猫烧香系列变种分析报告
  9. android strings.xml 特殊字符,android strings.xml 中的特殊字符转义
  10. Unity 发射子弹的两种方式