题目:Park Visit


题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1)

解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K<=m,那么答案就是K-1,否则就是(K-m)*2+m-1

找树中最长链方法是:

可以通过经典的O(n)的算法求出树的直径。做法是从任意一点开始DFS或者BFS一次求出一个最远的点,这是直径的一个端点;

再从这个最远点开始再次DFS或者BFS,再找到的最远点就是直径的另外一个端点。


#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N=200010;
int head[N],to[N],next[N],w[N];
int dis[N],que[N];
bool vis[N];
int edge,m,n;
void init()
{
memset(head,-1,sizeof(head));
edge=0;
}
void add(int u,int v,int c)
{
to[edge]=v,w[edge]=c,next[edge]=head[u],head[u]=edge++;
to[edge]=u,w[edge]=c,next[edge]=head[v],head[v]=edge++;
}
void bfs(int s)
{
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
int l,r,v,u;
l=r=0;
vis[s]=1;
dis[s]=0;
que[r++]=s;
while(r>l)
{
u=que[l++];
for(int i=head[u]; ~i; i=next[i])
{
if(!vis[v=to[i]])
{
vis[v]=1;
dis[v]=dis[u]+w[i];
que[r++]=v;
}
}
}
}
int treediameter(int s)
{
int u,maxl;
bfs(s);
maxl=0,u=s;
for(int i=1; i<=n; i++)
if(dis[i]>maxl)
u=i,maxl=dis[i];
bfs(u);
maxl=0;
for(int i=1; i<=n; i++)
if(dis[i]>maxl)
maxl=dis[i];
return maxl;
}
int main()
{
int u,v,d=1,t,i,j,x;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&m);
for(i=1;i<=n-1;i++)
{
scanf("%d%d",&u,&v);
add(u,v,1);
}
int ans=treediameter(1);
ans++;
while(m--)
{
scanf("%d",&x);
if(x<=ans) printf("%d\n",x-1);
else       printf("%d\n",(x-ans)*2+ans-1);
}
}
return 0;
}

HDU4607(求树中的最长链)相关推荐

  1. $Loj10155$ 数字转换(求树的最长链) 树形$DP$

    loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...

  2. 长链剖分:O(nlogn)预处理O(1)求kth祖先

    前言 一个长链剖分的小trick 问题 如题,数据范围大概10510^5105 思路 我们知道重链剖分是什么,即选择自己儿子中子树节点树最大的作为重儿子,其它儿子为轻儿子 而长链剖分则是选择儿子中子树 ...

  3. 有向图的强联通分量之:【求最长链】【求最长链的方案数(图论中的方案数DP)】【最长链和最大半联通子图 节点数相同】【最长链与最大半联通子图等价又不完全等价】

    注意了: 最长链与最大半联通子图是等价又不完全等价的. 最大半联通子图的节点数 会 与最长链的节点数相同, 但是边数的话,最大半联通子图还是会加进 两个点之间的所有边 但是本题的主要目的是求 最长链上 ...

  4. 中心城镇问题(长链剖分优化树形dp)

    problem 给定 nnn 个城市,n−1n-1n−1 条道路,形成一棵树.每座城市上的人口为 wiw_iwi​. 现要修建若干个中心城镇,满足任意两个中心城镇之间的距离严格大于 kkk. 最大化中 ...

  5. P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5904 题目大意 nnn个点的一棵树,求有多少个点对(i,j,k)(i,j,k)(i,j,k)使得这三个点距离相等 ...

  6. CF1009F-Dominant Indices【长链剖分】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1009F 题目大意 以1为根的一棵树,对于每个节点xxx求一个最小的kkk使得以xxx为根的子树中第kkk层的结 ...

  7. P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

    P3565 [POI2014]HOT-Hotels 参考题解 题目大意: 给定一棵树,在树上选 3 个点,要求两两距离相等,求方案数. 三个点树上两两距离为d存在下面两种情况 某个点三个子树(保证该点 ...

  8. 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)

    永琳需要协助紫解决异变! 在某个满月的夜晚,幻想乡的结界出现了异常,虽然目前还没有找到原因,不过有一点可以肯定的是,这次异变一定和满月有关.间隙妖怪紫在试图修复结界时需要永琳帮她排除满月产生的干扰,为 ...

  9. [COGS2652]秘术「天文密葬法」-长链剖分-01分数规划

    秘术「天文密葬法」 题目说明: 路径的长度是点数 所有整数都是正整数 已添加一句话题意 [题目描述] 永琳需要协助紫解决异变! 在某个满月的夜晚,幻想乡的结界出现了异常,虽然目前还没有找到原因,不过有 ...

最新文章

  1. 【计算机网络】第五章 数据链路层(3)
  2. kafka 同步提交 异步_腾讯游戏工程师分享:简单理解 Kafka 的消息可靠性策略
  3. encoder decoder 模型理解
  4. AI基础:提供pdf打包下载了!(更新了25集)
  5. Server SAN:弄潮儿云计算时代
  6. 【渝粤教育】国家开放大学2018年秋季 0538-21T社区护理 参考试题
  7. VirtuoZo数字摄影测量(二)——模型定向与核线影像生成
  8. 实际打印页码偏上_4个Excel打印小技巧,想怎么打就怎么打?
  9. MySQL数据库企业级应用实践(主从复制)
  10. 2018电工杯数学建模A题
  11. 【渝粤题库】陕西师范大学152112 网络信息检索与利用
  12. NLP关键词提取方法总结及实现
  13. 倾听社区的声音,但别被他们牵着鼻子走
  14. 北京数码视讯s905l固件_数码视讯Q6联通版S905L芯片第三方刷机免拆卡刷固件
  15. python 一等公民_Python中一等公民——函数
  16. 使用python将csv文件数据可视化
  17. 华硕服务器设置固态盘启动不了系统盘,华硕uefi引导启动不了系统安装系统安装...
  18. Armin Strom推出“致敬1”系列;卡西欧将发布紧凑型G-SHOCK | 知消
  19. 嵌入式虚拟化平台jailhouse踩坑笔记
  20. 智慧景区APP开发解决方案

热门文章

  1. 绕过网关访问图片上传并解决跨域问题
  2. 微服务调用组件Feign:简介以及搭建环境
  3. Response_案例1_重定向_特点
  4. 数组工具类Arrays
  5. linux相关函数,linux学习-信号相关函数
  6. lamp自动部署工具_salt实现lamp自动化部署
  7. STM32的ADC采集的引脚汇总
  8. DotNetTextBoxV3.0在线编辑器控件Ver3.4.1 Open Source开源版(附商业试用版下载)
  9. 51nod1237 最大公约数之和 V3
  10. VueJS ReactJS 如何?听听别人怎么说。