#877. 祖孙询问
祖孙询问
题目描述
已知一棵 n 个节点的有根树。有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。
输入格式
输入第一行包括一个整数 n 表示节点个数; 接下来 n 行每行一对整数对 a 和 b 表示 a 和 b 之间有连边。如果 b 是 -1,那么 a 就是树的根; 第 n+2 行是一个整数 m 表示询问个数; 接下来 m 行,每行两个正整数 x 和 y,表示一个询问。
输出格式
对于每一个询问,若 x 是 y 的祖先则输出 1,若 y 是 x 的祖先则输出 2,否则输出 0。
样例
输入样例 1
10
234 -1
12 234
13 234
14 234
15 234
16 234
17 234
18 234
19 234
233 19
5
234 233
233 12
233 13
233 15
233 19
输出样例 1
1
0
0
0
2
输入样例 2
10
5 2
2 1
3 2
4 2
6 3
7 3
8 4
9 4
10 6
1 -1
10
1 2
2 1
3 7
7 3
4 8
8 4
5 10
10 5
9 10
10 9
输出样例 2
1
2
1
2
1
2
0
0
0
0
输入样例 3
20
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 4
10 5
11 5
12 6
13 6
14 7
15 7
16 8
17 8
18 9
19 9
20 10
1 -1
15
1 15
15 1
2 11
11 2
3 14
14 3
4 17
17 4
5 20
20 5
6 13
13 6
7 15
8 16
9 19
输出样例 3
1
2
1
2
1
2
1
2
1
2
1
2
1
1
1
提示
数据范围:1<=n,m<= 410^4,节点的编号都大于0但不超过 410^4。
思路:基于DFS序的时间戳进行父子节点的关系判断。 如果 in[u] < in[v] 且 out[u] >= out[v],那么节点 u 是节点 v 的祖先。 生成 DFS 序 O(n)。基于时间戳的单次查询 O(1),m次查询 O(m)。