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

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

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

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

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

 1 #include<stdio.h>
 2 #include<string.h>
 3
 4 const int MAXN=111111;
 5
 6 struct E{
 7     int v,next;
 8 }e[MAXN<<1];
 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=0;
21     memset(head,-1,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=0;
36     memset(vis,0,sizeof(vis));
37     vis[x]=1;
38     q[r].p=x;
39     q[r++].c=1;
40     while(l<r)
41     {
42         u=q[l].p;
43         c=q[l++].c;
44         for(i=head[u];i!=-1;i=e[i].next)
45         {
46             int v=e[i].v;
47             if(!vis[v]){
48                 vis[v]=1;
49                 q[r].p=v;
50                 q[r++].c=c+1;
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=1;i<n;i++)
67         {
68             scanf("%d%d",&u,&v);
69             add(u,v);
70             add(v,u);
71         }
72         u=BFS(1);
73         v=BFS(u);
74         for(i=0;i<m;i++)
75         {
76             scanf("%d",&w);
77             if(q[n-1].c>=w)
78                 printf("%d\n",w-1);
79             else
80                 printf("%d\n",(q[n-1].c-1)+(w-q[n-1].c)*2);
81         }
82     }
83     return 0;
84 }

View Code

转载于:https://www.cnblogs.com/zstu-abc/p/3220764.html

hdu 4607 Park Visit(树上最长链)相关推荐

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

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

  2. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 Claire and her little friend, ykwd, are travelli ...

  3. HDU - 4607 Park Visit (树的直径)

    http://acm.hdu.edu.cn/showproblem.php?pid=4607 题意 一颗n个顶点的树,现在只想访问其中k个,问最短路径长度为多少. 分析 首先,最短的路径当然是一条链. ...

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

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

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

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

  6. 1577 例题3 数字转换(LOJ10155) 约数计算 树上最长链(两次找最大深度)

    总目录 在线测评地址(ybt) 在线测评地址(LOJ) 发现竟然读不懂题.努力静下来,再读题,总算有了眉目. 4→3→1→74的约数,不包括本身,1,2,约数和是1+2=3, 3的约数,不包括本身,1 ...

  7. [树上最长链][tarjan][单调队列][环上前缀和] Jzoj P5905 黑暗之魂(darksoul)

    Description oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰在一张地图中探险.地图中有n个篝火(也就是存档点).在篝火处休息可以将生命值恢复满 ...

  8. hdu 2196(树的最长链)

    题意:输出从一颗树中所有结点出发可以走的最长的路. 思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案. 代码如下: 1 #include <stdio.h> 2 #inc ...

  9. 【HDOJ】4607 Park Visit_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4607 [报告] 根据题意,就是求给定一棵树上经过K个点的最短路径,可以从任意节点开始到任意节点结束. 很 ...

最新文章

  1. MapReduce: Simplified Data Processing on Large ...
  2. python与人工智能编程-最适合人工智能开发的5种编程语言,你知道几种?
  3. 微型计算机硬件及其应用,《微型计算机硬件软件及其应用例题习题集》.pdf
  4. max's java road
  5. 关于“心脏出血”漏洞(heartbleed)的理解
  6. 异步任务下载apk文件并弹出对话框提示当前进度,文件下载结束后弹出安装界面
  7. 【vsftpd】嵌入式linux简易配置vsftpd服务
  8. Android框架式编程之MVP架构
  9. oracle不属于集合操作,Oracle的几个集合操作
  10. Linux安全加固--系统相关
  11. python实现猜数字小游戏
  12. 实用机器人设计(二)-传感器
  13. Vue学习笔记之05-条件判断
  14. 深度学习:循环神经网络RNN
  15. nginx+uwsgi+django
  16. ns2 java_【NS2】用eclipse调试NS2(转载)
  17. NLP-自然语言处理入门(持续更新)
  18. vue-router
  19. 想学建模该从何开始?
  20. 2023软件测试最难求职季,哪些测试技能更容易拿到offer?

热门文章

  1. Seaborn调色板设置
  2. Spark SQL中StructField和StructType
  3. 用计算机测试生日,超准生日爱情配对测试
  4. Devtools下载添加到谷歌扩展程序
  5. 自己动手实现远程执行功能
  6. 计算机毕业设计JavaBS高校教师考勤系统(源码+系统+mysql数据库+lw文档)
  7. 微信小程序父子页面间得数据传递(对象或者数组)
  8. 【数据结构】链表 - Go 语言实现
  9. C语言中【变量】的存储类型共有4种类型
  10. 人工智能新目标——看懂视频