hdu 4607 Park Visit

// dfs求树的直径
// 记录以 节点i为根的最长路径 以及最大深度
// 然后就 看 k的值了
#include <iostream> #include <algorithm> #include <queue> #include <vector> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define maxm 100010 #define maxn 1000110 struct Eg{ int to; int next; }E[maxm<<1]; int V[maxm],num; int vi[maxm]; void add(int u,int v){ E[num].to=v; E[num].next=V[u]; V[u]=num++; E[num].to=u; E[num].next=V[v]; V[v]=num++; } int ans; int dfs(int u){ vi[u]=true; int e,v; int max1=0,max2=0,tp; for(e=V[u];e!=-1;e=E[e].next){ v=E[e].to; if(vi[v]) continue; tp=dfs(v); //printf("=%d %d\n",u,tp); if(tp>max1){ max2=max(max1,max2); max1=tp; } else if(tp>max2) max2=tp; } ans=max(ans,max1+max2); return max1+1; } int main() { int T; int n,m; int i; int u,v,k; scanf("%d",&T); while(T--){ scanf("%d %d",&n,&m); num=0; ans=0; for(i=1;i<=n;i++) V[i]=-1,vi[i]=0; for(i=1;i<n;i++){ scanf("%d %d",&u,&v); add(u,v); } dfs(1); while(m--){ scanf("%d",&k); if(k<=ans+1) printf("%d\n",k-1); else printf("%d\n",ans+(k-ans-1)*2); } } return 0; }

 

你可能感兴趣的:(HDU)