求树上最长链:两遍搜索。

第一次从树上任意点开始,最远点必然是某一条最长链上的端点u。

第二次从u开始,最远点即该最长链的另一端点。

先在最长链上走,不足再去走支链。

把询问数m错打成n,狠狠wa了一次= =

  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. const int MAXN=;
  5.  
  6. struct E{
  7. int v,next;
  8. }e[MAXN<<];
  9.  
  10. struct Q{
  11. int p,c;
  12. }q[MAXN];
  13.  
  14. int tol;
  15. int head[MAXN];
  16. int vis[MAXN];
  17.  
  18. void init()
  19. {
  20. tol=;
  21. memset(head,-,sizeof(head));
  22. }
  23.  
  24. void add(int u,int v)
  25. {
  26. e[tol].v=v;
  27. e[tol].next=head[u];
  28. head[u]=tol++;
  29. }
  30.  
  31. int BFS(int x)
  32. {
  33. int r,l,i;
  34. int u,c;
  35. r=l=;
  36. memset(vis,,sizeof(vis));
  37. vis[x]=;
  38. q[r].p=x;
  39. q[r++].c=;
  40. while(l<r)
  41. {
  42. u=q[l].p;
  43. c=q[l++].c;
  44. for(i=head[u];i!=-;i=e[i].next)
  45. {
  46. int v=e[i].v;
  47. if(!vis[v]){
  48. vis[v]=;
  49. q[r].p=v;
  50. q[r++].c=c+;
  51. }
  52. }
  53. }
  54. return u;
  55. }
  56.  
  57. int main()
  58. {
  59. int T,n,m,i;
  60. int u,v,w;
  61. scanf("%d",&T);
  62. while(T--)
  63. {
  64. scanf("%d%d",&n,&m);
  65. init();
  66. for(i=;i<n;i++)
  67. {
  68. scanf("%d%d",&u,&v);
  69. add(u,v);
  70. add(v,u);
  71. }
  72. u=BFS();
  73. v=BFS(u);
  74. for(i=;i<m;i++)
  75. {
  76. scanf("%d",&w);
  77. if(q[n-].c>=w)
  78. printf("%d\n",w-);
  79. else
  80. printf("%d\n",(q[n-].c-)+(w-q[n-].c)*);
  81. }
  82. }
  83. return ;
  84. }

hdu 4607 Park Visit(树上最长链)的更多相关文章

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

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

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

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

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

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

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

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

  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

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

  7. hdu 4607 Park Visit (dfs)

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

  8. HDU 4607 Park Visit HDU暑期多校1

    10W个点的一棵树,边权为1 求访问K个点要走过的最小路程 BFS求出一条最长路以后,我们可以YY出其他的边都要重复走两次 树上的最长路可以从任意一点开始BFS求出这点的最大距离,再把终点设置为起点再 ...

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

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

随机推荐

  1. python 基于小顶堆实现随机抽样

    起因:之前用蓄水池抽样,算法精简,但直观性很差. 所以这次采用了简单的,为没一个行,赋值一个随机值,然后取 最大的K个作为,随机样本. 基本思路:为每一个行(record,记录,实体) 赋一个rand ...

  2. Spring实现AOP的4种方式(转)

    转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定 ...

  3. 剑指offer--面试题10--相关

    题目一:判断一个整数是不是2的n次幂 实现大概如下: int main() { ; )) == ) //重要!! std::cout<<"YES!"<<st ...

  4. Java Socket 基础例子

    1.服务器端代码 package com.lanber.socket; import java.io.DataInputStream; import java.io.DataOutputStream; ...

  5. uva 11489

    简单博弈 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...

  6. [Unity3D+算法]一小时做个2048

    原地址:http://blog.csdn.net/dingxiaowei2013/article/details/36462749 048是继FlappyBird之后另一个比较热的轻量级的手游,简单易 ...

  7. unity UGUI动态字体显示模糊

    设置Unity中ttf文件的Character为Unicode,点击apply

  8. PHP中的抽象类与接口

    抽象类 php5支持抽象类和抽象方法.类前加 abstract, 此类就成为抽象类,无法被实例化,此类天生就是用来被继承的,给子类提供了一个类的模板; 类方法前加 abstract,是抽象方法,抽象方 ...

  9. 【mongoDB高级篇①】聚集运算之group,aggregate

    group 语法 db.collection.group({ key:{field:1},//按什么字段进行分组 initial:{count:0},//进行分组前变量初始化,该处声明的变量可以在以下 ...

  10. JAVA! static什么作用?

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...