You are on page 1of 3

THUT TON LCA (Least Common Ancester)

LCA(u,v) tm t tin chung gn nht ca 2 nh u v v trong cy cho trc.


V d: Cho cy nh hnh sau

1
2
4

12

11
15

14

16

10

13

17

LCA(14,16)=11
LCA(4,8)=1
LCA(17,12)=9
Thut ton LCA(u,v) nh sau
+ Gi Cha[i] l cha ca nh i trong cy. Trong v d trn gi tr ca mng Cha l
(0, 1, 1, 2, 2, 2, 3, 3, 6, 6, 9, 9, 11, 13, 11, 15, 11)
Trong nt 1 l nt gc nn khng c cha
+ Gi D[i] l cao ca nt th i tnh t gc. Trong v d trn gi tr ca mng D l
(1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6, 7, 6, 7, 6)
Gi tr ca mng D c tnh bng th tc sau:
PROCEDURE DFS(u:longint);
BEGIN
IF D[u]>0 THEN exit;
IF cha[u]=0 THEN D[u]:=1
ELSE
BEGIN
IF D[cha[u]]=0 THEN

DFS(cha[u]);

D[u]:=D[cha[u]]+1;
END;
END;
//===============
PROCEDURE taoD;
VAR u:longint;
BEGIN
fillchar(D,sizeof(D),0);
FOR u:=1 TO N DO
IF D[u]=0 THEN DFS(u);
END;
+ Xy dng mng B[1..N,0..LogN] vi B[i,j] l t tin th 2j ca nh i. Xy dng mng B bng quy
hoch ng
Khi to B[i,0]:= cha[i]; tc l t tin th 20=1 l cha trc tip ca i
Cng thc quy hoch ng:
B[i,j]:=B[B[i,j-1],j-1]; (j=0..LogN, i=1..N)
Nu t u=B[i,j-1] th u l t tin th 2j-1 ca i nn t tin th 2j ca i l t tin th 2j-1- ca u. Trong
v d trn, B[14,2]=B[B[14,1],1]=B[11,1]=6. Vy t tin th 22=4 ca nh 14 l 6.
Th tc to mng B
PROCEDURE creat;
VAR i,j:longint;
BEGIN
b[0,0]:=0;
FOR i:=1 TO n DO b[i,0]:=cha[i];
FOR j:=1 TO log DO
FOR i:=0 TO n DO
b[i,j]:=b[b[i,j-1],j-1];
END;
xc nh LCA(u,v) ta lm nh sau:
+ Gi s D[u]>D[v] ta di chuyn u ln pha gc cy sao cho D[u]=D[v]. lm iu ny ta ch cn
i tng bc u:=Cha[u] cho n khi D[u]=D[v] tuy nhin trong trng hp xu (v d cy suy bin) th
chng trnh chy rt chm. Do vy ta s dng mng B nhy 1 ln c nhiu bc ln trn.
V d cn a u=14 v t tin th 5 ca n ta phn tch 5 thnh s nh phn 5=22+20
=> t tin th 5 ca u=14 l B[B[14,2],0]=B[6,0]=2
ly gi tr ca bit th k trong s nguyn x ta lm nh sau: (x shr(k-1)) and 1
+ Khi D[u]=D[v] ta thay u v v bng 2 nt t tin tng ng sao cho D[u]=D[v], qu trnh lp li cho
n khi u=v th u l t tin chung gn nht ca u v v
FOR k:=log DOWNTO 0 DO
IF b[u,k]<>b[v,k] THEN
BEGIN

u:=b[u,k];
v:=b[v,k];
END
ELSE lca:=b[u,k];
V d Tm LCA(u=4,v=8) c D[4]=D[8]=3
Vi K>=1 th B[4,k]=B[8,k]=0 nn LCA(4,8)=0 tc l cha xc nh c t tin chung gn nht
ca 4 v 8
Vi k=1 th B[4,1]=1 v B[8,1]=1 do vy t tin chung ca 4 v 8 l 1
Vi k=0 th B[4,0]=B[8,0]=1 do vy dch chuyn u=2 v v=3.
Cc bn c th tm 1 v d khc thy c hiu qu ca vic dch chuyn u=b[u,k]; v=B[v,k] khi
B[u,k]<>B[v,k]

You might also like