hdu4607Park Visit(树的直径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607

先求出树的直径:

  从任意一点(一般取第一点)进行bfs,记录下边界a;

  再从a进行bfs,直到边界,记录下长度,即直径。

然后,如果输入不大于直径,直接输出即可,

  若大于直径,则除了直径上的点,其他要走的都要走一个来回,需要乘2

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #include<cstdio>
 6 using  namespace std;
 7 const int maxn=1e5+10;
 8 vector<int>node[maxn];
 9 int n , m;
10 int start,mm;
11 void dfs(int per,int fro,int len)
12 {
13     if(len>mm)
14     {
15         mm=len;
16         start=per;
17     }
18     for(int i=0;i<node[per].size();i++)
19         if(node[per][i]!=fro) dfs(node[per][i],per,len+1);
20 }
21 int main()
22 {
23     int t;
24     scanf("%d",&t);
25     while(t--)
26     {
27 
28        scanf("%d%d",&n,&m);
29          for(int i=0;i<=n;i++) node[i].clear();
30         int x,y;
31         for(int i=0;i<n-1;i++)
32         {
33            scanf("%d%d",&x,&y);
34             node[x].push_back(y);
35             node[y].push_back(x);
36         }
37         start=mm=0;
38         dfs(1,0,0);
39         mm=0;
40         dfs(start,0,0);
41 
42         int p;
43         for(int i=0;i<m;i++)
44         {
45             scanf("%d",&p);
46             if(p<=mm+1) printf("%d\n",p-1);
47             else printf("%d\n",mm+(p-mm-1)*2);
48         }
49     }
50 }

 

posted @ 2017-03-29 19:32  yijiull  阅读(146)  评论(0编辑  收藏  举报