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

  首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m。如果m>k+1,那么最长链上还有其他分支,来回走一遍,因此答案为2*m-k-1。。。求最长链可以DP,两次BFS或者DFS等。。

  1. //STATUS:C++_AC_453MS_3524KB
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. //#include <ext/rope>
  6. #include <fstream>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <numeric>
  10. #include <cstring>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <string>
  14. #include <vector>
  15. #include <bitset>
  16. #include <queue>
  17. #include <stack>
  18. #include <cmath>
  19. #include <ctime>
  20. #include <list>
  21. #include <set>
  22. #include <map>
  23. using namespace std;
  24. //using namespace __gnu_cxx;
  25. //define
  26. #define pii pair<int,int>
  27. #define mem(a,b) memset(a,b,sizeof(a))
  28. #define lson l,mid,rt<<1
  29. #define rson mid+1,r,rt<<1|1
  30. #define PI acos(-1.0)
  31. //typedef
  32. typedef __int64 LL;
  33. typedef unsigned __int64 ULL;
  34. //const
  35. const int N=;
  36. const LL INF=0x3f3f3f3f;
  37. const int MOD=,STA=;
  38. const LL LNF=1LL<<;
  39. const double EPS=1e-;
  40. const double OO=1e15;
  41. const int dx[]={-,,,};
  42. const int dy[]={,,,-};
  43. const int day[]={,,,,,,,,,,,,};
  44. //Daily Use ...
  45. inline int sign(double x){return (x>EPS)-(x<-EPS);}
  46. template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
  47. template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
  48. template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
  49. template<class T> inline T Min(T a,T b){return a<b?a:b;}
  50. template<class T> inline T Max(T a,T b){return a>b?a:b;}
  51. template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
  52. template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
  53. template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
  54. template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
  55. //End
  56.  
  57. struct Edge{
  58. int u,v;
  59. }e[N*];
  60. int first[N],next[N*],d[N];
  61. int Ca,T,n,m,mt;
  62.  
  63. void adde(int a,int b)
  64. {
  65. e[mt].u=a;e[mt].v=b;
  66. next[mt]=first[a];first[a]=mt++;
  67. e[mt].u=b;e[mt].v=a;
  68. next[mt]=first[b];first[b]=mt++;
  69. }
  70.  
  71. int bfs(int s)
  72. {
  73. int u,i,hig;
  74. mem(d,);
  75. d[s]=;
  76. queue<int> q;
  77. q.push(s);
  78. hig=-;
  79. while(!q.empty())
  80. {
  81. u=q.front();q.pop();
  82. for(i=first[u];i!=-;i=next[i]){
  83. if(!d[e[i].v]){
  84. d[e[i].v]=d[e[i].u]+;
  85. if(d[e[i].v]>hig){
  86. hig=d[e[i].v];
  87. T=e[i].v;
  88. }
  89. q.push(e[i].v);
  90. }
  91. }
  92. }
  93. return hig;
  94. }
  95.  
  96. int main()
  97. {
  98. // freopen("in.txt","r",stdin);
  99. int i,j,a,b,hig;
  100. scanf("%d",&Ca);
  101. while(Ca--)
  102. {
  103. scanf("%d%d",&n,&m);
  104. mem(first,-);mt=;
  105. for(i=;i<n;i++){
  106. scanf("%d%d",&a,&b);
  107. adde(a,b);
  108. }
  109. bfs();
  110. hig=bfs(T);
  111.  
  112. while(m--){
  113. scanf("%d",&a);
  114. if(a>hig){
  115. printf("%d\n",*a-hig-);
  116. }
  117. else printf("%d\n",a-);
  118. }
  119. }
  120. return ;
  121. }

HDU-4607 Park Visit bfs | DP | dfs的更多相关文章

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

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

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

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

  3. hdu 4607 Park Visit (dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先如果k小于等于直径长度,那么答案为k−1.如果k大于直径长度,设直径长度为r,那么答案为r− ...

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

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

  5. hdu 4607 Park Visit 求树的直径

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

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

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

  7. hdu 4607 Park Visit

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

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

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

  9. HDU 4607 Park Visit(树的直径)

    题目大意:给定一棵树,让求出依次访问k个点的最小花费,每条边的权值都为1. 思路:如果能一直往下走不回来,那么这个路径肯定是最小的,这就取决于给定的k,但是怎么确定这个能一直走的长度呢,其实这个就是树 ...

随机推荐

  1. spoj 95

    栈应用 ...... 水题 #include<cstdio> #include<cstdlib> #include<cstring> #include<alg ...

  2. C++11 FAQ中文版--转

    更新至英文版October 3, 2012 译者前言: 经过C++标准委员会的不懈努力,最新的ISO C++标准C++11,也即是原来的C++0x,已经正式发布了.让我们欢迎C++11! 今天获得St ...

  3. AAC ADTS AAC LATM 格式分析

    http://blog.csdn.net/tx3344/article/details/7414543# 目录(?)[-] ADTS是个啥 ADTS内容及结构 将AAC打包成ADTS格式 1.ADTS ...

  4. Linux防火墙iptables简明教程

    前几天微魔部落再次遭受到个别别有用心的攻击者的攻击,顺便给自己充个电,复习了一下linux下常见的防火墙iptables的一些内容,但是无奈网上的很多教程都较为繁琐,本着简明化学习的目的,微魔为大家剔 ...

  5. php Ajax 局部刷新

    php Ajax 局部刷新: HTML部分 </head> <body> <h1>Ajax动态显示时间</h1> <input type=&quo ...

  6. android系统平台显示驱动开发简要:LCD常用接口篇『二』

    平台信息:内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客 ...

  7. R12 - OM改进了对成本与收入确认的流程

    我们知道在企业经营活动中,根据财务制度的要求,对于收入与成本确认有很复杂的原则,这里就不去细讨论这些原则了,要了解的话可以看纵横四海的BLOG: 中也有,但11中是灰的. 这个科目什么时候发挥作用呢? ...

  8. one-to-many many-to-one配置解释

    one-to-many放在某个文件的配置中,表示这个文件是ONE的一方, 同样的many-to-one放在某个文件的配置中,表示这个文件是many的一方.  

  9. MYI 文件内容

    参考 http://blog.itpub.net/703656/viewspace-1018470/ 创建表结构 create table test(name char(20), age int, c ...

  10. JAVA并行框架学习之ForkJoin

    当硬件处理能力不能按照摩尔定律垂直发展的时候,选择了水平发展,多核处理器已经广泛应用.未来随着技术的进一步发展,可能出现成百上千个处理核心,但现有的程序运行在多核心处理器上并不能得到较大性能的提升,主 ...