【Luogu】P1122最大子树和(DFS,树上DP)
题目链接
感觉自己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)相关推荐
- Luogu P1122 最大子树和 树形DP
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
- 牛客网CSP-S提高组赛前集训营1题解(仓鼠的石子游戏 [博弈论] + 乃爱与城市的拥挤程度 [树上DP] + 小w的魔术扑克[dfs + 离线])
文章目录 T1:仓鼠的石子游戏 题目 题解 代码实现 T2:乃爱与城市拥挤程度 题目 题解 代码实现 T3:小w的魔术扑克 题目 题解 代码实现 T1:仓鼠的石子游戏 题目 仓鼠和兔子被禁止玩电脑,无 ...
- P3387 【模板】缩点 Tarjan强连通分量/树上dp
P3387 [模板]缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 首先,什么是强连通分量 极大强连通子图 叫做强连通分量 首先要明确, ...
- 洛谷 P1122 最大子树和 题解
题目:P1122 最大子树和 DP - 树形DP - dfs 这题的做法被题目名字给暴露了 设 f [ i ] f[i] f[i] 为以点 i i i 为根的子树中的最大子树和 设 j j j 为 i ...
- 【ZJOI2019】线段树【线段树上dp】【大讨论】
题意:有一个 [1,n][1,n][1,n] 的线段树和 mmm 个区间赋值操作,求任取一个操作的子集并按顺序在线段树上跑后线段树上有 lazy 标记的点的个数之和 模 998244353998244 ...
- bzoj2435: [Noi2011]道路修建 树上dp
点击打开链接 RE了一辈子... 思路:树上dp,直接dfs找到每个点v的子节点有多少, 那么对答案的贡献是 w*abs((n-size[v])-size[v]); RE代码: 1 #include ...
- LeetCode 549. 二叉树中最长的连续序列(树上DP)
文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉树,你需要找出二叉树中最长的连续序列路径的长度. 请注意,该路径可以是递增的或者是递减. 例如,[1,2,3,4] 和 [4,3,2,1] 都 ...
- 2019长安大学ACM校赛网络同步赛C LaTale (树上DP)
链接:https://ac.nowcoder.com/acm/contest/897/C 来源:牛客网 LaTale 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他 ...
- 算法提高——树上DP(树的直径)
文章目录 前言 一.什么是树的直径? 二.例题 三.树上DP 总结 前言 树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视. 一.什么是树的直径? 树上最远两点(叶子结点) ...
- 警卫站岗(树上dp)
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
最新文章
- centos 6 编译安装httpd-2.4
- 嵌入式软件开发的特点、设计流程、嵌入式软件的结构
- sidekiq安装及使用
- MyBatis代码生成器(逆向工程)MBG使用
- Office2013 分享
- linux 修改用户组_linux小白到大神的成长之路:linux系统用户组的管理!
- Windows Terminal 完全配置教程(主题以及启动设置)
- 将url参数字符串转成数组
- C++笔记-二维棋盘数组转邻接表(使用QTL)
- python---(6)函数
- MySQL回放_mysql回顾
- python 边缘计算_OpenEdge首页、文档和下载 - 边缘计算平台 - OSCHINA - 中文开源技术交流社区...
- Angular - - ng-focus、ng-blur
- SAP资产评估组名_SAP软件 财务月结步骤
- Windows 10开机Windows聚焦壁纸不更新解决方法
- 微信小程序picker选择器(下拉框)以及传值问题
- 阿里巴巴Xin公益大会揭示个人参与公益事业的力量
- 区域生长算法原理及实现
- 单文件PHP版视频解析源码(中间件)
- git从本地添加项目到远程仓库