10W个点的一棵树,边权为1

求访问K个点要走过的最小路程

BFS求出一条最长路以后,我们可以YY出其他的边都要重复走两次

树上的最长路可以从任意一点开始BFS求出这点的最大距离,再把终点设置为起点再做一次BFS

所以就判断K和最长路间的距离就行了 O(n) 算法

  1 #include <set>
  2 #include <map>
  3 #include <list>
  4 #include <cmath>
  5 #include <ctime>
  6 #include <deque>
  7 #include <queue>
  8 #include <stack>
  9 #include <bitset>
 10 #include <cstdio>
 11 #include <string>
 12 #include <vector>
 13 #include <cassert>
 14 #include <cstdlib>
 15 #include <cstring>
 16 #include <sstream>
 17 #include <fstream>
 18 #include <numeric>
 19 #include <iomanip>
 20 #include <iostream>
 21 #include <algorithm>
 22 #include <functional>
 23 using namespace std;
 24 //typedef long long LL;
 25 //typedef unsigned long long ULL;
 26 // typedef __int64 LL;
 27 // typedef unisigned __int64 ULL;
 28 #define EPS         1e-8
 29 #define MAXN        100005
 30 #define MAXE        200005
 31 #define INF         0x3f3f3f3f
 32 #define PI          acos(-1.0)
 33 #define MOD         1000000007
 34 #define max(a,b)    ((a) > (b) ? (a) : (b))
 35 #define min(a,b)    ((a) < (b) ? (a) : (b))
 36 #define max3(a,b,c) (max(max(a,b),c))
 37 #define min3(a,b,c) (min(min(a,b),c))
 38 #define mabs(a)     (((a) < 0) ? (-a) : (a))
 39 #define YES         cout<<"YES"<<endl;
 40 #define L(t)        (t << 1)
 41 #define R(t)        (t << 1 | 1)
 42 #define Mid(a,b)    ((a+b)>>1)
 43 #define lowbit(a)   (a&-a)
 44 #define FOR(a,b,c)  for(int a = b; a < c; a++)
 45 #define FOR2(a,b,c) for(int a = b; a <= c; a++)
 46 #define LOOP(a,b)   for(int lop = a; lop < b; lop++)
 47 #define LOOP2(a,b)  for(int lop = a; lop <= b; lop++)
 48 //int gcd(int a,int b){ return b?gcd(b,a%b):a; }
 49 //int lcm(int a,int b){ return a*b/gcd(a,b); }
 50 struct Edge
 51 {
 52     int u,v,w; // st,ed,value
 53     int next;
 54 }edge[MAXE];
 55 struct Point
 56 {
 57     int p;
 58     int dis;
 59     Point(int a,int b)
 60     {
 61         p = a;
 62         dis = b;
 63     }
 64 };
 65 int head[MAXN];
 66 bool vis[MAXN];
 67 int cnt ; // num of edge
 68 int n ; // num of point
 69 int m ;
 70 void add(Edge x)
 71 {
 72     edge[cnt].u = x.u;
 73     edge[cnt].v = x.v;
 74     edge[cnt].w = x.w;
 75     edge[cnt].next = head[x.u];
 76     head[x.u] = cnt++;
 77     edge[cnt].v = x.u;
 78     edge[cnt].u = x.v;
 79     edge[cnt].w = x.w;
 80     edge[cnt].next = head[x.v];
 81     head[x.v] = cnt++;
 82 }
 83 int endp;
 84 int bfs(int s)
 85 {
 86     int dis = -INF;
 87     queue<Point> q;
 88     Point p(s,0);
 89     q.push(p);
 90     vis[s] = true;
 91     while(!q.empty())
 92     {
 93         int u = q.front().p;
 94         int d = q.front().dis;
 95         if(d > dis)
 96         {
 97             dis = max(dis,d);
 98             endp = u;
 99         }
100         for(int i = head[u]; i != -1; i = edge[i].next)
101         {
102             if(!vis[edge[i].v])
103             {
104                 q.push(Point(edge[i].v,d+1));
105                 vis[edge[i].v] = true;
106             }
107         }
108         q.pop();
109     }
110     return dis;
111 }
112 int main()
113 {
114     // freopen("in.txt","r",stdin);
115     // freopen("out.txt","w",stdout);
116     // std::ios::sync_with_stdio(false);
117     int t;
118     scanf("%d",&t);
119     while(t--)
120     {
121         cnt = 0;
122         scanf("%d%d",&n,&m);
123         memset(vis,0,sizeof(vis));
124         memset(edge,0,sizeof(edge));
125         memset(head,-1,sizeof(head));
126         for(int i = 0 ; i < n-1 ; i++)
127         {
128             int a,b;
129             scanf("%d%d",&a,&b);
130             Edge E;
131             E.u = a;
132             E.v = b;
133             add(E);
134         }
135         int dis1 = bfs(1);
136         memset(vis,0,sizeof(vis));
137         int dis = bfs(endp);
138         for(int i = 0 ; i < m ; i++)
139         {
140             int k;
141             scanf("%d",&k);
142             if(k-1 <= dis) printf("%d\n",k-1);
143             else printf("%d\n",dis+2*(k-dis-1));
144         }
145     }
146     return 0;
147 }

