先放代码,有空再写方法。。
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100210;
struct edge{
int u , v , next;
edge(int a = 0, int b = 0){
u = a, v = b;
}
}e[2*maxn];
struct node{
int d1 , d2 , son1 , son2;
int f1 , f;
int ls;
}n[maxn];
int head[maxn] , num[maxn];
int N , Q , cnt;
void add(int u , int v){
e[cnt] = edge(u , v) , e[cnt].next = head[u] , head[u] = cnt++ , num[u]++;
e[cnt] = edge(v , u) , e[cnt].next = head[v] , head[v] = cnt++ , num[v]++;
}
void initial(){
for(int i = 0;i < maxn;i++){
head[i] = -1;
num[i] = 0;
n[i].d1 = maxn;
n[i].d2 = maxn;
n[i].son1 = maxn;
n[i].son2 = maxn;
n[i].f1 = 0;
n[i].f = 0;
n[i].ls = 0;
}
cnt = 0;
}
void readcase(){
scanf("%d%d" , &N , &Q);
int u , v;
for(int i = 0;i < N-1;i++){
scanf("%d%d" , &u , &v);
add(u , v);
}
}
void dfs1(int u , int f){
int h = head[u];
n[u].f = f;
while(h != -1){
int v = e[h].v;
if(v != f){
if(n[u].son1 > v){
n[u].son2 = n[u].son1;
n[u].son1 = v;
}else if(n[u].son2 > v){
n[u].son2 = v;
}
n[v].ls = n[u].ls+1;
dfs1(v , u);
int tem = min(v , n[v].d1);
if(tem < n[u].d1){
n[u].d2 = n[u].d1;
n[u].d1 = tem;
n[u].f1 = v;
}else if(tem < n[u].d2){
n[u].d2 =tem;
}
}
h = e[h].next;
}
}
void bfs(int X , int Y){
int k = X , tem = X;
if(n[X].ls > n[Y].ls){
while(n[k].ls > n[Y].ls){
int h = head[k];
while(h != -1 && n[e[h].v].ls >= n[k].ls){
h = e[h].next;
}
if(h != -1){
tem = k;
k = e[h].v;
}
}
}
//cout << k << "+" << tem << " " << n[X].ls << " + " << n[Y].ls << endl;
//cout << n[Y].son1 << " " << n[Y].son2 << " " << n[Y].d1 << " " << n[Y].d2 << " " << n[Y].f1 << endl;
if(n[X].ls <= n[Y].ls || k != Y){
printf("%d %d\n",n[Y].son1 , n[Y].d1);
}else{
if(n[Y].son1 == tem){
printf("%d ",min(n[Y].f,n[Y].son2));
}else{
printf("%d ",min(n[Y].f , n[Y].son1));
}
if(Y != 1){
printf("1\n");
}else{
if(n[Y].f1 == tem){
int ans = n[Y].d2;
ans = min(ans , n[Y].f);
//cout << n[n[Y].f].son1 << "f" << n[n[Y].f].son2 << endl;
if(n[n[Y].f].f1 != Y && n[Y].f <= N){
ans = min(ans , n[n[Y].f].son1);
}else if(n[Y].f <= N){
ans = min(ans , n[n[Y].f].son2);
}
printf("%d\n" , ans);
}else{
printf("%d\n" , min(n[Y].f , n[Y].d1));
}
}
}
}
void computing(){
dfs1(1 , 0);
/*for(int i = 1;i <= N;i++){
cout << n[i].d1<< " + " << n[i].d2 << endl;
}*/
n[1].f = maxn;
int X , Y;
while(Q--){
scanf("%d%d" , &X , &Y);
if(num[Y] == 1){
printf("no answers!\n");
}else{
bfs(X , Y);
}
}
}
int main(){
int t;
cin >> t;
while(t--){
initial();
readcase();
computing();
cout << endl;
}
return 0;
}