祖孙询问
Description
已知一棵n個節點的有根樹。有m個詢問。每個詢問給出了一對節點的編號x和y,詢問x與y的祖孫關系。
Input
輸入第一行包括一個整數n表示節點個數。
接下來n行每行一對整數對a和b表示a和b之間有連邊。如果b是-1,那么a就是樹的根。
第n+2行是一個整數m表示詢問個數。
接下來m行,每行兩個正整數x和y。
Output
對于每一個詢問,輸出1:如果x是y的祖先,輸出2:如果y是x的祖先,否則輸出0。
Sample Input
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
Sample Output
1
0
0
0
2
Data Constraint
Hint
對于100%的.據,n,m≤40000,每個節點的編號都不超過40000。
.
.
.
.
.
.
分析
DFS遍歷樹,記錄每個點X的第一次訪問時間st[a]和最后一次訪問時間ed[a],若y在以X為根的子樹中,則一定有st[a]
程序:
while i>0 dobegindfs(v[i],dep+1);i:=next[i];end;inc(p);en[node]:=p; end;beginreadln(n);for i:=1 to n dobeginreadln(v[i],u[i]);if u[i]=-1 then root:=v[i] elsebeginnext[i]:=list[u[i]];list[u[i]]:=i;end;end;dfs(root,1);readln(m);for i:=1 to m dobeginreadln(a,b);if (st[b]<st[a])and(st[a]<en[a])and(en[a]<en[b]) then writeln(2) elseif (st[a]<st[b])and(st[b]<en[b])and(en[b]<en[a]) then writeln(1) else writeln(0);end; end.轉載于:https://www.cnblogs.com/YYC-0304/p/9499961.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 比赛
- 下一篇: 产生数(Floyd)