LCA(倍增)

时间:2023-03-09 07:38:09
LCA(倍增)
type arr=record v,nt:longint; end;
const maxn=; lx=;
var lt:array[..maxn] of longint;
eg:array[..maxn*] of arr;
d:array[..maxn] of longint;
g:array[..maxn,..lx] of longint;
n,i,x,y,a,b,sum:longint;
procedure swap(var a,b:longint);
var c:longint;
begin
c:=a; a:=b; b:=c;
end;
procedure add(x,y:longint);
begin
inc(sum); eg[sum].nt:=lt[x]; eg[sum].v:=y; lt[x]:=sum;
end;
procedure Tinit(x,fa:longint);
var i:longint;
begin
g[x,]:=fa; d[x]:=d[fa]+;
for i:= to lx do
g[x,i]:=g[g[x,i-],i-];
i:=lt[x];
while i<> do
begin
if eg[i].v<>fa then Tinit(eg[i].v,x);
i:=eg[i].nt;
end;
end;
function Tlca(x,y:longint):longint;
var dep,i:longint;
begin
if d[x]<d[y] then swap(x,y);
dep:=d[x]-d[y];
for i:= to lx- do
if dep and (<<i) > then
x:=g[x,i];
if x=y then exit(x);
for i:=lx- downto do
if g[x,i]<>g[y,i] then
begin
x:=g[x,i];
y:=g[y,i];
end;
exit(g[x][]);
end;
function Tdist(x,y:longint):longint;
begin
exit(d[x]+d[y]-d[Tlca(x,y)]*);
end;
begin
readln(n,a,b);
sum:=;
while not eof do
begin
read(x);
while not eoln do
begin
read(y);
add(x,y);
add(y,x);
end;
readln;
end;
Tinit(,);
writeln(Tlca(a,b));
writeln(Tdist(a,b));
end.