CodeForces - 1453E Dog Snacks(树形dp+贪心)
题目链接:点击查看
题目大意:给出一棵有根树,现在需要选择一个最小的 k 值,可以满足下列的 n 次操作:
- 起始时位于点 1(根节点)
- 每一步选择一个未被遍历的节点中,距离最近的,且必须满足此距离小于等于 k
- 跳到上述选择的点上去,然后重复操作 2,直到所有的点都被遍历过
- 回到点 1,需要满足这段距离也小于等于 k
问最小的 k 是多少
题目分析:一开始以为是二分+check,但是感觉check很难写,于是思考树形dp
类比于ccpc秦皇岛的那个树形dp,贪心去思考一下,对于一个普通的节点 u 来说,我们想要遍历完这个节点的子树后,让其停留的叶子结点 leaf 的深度越低越好,因为下一步就是需要从该叶子结点 leaf 跳到 fa[ u ] 然后再去 fa[ u ] 的另一颗子树或者 fa[ fa[ u ] ],所以这样贪心是可行的
更具体来说,对于点 u 的多个子树来说,假设这些子树都退化成了许多条链,那么第一次显然是跳到最深的那个叶子结点,然后回到次深的叶子结点,如此往复,最终停留在深度最低的那个叶子结点再跳回去
不过对于点 1 ,也就是根节点需要特判一下,因为他不需要往上跳,所以对于根节点来说,贪心策略和普通节点的策略截然相反,第一次先是跳到深度最浅的那个叶子结点,然后跳到次浅的叶子结点,最后跳到最深的叶子结点,最后再跳回到根节点
所以分两种情况维护最大值作为答案即可,期间需要维护 dp[ u ] ,代表以点 u 为根节点的子树中,深度最浅的叶子结点
- 根节点:
- 最后一次需要返回根节点的情况:最深的叶子结点的深度 - 根节点深度
- 次深的叶子结点跳到最深的叶子结点的那条链上:次深的叶子结点的深度 - 根节点深度 + 1
- 非根节点
- 最深的叶子结点跳到另外一棵子树的链上:最深的叶子结点的深度 - 当前节点深度 + 1
代码:
//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;vector<int>node[N];int dp[N],ans;void dfs(int u,int fa,int dep)
{vector<int>deep;for(auto v:node[u]){if(v==fa)continue;dfs(v,u,dep+1);deep.push_back(dp[v]);}sort(deep.begin(),deep.end());int sz=deep.size();if(sz==0)//叶子节点 dp[u]=dep;else if(u!=1)//普通节点 {dp[u]=deep[0];ans=max(ans,deep[sz-1]-dep+1);}else if(u==1)//根节点 {if(sz>0)//最长链要返回根节点 ans=max(ans,deep[sz-1]-dep);if(sz>1)//次长链要跳到最长链 ans=max(ans,deep[sz-2]-dep+1);}
}int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.ans.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);for(int i=1;i<=n;i++)node[i].clear();for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}ans=0;dfs(1,-1,0);printf("%d\n",ans);}return 0;
}
CodeForces - 1453E Dog Snacks(树形dp+贪心)相关推荐
- [Codeforces 814D] An overnight dance in discotheque 树形dp,贪心
题目链接 题解:这道题,首先可以发现,圆与圆关系只有内含与外离, 所以可以建立出一个树形结构, 每个圆的父亲是与这个圆半径相差最小且包含这个圆的圆, 这样,整个一张图形成了一个森林,可以将圆按半径排序 ...
- A. Parsa‘s Humongous Tree(树形DP + 贪心)
Problem - 1528A - Codeforces 两个玩家正在玩一个游戏.他们有一个整数1,2,...,n的排列组合(排列组合是一个数组,其中从1到n的每个元素正好出现一次).这个排列组合没有 ...
- 2020CCPC(秦皇岛) - Kingdom‘s Power(树形dp+贪心)
题目大意:给出一棵 n 个节点的有根树,点 1 为根节点,现在在根节点有无穷多个士兵,每一秒可以控制任意一个士兵向任意一个单位移动一步,士兵移动到的点会被永久占领,现在问最少需要经过多少秒,才能将所有 ...
- The Lost House POJ - 2057(树形dp+贪心 (双线最优子结构问题))
思路 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这 只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子 所要爬行 ...
- CodeForces - 1341D Nastya and Scoreboard(dp+贪心)
题目链接:点击查看 题目大意:给出 n 个二进制数字,1 ~ n 分别表示从最高位到最低位的数字,每个二进制数字的长度都为 7 ,分别表示相应位置是否被点亮 现在总共需要再点亮 k 个位置,问能否有一 ...
- [POI2014]FAR-FarmCraft 树形DP + 贪心思想
(感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...
- 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)
题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...
- 牛客 - 树上求和(贪心+树形dp)
题目链接:点击查看 题目大意:给出一棵树,现在要求给每条边赋上 0 ~ n - 1 的值,且不重复,规定每条路径 ( u , v ) 的权值和为其简单路径上的边权之和,而整棵树的权值和为 所有简单路径 ...
- HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)
题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...
最新文章
- matlab在曲线给命名,matlab 利用xlsread画图,怎么将一组excel数据导入,通过matlab作图...
- 强交变磁场下的AD转换数值的变化
- 移动终端app测试点总结
- Spring MVC 返回视图时添加的模型数据------POJO
- 用vim看代码的常用指令
- step-by-step多文件WEB批量上传(swfupload)的完美解决方案
- 移动端报表JS开发示例
- 一个AI玩57个游戏,DeepMind离真正「万能」的AGI不远了!
- python2多线程_python_并发编程——多线程2
- signature=fd45b8c9a90eebce5d855f07302ab4ee,Private Use Area
- RETINA 屏幕1px 边框实现
- 【食品加工技术】第四章 饮料生产技术 笔记
- stm32命名规范总结
- 云端是一个软件平台,拥有丰富的资源。在云端使用软件,无需安装,一点,下载,直接使用。
- 物理/逻辑CPU、Core、Thread等概念
- 部分经济学术语英文简写
- STM32CubeMX学习笔记(44)——USB接口使用(HID按键)
- Robocup2D入门笔记(2)——环境的配置与安装
- HDU 2197:本原串
- IOS证书制作,最简单的在线制作流程
热门文章
- dns服务器正则表达式验证,js如何对域名和ip进行校验?(正则表达式)
- 积木赛尔号机器人_【金福利】8月2日赛尔号大电影7:疯狂机器城会员充值动电影票!...
- python数学建模可视化_数学建模之流程图和数据可视化
- java 自定义反序列化_java – 使用类字段中指定的自定义反序列化器反序列化字符串...
- Nacos自定义 namespace与group配置
- 谈谈GIS三维渲染引擎
- 标记-整理(Mark-Compact)
- StrickyAssignor 分配策略
- ConcurrentHashMap的源码分析-tryPresize
- 用户关联角色操作-代码实现