HDU - 4607 Park Visit (树的直径)
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 (树的直径)相关推荐
- HDU 4607 Park Visit(树的直径)
题目大意:给定一棵树,让求出依次访问k个点的最小花费,每条边的权值都为1. 思路:如果能一直往下走不回来,那么这个路径肯定是最小的,这就取决于给定的k,但是怎么确定这个能一直走的长度呢,其实这个就是树 ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 Claire and her little friend, ykwd, are travelli ...
- HDU 4607 Park Visit 两次DFS求树直径
两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R: ans = ...
- HDU 4607 Park Visit HDU暑期多校1
10W个点的一棵树,边权为1 求访问K个点要走过的最小路程 BFS求出一条最长路以后,我们可以YY出其他的边都要重复走两次 树上的最长路可以从任意一点开始BFS求出这点的最大距离,再把终点设置为起点再 ...
- hdu 4607 Park Visit(树上最长链)
求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...
- 【HDOJ】4607 Park Visit_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=4607 [报告] 根据题意,就是求给定一棵树上经过K个点的最短路径,可以从任意节点开始到任意节点结束. 很 ...
- hdu 4679 树的直径
1 /* 2 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 3 树的直径(Diameter)是指树上的最长简单路. 4 直径的求法:两遍BFS (or DFS) ...
- HDU - 7009 树上游走(树的直径+容斥)
题目链接:点击查看 题目大意:给一棵树,称一个点集 S 是好的当且仅当存在一个点,其到 S 中所有点的距离互不相同,求 |S| 的最大值和使得 |S| 最大的 S 的个数 题目分析:不难看出 ∣S∣| ...
- HDU - 4612 Warm up(边双缩点+树的直径)
题目链接:点击查看 题目大意:给出一个由n个点和m条边构成的无向图,现在允许加一条边,使得整张图中桥的数量最少,求最少的桥的数量 题目分析:因为是要求桥,所以直接用tarjan边双缩点,将原图转换成一 ...
最新文章
- R语言ggplot2可视化分面图、在分面图中的每个直方图中添加均值文本标签、添加均值红色竖线
- offsetwidth/offsetheight的区别
- 关于在unity中动态获取字符串后在InputField上进行判断的BUG
- django-路由传参-视图捕获URL的参数-位置传参-关键词传参
- [HTA] - HTML应用程序
- iOS链式动画、Spring动画,TimingFunction扩展
- 请千万不要在 JDK 7+ 中使用这个 JSON 包了!切记
- vscode :常用快捷操作
- strcmp函数原型 C语言
- cad如何导出jpg文件?
- 强制卸载Edge(Chromium内核版本)
- Mysql数据库内的索引操作【重点】
- CT图像重建简要介绍
- Bitmap图片去除白色背景
- “爱心助农”成绩单公布,淘宝何以成为最大舞台?
- [一亩三分地] 答题答案总结
- 微信公众号接入微软小冰
- 前端程序员应该去哪个城市发展?
- 光流传感器 定位精度_光流定位原理是什么??
- viz::viz3d报错_我可以在Excel中获得该Viz吗?
热门文章
- OS X 使用技巧——在Finder窗口标题栏上显示路径
- HTML5新特性之跨文档消息传输
- 如何在xcode中使用storyboard
- 向虚拟机发短信(android SMS 调试)
- 姑苏行(一) 虎丘山
- 【Spark Summit EU 2016】使用参数服务器在Spark上扩展因式分解机
- linux文件及文件夹权限
- 【转】使用oschina的git服务器
- 解决initializing java tooling(1%)
- [转]Maintain Control State in ASP.NET 2.0