给定一个 二叉树(暑假每日一题 34)_LCA 个结点(编号 二叉树(暑假每日一题 34)_LCA_02)构成的二叉树,其根结点为 二叉树(暑假每日一题 34)_数据_03

进行 二叉树(暑假每日一题 34)_数据_04

树中所有边长均为 二叉树(暑假每日一题 34)_数据_03

输入格式
第一行包含一个整数 二叉树(暑假每日一题 34)_LCA_06,表示共有 二叉树(暑假每日一题 34)_LCA_06

每组数据第一行包含两个整数 二叉树(暑假每日一题 34)_DFS_08

接下来 二叉树(暑假每日一题 34)_LCA 行,每行包含两个整数,其中第 二叉树(暑假每日一题 34)_DFS_10 行的整数表示结点 二叉树(暑假每日一题 34)_DFS_10 的子结点编号。如果没有子结点则输出 ​​​−1​​。

接下来 二叉树(暑假每日一题 34)_数据_04

输出格式
每组测试数据输出 二叉树(暑假每日一题 34)_数据_04

数据范围
二叉树(暑假每日一题 34)_LCA_14
二叉树(暑假每日一题 34)_数据_15

输入样例:

1
8 4
2 3
4 5
6 -1
-1 -1
-1 7
-1 -1
8 -1
-1 -1
1 6
4 6
4 5
8 1

输出样例:

2
4
2
4

#include<iostream>

using namespace std;

const int N = 1010;

int n, m;
int d[N], p[N];
int l[N], r[N];

void dfs(int u, int depth){

d[u] = depth;
if(l[u] != -1) dfs(l[u], depth + 1);
if(r[u] != -1) dfs(r[u], depth + 1);
}

int get(int x, int y){

int res = 0;
while(x != y){
res++;
if(d[x] > d[y]) x = p[x];
else y = p[y];
}
return res;
}

int main(){

int t;
cin >> t;
while(t--){

cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> l[i] >> r[i];
if(l[i] != -1) p[l[i]] = i;
if(r[i] != -1) p[r[i]] = i;
}

dfs(1, 1);

while(m--){
int x, y;
cin >> x >> y;
cout << get(x, y) << endl;
}
}

return 0;
}