转载于:https://www.cnblogs.com/Felix-F/p/3209585.html

HDU 4607 Park Visit HDU暑期多校1相关推荐

  1. hdu 4607 Park Visit 求树的直径

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

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

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

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

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

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

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

  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. 2019牛客暑期多校训练营(第五场)C generator 2 (BSGS)

    2019牛客暑期多校训练营(第五场)C generator 2 思路 x0=x0x_0 = x_0x0​=x0​ x1=a∗x0∗bx_1 = a * x_0 * bx1​=a∗x0​∗b x2=a∗ ...

  8. 2021牛客暑期多校训练营9

    2021牛客暑期多校训练营9 题号 题目 知识点 A A Math Challenge B Best Subgraph C Cells D Divide-and-conquer on Tree E E ...

  9. 2021牛客暑期多校训练营5

    2021牛客暑期多校训练营5 题号 题目 知识点 A Away from College B Boxes 概率 C Cheating and Stealing D Double Strings 线性d ...

最新文章

  1. VS2010使用Skin++
  2. mysql中的notin
  3. 25岁社招进阿里,从电商到有赞新零售,他仅1年就打开了马云一直想做的新领域!
  4. [python] shell模式下面写for循环
  5. AES加密算法动画演示
  6. HTML中的全局属性
  7. 【数理统计】概率论基础回顾
  8. canvas实现半圆环形进度条
  9. 计算机组成原理与接口技术 pdf,计算机组成原理与接口技术课件 7-Datapath(2).pdf...
  10. nlm算法matlab代码_遗传算法GA的MATLAB代码
  11. 正确的工作流程:我应该使用哪个OAuth 2.0流程?
  12. 安卓10省电还是费电_拍照成罪魁祸首 安卓十大耗电App排行公布
  13. orangepi自启动打开一个终端并且运行脚本
  14. linux 虚拟机采用NAT方式共享上网
  15. Java之ApiPost工具
  16. APM 、PX4, PIXHAWK
  17. 烽火计划项目成果-目录索引
  18. 2018主流台式计算机跑分,pu天梯图2018最新版2018电脑cpu处理器性能排行榜
  19. php开发岗前培训心得体会范文,岗前培训心得体会范文
  20. 我的信息化教学改革实践-“oao‘课堂

热门文章

  1. Blender:如何翻转UV
  2. 推荐阅读:《我在赶集网的两个月(完整版)》
  3. mybatis (高级映射 缓存 延迟加载)
  4. matlab开关电源仿真软件,做开关电源,一般用什么仿真软件?
  5. 多元线性回归公式推导及R语言实现
  6. cenos回到linux桌面快捷键,Centos桌面 快捷键
  7. 华为防火墙区域和地址规划:
  8. 优秀工程师应该具备哪些素质_优秀的工程师该具备什么能力?
  9. IOS获取UDID添加到开发者账号用来安装测试包
  10. SAP TR传输操作手册