【NOIP2012模拟10.27】祖孙询问
2016-09-03 14:08
281 查看
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。
题解
DFS序以及各种求LCA算法均可秒杀此题。
代码
已知一棵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。
题解
DFS序以及各种求LCA算法均可秒杀此题。
代码
type arr=record y,next:longint; end; var n,m,nm,n_1:longint; ls,h:array [0..40001] of longint; go:array [0..40001,0..20] of longint; e:array [0..80001] of arr; procedure add(o,p:longint); begin inc(nm); with e[nm] do begin y:=p; next:=ls[o]; ls[o]:=nm; end; inc(nm); with e[nm] do begin y:=o; next:=ls[p]; ls[p]:=nm; end; end; procedure init; var i,x,y:longint; begin nm:=0; readln(n); for i:=1 to n do begin readln(x,y); if y=-1 then n_1:=x else add(x,y); end; end; procedure dfs(x:longint); var i:longint; begin for i:=1 to 15 do begin if h[x]<(1 shl i) then break; go[x,i]:=go[go[x,i-1],i-1]; end; i:=ls[x]; while i>0 do with e[i] do begin if y<>go[x,0] then begin h[y]:=h[x]+1; go[y,0]:=x; dfs(y); end; i:=next; end; end; function LCA(x,y:longint):longint; var t,i:longint; begin if h[x]<h[y] then begin t:=x; x:=y; y:=t; end; t:=h[x]-h[y]; for i:=15 downto 0 do if (t and (1 shl i))<>0 then x:=go[x,i]; for i:=15 downto 0 do if go[x,i]<>go[y,i] then begin x:=go[x,i]; y:=go[y,i]; end; if x=y then exit(x); exit(go[x,0]); end; procedure main; var i,x,y,t:longint; begin dfs(n_1); readln(m); for i:=1 to m do begin readln(x,y); if x=y then writeln('0') else begin t:=LCA(x,y); if t=x then writeln('1') else if t=y then writeln('2') else writeln('0'); end; end; end; begin init; main; end.
相关文章推荐
- JZOJ 3056. 【NOIP2012模拟10.27】数字
- 高中OJ3056【NOIP2012模拟10.27】数字
- 【NOIP2012模拟10.27】比赛
- 3077. 【备战NOIP2012图论专项模拟试题】外星人入侵 (Standard IO)
- JZOJ3051. 【NOIP2012模拟10.25】单元格
- NOIP模拟10.27
- 10.27 noip模拟试题
- jzoj3082. 【NOIP2012模拟11.1】骰子游戏
- 3078. 【备战NOIP2012图论专项模拟试题】无线通讯网 (Standard IO)
- 【NOIP2012】寻宝 模拟
- 【模拟】【noip2012普及组】寻宝
- JZOJ 3053 【NOIP2012模拟10.25】旅行
- 【NOIP2012模拟11.8】斐波那契
- 【备战NOIP2012图论专项模拟试题】砍树 纪中3079 dfs
- 3079. 【备战NOIP2012图论专项模拟试题】砍树 (Standard IO)
- 【NOIP2012模拟10.29】排列 一题总结
- 【NOIP2012模拟10.6】购买
- 【NOIP2015模拟10.27】魔道研究
- JZOJ2936. 【NOIP2012模拟8.9】逐个击破(2017.9B组)
- 高中纪中OJ3077. 【备战NOIP2012图论专项模拟试题】外星人入侵 题解