题目链接:点击查看

题目大意:给出一棵有根树,现在需要选择一个最小的 k 值,可以满足下列的 n 次操作:

  1. 起始时位于点 1(根节点)
  2. 每一步选择一个未被遍历的节点中,距离最近的,且必须满足此距离小于等于 k
  3. 跳到上述选择的点上去,然后重复操作 2,直到所有的点都被遍历过
  4. 回到点 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. 最后一次需要返回根节点的情况:最深的叶子结点的深度 - 根节点深度
    2. 次深的叶子结点跳到最深的叶子结点的那条链上:次深的叶子结点的深度 - 根节点深度 + 1
  2. 非根节点
    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+贪心)相关推荐

  1. [Codeforces 814D] An overnight dance in discotheque 树形dp,贪心

    题目链接 题解:这道题,首先可以发现,圆与圆关系只有内含与外离, 所以可以建立出一个树形结构, 每个圆的父亲是与这个圆半径相差最小且包含这个圆的圆, 这样,整个一张图形成了一个森林,可以将圆按半径排序 ...

  2. A. Parsa‘s Humongous Tree(树形DP + 贪心)

    Problem - 1528A - Codeforces 两个玩家正在玩一个游戏.他们有一个整数1,2,...,n的排列组合(排列组合是一个数组,其中从1到n的每个元素正好出现一次).这个排列组合没有 ...

  3. 2020CCPC(秦皇岛) - Kingdom‘s Power(树形dp+贪心)

    题目大意:给出一棵 n 个节点的有根树,点 1 为根节点,现在在根节点有无穷多个士兵,每一秒可以控制任意一个士兵向任意一个单位移动一步,士兵移动到的点会被永久占领,现在问最少需要经过多少秒,才能将所有 ...

  4. The Lost House POJ - 2057(树形dp+贪心 (双线最优子结构问题))

    思路 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这 只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子 所要爬行 ...

  5. CodeForces - 1341D Nastya and Scoreboard(dp+贪心)

    题目链接:点击查看 题目大意:给出 n 个二进制数字,1 ~ n 分别表示从最高位到最低位的数字,每个二进制数字的长度都为 7 ,分别表示相应位置是否被点亮 现在总共需要再点亮 k 个位置,问能否有一 ...

  6. [POI2014]FAR-FarmCraft 树形DP + 贪心思想

    (感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...

  7. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

  8. 牛客 - 树上求和(贪心+树形dp)

    题目链接:点击查看 题目大意:给出一棵树,现在要求给每条边赋上 0 ~ n - 1 的值,且不重复,规定每条路径 ( u , v ) 的权值和为其简单路径上的边权之和,而整棵树的权值和为 所有简单路径 ...

  9. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

最新文章

  1. matlab在曲线给命名,matlab 利用xlsread画图,怎么将一组excel数据导入,通过matlab作图...
  2. 强交变磁场下的AD转换数值的变化
  3. 移动终端app测试点总结
  4. Spring MVC 返回视图时添加的模型数据------POJO
  5. 用vim看代码的常用指令
  6. step-by-step多文件WEB批量上传(swfupload)的完美解决方案
  7. 移动端报表JS开发示例
  8. 一个AI玩57个游戏,DeepMind离真正「万能」的AGI不远了!
  9. python2多线程_python_并发编程——多线程2
  10. signature=fd45b8c9a90eebce5d855f07302ab4ee,Private Use Area
  11. RETINA 屏幕1px 边框实现
  12. 【食品加工技术】第四章 饮料生产技术 笔记
  13. stm32命名规范总结
  14. 云端是一个软件平台,拥有丰富的资源。在云端使用软件,无需安装,一点,下载,直接使用。
  15. 物理/逻辑CPU、Core、Thread等概念
  16. 部分经济学术语英文简写
  17. STM32CubeMX学习笔记(44)——USB接口使用(HID按键)
  18. Robocup2D入门笔记(2)——环境的配置与安装
  19. HDU 2197:本原串
  20. IOS证书制作,最简单的在线制作流程

热门文章

  1. dns服务器正则表达式验证,js如何对域名和ip进行校验?(正则表达式)
  2. 积木赛尔号机器人_【金福利】8月2日赛尔号大电影7:疯狂机器城会员充值动电影票!...
  3. python数学建模可视化_数学建模之流程图和数据可视化
  4. java 自定义反序列化_java – 使用类字段中指定的自定义反序列化器反序列化字符串...
  5. Nacos自定义 namespace与group配置
  6. 谈谈GIS三维渲染引擎
  7. 标记-整理(Mark-Compact)
  8. StrickyAssignor 分配策略
  9. ConcurrentHashMap的源码分析-tryPresize
  10. 用户关联角色操作-代码实现