HDU 4607 Park Visit(树的直径)】的更多相关文章

题目大意:给定一棵树,让求出依次访问k个点的最小花费,每条边的权值都为1. 思路:如果能一直往下走不回来,那么这个路径肯定是最小的,这就取决于给定的k,但是怎么确定这个能一直走的长度呢,其实这个就是树的直径,也叫作最长简单路径.找出来这个直径之后,只需和k比较一下就能确定走多少步.设直径为maxx, 如果maxx + 1== k的话,说明刚好不用回来走完最长的这个路,所以当k小于等于maxx + 1的时候就是k-1,当k大于maxx + 1的时候,除了要走完不用回来的路,肯定还要走那些用回来的,…
题意: 莱克尔和她的朋友到公园玩,公园很大也很漂亮.公园包含n个景点通过n-1条边相连.克莱尔太累了,所以不能去参观所有点景点. 经过深思熟虑,她决定只访问其中的k个景点.她拿出地图发现所有景点的入口都很特殊.所以她想选择一个入口,并找到一条最短的 路来参观k个景点.我们假设景点之间的距离为1. 解题思路:因为地图形状为树形,所以求树的最大直径.当k小于等于直径的时候输出k-1,当k大于直径的时候,因为访问了某一个景 需要返回直径所在的路径上,所以当k大于冷的时候结果为len-(k-len-1)…
http://acm.hdu.edu.cn/showproblem.php?pid=4607 先求树的直径 方法:两遍bfs ,任选一点 a  求到a点最远的一点b ,然后 求到b点最远点 c 这样 b和c之间的路径为 树的直径 然后讨论 假设直径上的点个数为 k   要访问的点个数为 v 1)如果v<=k 则可以直接在直径上参观  路径为 v-1 2)如果v>k 首先还是要走直径 但是 m=v-k  这m个点要到其他枝叶上访问 一共要花费 2*m 代码: #include<iostre…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ,ans = k-1: b:若k>=r+1,ans = r+(k-(r+1))*2: 代码: #include "stdio.h" #include "string.h&…
解题思路: 通过两次DFS求树的直径,第一次以随意点作为起点,找到距离该点距离最远的点,则能够证明这个点一定在树的直径上,然后以该点为起点进行DFS得到的最长路就是树的直径. 最后的询问,假设K <= D + 1则能够沿着直径走,距离为K  -  1, 假设K >= D + 1.则须要走直径旁边的分支,每訪问一个点距离为2(从直径到这个点,再返回到直径上). #include <iostream> #include <cstring> #include <cstd…
Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 523    Accepted Submission(s): 236 Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The par…
Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The park is beautiful - but large, indeed. N feature spots in the park are connected by exactly (N-1) undirected paths, and Claire is too tired to visit all…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先如果k小于等于直径长度,那么答案为k−1.如果k大于直径长度,设直径长度为r,那么答案为r−1+(k−r)∗2. #include <cstdio> #include <cmath> #include <algorithm> #include <iostream> #include <cstring> #include <queue&…
题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ,ans = k-1: b:若k>=r+1,ans = r+(k-(r+1))*2: #include<stdio.h> #include<string.h> #include<queue> using namespace std; #define inf 99999…
题目大意 给定一颗树,要求走过其中连续的k个点,使得步数最少 题解 每条边要么经过两次,要么一次,因为我们的目标就是使得走一次的边尽量的多,这样就转换成求树的直径了,求树的直径我用的是两次dfs,先随便从一个点开始dfs,找出以这个点为根距离它最远的结点,假设为s,然后再从s结点进行一个dfs,距离s结点最远的点与s点的距离就是树的直径(假设为d),最后判断一下k和树的直径的大小,如果k-1小于树的直径,那么直接输出k-1,否则答案就是d+(k-1-d)*2 代码: #include <iost…