题目链接: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 }