http://acm.hdu.edu.cn/showproblem.php?pid=4607

题意

一颗n个顶点的树,现在只想访问其中k个,问最短路径长度为多少。

分析

首先,最短的路径当然是一条链。那么我们需要求树的直径。求法:先从任意一点dfs到最深处v,再以v为根深搜,得到的最长路径便是树的直径。

若k小于等于直径,那么这k个顶点肯定是处于直径路径上最优,此时答案为k-1。

若k大于直径,即需要走不在直径上的点。根据大量实践发现,每个不在直径上的点对答案的贡献都是2。因此最终答案就是k-1+(k-d)*2

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int N = 1e6+10;
//const int MAXN = 210;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1000000007;
int T;
void testcase(){printf("Case #%d: ",++T);
}
const int MAXN = 1e5+5;
const int MAXM = 30;struct Edge{int to,nxt;
}edge[MAXN<<1];int n,m,cnt,head[MAXN];
int dis[MAXN];void init(){cnt=0;mset(head,-1);
}
void addedge(int u,int v){edge[cnt].to=v;edge[cnt].nxt=head[u];head[u]=cnt++;
}void DFS(int u){for(int i=head[u];i!=-1;i=edge[i].nxt){int v=edge[i].to;if(dis[v]==-1){dis[v]=dis[u]+1;DFS(v);}}
}int main(){
#ifdef LOCALfreopen("in.txt","r",stdin);
#endif // LOCALint t;scanf("%d",&t);while(t--){init();scdd(n,m);int u,v;for(int i=1;i<n;i++){scdd(u,v);addedge(u,v);addedge(v,u);}mset(dis,-1);dis[1]=0;DFS(1);int len=0;for(int i=1;i<=n;i++)if(dis[i]>len){len=dis[i];u=i;}mset(dis,-1);dis[u]=0;DFS(u);len=0;for(int i=1;i<=n;i++)if(dis[i]>len)len=dis[i];len++;int k;while(m--){scanf("%d",&k);if(len>=k)cout<<k-1<<endl;elsecout<<(len-1)+(k-len)*2<<endl;}}return 0;
}

转载于:https://www.cnblogs.com/fht-litost/p/9281827.html

HDU - 4607 Park Visit (树的直径)相关推荐

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

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

  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 两次DFS求树直径

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

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

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

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

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

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

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

  7. hdu 4679 树的直径

    1 /* 2 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 3 树的直径(Diameter)是指树上的最长简单路. 4 直径的求法:两遍BFS (or DFS) ...

  8. HDU - 7009 树上游走(树的直径+容斥)

    题目链接:点击查看 题目大意:给一棵树,称一个点集 S 是好的当且仅当存在一个点,其到 S 中所有点的距离互不相同,求 |S| 的最大值和使得 |S| 最大的 S 的个数 题目分析:不难看出 ∣S∣| ...

  9. HDU - 4612 Warm up(边双缩点+树的直径)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边构成的无向图,现在允许加一条边,使得整张图中桥的数量最少,求最少的桥的数量 题目分析:因为是要求桥,所以直接用tarjan边双缩点,将原图转换成一 ...

最新文章

  1. R语言ggplot2可视化分面图、在分面图中的每个直方图中添加均值文本标签、添加均值红色竖线
  2. offsetwidth/offsetheight的区别
  3. 关于在unity中动态获取字符串后在InputField上进行判断的BUG
  4. django-路由传参-视图捕获URL的参数-位置传参-关键词传参
  5. [HTA] - HTML应用程序
  6. iOS链式动画、Spring动画,TimingFunction扩展
  7. 请千万不要在 JDK 7+ 中使用这个 JSON 包了!切记
  8. vscode :常用快捷操作
  9. strcmp函数原型 C语言
  10. cad如何导出jpg文件?
  11. 强制卸载Edge(Chromium内核版本)
  12. Mysql数据库内的索引操作【重点】
  13. CT图像重建简要介绍
  14. Bitmap图片去除白色背景
  15. “爱心助农”成绩单公布,淘宝何以成为最大舞台?
  16. [一亩三分地] 答题答案总结
  17. 微信公众号接入微软小冰
  18. 前端程序员应该去哪个城市发展?
  19. 光流传感器 定位精度_光流定位原理是什么??
  20. viz::viz3d报错_我可以在Excel中获得该Viz吗?

热门文章

  1. OS X 使用技巧——在Finder窗口标题栏上显示路径
  2. HTML5新特性之跨文档消息传输
  3. 如何在xcode中使用storyboard
  4. 向虚拟机发短信(android SMS 调试)
  5. 姑苏行(一) 虎丘山
  6. 【Spark Summit EU 2016】使用参数服务器在Spark上扩展因式分解机
  7. linux文件及文件夹权限
  8. 【转】使用oschina的git服务器
  9. 解决initializing java tooling(1%)
  10. [转]Maintain Control State in ASP.NET 2.0