题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607

首先如果k小于等于直径长度,那么答案为k−1。如果k大于直径长度,设直径长度为r,那么答案为r−1+(k−r)∗2。

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cstring>
  6. #include <queue>
  7. #include <vector>
  8. #define maxn 105000
  9. using namespace std;
  10.  
  11. const int INF = 0x3f3f3f;
  12.  
  13. vector<int> G[maxn];
  14. int N,M;
  15. int maxdeep,point;
  16. bool vis[maxn];
  17. void dfs(int u,int deep){
  18. if(maxdeep < deep){
  19. maxdeep = deep;
  20. point = u;
  21. }
  22. for(int i=;i<G[u].size();i++){
  23. int v = G[u][i];
  24. if(!vis[v]){
  25. vis[v] = true; //printf("u,v %d %d\n",u,v);jf
  26. dfs(v,deep+);
  27. }
  28. }
  29. }
  30.  
  31. int main()
  32. {
  33. //if(freopen("input.txt","r",stdin)== NULL) {printf("Error\n"); exit(0);}
  34.  
  35. int T;
  36. cin>>T;
  37. while(T--){
  38. cin>>N>>M;
  39. if(N == ){
  40. for(int i=;i<=M;i++){
  41. int K;
  42. scanf("%d",&K);
  43. printf("0\n");
  44. }
  45. continue;
  46. }
  47.  
  48. for(int i=;i<=N;i++) G[i].clear();
  49. for(int i=;i<=N-;i++){
  50. int a,b;
  51. scanf("%d %d",&a,&b);
  52. G[a].push_back(b);
  53. G[b].push_back(a);
  54. }
  55. memset(vis,,sizeof(vis));
  56. maxdeep = ; point = ;
  57. vis[] = true;
  58. dfs(,);
  59. memset(vis,,sizeof(vis));
  60. dfs(point,);
  61. for(int i=;i<=M;i++){
  62. int K;
  63. scanf("%d",&K);
  64. if(maxdeep >= K-) printf("%d\n",K-);
  65. else printf("%d\n",maxdeep + * (K - - maxdeep));
  66. }
  67. }
  68. }

hdu 4607 Park Visit (dfs)的更多相关文章

  1. HDU 4607 Park Visit (树的最长链)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  3. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

  4. 题解报告:hdu 4607 Park Visit(最长链)

    Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The par ...

  5. hdu 4607 Park Visit

    http://acm.hdu.edu.cn/showproblem.php?pid=4607 先求树的直径 方法:两遍bfs ,任选一点 a  求到a点最远的一点b ,然后 求到b点最远点 c 这样 ...

  6. HDU 4607 Park Visit (DP最长链)

    [题目]题意:N个城市形成一棵树,相邻城市之间的距离是1,问访问K个城市的最短路程是多少,共有M次询问(1 <= N, M <= 100000, 1 <= K <= N). [ ...

  7. HDU 4607 Park visit (求树的直径)

    解题思路: 通过两次DFS求树的直径,第一次以随意点作为起点,找到距离该点距离最远的点,则能够证明这个点一定在树的直径上,然后以该点为起点进行DFS得到的最长路就是树的直径. 最后的询问,假设K &l ...

  8. HDU 4607 Park Visit 树的最大直径

    题意: 莱克尔和她的朋友到公园玩,公园很大也很漂亮.公园包含n个景点通过n-1条边相连.克莱尔太累了,所以不能去参观所有点景点. 经过深思熟虑,她决定只访问其中的k个景点.她拿出地图发现所有景点的入口 ...

  9. hdu 4607 Park Visit(树上最长链)

    求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...

随机推荐

  1. [原创] SQLite数据库使用清单(上)

    1. 介绍 1.1 安装 访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件. 您需要下载 sqlite-shell-win32-*.zip 和 sqlite-dll-win3 ...

  2. Android 巧妙实现图片和文字上下布局或者左右布局

    最近去了一家新公司,然后开始做新的项目,看其代码发现了一个很巧妙的方法来实现图片在上面文字在下面的布局方式.只需要一个控件——RadioButton. 布局文件很简单,用来展示RadioBUtton的 ...

  3. Length 和 Width在矩形中的定义.

    Length is the longer or longest dimension of a rectangle (or even an object). Ref:http://mathforum.o ...

  4. 修改CMD命令窗口编码并保存方法

    我们经常出现的情况是命令行窗口乱码,默认的cmd窗口显示的中文是GBK编码,要是输出utf-8的就可能会乱码了,那么怎么修改呢. 打开的命令窗口,如果我们要修改成UTF8编码,输入命令: CHCP 6 ...

  5. csv文本编辑引号问题

    今天发现一个csv的一个问题,csv工具类对于引号默认有特殊的处理.我希望写出来的结果是 1,"1",1 原来的代码是 CsvWriter cw=new CsvWriter(&qu ...

  6. 【HOJ2430】【贪心+树状数组】 Counting the algorithms

    As most of the ACMers, wy's next target is algorithms, too. wy is clever, so he can learn most of th ...

  7. jquery的select元素和option的相关操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. highcharts实例教程二:结合php与mysql生成饼图

    上回我们分析了用highcharts结合php和mysql生成折线图的实例,这次我们以技术cto网站搜索引擎流量为例利用highcharts生成饼图. 饼图通常用在我们需要直观地显示各个部分所占的比例 ...

  9. python路径相关

    import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 将当 ...

  10. Linux查看端口号

    查看端口占用情况的命令:lsof -i 查看某一端口的占用情况: lsof -i:端口号 结束占用端口的进程:killall 进程名 也可使用命令: netstat -apn|grep <端口号 ...