题目描述

  有一棵树,你要从\(0\)号点开始走,你可以走\(m\)步,问你最多能经过多少个不同的点。

  \(n\leq 100\)

题解

  出题人的做法是DP(一个简单的树形DP),但是可以直接通过一次DFS做出来。

  先DFS整棵树,设\(d\)为所有点深度的最大值。

  若\(m<d\),那么显然走这条最长的链是最优的,答案为\(m+1\)

  否则我们可以先沿着这条链走到底,在这个过程中可以往其他的子树走,每花两步可以走到一个新的点,答案为\(\min(n,d+\lfloor\frac{m-d+1}{2}\rfloor)\)

  时间复杂度:\(O(n)\)

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. #include<utility>
  7. #include<cmath>
  8. #include<functional>
  9. using namespace std;
  10. typedef long long ll;
  11. typedef unsigned long long ull;
  12. typedef pair<int,int> pii;
  13. typedef pair<ll,ll> pll;
  14. void sort(int &a,int &b)
  15. {
  16. if(a>b)
  17. swap(a,b);
  18. }
  19. void open(const char *s)
  20. {
  21. #ifndef ONLINE_JUDGE
  22. char str[100];
  23. sprintf(str,"%s.in",s);
  24. freopen(str,"r",stdin);
  25. sprintf(str,"%s.out",s);
  26. freopen(str,"w",stdout);
  27. #endif
  28. }
  29. int rd()
  30. {
  31. int s=0,c;
  32. while((c=getchar())<'0'||c>'9');
  33. do
  34. {
  35. s=s*10+c-'0';
  36. }
  37. while((c=getchar())>='0'&&c<='9');
  38. return s;
  39. }
  40. void put(int x)
  41. {
  42. if(!x)
  43. {
  44. putchar('0');
  45. return;
  46. }
  47. static int c[20];
  48. int t=0;
  49. while(x)
  50. {
  51. c[++t]=x%10;
  52. x/=10;
  53. }
  54. while(t)
  55. putchar(c[t--]+'0');
  56. }
  57. int upmin(int &a,int b)
  58. {
  59. if(b<a)
  60. {
  61. a=b;
  62. return 1;
  63. }
  64. return 0;
  65. }
  66. int upmax(int &a,int b)
  67. {
  68. if(b>a)
  69. {
  70. a=b;
  71. return 1;
  72. }
  73. return 0;
  74. }
  75. int maxd;
  76. vector<int> g[110];
  77. void dfs(int x,int fa,int dep)
  78. {
  79. maxd=max(maxd,dep);
  80. for(auto v:g[x])
  81. if(v!=fa)
  82. dfs(v,x,dep+1);
  83. }
  84. int main()
  85. {
  86. open("chessbord");
  87. int n,m;
  88. scanf("%d%d",&n,&m);
  89. int x,y;
  90. for(int i=1;i<n;i++)
  91. {
  92. scanf("%d%d",&x,&y);
  93. x++;
  94. y++;
  95. g[x].push_back(y);
  96. g[y].push_back(x);
  97. }
  98. dfs(1,0,1);
  99. int ans;
  100. if(m<maxd)
  101. ans=m+1;
  102. else
  103. ans=min(n,maxd+(m-maxd+1)/2);
  104. printf("%d\n",ans);
  105. return 0;
  106. }

【CQOI2017】【BZOJ4813】小Q的棋盘 DFS的更多相关文章

  1. 【CQOI2017】小Q的棋盘

    题面 题解 根据题意,不回头是最好的(显然法) \(dfs\)找到最长链,设长度为\(\mathrm{L}\),然后分类讨论: 如果\(\mathrm{L} > m\),答案就是\(m + 1\ ...

  2. 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)

    [BZOJ4813][CQOI2017]小Q的棋盘(贪心) 题面 BZOJ 洛谷 题解 果然是老年选手了,这种题都不会做了.... 先想想一个点如果被访问过只有两种情况,第一种是进入了这个点所在的子树 ...

  3. [BZOJ4813][CQOI2017]小Q的棋盘(DP,贪心)

    4813: [Cqoi2017]小Q的棋盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 804  Solved: 441[Submit][Statu ...

  4. bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]

    4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...

  5. BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs

    BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs Description 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能 在有连线的格 ...

  6. 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告

    P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...

  7. 重庆OI2017 小 Q 的棋盘

    小 Q 的棋盘 时间限制: 1 Sec  内存限制: 512 MB 题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移 ...

  8. 小Q的棋盘 (贪心)

    小Q的棋盘 (贪心) 题目 洛谷传送门 做法 显然这是一棵树(这个就不多bb了,树的性质) 很容易发现一个性质,如果一条链走完,我们必须回头再走一次那条链(或一部分)才可以走到更多的点 所以为了减少这 ...

  9. 【CQOI2017】小Q的表格

    [CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...

随机推荐

  1. openlayer3相关扩展

    1 ol3扩展 http://viglino.github.io/ol-ext/ ,里面包含编辑-选择控件,字体,动画,canvas绘制等等实例 2 ol3空间拓扑关系库jsts,有jst衍生过来 h ...

  2. Xamarin 学习笔记 - Page(页面)

    本文翻译自CodeProject文章:https://www.codeproject.com/Articles/1226447/Xamarin-Notes-Xamarin-Forms-Pages 转载 ...

  3. C#检查字符串是否是合法的HTTP URL地址的代码

    在研发过程,把开发过程较好的一些内容片段记录起来,下面的内容是关于C#检查字符串是否是合法的HTTP URL地址的内容,应该是对各位有较大用处. protected string HTTPChecke ...

  4. 解决Android Studio编译后安装apk报错:Error while Installing APK

    刚开始玩 Android ,用Android studio  连接真机做测试,在虚拟机上没有问题,但是真机就会报错 检查了好多地方,最终发现了问题,网上的常规就不介绍了,大家自己去看别的帖子 手机方面 ...

  5. 数据库CRUD操作以及MyBatis的配置使用

    • 业务字段设计 • 数据库创建 • CRUD操作 • MyBatis集成 • 注解和XML定义 • ViewObject和DateTool • 首页开发     • 业务字段设计 实体: name: ...

  6. tofixed方法 四舍五入

    tofixed方法 四舍五入 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留2位小数,则表示为:toFixed(Num):但是其四舍五入的规则与数学中的 ...

  7. mysql备份与还原!

    一.备份常用操作基本命令 1.备份命令mysqldump格式 格式:mysqldump -h主机名  -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 2.备份M ...

  8. LeetCode算法题-Array Partition I(Java实现)

    这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...

  9. 记录基于VMware虚拟机, Linux7.2下外部主机访问配置

    systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动

  10. ThreadLocal的简单使用和实现原理

    我们先看以下代码,不用ThreadLocal会发生什么情况 package com.qjc.thread.threadLocal; import java.text.ParseException; i ...