#include <bitset>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#include <iterator>
#include <queue>
using namespace std;
typedef vector<int> VI;
typedef pair<int, int> PII;
const int maxn = 111111;
struct node {
int v, next;
node(int v = 0, int next = 0) :
v(v), next(next) {
}
} edge[maxn << 2];
int head[maxn], e;
void add_edge(int u, int v) {
edge[e] = node(v, head[u]);
head[u] = e++;
edge[e] = node(u, head[v]);
head[v] = e++;
}
bool vis[maxn];
int dis[maxn];
int q[maxn], front, rear;
int bfs(int s, int n) {
int i, v, u;
front = rear = 0;
q[rear++] = s;
memset(vis, false, sizeof(vis));
vis[s] = true;
dis[s] = 0;
while (front < rear) {
u = q[front++];
for (i = head[u]; ~i; i = edge[i].next) {
v = edge[i].v;
if (vis[v])
continue;
vis[v] = true;
dis[v] = dis[u] + 1;
q[rear++] = v;
}
}
int k = 1;
for (i = 2; i <= n; ++i)
if (dis[i] > dis[k])
k = i;
return k;
}
int main() {
int i, n, m, u, v;
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
memset(head, -1, sizeof(head));
e = 0;
for (i = 1; i < n; ++i) {
scanf("%d%d", &u, &v);
add_edge(u, v);
}
int k = bfs(1, n);
k = bfs(k, n);
int K;
while (m--) {
scanf("%d", &K);
if (K <= dis[k] + 1)
printf("%d\n", K - 1);
else
printf("%d\n", (dis[k]) + (K - (dis[k] + 1)) * 2);
}
}
return 0;
}
HDU 4607
最新推荐文章于 2020-01-08 10:02:45 发布