#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 100005;
const int inf = 0x3f3f3f3f;
int t , n , m , a , b , e , k;
int head[maxn] , dp[maxn] , dis[maxn] , vis[maxn];
struct T{
int u;
int v;
int next;
};
T edge[maxn << 4];
void init(){
e = 0;
memset(head , -1 , sizeof(head));
memset(dp , 0 , sizeof(dp));
}
void addedge(int u , int v){
edge[e].u = u;
edge[e].v = v;
edge[e].next = head[u];
head[u] = e ++;
return ;
}
void dfs(int u , int fa , int h){
if(head[u] == -1) {
dp[u] = 1;
return ;
}
int ans = 0;
int v;
for(int i = head[u] ; i != -1 ; i = edge[i].next){
v = edge[i].v;
if(v != fa){
dfs(v , u , h + 1);
if(ans < dp[v]){
ans = dp[v];
}
}
}
dp[u] = ans + 1;
dis[u] = h;
return ;
}
int main(){
scanf("%d" , &t);
while(t --){
init();
scanf("%d%d" , &n , &m);
for(int i = 0 ; i < n - 1 ; i ++){
scanf("%d%d" , &a , &b);
a --;
b --;
addedge(a , b);
addedge(b , a);
}
dfs(0 , -1 , 0);
int node;
int lld = -inf;
int lh = -inf;
for(int i = 0 ; i < n ; i ++){
if(lh < dis[i]){
lh = dis[i];
node = i;
}
}
memset(dp , 0 , sizeof(dp));
dfs(node , -1 , 0);
for(int i = 0 ; i < m ; i ++){
scanf("%d" , &k);
if(k < dp[node]){
printf("%d\n" , k - 1);
}
else{
printf("%d\n" , dp[node] - 1 + (k - dp[node]) * 2);
}
}
}
return 0;
}
hdu 4607 Park Visit (DFS)
最新推荐文章于 2021-03-28 21:19:39 发布