用树形DP找到这颗树距离最远的两个点....对于一个询问K..若小于最远距离..显然只要走最远的这条边走K-1个边就行了..
当K大于了最远距离..就要去走其他的点...而去其他点必须再回到这个主线..所以要加上(最远距离上点总数-K)*2...
Program:
#include<iostream> #include<stack> #include<queue> #include<stdio.h> #include<algorithm> #include<string.h> #include<cmath> #define ll long long #define oo 1000000007 #define MAXN 100010 using namespace std; vector<int> Tree[MAXN]; int dis[MAXN],M; void dfs(int x,int f) { int i,m=Tree[x].size(); dis[x]=1; for (i=0;i<m;i++) if (Tree[x][i]!=f) { dfs(Tree[x][i],x); M=max(M,dis[x]+dis[Tree[x][i]]); dis[x]=max(dis[x],dis[Tree[x][i]]+1); } return; } int main() { int T,i,n,k; scanf("%d",&T); while (~scanf("%d%d",&n,&k)) { for (i=1;i<=n;i++) Tree[i].clear(); for (i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); Tree[x].push_back(y); Tree[y].push_back(x); } memset(dis,0,sizeof(dis)); M=0; dfs(1,0); while (k--) { int x; scanf("%d",&x); if (x<=M) printf("%d ",x-1); else printf("%d ",M-1+(x-M)*2); } } return 0; }