You are on page 1of 240

H s m (Ch bin)

c ng l minh hong nguyn thanh hng

ti liu gio khoa

chuyn tin
quyn 2

Nh xut bn gio dc vit nam

Cng ty C phn dch v xut bn Gio dc H Ni - Nh xut bn Gio dc Vit Nam


gi quyn cng b tc phm.

349-2009/CXB/43-644/GD
2

M4 s : 8I746H9

LI NI U
B Gio dc v o to ban hnh chng trnh chuyn tin hc cho cc
lp chuyn 10, 11, 12. Da theo cc chuyn chuyn su trong chng trnh
ni trn, cc tc gi bin son b sch chuyn tin hc, bao gm cc vn c
bn nht v cu trc d liu, thut ton v ci t chng trnh.
B sch gm ba quyn, quyn 1, 2 v 3. Cu trc mi quyn bao gm: phn
l thuyt, gii thiu cc khi nim c bn, cn thit trc tip, thng dng nht;
phn p dng, trnh by cc bi ton thng gp, cch gii v ci t chng
trnh; cui cng l cc bi tp. Cc chuyn trong b sch c la chn mang
tnh h thng t c bn n chuyn su.
Vi tri nghim nhiu nm tham gia ging dy, bi dng hc sinh chuyn tin
hc ca cc trng chuyn c truyn thng v uy tn, cc tc gi la chn,
bin son cc ni dung c bn, thit yu nht m mnh s dng dy hc
vi mong mun b sch phc v khng ch cho gio vin v hc sinh chuyn
PTTH m c cho gio vin, hc sinh chuyn tin hc THCS lm ti liu tham kho
cho vic dy v hc ca mnh.
Vi kinh nghim nhiu nm tham gia bi dng hc sinh, sinh vin tham gia
cc k thi hc sinh gii Quc gia, Quc t Hi thi Tin hc tr Ton quc,
Olympiad Sinh vin Tin hc Ton quc, K thi lp trnh vin Quc t khu vc
ng Nam , cc tc gi la chn gii thiu cc bi tp, li gii c nh
hng phc v cho khng ch hc sinh m c sinh vin lm ti liu tham kho
khi tham gia cc k thi trn.
Ln u tp sch c bin son, thi gian v trnh c hn ch nn chc
chn cn nhiu thiu st, cc tc gi mong nhn c kin ng gp ca bn
c, cc ng nghip, sinh vin v hc sinh b sch c ngy cng hon
thin hn .
Cc tc gi

Chuyn 6

KIU D LIU TRU TNG


V CU TRC D LIU
Kiu d liu tru tng l mt m hnh ton hc vi nhng thao tc nh ngha
trn m hnh . Kiu d liu tru tng c th khng tn ti trong ngn ng
lp trnh m ch dng tng qut ha hoc tm lc nhng thao tc s c
thc hin trn d liu. Kiu d liu tru tng c ci t trn my tnh bng
cc cu trc d liu: Trong k thut lp trnh cu trc (Structural
Programming), cu trc d liu l cc bin cng vi cc th tc v hm thao
tc trn cc bin . Trong k thut lp trnh hng i tng (ObjectOriented Programming), cu trc d liu l kin trc th bc ca cc lp, cc
thuc tnh v phng thc tc ng ln chnh i tng hay mt vi thuc tnh
ca i tng.
Trong chng ny, chng ta s kho st mt vi kiu d liu tru tng cng
nh cch ci t chng bng cc cu trc d liu. Nhng kiu d liu tru
tng phc tp hn s c m t chi tit trong tng thut ton mi khi thy
cn thit.

1. Danh sch
1.1. Khi nim danh sch
Danh sch l mt tp sp th t cc phn t cng mt kiu. i vi danh sch,
ngi ta c mt s thao tc: Tm mt phn t trong danh sch, chn mt phn t
vo danh sch, xa mt phn t khi danh sch, sp xp li cc phn t trong
danh sch theo mt trt t no v.v
Vic ci t mt danh sch trong my tnh tc l tm mt cu trc d liu c th
m my tnh hiu c lu cc phn t ca danh sch ng thi vit cc on
chng trnh con m t cc thao tc cn thit i vi danh sch.

V danh sch l mt tp sp th t cc phn t cng kiu, ta k hiu 


l kiu d liu ca cc phn t trong danh sch, khi ci t c th,  c
th l bt c kiu d liu no c chng trnh dch chp nhn (S nguyn, s
thc, k t, ).

1.2. Biu din danh sch bng mng

Khi ci t danh sch bng mng mt chiu , ta cn c mt bin nguyn  lu s


phn t hin c trong danh sch. Nu mng c nh s bt u t 1 th cc
phn t trong danh sch c ct gi trong mng bng cc phn t c nh s
t 1 ti : 

a) Truy c
c p ph
ph n t
t trong m
mng

Vic truy cp mt phn t v tr  trong mng c th thc hin rt d dng qua


phn t
 . V cc phn t ca mng c kch thc bng nhau v c lu tr
lin tc trong b nh, vic truy cp mt phn t c thc hin bng mt php
ton tnh a ch phn t c thi gian tnh ton l hng s. V vy nu ci t
bng mng, vic truy cp mt phn t trong danh sch v tr bt k c phc
tp l  .
b) Chn ph
ph n t
t vo m
mng

chn mt phn t  vo mng ti v tr , trc ht ta dn tt c cc phn t


t v tr  ti ti v tr  v sau mt v tr (to ra ch trng ti v tr ), t gi
tr  vo v tr , v tng s phn t ca mng ln 1.
procedure Insert(p: Integer; const v: TElement);
//Th tc chn phn t v vo v tr p

var i: Integer;
begin
for i := n downto p do a[i + 1] := a[i];
a[p] := v;
n := n + 1;
end;

Trng hp tt nht, v tr chn nm sau phn t cui cng ca danh sch


(   ), khi thi gian thc hin ca php chn l  . Trng hp xu
nht, ta cn chn ti v tr 1, khi thi gian thc hin ca php chn l .
6

Cng d dng chng minh c rng thi gian thc hin trung bnh ca php
chn l .

c) Xa ph
ph n t
t kh
khi m
mng

xa mt phn t ti v tr  ca mng m vn gi nguyn th t cc phn t


cn li: Trc ht ta phi dn tt c cc phn t t v tr   ti  ln trc
mt v tr (thng tin ca phn t th  b ghi ), sau gim s phn t ca
mng () i .
procedure Delete(p: Integer); //Th tc xa phn t ti v tr p
var i: Integer;
begin
for i := p to n - 1 do a[i] := a[i + 1];
n := n - 1;
end;

Trng hp tt nht, v tr xa nm cui danh sch ( , khi thi gian


thc hin ca php xa l  . Trng hp xu nht, ta cn xa ti v tr 1, khi
thi gian thc hin ca php xa l . Cng d dng chng minh c
rng thi gian thc hin trung bnh ca php xa l .

Trong trng hp cn xa mt phn t m khng cn duy tr th t ca cc phn


t khc, ta ch cn a gi tr phn t cui cng vo v tr cn xa ri gim s
phn t ca mng () i 1. Khi thi gian thc hin ca php xa ch l  .

1.3. Biu din danh sch bng danh sch ni n

Danh sch ni n (Singly-linked list) gm cc nt c ni vi nhau theo mt


chiu. Mi nt l mt bn ghi (record) gm hai trng:



Trng  cha gi tr lu trong nt


Trng  cha lin kt (con tr) ti nt k tip, tc l cha mt thng tin
bit nt k tip nt trong danh sch l nt no, trong trng hp l
nt cui cng (khng c nt k tip), trng lin kt ny


c gn mt gi tr c bit, chng hn con tr .
type
PNode = ^TNode; //Kiu con tr ti mt nt
TNode = record; //Kiu bin ng cha thng tin trong mt nt

info: TElement;
link: PNode;
end;

Nt u tin trong danh sch (


) ng vai tr quan trng trong danh sch ni
n. duyt danh sch ni n, ta bt u t nt u tin, da vo trng lin
kt i sang nt k tip, n khi gp gi tr c bit (duyt qua nt cui) th
dng li
a




Hnh 1.1. Danh sch ni n

a) Truy c
c p ph
ph n t
t trong danh sch n!
n!i "#n
Bn thn danh sch ni n l mt kiu d liu tru tng. ci t kiu
d liu tru tng ny, chng ta c th dng mng cc nt (trng  cha ch
s ca nt k tip) hoc bin cp pht ng (trng  cha con tr ti nt k
tip). Tuy nhin v cu trc ni n, vic xc nh phn t ng th  trong
danh sch bt buc phi duyt t u danh sch qua  nt, vic ny mt thi
gian trung bnh , v t ra khng hiu qu nh thao tc trn mng. Ni cch
khc, danh sch ni n tin li cho vic truy cp tun t nhng khng hiu qu
nu chng ta thc hin nhiu php truy cp ngu nhin.
b) Chn ph
ph n t
t vo danh sch n!
n!i "#n

chn thm mt nt cha gi tr  vo v tr ca nt  trong danh sch ni


n, trc ht ta to ra mt nt mi  cha gi tr  v cho nt ny lin
kt ti . Nu  ang l nt u tin ca danh sch (
) th cp nht li 

bng , cn nu  khng phi nt u tin ca danh sch, ta tm nt 
l nt ng lin trc nt  v chnh li lin kt:  lin kt ti  thay v
lin kt ti thng  (h.1.2).



a



c


d




Hnh 1.2. Chn phn t vo danh sch ni n

procedure Insert(p: PNode; const v: TElement);


//Th tc chn phn t v vo v tr nt p

var NewNode, q: PNode;


begin
New(NewNode);
NewNode^.info := v;
NewNode^.link := p;
if head = p then head := NewNode
else
begin
q := head;
while q^.link p do q := q^.link;
q^.link := NewNode;
end;
end;

Vic chnh li lin kt trong php chn phn t vo danh sch ni n mt thi
gian  , tuy nhin vic tm nt ng lin trc nt  yu cu phi duyt t
u danh sch, vic ny mt thi gian trung bnh . Vy php chn mt phn
t vo danh sch ni n mt thi gian trung bnh  thc hin.
c) Xa ph
ph n t
t kh
khi danh sch n!
n!i "#n:

xa nt  khi danh sch ni n, gi   l nt ng lin sau  trong danh


sch. Xt hai trng hp:


Nu  l nt u tin trong danh sch 


  th ta t li 
 bng
 .

Nu  khng phi nt u tin trong danh sch, tm nt  l nt ng lin


trc nt  v chnh li lin kt:  lin kt ti   thay v lin kt ti 
(h.1.3)

Vic cui cng l hu nt .

procedure Delete(p: PNode); //Th tc xa nt p ca danh sch ni n


var next, q: PNode;
begin
next := p^.link;
if p = head then head := next
else
begin
q := head;
while q^.link <> p do q := q^.link;
q^.link := next;
end;
Dispose(p);
end;
a




 




 

Hnh 1.3. Xa phn t khi danh sch ni n

Cng ging nh php chn, php xa mt phn t khi danh sch ni n cng
mt thi gian trung bnh  thc hin.

Trn y m t cc thao tc vi danh sch biu din di dng danh sch ni


n cc bin ng. Chng ta c th ci t danh sch ni n bng mt mng,
mi nt cha trong mt phn t ca mng v trng lin kt  chnh l ch s
ca nt k tip. Khi mi thao tc chn/xa phn t cng c thc hin
tng t nh trn:
const max = ...; //S phn t cc i
type
TNode = record
10

info: TElement;
link: Integer;
end;
TList = array[1..max] of TNode;
var
Nodes: TList;
head: Integer;

1.4. Biu din danh sch bng danh sch ni kp

Vic xc nh nt ng lin trc mt nt  trong danh sch ni n bt buc


phi duyt t u danh sch, thao tc ny mt thi gian trung bnh  thc
hin v nh hng trc tip ti thi gian thc hin thao tc chn/xa phn t.
khc phc nhc im ny, ngi ta s dng danh sch ni kp.
Danh sch ni kp gm cc nt c ni vi nhau theo hai chiu. Mi nt l
mt bn ghi (record) gm ba trng:



Trng info cha gi tr lu trong nt .


Trng   cha lin kt (con tr) ti nt k tip, tc l cha mt thng
tin bit nt k tip nt l nt no, trong trng hp nt ng cui
cng trong danh sch (khng c nt k tip), trng lin kt ny c gn
mt gi tr c bit (chng hn con tr )
Trng ! cha lin kt (con tr) ti nt lin trc, tc l cha mt
thng tin bit nt lin trc nt l nt no, trong trng hp nt
ng u tin trong danh sch (khng c nt lin
!

 
trc), trng lin kt ny c gn mt gi tr
c bit (chng hn con tr )
type
PNode =
TNode =
info:
next,
end;

^TNode; //Kiu con tr ti mt nt


record; //Kiu bin ng cha thng tin trong mt nt
TElement;
prev: PNode;

Khc vi danh sch ni n, trong danh sch ni kp ta quan tm ti hai nt:


Nt u tin (!") v phn t cui cng (
"). C hai cch duyt danh sch
ni kp: Hoc bt u t !", da vo lin kt   i sang nt k tip, n
11

khi gp gi tr c bit (duyt qua 


") th dng li. Hoc bt u t 
", da
vo lin kt ! i sang nt lin trc, n khi gp gi tr c bit (duyt
qua !") th dng li
!"
a

e

"

Hnh 1.4. Danh sch ni kp

Ging nh danh sch ni n, vic chn/xa nt trong danh sch ni kp cng


n gin ch l k thut chnh li cc mi lin kt gia cc nt cho hp l. Tuy
nhin ta c th xc nh c d dng nt ng lin trc/lin sau ca mt nt
trong thi gian  , nn cc thao tc chn/xa trn danh sch ni kp ch mt
thi gian  , tt hn so vi ci t bng mng hay danh sch ni n.

1.5. Biu din danh sch bng danh sch ni vng n

Trong danh sch ni n, phn t cui cng trong danh sch c trng lin kt
c gn mt gi tr c bit (thng s dng nht l gi tr ). Nu ta cho
trng lin kt ca phn t cui cng tr thng v phn t u tin ca danh
sch th ta s c mt kiu danh sch mi gi l danh sch ni vng n.

Hnh 1.5. Danh sch ni vng n

i vi danh sch ni vng n, ta ch cn bit mt nt bt k ca danh sch l


ta c th duyt c ht cc nt trong danh sch bng cch i theo hng lin
kt. Chnh v l do ny, khi chn/xa vo danh sch ni vng n, ta khng phi
x l cc trng hp ring khi nt ng u danh sch. Mc d vy, danh sch
ni vng n vn cn thi gian trung bnh  thc hin thao tc chn/xa
v vic xc nh nt ng lin trc mt nt cho trc cng gp tr ngi nh vi
danh sch ni n.

12

1.6. Biu din danh sch bng danh sch ni vng kp


Danh sch ni vng n ch cho ta duyt cc nt ca danh sch theo mt chiu,
nu ci t bng danh sch ni vng kp th ta c th duyt cc nt ca danh
sch c theo chiu ngc li na. Danh sch ni vng kp c th to thnh t
danh sch ni kp nu ta cho trng ! ca nt !" tr ti nt #
" cn
trng   ca nt 
" th tr ti nt !".

Tng t nh danh sch ni kp, danh sch ni vng kp cho php thao tc
chn/xa phn t c th thc hin trong thi gian  .
a

Hnh 1.6. Danh sch ni vng kp

1.7. Biu din danh sch bng cy


C nhiu thao tc trn danh sch, nhng nhng thao tc ph bin nht l truy
cp phn t, chn v xa phn t. Ta kho st cch ci t danh sch bng
mng hoc danh sch lin kt, nu nh mng cho php thao tc truy cp ngu
nhin tt hn danh sch lin kt, th thao tc chn/xa phn t trn mng li mt
kh nhiu thi gian.
Di y l bng so snh thi gian thc hin cc thao tc trn danh sch.
Phng php

Truy cp ngu nhin

Chn

Xa

Mng

 

 

Danh sch ni n



 

Danh sch ni kp



   

Danh sch ni vng n

 

 

Danh sch ni vng kp



   

Cy l mt kiu d liu tru tng m trong mt s trng hp c th gin tip


dng biu din danh sch. Vi mt cch nh s th t cho cc nt ca cy
(duyt theo th t gia), mi php truy cp ngu nhin, chn, xa phn t trn
13

danh sch c th thc hin trong thi gian $%&' . Chng ta s tip tc ch
ny trong mt bi ring.

Bi tp
1.1. Vit chng trnh thc hin cc php chn, xa, v tm kim mt phn t
trong danh sch cc s nguyn sp xp theo th t tng dn biu din
bi:




Mng
Danh sch ni n
Danh sch ni kp

1.2. Vit chng trnh ni hai danh sch s nguyn sp xp, tng qut hn,
vit chng trnh ni  danh sch s nguyn sp xp c mt danh
sch gm tt c cc phn t.

1.3. Gi s chng ta biu din mt a thc  


( )* 
+ ),  - 

. )/ , trong 0( 1 0+ 1 - 1 0. di dng mt danh sch ni n m


nt th  ca danh sch cha h s
2 , s m 02 v con tr ti nt k tip
(nt   ). Hy tm thut ton cng v nhn hai a thc theo cc biu din
ny.

1.4. Mt s nh phn
.
.3(
4 , trong
2 5 678 9 c gi tr bng
:.2<4
2 ;2 . Ngi ta biu din s nh phn ny bng mt danh sch ni n
gm  nt, c nt u danh sch cha gi tr
. , mi nt trong danh sch
cha mt ch s nh phn
2 v con tr ti nt k tip l nt cha ch s
nh phn
23( . Hy lp chng trnh thc hin php ton cng 1 trn s
nh phn cho v a ra biu din nh phn ca kt qu.
Gi : S dng php quy

2. Ngn xp v hng i
Ngn xp v hng i l hai kiu d liu tru tng rt quan trng v c s
dng nhiu trong thit k thut ton. V bn cht, ngn xp v hng i l danh
sch tc l mt tp hp cc phn t cng kiu c tnh th t.
14

Trong phn ny chng ta s tm hiu hot ng ca ngn xp v hng i v


cch ci t chng bng cc cu trc d liu. Tng t nh danh sch, ta gi
kiu d liu ca cc phn t s cha trong ngn xp v hng i l .
Khi ci t chng trnh c th, kiu  c th l kiu s nguyn, s
thc, k t, hay bt k kiu d liu no c chng trnh dch chp nhn.

2.1. Ngn xp
Ngn xp (Stack) l mt kiu danh sch m vic b sung mt phn t v loi b
mt phn t c thc hin cui danh sch.
C th hnh dung ngn xp nh mt chng a, a no c t vo chng sau
cng s nm trn tt c cc a khc v s c ly ra u tin. V nguyn tc
vo sau ra trc, ngn xp cn c tn gi l danh sch kiu LIFO (Last In
First Out). V tr cui danh sch c gi l nh (top) ca ngn xp.
i vi ngn xp c su thao tc c bn:







=: Khi to mt ngn xp rng


=">: Cho bin ngn xp c rng khng?
="?@: Cho bit ngn xp c y khng?
A: c gi tr phn t nh ngn xp
B@": y mt phn t vo ngn xp
B: Ly ra mt phn t t ngn xp

a) Bi&
Bi&u di'
di'n ng(n x*
x*p b+
b+ng m
mng

Cch biu din ngn xp bng mng cn c mt mng =" lu cc phn t


trong ngn xp v mt bin nguyn  lu ch s ca phn t ti nh ngn
xp. V d:
const max = ...; //Dung lng cc i ca ngn xp
type
TStack = record
items: array[1..max] of TElement;
top: Integer;
end;
var Stack: TStack;

Su thao tc c bn ca ngn xp c th vit nh sau:


15

//Khi to ngn xp rng

procedure Init;
begin
Stack.top := 0;
end;
//Hm kim tra ngn xp c rng khng?

function IsEmpty: Boolean;


begin
Result := Stack.top = 0;
end;
//Hm kim tra ngn xp c y khng?

function IsFull: Boolean;


begin
Result := Stack.top = max;
end;
//c gi tr phn t nh ngn xp

function Get: TElement;


begin
if IsEmpty then
Error "Stack is Empty" //Bo li ngn xp rng
else
with Stack do Result := items[top];
//Tr v phn t nh ngn xp

end;
//y mt phn t x vo ngn xp

procedure Push(const x: TElement);


begin
if IsFull then
Error "Stack is Full" //Bo li ngn xp y
else
with Stack do
begin
top := top + 1; //Tng ch s nh Stack
items[top] := x; //t x vo v tr nh Stack
end;
end;
//Ly mt phn t ra khi ngn xp

function Pop: TElement;


begin
16

if IsEmpty then
Error "Stack is Empty" //Bo li ngn xp rng
else
with Stack do
begin
Result := items[top]; //Tr v phn t nh ngn xp
top := top - 1; //Gim ch s nh ngn xp
end;
end;

b) Bi&
Bi&u di'
di'n ng(n x*
x*p b+
b+ng danh sch n!
n!i "#n ki&
ki&u LIFO
Ta s trnh by cch ci t ngn xp bng danh sch ni n cc bin ng v
con tr. Trong cch ci t ny, ngn xp s b y nu nh vng khng gian
nh dng cho cc bin ng khng cn thm mt phn t mi. Tuy nhin,
vic kim tra iu ny ph thuc vo my tnh, chng trnh dch v ngn ng
lp trnh. Mt khc, khng gian b nh dng cho cc bin ng thng rt ln
nn ta s khng vit m cho hm ="?@: Kim tra ngn xp trn.
Cc khai bo d liu:

type
PNode = ^TNode; //Kiu con tr lin kt gia cc nt
TNode = record //Kiu d liu cho mt nt
info: TElement;
link: PNode;
end;
var top: PNode; //Con tr ti phn t nh ngn xp

Cc thao tc trn ngn xp:


//Khi to ngn xp rng

procedure Init;
begin
top := nil;
end;
//Kim tra ngn xp c rng khng

function IsEmpty: Boolean;


begin
Result := top = nil;
end;
17

//c gi tr phn t nh ngn xp

function Get: TElement;


begin
if IsEmpty then
Error "Stack is Empty" //Bo li ngn xp rng
else
Result := top^.info;
end;
//y mt phn t x vo ngn xp

procedure Push(const x: TElement);


var p: PNode;
begin
New(p); //To nt mi
p^.info := x;
p^.link := top; //Ni vo danh sch lin kt
top := p; //Dch con tr nh ngn xp
end;
//Ly mt phn t khi ngn xp

function Pop: TElement;


var p: PNode;
begin
if IsEmpty then
Error "Stack is Empty" //Bo li ngn xp rng
else
begin
Result := top^.info; //Ly phn t ti con tr top
p := top^.link;
Dispose(top); //Gii phng b nh
top := P; //Dch con tr nh ngn xp
end;
end;

2.2. Hng i
Hng i (Queue) l mt kiu danh sch m vic b sung mt phn t c thc
hin cui danh sch v vic loi b mt phn t c thc hin u danh
sch.

18

Khi ci t hng i, c hai v tr quan trng l v tr u danh sch (!), ni


cc phn t c ly ra, v v tr cui danh sch (!
!), ni phn t cui cng
c a vo.
C th hnh dung hng i nh mt on ngi xp hng mua v: Ngi no
xp hng trc s c mua v trc. V nguyn tc vo trc ra trc, hng
i cn c tn gi l danh sch kiu FIFO (First In First Out).
Tng t nh ngn xp, c su thao tc c bn trn hng i:







=: Khi to mt hng i rng


=">: Cho bin hng i c rng khng?
="?@: Cho bit hng i c y khng?
A: c gi tr phn t u hng i
B@": y mt phn t vo hng i
B: Ly ra mt phn t t hng i

a) Bi&
Bi&u di'
di'n hng "0
"0i b+
b+ng m
mng

Ta c th biu din hng i bng mt mng " lu cc phn t trong


hng i, mt bin nguyf! lu ch s phn t u hng i v mt bin
nguyn !
! lu ch s phn t cui hng i. Ch mt phn ca mng "
t v tr ! ti !
! c s dng lu tr cc phn t trong hng i. V d:
const max = ...; //Dung lng cc i
type
TQueue = record
items: array[1..max] of TElement;
front, rear: Integer;
end;
var Queue: TQueue;

Su thao tc c bn trn hng i c th vit nh sau:


//Khi to hng i rng

procedure Init;
begin
Queue.front := 1;
Queue.rear := 0;
end;
//Kim tra hng i c rng khng

19

function IsEmpty: Boolean;


begin
Result := Queue.front > Queue.rear;
end;
//Kim tra hng i c y khng

function IsFull: Boolean;


begin
Result := Queue.rear = max;
end;
//c gi tr phn t u hng i

function Get: TElement;


begin
if IsEmpty then
Error "Queue is Empty" //Bo li hng i rng
else
with Queue do Result := items[front];
end;
//y mt phn t x vo hng i

procedure Push(const x: TElement);


begin
if IsFull then
Error "Queue is Full" //Bo li hng i y
else
with Queue do
begin
rear := rear + 1;
items[rear] := x;
end;
end;
//Ly mt phn t khi hng i

function Pop: TElement;


begin
if IsEmpty then
Error "Queue is Empty" //Bo li hng i rng
else
with Queue do
begin
Result := items[front];
20

front := front + 1;
end;
end;

b) Bi&
Bi&u di'
di'n hng "0
"0i b+
b+ng danh sch vng
Xt vic biu din ngn xp v hng i bng mng, gi s mng c ti a 10
phn t, ta thy rng nu nh lm 6 ln thao tc B@", ri 4 ln thao tc B, ri
tip tc 8 ln thao tc B@" na th khng c vn g xy ra c. L do l v ch
s  lu nh ca ngn xp s c tng ln 6000, ri gim v 2000, sau
li tng tr li ln 10000 (cha vt qu ch s mng). Nhng nu ta thc hin
cc thao tc i vi cch ci t hng i nh trn th s gp thng bo li
trn mng, bi mi ln y phn t vo ngn xp, ch s cui hng i !
!
lun tng ln v khng bao gi b gim i c. chnh l nhc im m ta ni
ti khi ci t: Ch c cc phn t t v tr ! ti !
! l thuc hng i, cc
phn t t v tr 1 ti ! C l v ngha.

khc phc iu ny, ta c th biu din hng i bng mt danh sch vng
(dng mng hoc danh sch ni vng n): coi nh cc phn t ca hng i
c xp quanh vng trn theo mt chiu no (chng hn chiu kim ng
h). Cc phn t nm trn phn cung trn t v tr ! ti v tr !
! l cc
phn t ca hng i. C thm mt bin  lu s phn t trong hng i. Vic
y thm mt phn t vo hng i tng ng vi vic ta dch ch s 
!
theo chiu vng mt v tr ri t gi tr mi vo . Vic ly ra mt phn t
trong hng i tng ng vi vic ly ra phn t ti v tr ! ri dch ch
s ! theo chiu vng. (h.1.7)

21

!

2
3

0
7

4
6

!
!

Hnh 1.7. Dng danh sch vng m t hng i

tin cho vic dch ch s theo vng, khi ci t danh sch vng bng mng,
ngi ta thng dng cch nh ch s t 0 tin s dng php chia ly d
(modulus - mod).
const max = ...; //Dung lng cc i
type
TQueue = record
items: array[0..max - 1] of TElement;
n, front, rear: Integer;
end;
var Queue: TQueue;

Su thao tc c bn trn hng i ci t trn danh sch vng c vit di


dng gi m nh sau:
//Khi to hng i rng

procedure Init;
begin
with Queue do
begin
front := 0;
rear := max - 1;
n := 0;
end;
end;
//Kim tra hng i c rng khng

function IsEmpty: Boolean;


22

begin
Result := Queue.n = 0;
end;
//Kim tra hng i c y khng

function IsFull: Boolean;


begin
Result := Queue.n = max;
end;
//c gi tr phn t u hng i

function Get: TElement;


begin
if IsEmpty then
Error "Queue is Empty" //Bo li hng i rng
else
with Queue do Result := items[front];
end;
//y mt phn t vo hng i

procedure Push(const x: TElement);


begin
if IsFull then
Error "Queue is Full" //Bo li hng i y
else
with Queue do
begin
rear := (rear + 1) mod max;
items[rear] := x;
Inc(n);
end;
end;
//Ly mt phn t ra khi hng i

function Pop: TElement;


begin
if IsEmpty then
Error "Queue is Empty" //Bo li hng i rng
else
with Queue do
begin
Result := items[front];
23

front := (front + 1) mod max;


Dec(n);
end;
end;

c) Bi&
Bi&u di'
di'n hng "0
"0i b+
b+ng danh sch n!
n!i "#n ki&
ki&u FIFO
Tng t nh ci t ngn xp bng bin ng v con tr trong mt danh sch
ni n, ta cng khng vit hm ="?@ kim tra hng i y.

Cc khai bo d liu:

type
PNode = ^TNode; //Kiu con tr lin kt gia cc nt
TNode = record //Kiu d liu cho mt nt
info: TElement;
link: PNode;
end;
var front, rear: PNode; //Con tr ti phn t u v cui hng i

Cc thao tc trn hng i:


//Khi to hng i rng

procedure Init;
begin
front := nil;
end;
//Kim tra hng i c rng khng

function IsEmpty: Boolean;


begin
Result := front = nil;
end;
//c gi tr phn t u hng i

function Get: TElement;


begin
if IsEmpty then
Error "Queue is Empty" //Bo li hng i rng
else
Result := front^.info;
end;
//y mt phn t x vo hng i

procedure Push(const x: TElement);


24

var p: PNode;
begin
New(p); //To mt nt mi
p^.info := x;
p^.link := nil;
//Ni nt vo danh sch

if front = nil then front := p


else rear^.link := p;
rear := p; //Dch con tr rear
end;
//Ly mt phn t ra khi hng i

function Pop: TElement;


var P: PNode;
begin
if IsEmpty then
Error "Queue is Empty" //Bo li hng i rng
else
begin
Result := front^.info; //Ly phn t ti con tr front
P := front^.link;
Dispose(front); //Gii phng b nh
front := p; //Dch con tr front
end;
end;

2.3. Mt s ch v k thut ci t
Ngn xp v hng i l hai kiu d liu tru tng tng i d ci t, cc th
tc v hm m phng cc thao tc c th vit rt ngn. Tuy vy trong cc
chng trnh di, cc thao tc vn nn c tch bit ra thnh chng trnh con
d dng g ri hoc thay i cch ci t (v d i t ci t bng mng
sang ci t bng danh sch ni n). iu ny cn gip ch cho lp trnh vin
trong trng hp mun biu din cc kiu d liu tru tng bng cc lp v
i tng. Nu c bn khon rng vic gi thc hin chng trnh con s lm
chng trnh chy chm hn vic vit trc tip, bn c th t cc thao tc
di dng inline functions.

25

Bi tp
1.5. Hng i hai u (doubled-ended queue) l mt danh sch c trang b
bn thao tc:
B@"?: y phn t  vo u danh sch

B@"D: y phn t  vo cui danh sch


B?: Loi b phn t u danh sch

BD: Loi b phn t cui danh sch

Hy tm cu trc d liu thch hp ci t kiu d liu tru tng hng


i hai u.
1.6. C hai s ng ray xe la b tr nh hnh sau:
3

II

Ban u c  toa tu xp theo th t t 1 ti  t phi qua tri trn ng


ray . Ngi ta mun xp li cc toa tu theo th t mi t phi qua tri
( 8 + 8 E 8 .  ln ng ray F theo nguyn tc: Cc toa tu khng c
vt nhau trn ray, mi ln ch c chuyn mt toa tu t  G H,
 G H hoc  G F. Hy cho bit iu c th thc hin c trn s
ng ray no trong hai s trn.

26

3. Cy
3.1. nh ngha
Cy l mt kiu d liu tru tng gm mt tp hu hn cc nt, gia cc nt c
mt quan h phn cp gi l quan h cha-con. C mt nt c bit gi l gc
(root).
C th nh ngha cy bng cch quy nh sau:



Mt nt l mt cy, nt cng l gc ca cy y
Nu ! l mt nt v !( 8 !+ 8 8 !I ln lt l gc ca cc cy ( 8 + 8 8 I , th
ta c th xy dng mt cy mi  bng cch cho nt ! tr thnh cha ca cc
nt !( 8 !+ 8 8 !I . Cy  ny nt gc l ! cn cc cy ( 8 + 8 8 I tr thnh
cc cy con hay nhnh con (subtree) ca nt gc.

tin, ngi ta cn cho php tn ti mt cy khng c nt no m ta gi l cy


rng (null tree), k hiu J.
Mt vi hnh nh ca cu trc cy:




27

Mc lc ca mt cun sch vi phn, chng, bi, mc v.v c cu trc


ca cy
Cu trc th mc trn a cng c cu trc cy, th mc gc c th coi l
gc ca cy vi cc cy con l cc th mc con (sub-directories) v tp
(files) nm trn th mc gc.
Gia ph ca mt h tc cng c cu trc cy.
Mt biu thc s hc gm cc php ton cng, tr, nhn, chia cng c th
lu tr trong mt cy m cc ton hng c lu tr cc nt l, cc ton
t c lu tr cc nt nhnh, mi nhnh l mt biu thc con (h.1.8).

Y


C
V

U
T

TZ;  V Y W C X

Hnh 1.8. Cy biu din biu thc

3.2. Cc khi nim c bn

Nu !( 8 !+ 8 8 !I  l dy cc nt trn cy sao cho !2 l nt cha ca nt !2K( vi


LM N  O , th dy ny c gi l mt ng i (path) t !( ti !I . Chiu di
ca ng i bng s nt trn ng i tr i 1. Quy c rng c ng i
di 0 t mt nt n chnh n. Nh cy hnh 1.9, 8 H8 ? l ng i di
2, 8 P8 Q8 R l ng i di 3.


Hnh 1.9. Cy

Nu c mt ng i di khc 0 t nt
ti nt  th nt
gi l tin bi
(ancestor) ca nt  v nt  c gi l hu du (descendant) ca nt
. Nh
cy hnh 1.9, nt  l tin bi ca tt c cc nt trn cy, nt Q l hu du ca
nt  v nt P. Mt s quy c cn cho php mt nt l tin bi cng nh hu
du ca chnh nt , trong trng hp ny, ngi ta c thm khi nim tin bi
28

thc s (proper ancestor) v hu du ch thc (proper descendant) trng vi


khi nim tin bi v hu du m ta nh ngha.
Trong cy, ch duy nht mt nt khng c tin bi l nt gc. Mt nt khng c
hu du gi l nt l (leaf) ca cy, cc nt khng phi l c gi l nt nhnh
(branch). Nh cy hnh 1.9, cc nt F8 8 ?8 A8 =8 S8 R l cc nt l.

cao ca mt nt l di ng i di nht t nt ti mt nt l hu du
ca n, cao ca nt gc gi l chiu cao (height) ca cy. Nh cy hnh 1.9,
cy c chiu cao l 3 (ng i 8 P8 Q8 S).

su (depth) ca mt nt l di ng i duy nht t nt gc ti nt .


Nh cy hnh 1.9, nt  c su l 0, nt H8 F8 P c su l 1, nt
8 ?8 A8 Q8 = c su l 2, v nt S8 R c su l 3. C th nh ngha chiu
cao ca cy l su ln nht ca cc nt trong cy.
Mt tp hp cc cy i mt khng c nt chung c gi l rng (forest), c
th coi tp cc cy con ca mt nt l mt rng.
Nhng nt con ca cng mt nt c gi l anh em (sibling). Vi mt cy, nu
chng ta c tnh n th t anh em th cy gi l cy c th t (ordered tree),
cn nu chng ta khng quan tm ti th t anh em th cy gi l cy khng
c th t (unordered tree).

3.3. Biu din cy tng qut


Trong thc t, c mt s ng dng i hi mt cu trc d liu dng cy nhng
khng c rng buc g v s con ca mt nt trn cy, v d nh cu trc th
mc trn a hay h thng mc ca mt cun sch. Khi , ta phi tm cch
m t mt cch khoa hc cu trc d liu dng cy tng qut. Gi s 
l kiu d liu ca cc phn t cha trong mi nt ca cy, khi ta c th biu
din cy bng mt trong cc cu trc d liu sau:
a) Bi&
Bi&u di'
di'n b+
b+ng lin k*
k*t t4
t4i nt cha

Vi  l mt cy, trong cc nt c nh s t 1 ti , khi ta c th gn


cho mi nt  mt nhn 
!  l s hiu nt cha ca nt . Nu nt  l nt
gc, th 
!  c gn gi tr 0. Cch biu din ny c th ci t bng mt
29

mng cc nt, mi nt l mt bn ghi bn trong cha gi tr lu ti nt ( v


nhn 
!.
const max = ...; //Dung lng cc i
type
TNode = record
info: TElement;
parent: Integer;
end;
TTree = array[1..max] of TNode;
var Tree: TTree;

Trong cch biu din ny, nu chng ta cn bit nt cha ca mt nt th ch cn


truy xut trng parent ca nt . Tuy nhin nu ta cn lit k tt c cc nt
con ca mt nt th khng c cch no khc l phi duyt ton b danh sch nt
v kim tra trng parent. Thc hin vic ny mt thi gian  vi mi nt.

b) Bi&
Bi&u di'
di'n b+
b+ng c6
c6u trc lin k*
k*t

Trong cch biu din ny, ta sp xp cc nt con ca mi nt theo mt th t


no . Mi nt ca cy l mt bn ghi gm 4 trng:



Trng : Cha gi tr lu trong nt


Trng 
!: Cha con tr lin kt ti nt cha, tc l cha mt thng tin
bit nt cha ca nt ang xt l nt no. Trong trng hp nt ang
xt l gc (khng c nt cha), trng 
! c gn mt gi tr c bit
().
Trng !": Cha lin kt (con tr) ti nt con u tin (con c) ca nt
ang xt, trong trng hp nt ang xt l nt l (khng c nt con), trng
ny c gn mt gi tr c bit ().
Trng "0[: Cha lin kt (con tr) ti nt em k cn (nt cng cha vi
nt ang xt, khi sp th t cc nt con th nt "0[ ng lin sau nt
ang xt). Trong trng hp nt ang xt khng c nt em, trng ny
c gn mt gi tr c bit ().
type
PNode = ^TNode;
TNode = record
info: TElement;
30

parent, first, sibling: PNode;


end;

!
 H

"0[ V


!" \

P
6

Hnh 1.10. Cu trc nt ca cy tng qut

Trong cc biu din ny, t mt nt ! bt k, ta c th i theo lin kt !"


n nt con u tin, nt ny chnh l cht ca mt danh sch ni n cc nt
con: T nt !", i theo lin kt "0[, ta c th duyt tt c cc nt con ca
nt !.

Trong trng hp phi thc hin nhiu ln php chn/xa mt cy con, ngi ta
c th biu din danh sch cc nt con ca mt nt di dng danh sch mc ni
kp vic chn/xa c thc hin hiu qu hn, khi thay v trng lin kt
n "0[, mi nt s c hai trng ! v   cha lin kt ti nt anh
lin trc v em lin sau ca mt nt.

3.4. Cy nh phn
Cy nh phn (binary tree) l mt dng quan trng ca cu trc cy. N c c
im l mi nt trn cy ch c ti a hai nhnh con. Vi mt nt th ngi ta
cng phn bit cy con tri v cy con phi ca nt , tc l cy nh phn l
cy c th t.

31

a) M8t s!
s! d9ng ":
":c bi;
bi;t c<
c<a cy nh>
nh> phn

a)

b)

d)

Hnh 1.11. Cy nh phn suy bin

Cc cy nh phn trong hnh 1.11 c gi l cy nh phn suy bin (degenerate


binary tree), trong cy nh phn suy bin, cc nt khng phi l ch c ng mt
cy con. Cy a) c gi l cy lch phi, cy b) c gi l cy lch tri, cy c)
v d) c gi l cy zc-zc.

Hnh 1.11. Cy nh phn hon chnh

Cy trong hnh 1.11 c gi l cy nh phn hon chnh (complete binary tree).


Cy nh phn hon chnh c mi nt l nm cng mt su v mi nt nhnh
u c hai nhnh con. S nt su  ca cy nh phn hon chnh l ;] .
Tng s nt ca cy nh phn hon chnh cao  l ;]K( C

32

Hnh 1.12. Cy nh phn gn hon chnh

Cy trong hnh 1.12 c gi l cy nh phn gn hon chnh (nearly complete


binary tree). Mt cy nh phn cao  c gi l cy nh phn gn hon
chnh nu ta b i mi nt su  th c mt cy nh phn hon chnh.
Cy nh phn hon chnh hin nhin l cy nh phn gn hon chnh.

Hnh 1.13. Cy nh phn y

Cy trong hnh 1.13 c gi l cy nh phn y (full binary tree). Cy nh


phn y l cy nh phn m mi nt nhnh ca n u c hai nt con.
D dng chng minh c nhng tnh cht sau:






33

Trong cc cy nh phn c cng s lng nt nh nhau th cy nh phn suy


bin c chiu cao ln nht, cn cy nh phn gn hon chnh th c chiu
cao nh nht.
S lng ti a cc nt su  ca cy nh phn l ;^
S lng ti a cc nt trn mt cy nh phn c chiu cao  l ;]K( C
Cy nh phn gn hon chnh c  nt th chiu cao ca n l _%' `.

b) Bi&
Bi&u di'
di'n cy nh>
nh> phn
R rng c th s dng cc cch biu din cy tng qut biu din cy nh
phn, nhng da vo nhng c im ring ca cy nh phn, chng ta c th c
nhng cch biu din hiu qu hn. Trong phn ny chng ta xt mt s cch
biu din c th cho cy nh phn, tng t nh vi i vi cy tng qut, ta
gi  l kiu d liu ca cc phn t cha trong cc nt ca cy nh
phn.
 Biu din bng mng

Mt cy nh phn hon chnh c  nt th c chiu cao l _%' `, tc l cc nt s


nm cc su t 0 ti _%' `, Khi ta c th lit k tt c cc nt t su 0
(nt gc) ti su _%' `, sao cho vi cc nt cng su th th t lit k l t
tri qua phi. Th t lit k cho php ta nh s cc nt t 1 ti  (h.1.14).
1

2
B

5
C

7
F

Hnh 1.14. nh s cc nt ca cy nh phn hon chnh biu din bng mng

Vi cch nh s ny, hai con ca nt th  s l cc nt th ; v ;  . Cha


ca nt th  l nt th _ Z;`. Ta c th lu tr cy bng mt mng  trong
phn t cha trong nt th  ca cy c lu tr trong mng bi  .
Vi cy nh phn hnh 1.14, ta c th dng mng  8 H8 8 F8 P8 8 A
cha cc gi tr trn cy.
Trong trng hp cy nh phn khng hon chnh, ta c th thm vo mt s nt
gi c cy nh phn hon chnh. Khi biu din bng mng th nhng phn
t tng ng vi cc nt gi s c gn mt gi tr c bit. Chnh v l do ny
nn vic biu din cy nh phn khng hon chnh bng mng s rt lng ph b
nh trong trng hp phi thm vo nhiu nt gi. V d ta cn ti mt mng 15
phn t lu tr cy nh phn lch phi ch gm 4 nt (h.1.15).
34

10

11

12

13

14

15
D

C
D

Hnh 1.15. Nhc im ca phng php biu din cy nh phn bng mng

 Biu din bng cu trc lin kt.


Khi biu din cy nh phn bng cu trc lin kt, mi nt ca cy l mt bn
ghi (record) gm 4 trng:



Trng : Cha gi tr lu ti nt


Trng 
!: Cha lin kt (con tr) ti nt cha, tc l cha mt thng
tin bit nt cha ca nt l nt no, i vi nt gc, trng ny
c gn mt gi tr c bit ().
Trng : Cha lin kt (con tr) ti nt con tri, tc l cha mt thng
tin bit nt con tri ca nt l nt no, trong trng hp khng c
nt con tri, trng ny c gn mt gi tr c bit ().
Trng ![: Cha lin kt (con tr) ti nt con phi, tc l cha mt
thng tin bit nt con phi ca nt l nt no,

!
trong trng hp khng c nt con phi, trng ny c
gn mt gi tr c bit ().

i vi cy ta ch cn phi quan tm gi li nt gc (!),


bi t nt gc, i theo cc hng lin kt , ![ ta c th
duyt mi nt khc.
type
PNode =
TNode =
info:
left,
end;
var root:

35





^TNode; //Kiu con tr ti mt nt


record //Cu trc bin ng cha thng tin trong mt nt
TElement;
right: PNode
PNode; //Con tr ti nt gc

![

Trong trng hp bit r gii hn v s nt ca cy, ta c th lu tr cc nt


trong mt mng, v dng ch s mng nh lin kt ti mt nt:
const max = ...; //Dung lng cc i
type
TNode = record //Cu trc bin ng cha thng tin trong mt nt
info: TElement;
left, right: Integer; //Ch s ca nt con tri v nt con phi
end;
TTree = array[1..max] of TNode;
var
Tree: TTree;
root: Integer; //Ch s ca nt gc


Hnh 1.16. Biu din cy nh phn bng cu trc lin kt

c) Php duy;
duy;t cy nh>
nh> phn
Php x l cc nt trn cy m ta gi chung l php thm (visit) cc nt mt
cch h thng sao cho mi nt ch c thm mt ln gi l php duyt cy.
Gi s rng cu trc mt nt ca cy c c t nh sau:
type
36

PNode =
TNode =
info:
left,
end;
var root:

^TNode; //Kiu con tr ti mt nt


record //Cu trc bin ng cha thng tin trong mt nt
TElement;
right: PNode
PNode; //Con tr ti nt gc

Quy c rng nu nh mt nt khng c nt con tri (hoc nt con phi) th lin


kt  (![) ca nt c lin kt thng ti mt nt c bit m ta gi l
, nu cy rng th nt gc ca cy cng c gn bng . Khi c ba
cch duyt cy hay c s dng:
 Duyt theo th t trc
Trong php duyt theo th t trc (preorder traversal) th gi tr trong mi nt
bt k s c lit k trc tt c cc gi tr lu trong hai nhnh con ca n, c
th m t bng th tc quy sau:
procedure Visit(node: PNode); //Duyt nhnh cy gc node^
begin
if node nil then
begin
Output node^.info;
Visit(node^.left);
Visit(node^.right);
end;
end;

Qu trnh duyt theo th t trc bt u bng li gi a"D.

37

?
P
H


Q


Hnh 1.17

Hnh 1.17 l mt cy nh phn c 9 nt. Nu ta duyt cy ny theo th t trc


th qu trnh duyt theo th t trc s ln lt lit k cc gi tr:
 Duyt theo th t gia

?8 P8 H8 8 F8 8 Q8 A8 =

Trong php duyt theo th t gia (inorder traversal) th gi tr trong mi nt


bt k s c lit k sau tt c cc gi tr lu nt con tri v c lit k
trc tt c cc gi tr lu nt con phi ca nt , c th m t bng th tc
quy sau:
procedure Visit(node: PNode); //Duyt nhnh cy gc node^
begin
if node nil then
begin
Visit(node^.left);
Output node^.info;
Visit(node^.right);
end;
end;

Qu trnh duyt theo th t gia cng bt u bng li gi a"D.

Nu ta duyt cy hnh 1.17 theo th t gia th qu trnh duyt s lit k ln


lt cc gi tr:
8 H8 F8 P8 8 ?8 A8 Q8 =

38

 Duyt theo th t sau


Trong php duyt theo th t sau th gi tr trong mi nt bt k s c lit k
sau tt c cc gi tr lu trong hai nhnh con ca n, c th m t bng th tc
quy sau:
procedure Visit(node: PNode); //Duyt nhnh cy gc node^
begin
if node nil then
begin
Visit(node^.left);
Visit(node^.right);
Output node^.info;
end;
end;

Qu trnh duyt theo th t sau cng bt u bng li gi a"D.

Cng vi cy hnh 1.17, nu ta duyt theo th t sau th cc gi tr s ln lt


c lit k theo th t:

3.5. Cy k-phn

8 F8 H8 8 P8 A8 =8 Q8 ?

Cy -phn l mt dng cu trc cy m mi nt trn cy c ti a  nt con (c


tnh n th t ca cc nt con).

Cng tng t nh vic biu din cy nh phn, ngi ta c th thm vo cy phn mt s nt gi cho mi nt nhnh ca cy -phn u c ng  nt
con, cc nt con c xp th t t nt con th nht ti nt con th , sau
nh s cc nt trn cy -phn bt u t 0 tr i, bt u t mc 1, ht mc
ny n mc khc v t tri qua phi mi mc.

Theo cch nh s ny, nt con th b ca nt  s l:   b. Nu  khng phi l


nt gc ( 1 7) th nt cha ca nt i l nt _ C Z `. Ta c th dng mt mng
= nh s t 0 lu cc gi tr trn cc nt: Gi tr ti nt th  c lu tr
phn t = . y l c ch biu din cy -phn bng mng.
Cy -phn cng c th biu din bng cu trc lin kt vi cu trc d liu cho
mi nt ca cy l mt bn ghi (record) gm 3 trng:

39




Trng : Cha gi tr lu trong nt .


Trng 
!: Cha lin kt (con tr) ti nt cha, tc l cha mt thng
tin bit nt cha ca nt l nt no, i vi nt gc, trng ny
c gn mt gi tr c bit ().
Trng ": L mt mng gm  phn t, phn t th  cha lin kt (con
tr) ti nt con th , trong trng hp khng c nt con th  th " 
c gn mt gi tr c bit ().

i vi cy -phn, ta cng ch cn gi li nt gc, bi t nt gc, i theo cc


hng lin kt c th i ti mi nt khc.

Bi tp

1.7. Xt hai nt 8 > trn mt cy nh phn, ta ni nt


> nm bn phi nt ) nu:




nm bn tri nt > (nt

Hoc nt nm trong nhnh con tri ca nt >


Hoc nt > nm trong nhnh con phi ca nt
Hoc tn ti mt nt c sao cho nm trong nhnh con tri v > nm trong
nhnh con phi ca nt c
Ch ra rng vi hai nt 8 > bt k trn mt cy nh phn ( d >) ch c
ng mt trong bn mnh sau l ng:






nm bn tri >
nm bn phi >
l tin bi thc s ca >
> l tin bi thc s ca

1.8. Vi mi nt trn cy nh phn , gi s rng ta bit c cc gi tr


B!!! , =!!  v B"!!  ln lt l th t duyt trc,
gia, sau ca . Tm cch ch da vo cc gi tr ny kim tra hai nt c
quan h tin bi-hu du hay khng.
1.9. Bc (degree) ca mt nt l s nt con ca n. Chng minh rng trn cy
nh phn, s l nhiu hn s nt bc 2 ng mt nt.
40

1.10. Ch ra rng cu trc ca mt cy nh phn c th khi phc mt cch n


nh nu ta bit c th t duyt trc v gia ca cc nt. Tng t nh
vy, cu trc cy c th khi phc nu ta bit c th t duyt sau v
gia ca cc nt.
1.11. Tm v d v hai cy nh phn khc nhau nhng c th t trc ca cc nt
ging nhau v th t sau ca cc nt cng ging nhau trn hai cy.

4. K php tin t, trung t v hu t


kt thc chng ny, chng ta ni ti mt ng dng ca ngn xp v cy nh
phn: Bi ton phn tch v tnh gi tr biu thc.

4.1. Biu thc di dng cy nh phn


Chng ta c th biu din cc biu thc s hc gm cc php ton cng, tr,
nhn, chia bng mt cy nh phn y , trong cc nt l biu th cc ton
hng (hng, bin), cc nt khng phi l l biu th cc ton t (php ton s hc
chng hn). Mi php ton trong mt nt s tc ng ln hai biu thc con nm
cy con bn tri v cy con bn phi ca nt . V d: Biu thc TZ; 
X Y e C V c biu din trong cy hnh 1.18.
Y


U
T

C
X

e
TZ;  X Y e C V

Hnh 1.18. Cy biu din biu thc

4.2. Cc k php cho cng mt biu thc


Vi cy nh phn biu din biu thc trong hnh 4.1,

41

Nu duyt theo th t trc, ta s c Y  U T ; X C e V, y l dng


tin t (prefix) ca biu thc. Trong k php ny, ton t c vit trc
hai ton hng tng ng, ngi ta cn gi k php ny l k php Ba lan.
Nu duyt theo th t gia, ta s c T U ;  X Y e C V . K php ny
b nhp nhng v thiu du ngoc. Nu thm vo th tc duyt mt c ch
b sung cc cp du ngoc vo mi biu thc con, ta s thu c biu thc
fgTU;  Xh Y e C Vi. K php ny gi l dng trung t (infix) ca mt

biu thc (Thc ra ch cn thm cc du ngoc trnh s mp m m


thi, khng nht thit phi thm vo y cc cp du ngoc).
Nu duyt theo th t sau, ta s c T ; U X  e V C Y , y l dng hu
t (postfix) ca biu thc. Trong k php ny ton t c vit sau hai ton
hng, ngi ta cn gi k php ny l k php nghch o Balan (Reverse
Polish Notation - RPN)

Ch c dng trung t mi cn c du ngoc, dng tin t v hu t khng cn


phi c du ngoc. Chng ta s tho lun v tnh n nh ca dng tin t v
hu t trong phn sau.

4.3. Cch tnh gi tr biu thc


C mt vn cn lu l khi my tnh gi tr mt biu thc s hc gm cc
ton t hai ngi (ton t gm hai ton hng nh 8 C8Y8U) th my ch thc hin
c php ton vi hai ton hng. Nu biu thc phc tp th my phi chia
nh v tnh ring tng biu thc trung gian, sau mi ly gi tr tm c
tnh tip*. V d nh biu thc  ;  X my s phi tnh  ; trc c kt
qu l 3 sau mi em 3 cng vi 4 ch khng th thc hin php cng mt
lc ba s c.
Khi lu tr biu thc di dng cy nh phn th ta c th coi mi nhnh con ca
cy biu din mt biu thc trung gian m my cn tnh trc khi tnh biu
thc ln. Nh v d trn, my s phi tnh hai biu thc TU;  X v e C V trc

Thc ra y l vic ca trnh dch ngn ng bc cao, cn my ch tnh cc php ton vi hai ton hng
theo trnh t ca cc lnh c phn tch ra.

42

khi lm php tnh nhn cui cng. tnh biu thc TU;  X th my li phi
tnh biu thc TU; trc khi em cng vi X.

Vy tnh mt biu thc lu tr trong mt nhnh cy nh phn gc !, my s


lm ging nh hm quy sau:
function Calculate(r: Nt): Gi tr;
//Tnh biu thc con trong nhnh cy gc r

begin
if nt r cha mt ton hng then
Result := Gi tr cha trong nt r
else //Nt r cha mt ton t
begin
x := Calculate(nt con tri ca r);
y := Calculate(nt con phi ca r);
Result := x y;
end;
end;

(Trong trng hp lp trnh trn cc h thng song song, vic tnh gi tr biu
thc cy con tri v cy con phi c th tin hnh ng thi lm gim ng k
thi gian tnh ton biu thc).

4.4. Tnh gi tr biu thc hu t


rng khi tnh ton biu thc, my s phi quan tm ti vic tnh biu thc
hai nhnh con trc, ri mi xt n ton t nt gc. iu lm ta ngh ti
php duyt cy theo th t sau v k php hu t. Nm 1920, nh l-gic hc
ngi Balan Jan ukasiewicz chng minh rng biu thc hu t khng cn
phi c du ngoc vn c th tnh c mt cch ng n bng cch c ln
lt biu thc t tri qua phi v dng mt Stack lu cc kt qu trung gian:



43

Bc 1: Khi to mt ngn xp rng


Bc 2: c ln lt cc phn t ca biu thc RPN t tri qua phi (phn
t ny c th l hng, bin hay ton t) vi mi phn t :

Nu phn t ny l mt ton hng th y gi tr ca n vo ngn xp.

Nu phn t ny l mt ton t j, ta ly t ngn xp ra hai gi tr (> v
) sau p dng ton t j vo hai gi tr va ly ra, y kt qu
tm c ( j>) vo ngn xp (ra hai vo mt).

Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong,


trong ngn xp ch cn duy nht mt phn t, phn t chnh l gi tr ca
biu thc.
V d: Tnh biu thc T ; U X  e V C Y tng ng vi biu thc trung t
TU;  X Y e C V
c

X l

Ngn xp

y vo 6

y vo 2

6, 2

/
4
+
8
3

Ly ra 2 v 6, y vo TU; V
y vo 4

3
3, 4

Ly ra 4 v 3, y vo V  X W

y vo 8

7, 8

y vo 3

7, 8, 3

Ly ra 5 v 7, y vo W Y \ V\

7, 5

Ly ra 3 v 8, y vo e C V \

35

Ta c kt qu l 35

Di y ta s vit mt chng trnh n gin tnh gi tr biu thc RPN.


Input
Biu thc s hc RPN, hai ton hng lin nhau c phn tch bi du cch.
Cc ton hng l s thc, cc ton t l +, -, * hoc /.
Output
Kt qu biu thc
Sample Input
6 2 / 4 + 8 3 - *

Sample Output
35.0000

n gin, chng trnh khng kim tra li vit sai biu thc RPN, vic ch
l thao tc t m ch khng phc tp lm, ch cn xem li thut ton v ci thm
cc lnh bt li ti mi bc.


RPNCALC.PAS  Tnh gi tr biu thc RPN


{$MODE OBJFPC}
program CalculatingRPNExpression;
type
44

TStackNode = record
// Ngn xp c ci t bng danh sch mc ni kiu LIFO

value: Real;
link: Pointer;
end;
PStackNode = ^TStackNode;
var
RPN: AnsiString;
top: PStackNode;
procedure Push(const v: Real);
//y mt ton hng l s thc v vo ngn xp

var p: PStackNode;
begin
New(p);
p^.value := v;
p^.link := top;
top := p;
end;
function Pop: Real; //Ly mt ton hng ra khi ngn xp
var p: PStackNode;
begin
Result := top^.value;
p := top^.link;
Dispose(top);
top := p;
end;
procedure ProcessToken(const token: AnsiString);
//X l mt phn t trong biu thc RPN

var
x, y: Real;
err: Integer;
begin
if token[1] in ['+', '-', '*', '/'] then
//Nu phn t token l ton t
begin //Ly ra hai phn t khi ngn xp, thc hin ton t v y gi tr vo ngn xp

y := Pop;
x := Pop;
case token[1] of
'+': Push(x + y);
45

'-': Push(x - y);


'*': Push(x * y);
'/': Push(x / y);
end;
end
else //Nu phn t token l ton hng th y gi tr ca n vo ngn xp
begin
Val(token, x, err);
Push(x);
end;
end;
procedure Parsing; //X l biu thc RPN
var i, j: Integer;
begin
j := 0; //j l v tr x l xong
for i := 1 to Length(RPN) do //Qut biu thc t tri sang phi
if RPN[i] in [' ', '+', '-', '*', '/'] then
//Nu gp ton t hoc du phn cch ton hng

begin
if i > j + 1 then //Trc v tr i c mt ton hng cha x l
ProcessToken(Copy(RPN, j + 1, i - j - 1));
//X l ton hng

if RPN[i] in ['+', '-', '*', '/'] then


//Nu v tr i cha ton t

ProcessToken(RPN[i]); //X l ton t


j := i; // x l xong n v tr i
end;
if j < Length(RPN) then
//Trng hp c mt ton hng cn st li (biu thc ch c 1 ton hng)

ProcessToken(Copy(RPN, j + 1, Length(RPN) - j));


//X l nt

end;
begin
ReadLn(RPN); //c biu thc
top := nil; //Khi to ngn xp rng,
Parsing; //X l
Write(Pop:0:4); //Ly ra phn t duy nht cn li trong ngn xp v in ra kt qu.
end.

46

4.5. Chuyn t dng trung t sang hu t


C th ni rng vic tnh ton biu thc vit bng k php nghch o Balan l
khoa hc hn, my mc v n gin hn vic tnh ton biu thc vit bng k
php trung t. Ch ring vic khng phi x l du ngoc cho ta thy u im
ca k php RPN. Chnh v l do ny, cc chng trnh dch vn cho php lp
trnh vin vit biu thc trn k php trung t theo thi quen, nhng trc khi
dch ra cc lnh my th tt c cc biu thc u c chuyn v dng RPN. Vn
t ra l phi c mt thut ton chuyn biu thc di dng trung t v dng
RPN mt cch hiu qu, di y ta trnh by thut ton :
Thut ton s dng mt ngn xp k
l cha cc ton t v du ngoc m.
Th tc B@" y mt phn t vo k
l, hm B ly ra mt phn t
t k
l, hm A c gi tr phn t nm nh k
l m khng ly phn
t ra. Ngoi ra mc u tin ca cc ton t c quy nh bng hm
B!!>: u tin cao nht l du nhn (*) v du chia (/) vi mc u tin l 2,
tip theo l du cng (+) du (-) vi mc u tin l 1, u tin thp nht l du
ngoc m vi mc u tin l 0.
Stack := ;
for phn t token c c t biu thc trung t do
case token of
//token c th l ton hng, ton t, hoc du ngoc c c ln lt theo th t t tri qua phi
'(': Push(token); //Gp du ngoc m th y vo ngn xp

')':
//Gp du ngoc ng th ly ra v hin th cc phn t trong ngn xp cho ti khi ly ti du
ngoc m

repeat
x := Pop;
if x '(' then Output x;
until x = '(';
'+', '-', '*', '/': //Gp ton t
begin
//Chng no nh ngn xp c phn t vi mc u tin ln hn hay bng token, ly phn t ra
v hin th

while (Stack )
and (Priority(token) Priority(Get)) do
Output Pop;
Push(token); //y ton t token vo ngn xp
47

end;
else //Gp ton hng th hin th lun
Output token;
end;
//Khi c xong biu thc, ly ra v hin th tt c cc phn t cn li trong ngn xp

while Stack do
Output Pop
c

V d vi biu thc trung t TU;  X Y e C V


X l

Ngn xp

Output

y ( vo ngn xp

Hin th

y / vo ngn xp

(/

Hin th

(/

62

Ly / khi ngn xp v hin


th, y + vo ngn xp
Hin th

(+

62/

(+

62/4

62/4+

Ly + v ( khi ngn xp,


hin th +
y vo ngn xp

62/4+

y ( vo ngn xp

62/4+

Hin th

62/4+8

y - vo ngn xp

(-

62/4+8

Hin th

(-

62/4+83

Ly - v ( khi ngn xp,


hin th -
Ly nt ra v hin th

62/4+83-

62/4+83-

4
)

Ht

Ch thch

/ > (
( < + < /

- > )

Thut ton ny c tn l thut ton xp toa tu (shunting yards) do Edsger


Dijkstra xut nm 1960. Tn gi ny xut pht t m hnh ng ray tu ha:

48

TU;  X Y e C V
=

DB

k
l

Hnh 1.19. M hnh xp toa tu ca thut ton chuyn t dng trung t sang hu t

Trong hnh 1.19, mi toa tu tng ng vi mt phn t trong biu thc trung t
nm ng ray = . C ba php chuyn toa tu: T ng ray = sang
thng ng ray DB, t ng ray = xung ng ray k
l, hoc t
ng ray k
l ln ng ray DB. Thut ton ch n thun da trn cc lut
chuyn m theo cc lut ta s chuyn c tt c cc toa tu sang ng ray
DB c mt th t tng ng vi biu thc hu t* (v d ton hng
= s c chuyn thng sang DB hay du ( = s c chuyn
thng xung k
l).
Di y l chng trnh chuyn biu thc vit dng trung t sang dng RPN:
Input
Biu thc trung t
Output
Biu thc hu t

Sample Input

Sample Output

(6 / 2 + 4) * (8 - 3)

6 2 / 4 + 8 3 - *

INFIX2RPN.PAS  Chuyn t dng trung t sang hu t


{$MODE OBJFPC}

Thc ra th cn thao tc loi b cc du ngoc trong biu thc RPN na, nhng iu ny khng quan
trng, du ngoc l tha trong biu thc RPN v nh ni v phng php tnh: biu thc RPN c th
tnh n nh m khng cn cc du ngoc.

49

program ConvertInfixToRPN;
type
TStackNode = record
// Ngn xp c ci t bng danh sch mc ni kiu LIFO

value: AnsiChar;
link: Pointer;
end;
PStackNode = ^TStackNode;
var
Infix: AnsiString;
top: PStackNode;
procedure Push(const c: AnsiChar); //y mt phn t v vo ngn xp
var p: PStackNode;
begin
New(p);
p^.value := c;
p^.link := top;
top := p;
end;
function Pop: AnsiChar; //Ly mt phn t ra khi ngn xp
var p: PStackNode;
begin
Result := top^.value;
p := top^.link;
Dispose(top);
top := p;
end;
function Get: AnsiChar; //c phn t nh ngn xp
begin
Result := top^.value;
end;
function Priority(c: Char): Integer; //Mc u tin ca cc ton t
begin
case c of
'*', '/': Result := 2;
'+', '-': Result := 1;
'(': Result := 0;
end;
50

end;
//X l mt phn t c c t biu thc trung t

procedure ProcessToken(const token: AnsiString);


var
x: AnsiChar;
Opt: AnsiChar;
begin
Opt := token[1];
case Opt of
'(': Push(Opt); //token l du ngoc m
')': //token l du ngoc ng
repeat
x := Pop;
if x <> '(' then Write(x, ' ')
else Break;
until False;
'+', '-', '*', '/': //token l ton t
begin
while (top <> nil)
and (Priority(Opt) <= Priority(Get)) do
Write(Pop, ' ');
Push(Opt);
end;
else //token l ton hng
Write(token, ' ');
end;
end;
procedure Parsing;
const Operators = ['(', ')', '+', '-', '*', '/'];
var i, j: Integer;
begin
j := 0; //j l v tr x l xong
for i := 1 to Length(Infix) do
if Infix[i] in Operators + [' '] then
//Nu gp du ngoc, ton t hoc du cch

begin
if i > j + 1 then //Trc v tr i c mt ton hng cha x l
ProcessToken(Copy(Infix, j + 1, i - j - 1));
//x l ton hng

51

if Infix[i] in Operators then


//Nu v tr i cha ton t hoc du ngoc

ProcessToken(Infix[i]); //X l k t
j := i; //Cp nht, x l xong n v tr i
end;
if j < Length(Infix) then //X l nt ton hng cn st li
ProcessToken(Copy(Infix, j + 1, Length(Infix) - j));
//c ht biu thc trung t, ly nt cc phn t trong ngn xp ra v hin th

while top <> nil do


Write(Pop, ' ');
WriteLn;
end;
begin
ReadLn(Infix); //Nhp d liu
top := nil; //Khi to ngn xp rng
Parsing; //c biu thc trung t v chuyn thnh dng RPN
end.

4.6. Xy dng cy nh phn biu din biu thc


Ngay trong phn u tin, chng ta bit rng cc dng biu thc trung t, tin
t v hu t u c th c hnh thnh bng cch duyt cy nh phn biu din
biu thc theo cc trt t khc nhau. Vy ti sao khng xy dng ngay cy
nh phn biu din biu thc ri thc hin cc cng vic tnh ton ngay trn
cy?. Kh khn gp phi chnh l thut ton xy dng cy nh phn trc tip t
dng trung t c th km hiu qu, trong khi t dng hu t li c th khi
phc li cy nh phn biu din biu thc mt cch rt n gin, gn ging nh
qu trnh tnh ton biu thc hu t:



Bc 1: Khi to mt ngn xp rng dng cha cc nt trn cy


Bc 2: c ln lt cc phn t ca biu thc RPN t tri qua phi (phn
t ny c th l hng, bin hay ton t) vi mi phn t :

To ra mt nt mi c cha phn t mi c c

Nu phn t ny l mt ton t, ly t ngn xp ra hai nt (theo th t
l > v ), cho tr thnh con tri v > tr thnh con phi ca nt c

y nt c vo ngn xp
52

Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong,


trong ngn xp ch cn duy nht mt phn t, phn t chnh l gc ca
cy nh phn biu din biu thc.

Bi tp
1.12. Biu thc c th c dng phc tp hn, chng hn biu thc bao gm c
php ly s i (C ), php tnh ly tha ( m ), hm s vi mt hay nhiu
bin s. Chng ta c th biu din nhng biu thc dng ny bng mt cy
tng qut v t c th chuyn biu thc v dng RPN thc hin tnh
ton. Hy xy dng thut ton chuyn biu thc s hc (dng phc tp)
v dng RPN v thut ton tnh gi tr biu thc .
1.13. Vit chng trnh chuyn biu thc logic dng trung t sang dng RPN. V
d chuyn:
nop 0 &q l nop  thnh:
0 nop l  nop &q.
1.14. Chuyn cc biu thc sau y ra dng RPN
 Y H  F
  HUF  P
 Y H  CF
 C H  FrUs
 &q H nop gF &q P &q o&t h
f)  H &q F P

a)
b)
c)
d)
e)

1.15. Vi mt nh en trng hnh vung kch thc ;. Y ;. , ngi ta dng


phng php sau m ha nh:


53

Nu nh ch gm ton im en th nh c th c m ha bng xu ch
gm mt k t B
Nu nh ch gm ton im trng th nh c th c m ha bng xu
ch gm mt k t W
Nu B8 u8 D8 k ln lt l xu m ha ca bn nh vung kch thc bng
nhau th vBuDk l xu m ha ca nh vung to thnh bng cch t 4
nh vung ban u theo s :

B u
k D
V d &B&BWWBW&BWBW v
&&BBBB&BWWBW&BWBW l hai xu m ha ca
cng mt nh bn:

Bi ton t ra l cho s nguyn dng  v hai xu m ha


ca hai nh kch thc ;. Y ;. . Hy cho bit hai nh c khc nhau
khng v nu chng khc nhau hy ch ra mt v tr c mu khc nhau trn
hai nh.

5. Cy nh phn tm kim
5.1. Cu trc chung ca cy nh phn tm kim
Cy nh phn tm kim (binary search tree-BST) l mt cy nh phn, trong
mi nt cha mt phn t (kha). Kha cha trong mi nt phi ln hn hay
bng mi kha trong nhnh con tri v nh hn hay bng mi kha trong nhnh
con phi.
y chng ta gi s rng cc kha lu tr trong cy c ly t mt tp hp k
c quan h th t ton phn.
4

Hnh 1.20. Cy nh phn tm kim

C th c nhiu cy nh phn tm kim biu din cng mt b kha. Hnh 1.20 l


v d v hai cy nh phn tm kim biu din cng mt b kha  8;8V8X8\8T.
54

nh l 5.1
Nu duyt cy nh phn tm kim theo th t gia, cc kha trn cy s c lit
k theo th t khng gim (tng dn).
Chng minh
Ta chng minh nh l bng quy np: R rng nh l ng vi BST ch c mt nt. Gi s
nh l ng vi mi BST c t hn  nt, xt mt BST bt k gm  nt, v nt gc
cha kha , thut ton duyt cy theo th t gia trc ht s lit k tt c cc kha trong
nhnh con tri theo th t khng gim (gi thit quy np), cc kha ny u N  (tnh cht
ca cy nh phn tm kim). Tip theo thut ton s lit k kha  ca nt gc, cui cng,
li theo gi thit quy np, thut ton s lit k tt c cc kha trong nhnh con phi theo th
t khng gim, tng t nh trn, cc kha trong nhnh con phi u w . Vy tt c 
kha trn BST s c lit k theo th t khng gim, nh l ng vi mi BST gm 
nt. PCM.

5.2. Cc thao tc trn cy nh phn tm kim


a) C6u trc nt
Chng ta s biu din BST bng mt cu trc lin kt cc nt ng v con tr
lin kt. Mi nt trn BST s l mt bn ghi gm 3 trng:



Trng >: Cha kha lu trong nt.


Trng 
!M Cha lin kt (con tr) ti nt cha, nu l nt gc (khng
c nt cha) th trng 
! c t bng mt con tr c bit, k hiu
.
Trng : Cha lin kt (con tr) ti nt con tri, nu nt khng c
nhnh con tri th trng  c t bng .
Trng ![: Cha lin kt (con tr) ti nt con phi, nu nt khng c
nhnh con phi th trng ![ c t bng .

Nu cc kha cha trong nt c kiu R> th cu trc nt ca BST c th c


khai bo nh sau:
type
PNode = ^TNode; //Kiu con tr ti mt nt
TNode = record
key: TKey;
parent, left, right: PNode;
end;
var
55

sentinel: TNode;
nilT: PNode; //Con tr ti nt t bit
root: PNode; //Con tr ti nt gc
begin
nilT := @sentinel;
...
end.

Cc ngn ng lp trnh bc cao thng cung cp hng con tr  (hay @)
gn cho cc lin kt khng tn ti trong cu trc d liu. Hng con tr  ch
c s dng so snh vi cc con tr khc, khng c php truy cp bin
ng x.
Trong ci t BST, chng ta s dng con tr  c cng cng tng t nh
con tr : gn cho nhng lin kt khng c thc. Ch c khc l con tr 
tr ti mt bin " c thc, ch c iu cc trng ca x l v ngha
m thi. Chng ta hy sinh mt nh cho bin " x n gin ha
cc thao tc trn BST*.
b) KhB
KhBi t9
t9o cy rC
rCng
Trong cu trc BST khai bo trn, ta quy c mt cy rng l cy c gc
D , php khi to mt BST rng ch n gin l:
procedure MakeNull;
begin
root := nilT;
end;

c) Tm kha l4
l4n nh6
nh6t v nh
nh nh6
nh6t
Theo nh l 5.1, kha nh nht trn BST nm trong nt c thm u tin v
kha ln nht ca BST nm trong nt c thm cui cng nu ta duyt cy
theo th t gia. Nh vy nt cha kha nh nht (ln nht) ca BST chnh l
nt cc tri (cc phi) ca BST. Hm y@ v y
@ di y ln

Mc ch ca bin ny l bt i thao tc kim tra con tr  d  trc khi truy cp nt x.

56

lt tr v nt cha kha nh nht v ln nht trong nhnh cy BST gc


y ta gi thit rng nhnh BST gc khc rng: d )

function Minimum(x: PNode): PNode; //Kha nh nht nm nt cc tri


begin
while x^.left nilT do //i sang nt con tri chng no vn cn i c
x := x^.left;
Result := x;
end;
function Maximum(x: PNode): PNode; //Kha ln nht nm nt cc phi
begin
while x^.right nilT do //i sang nt con phi chng no vn cn i c
x := x^.right;
Result := x;
end;

d) Tm nt liE
liEn trF4
trF4c v nt liE
liEn sau
i khi chng ta phi tm nt ng lin trc v lin sau ca mt nt nu
duyt cy BST theo th t gia. Trc ht ta xt vit hm B!l""!  tr
v nt ng lin trc nt , xt hai trng hp:


Nu c nhnh con tri th tr v nt cc phi ca nhnh con tri:


D"@ z y
@ xE # .
Nu khng c nhnh con tri th t , ta i dn ln pha gc cy cho ti
khi gp mt nt cha trong nhnh con phi th dng li v tr v nt .
function Predecessor(x: PNode): PNode;
begin
if x^.left nilT then //x c nhnh con tri
Result := Maximum(x^.left) //Tr v nt cc phi ca cy con tri
else
repeat
Result := x^.parent;
//Nu x l gc hoc x l nhnh con phi th thot ngay

if (Result = nilT)
or (x = Result^.right) then Break;
x := Result; //Nu khng th i tip ln pha gc
until False;
end;
57

Hm k@ll""!  tr v nt lin sau nt c cch lm tng t nu ta i vai


tr # v D[, y@ v y
@:
function Successor(x: PNode): PNode;
begin
if x^.right nilT then //x c nhnh con phi
Result := Minimum(x^.right) //Tr v nt cc tri ca cy con phi
else
repeat
Result := x^.parent;
//Nu x l gc hoc x l nhnh con tri th thot ngay

if (Result = nilT)
or (x = Result^.left) then Break;
x := Result; //i tip ln pha gc
until False;
end;

e) Tm ki*
ki*m

Php tm kim nhn vo mt nt v mt kha . Nu kha  c trong nhnh


BST gc th tr v mt nt cha kha , nu khng tr v .

Php tm kim trn BST c th ci t bng hm k


!l, hm ny c xy
dng da trn nguyn l chia tr: Nu nt cha kha  th hm n gin
tr v nt , nu khng th vic tm kim s c tin hnh tng t trn cy
con tri hoc cy con phi ty theo nt cha kha nh hn hay ln hn :
//Hm Search tr v nt cha kha k, tr v nilT nu khng tm thy kha k trong nhnh gc x

function Search(x: PNode; const k: TKey): PNode;


begin
while (x nilT) and (x^.key k) do //Chng no cha tm thy
if k < x^.key then x := x^.left
//k chc chn khng nm trong cy con phi, tm trong cy con tri

else x := x^.right;
//k chc chn khng nm trong cy con tri, tm trong cy con phi

Result := x;
end;

58

f) Chn

Chn mt kha  vo BST tc l thm mt nt mi cha kha  trn BST v


mc ni nt vo BST sao cho vn m bo cu trc ca mt BST. Php chn
cng c thc hin da trn nguyn l chia tr: Bi ton chn  vo cy
BST s c quy v bi ton chn  vo cy con tri hay cy con phi, ty theo
kha  nh hn hay ln hn hoc bng kha cha trong nt gc. Trng hp c
s l  c chn vo mt nhnh cy rng, khi ta ch vic to nt mi, mc
ni nt mi vo nhnh rng ny v t kha  vo nt mi .
3

Hnh 1.11. Cy nh phn tm kim trc v sau khi chn kha { |

Trc tin ta vit mt th tc k#B


!8 F8 =#
chnh li cc lin kt sao cho nt F tr thnh nt con ca nt
B
!:
procedure SetLink(ParentNode, ChildNode: PNode;
InLeft: Boolean);
begin
ChildNode^.parent := ParentNode;
if InLeft then ParentNode^.left := ChildNode
//InLeft = True: Cho ChildNode thnh nt con tri ca ParentNode

else ParentNode^.right := ChildNode;


//InLeft = False: Cho ChildNode thnh nt con phi ca ParentNode

end;

Khi th tc chn mt nt x vo BST c th vit nh sau


//Chn k vo BST, tr v nt mi cha k

59

function Insert(k: TKey): PNode;


var x, y: PNode;
begin
y := nilT;
x := root; //Bt u t gc
while x nilT do
begin
y := x;
if k < x^.key then x := x^.left //Chn vo nhnh tri
else x := x^.right; //Chn vo nhnh phi
end;
New(x); //To nt mi cha k
x^.key := k;
x^.left := nilT;
x^.right := nilT;
SetLink(y, x, k < y^.key); //Mc ni vo BST
if root = nilT then root := x;
//Cp nht li gc nu l nt u tin c chn vo

Result := x;
end;

g) Xa
Vic xa mt nt trong BST thc cht l xa i kha cha trong nt . Php
xa c thc hin nh sau:


Nu c t hn hai nhnh con, ta ly nt con (nu c) ca ln thay cho


v xa nt .
Nu c hai nhnh con, ta xc nh nt > l nt cc phi ca nhnh con tri
(hoc nt cc tri ca cy con phi), a kha cha trong nt > ln nt ri
xa nt >. Ch rng nt > chc chn khng c hai nt con, vic xa
quy v trng hp trn. (h.1.22)

60

>

>

Hnh 1.22. Xa nt khi BST

procedure Delete(x: PNode);


var y, z: PNode;
begin
if (x^.left nilT) and (x^.right nilT) then
//x c hai nhnh con

begin
y := Maximum(x^.left); //Tm nt cc phi ca cy con tri
x^.key := y^.key; //a kha ca nt y ln nt x
x := y;
end;
//Vn by gi l xa nt x c nhiu nht mt nhnh con, xc nh y l nt con (nu c) ca x

if x^.left nilT then y := x^.left


else y := x^.right;
z := x^.parent; //z l cha ca x
//cho y lm con ca z thay cho x

SetLink(z, y, z^.left = x);


if x = root then root := y;
//Trng hp nt x b hy l gc th cp nht li gc l y

Dispose(x); //Gii phng b nh cp cho nt x


end;

h) Php quay cy
Php quay cy l mt php chnh li cu trc lin kt trn BST, c hai loi: quay
tri (left rotation) v quay phi (right rotation).
Khi ta thc hin php quay tri trn nt , chng ta gi thit rng nt con phi
ca l > d . Trn cy con gc , php quay tri s a > ln lm gc mi,
61

tr thnh nt con tri ca > v nt con tri ca > tr thnh nt con phi ca .

Php quay ny cn gi l quay theo lin kt

G >.

Ngc li, php quay phi thc hin trn nhng cy con gc > m nt con tri
ca > l d . Sau php quay phi, s c a ln lm gc nhnh, > tr
thnh nt con phi ca v nt con phi ca > tr thnh nt con tri ca . Php
~

quay ny cn gi l quay theo lin kt > G .

D thy rng sau php quay, rng buc v quan h th t ca cc kha cha
trong cy vn m bo cho cy mi l mt BST.
Hnh 5.4 m t hai php quay trn cy nh phn tm kim.
c

>

Quay phi

Quay tri

>

Hnh 1.23. Php quay cy

Cc thut ton quay tri v quay phi c th vit nh sau:


procedure RotateLeft(x: PNode);
var y, z, branch: PNode;
begin
y := x^.right;
z := x^.parent;
branch := y^.left;
SetLink(x, branch, False); //Cho branch tr thnh con phi ca x
SetLink(y, x, True); //Cho x tr thnh con tri ca y
SetLink(z, y, (z^.left = x)); //Mc ni y vo lm con ca z thay cho x
if root = x then root := y; //Cp nht li gc cy nu trc y x l gc
end;
62

procedure RotateRight(y: PNode);


var x, z, branch: PNode;
begin
x := y^.left;
z := y^.parent;
branch := x^.right;
SetLink(y, branch, True); //Cho branch tr thnh con tri ca y
SetLink(x, y, False); //Cho y tr thnh con phi ca x
SetLink(z, x, z^.left = y); //Mc ni x vo lm con ca z thay cho y
if root = y then root := x; //Cp nht li gc cy nu trc y y l gc
end;

D thy rng mt BST sau php quay vn l BST. Chng ta c th vit mt thao
tc !  tng qut hn: Vi d ! , v > xE 
! , php
!  s quay theo lin kt > y nt ln pha gc cy ( su
ca gim 1) v ko nt > xung su hn mt mc lm con nt .
procedure UpTree(x: PNode);
var y, z, branch: PNode;
begin
y := x^.parent; //y^ l nt cha ca x^
z := y^.parent; //z^ l nt cha ca y^
if x = y^.left then //Quay phi
begin
branch := x^.right;
SetLink(y, branch, True);

//Chuyn nhnh gc branch^ ca x^ sang lm con tri y^


SetLink(x, y, False); //Cho y^ lm con phi x^

end
else //Quay tri
begin
branch := x^.left;
SetLink(y, branch, False);
//Chuyn nhnh gc branch^ ca x^ sang lm con phi y^

SetLink(x, y, True); //Cho y^ lm con tri x^


end;
SetLink(z, x, z^.left = y); //Mc ni x^ vo lm con z^ thay cho y^
if root = y then root := x;
//Cp nht li gc BST nu trc t y^ l gc

63

end;

5.3. Hiu lc ca cc thao tc trn cy nh phn tm kim

C th chng minh c rng cc thao tc y@ , y


@ ,
B!l""!, k@ll""!, k
!l, ="! u c thi gian thc hin $ vi
 l chiu cao ca cy nh phn tm kim. Hn na, trong trng hp xu nht,
cc thao tc ny u c thi gian thc hin .

Vy khi lu tr  kha bng cy nh phn tm kim th cu trc BST tt nht l


cu trc cy nh phn gn hon chnh (c chiu cao thp nht:  _%' `) cn
cu trc BST ti nht biu din l cu trc cy nh phn suy bin (c chiu
cao   C ).

5.4. Cy nh phn tm kim t cn bng


a) Tnh cn b+
b+ng

tng tnh hiu qu ca cc thao tc c bn trn BST, cch chung nht l c


gng gim chiu cao ca cy. Vi mt BST gm  nt, d nhin gii php l
tng l gim c chiu cao xung cn _%' ` (cy nh phn gn hon chnh)
nhng iu ny thng lm nh hng nhiu ti thi gian thc hin gii thut.
Ngi ta nhn thy rng mun mt cy nh phn thp th phi c gng gi c
s cn bng (v chiu cao v s nt) gia hai nhnh con ca mt nt bt k.
Chnh v vy nhng tng ban u gim chiu cao ca BST xut pht t
nhng k thut cn bng cy, t ngi ta xy dng cc cu trc d liu cy
nh phn tm kim c kh nng t cn bng (self-balancing binary search tree)
vi mong mun gi c chiu cao ca BST lun l mt i lng $%' .
b) M8t s!
s! d9ng BST tL
tL cn b+
b+ng

 Cy AVL
Mt trong nhng pht kin u tin v cu trc BST t cn bng l cy AVL
[1]. Trong mi nhnh cy AVL, chiu cao ca nhnh con tri v nhnh con phi
hn km nhau khng qu 1. Mi nt ca cy AVL cha thm mt thng tin v
h s cn bng ( lch chiu cao gia nhnh con tri v nhnh con phi). Ngay
sau mi php chn/xa, h s cn bng ca mt s nt c cp nht li v nu

64

pht hin mt nt c h s cn bng w ;, php quay cy s c thc hin


cn bng cao gia hai nhnh con ca nt .
Mt cy AVL c cao  th c khng t hn   V C nt. y   V
l s fibonacci th   V. Cc tc gi cng chng minh c rng chiu cao ca
cy AVL c  nt trong l mt i lng EXX7X %'  ; C 7EV;e.
 Cy en

Mt dng khc ca BST t cn bng l cy en (Red-Black tree) [4]. Mi nt


ca cy en cha thm mt bit mu ( hoc en). Ngoi cc tnh cht ca
BST, cy en tha mn 5 tnh cht sau y:






Mi nt u c t mu ( hoc en)
Nt gc !x c mu en
Nt x c mu en
Nu mt nt c t mu th c hai nt con ca n phi c t mu en
Vi mi nt, tt c cc ng i t nt n cc nt l hu du c cng
mt s lng nt en.

Tng t nh cy AVL, i km vi cc php chn/xa trn cy en l nhng


thao tc t mu v cn bng cy. Ngi ta chng minh c rng chiu cao ca
cy en c  nt trong khng vt qu ; %'  . Trn thc t cy en
nhanh hn cy AVL php chn v xa nhng chm hn php tm kim.
 Cy Splay
Cn rt nhiu dng BST t cn bng khc nhng mt trong nhng tng th v
nht l cy Splay [35]. Cy Splay duy tr s cn bng m khng cn thm mt
thng tin ph tr no mi nt. Php lm bp cy c thc hin mi khi c
lnh truy cp, nhng nt thng xuyn c truy cp s c y dn ln gn
gc cy c tc truy cp nhanh hn. Cc php tm kim, chn v xa trn
cy Splay cng c thc hin trong thi gian $%'  (nh gi b tr). Trong
trng hp tn sut thc hin php tm kim trn mt kha hay mt cm kha
cao hn hn so vi nhng kha khc, cy splay s pht huy c u th v mt
tc .

65

c) V6n "E
"E chN
chNng minh l thuy*
thuy*t v ci ":
" :t
Cy AVL v cy en thng c a vo ging dy trong cc gio trnh cu
trc d liu v cc tnh cht ca hai cu trc d liu kh d dng trong chng
minh l thuyt. Cy Splay thng c s dng trong cc phn mm ng dng
v tc nhanh v tnh cht nhanh hn nu truy cp li (quick to access
again). Ba loi cy ny kh ph bin trong cc th vin h tr ca cc mi
trng pht trin cao cp vit cc phn mm ng dng. Lp trnh vin c th
ty chn loi cy thch hp nht ci t gii quyt vn ca mnh.
Trong trng hp bn lp trnh trong thi gian hn hp m khng c th vin h
tr (chng hn trong cc k thi lp trnh), phi ni rng vic ci t cc loi cy
k trn khng h n gin v d nhm ln (bn c th tham kho trong cc ti
liu khc v c s l thuyt v k thut ci t cc loi cy k trn). Nu bn cn
s dng cc cu trc d liu ny trong phn mm, theo ti cc bn nn s dng
cc th vin sn c hoc vit mt th vin lp mu (class template) tht cn thn
s dng li.
Ti s khng i vo chi tit cc loi cy ny. iu bn phi nh ch l c tn ti
nhng cu trc nh vy, khi nh gi mt thut ton c s dng BST, c th
coi cc thao tc c bn trn BST c thc hin trong thi gian $%' .
Trong bi sau ti s gii thiu mt cu trc BST khc d ci t hn, d ty bin
hn, v tc cng khng h thua km trn thc t: Cu trc Treap.

Bi tp
1.16. Qu trnh tm kim trn BST c th coi nh mt ng i xut pht t nt
gc. Gio s X pht hin ra mt tnh cht th v: Nu ng i trong qu
trnh tm kim kt thc mt nt l, k hiu # l tp cc gi tr cha trong
cc nt nm bn tri ng i v D l tp cc gi tr cha trong cc nt
nm bn phi ng i. Khi L 5 #8 > 5 D, ta c N >. Chng minh
pht hin ca gio s X l ng hoc ch ra mt phn v d.
1.17. Cho BST gm  nt, bt u t nt y@x , ngi ta gi hm
k@ll""! i sang nt lin sau cho ti khi duyt qua nt y
@x.

66

Chng minh rng thi gian thc hin gii thut ny c thi gian thc hin
$.

Gi : Thc hin  li gi k@ll""! ln tip n gin ch l duyt qua


cc lin kt cha/con trn BST mi lin kt ti a 2 ln. iu tng t c
th chng minh c nu ta bt u t nt y
@x v gi lin tip
hm B!l""! i sang nt lin trc.

1.18. Cho BST c chiu cao , bt u t mt nt (, ngi ta tm nt + l nt


lin sau (: + z k@ll""!( , tip theo li tm nt  l nt lin sau
+ , Chng minh rng thi gian thc hin  ln php k@ll""! nh vy
ch mt thi gian $  .
1.19. (tree Sort) Ngi ta c th thc hin vic sp xp mt dy kha bng cy
nh phn tm kim: Chn ln lt cc gi tr kha vo mt cy nh phn
tm kim sau duyt cy theo th t gia. nh gi thi gian thc hin
gii thut trong trng hp tt nht, xu nht v trung bnh. Ci t thut
ton tree Sort.
1.20. Vit thut ton k
!l# tm nt cha kha ln nht N  trong
BST.

1.21. Vit thut ton k


!lA tm nt cha kha nh nht w  trong
BST.
1.22. Vit th tc yD nhn vo nt  v dng cc php quay
chuyn nt  thnh gc ca cy BST.
1.23. Vit th tc y#
 nhn vo nt  v dng cc php quay
chuyn nt  thnh mt nt l ca cy BST.

1.24. Radix tree (cy tm kim c s) l mt cy nh phn trong mi nt c


th cha hoc khng cha gi tr kha, (ngi ta thng dng mt gi tr
c bit tng ng vi nt khng cha gi tr kha hoc s dng thm mt
bit nh du nhng nt khng cha gi tr kha)
Cc gi tr kha lu tr trn Radix tree l cc dy nh phn, hay tng qut
hn l mt kiu d liu no c th m ha bng cc dy nh phn. Php
chn mt kha vo Radix tree c thc hin nh sau: Bt u t nt gc
ta duyt biu din nh phn ca kha, gp bit 0 i sang nt con tri v gp

67

bit 1 i sang nhnh con phi, mi khi khng i c na (i vo lin kt


), ta to ra mt nt v ni n vo cy ch lin kt  va r sang
ri i tip. Cui cng ta t kha vo nt cui cng trn ng i. Hnh
di y l Radix tree sau khi chn cc gi tr 1011, 10, 100, 0, 011. Cc
nt t m khng cha kha

0
0

10
1
011

100
1
1011

Gi k l tp cha cc kha l cc dy nh phn, tng di cc dy nh


phn trong k l . Ch ra rng chng ta ch cn mt thi gian  xy
dng Radix tree cha cc phn t ca k, mt thi gian  duyt
Radix tree theo th t gia v lit k cc phn t ca k theo th t t in.

1.25. Cho BST to thnh t  kha c chn vo theo mt trt t ngu nhin,
gi Gi l bin ngu nhin cho chiu cao ca BST. Chng minh rng k
vng   $%' .

1.26. Cho BST to thnh t  kha c chn vo theo mt trt t ngu nhin,
gi Gi l bin ngu nhin cho su ca mt nt. Chng minh rng k
vng   $%' .

1.27. Gi 0 l s lng cc cy nh phn tm kim cha  kha hon ton


phn bit.


Chng minh rng 07 v 0 :.3(


I<4 0I 0.3(3I

68

Chng minh rng 0 .K( g+.


h (s catalan th ). T suy ra xc sut
.

Chng minh cng thc xp x 0

BST l cy nh phn gn hon chnh (hoc cy nh phn suy bin) nu 


kha c chn vo theo th t ngu nhin.
/

.U,

g  $ Uh

6. Cy nh phn tm kim ngu nhin


6.1. cao trung bnh ca BST
Trong bi trc ta bit rng cc thao tc c bn ca BST c thc hin
trong thi gian $ vi  l chiu cao ca cy. Nu  kha c chn vo mt
BST rng, ta s c mt BST gm  nt. Chiu cao ca BST c th l mt s
nguyn no nm trong phm vi t _[` ti  C . Nu thay i th t chn 
kha vo cy, ta c th thu c mt cu trc BST khc.

iu chng ta mun bit l nu chn  kha vo BST theo cc trt t khc nhau
th cao trung bnh ca BST thu c l bao nhiu. Hay ni chnh xc hn,
chng ta cn bit gi tr k vng ca cao mt BST khi chn  kha vo theo
mt trt t ngu nhin.
Thc ra trong cc thao tc c bn ca BST, su trung bnh ca cc nt mi l
yu t quyt nh hiu sut ch khng phi cao ca cy. su ca nt 
chnh l s php so snh cn thc hin chn nt  vo BST. Tng s php so
snh chn ton b  nt vo BST c th nh gi tng t nh QuickSort,
bng $ %' . Vy su trung bnh ca mi nt l

$ %'  $%' .

Ngi ta cn chng minh c mt kt qu mnh hn: cao trung bnh ca


BST l mt i lng $%' . C th l   N V %'   $  vi   l gi tr
k vng ca cao v  l s nt trong BST. Chng minh ny kh phc tp,
bn c th tham kho trong cc ti liu khc .

69

6.2. Treap
Chng ta c th trnh trng hp suy bin ca BST bng cch chn cc nt vo
cy theo mt trt t ngu nhin*. Tuy nhin trn thc t rt t khi chng ta m
bo c cc nt c chn/xa trn BST theo trt t ngu nhin, bi cc thao
tc trn BST thng do mt tin trnh khc thc hin v th t chn/xa hon
ton do tin trnh quyt nh.
Trong mc ny chng ta quan tm ti mt dng BST m cu trc ca n khng
ph thuc vo th t chn/xa: Treap.

Cho mi nt ca BST thm mt thng tin !!> gi l u tin. u


tin ca mi nt l mt s dng. Khi Treap [33] c nh ngha l mt
BST tha mn tnh cht ca Heap. C th l:




Nu nt > nm trong nhnh con tri ca nt th >E > N E >.


Nu nt > nm trong nhnh con phi ca nt th >E > w E >.
Nu nt > l hu du ca nt th >E !!> N E !!>

Hai tnh cht u tin l tnh cht ca BST, tnh cht th ba l tnh cht ca
Heap. Nt gc ca Treap c u tin ln nht. tin trong ci t, ta quy
nh nt gi x c u tin bng 0.
nh l 6-1

Xt mt tp cc nt, mi nt cha kha v u tin, khi tn ti cu trc


Treap cha cc nt trn.
Chng minh
Khi to mt BST rng v chn ln lt cc nt vo BST theo th t t nt u
tin cao nht ti nt u tin thp nht. Hai rng buc u tin c tha mn v ta
s dng php chn ca BST. Hn na php chn ca BST lun chn nt mi vo
thnh nt l nn sau mi bc chn, nt l mi chn vo khng th mang u
tin ln hn cc nt tin bi ca n c. iu ny ch ra rng BST to thnh l
mt Treap.

T trnh y khng chnh xc, trn thc t phng php ny khng trnh c trng hp xu. C
iu l xc sut xy ra trng hp xu qu nh v rt kh c tnh ch ra c th trng hp xu (ging
nh Randomized QuickSort).

Tn gi Treap l ghp ca hai t: tree v Heap

70

nh l 6-2
Xt mt tp cc nt, mi nt cha kha v u tin. Nu cc kha cng nh
u tin ca cc nt hon ton phn bit th tn ti duy nht cu trc Treap
cha cc nt trn.
Chng minh
S tn ti ca cu trc Treap c ch ra trong chng minh trong nh l 6.1.
Tnh duy nht ca cu trc Treap ny c th chng minh bng quy np: R rng
nh l ng vi tp gm 0 nt (Treap rng). Xt tp gm w nt, khi nt c
u tin ln nht chc chn s phi l gc Treap, nhng nt mang kha nh hn
kha ca nt gc phi nm trong nhnh con tri v nhng nt mang kha ln hn
kha ca nt gc phi nm trong nhnh con phi. S duy nht v cu trc ca
nhnh con tri v nhnh con phi c suy ra t gi thit quy np. PCM.

Trong ci t thng thng ca Treap, u tin !!> ca mi nt thng


c gn bng mt s ngu nhin v hiu ha nhng tin trnh c tnh lm
cy suy bin: Cho d cc nt c chn/xa trn Treap theo th t no, cu trc
ca Treap s lun ging nh khi chng ta chn cc nt cn li vo theo th t
gim dn ca B!!> (tc l th t ngu nhin). Hn na nu bit trc c
tp cc nt s chn vo Treap, ta cn c th gn u tin !!> cho cc nt
mt cch hp l p Treap thnh cy nh phn gn hon chnh (trung v ca
tp cc kha s c gn u tin cao nht tr thnh gc cy, tng t vi
nhnh tri v nhnh phi). Ngoi ra nu bit trc tn sut truy cp nt ta c
th gn u tin ca mi nt bng tn sut ny cc nt b truy cp thng
xuyn s gn gc cy, t tc truy cp nhanh hn.

6.3.Cc thao tc trn Treap


a) C6u trc nt

Tng t nh BST, cu trc nt ca Treap ch c thm mt trng !!>


lu u tin ca nt
type
PNode = ^TNode; //Kiu con tr ti mt nt
TNode = record
key: TKey;
parent, left, right: PNode;
priority: Integer;
71

end;
var
sentinel: TNode;
nilT: PNode; //Con tr ti nt t bit
root: PNode; //Con tr ti nt gc
begin
sentinel.priority := 0;
nilT := @sentinel;
...
end.

Trn l thuyt ngi ta thng cho cc gi tr B!!> l s thc ngu nhin,


khi ci t ta c th cho B!!> s nguyn dng ly ngu nhin trong mt
phm vi rng. K hiu DB l hm tr v mt s dng ngu nhin, bn c th
ci t hm ny bng bt k mt thut ton to s ngu nhin no. V d:
function RP: Integer;
begin
Result := 1 + Random(MaxInt - 1);
//Ly ngu nhin t 1 ti MaxInt - 1

end;

Cc php khi to cy rng, tm phn t ln nht, nh nht, tm phn t lin


trc, lin sau trn Treap khng khc g so vi trn BST thng thng. Php
quay khng c thc hin ty tin trn Treap v n s ph v rng buc th t
Heap, thay vo ch c thao tc UpTree c nhng vo trong mi php chn
(Insert) v xa (Delete) hiu chnh cu trc Treap.

Nhc li v thao tc ! 

72

>

l nhnh tri
Quay phi

H!
l

>


H!
l

>

l nhnh phi
 Quay tri


H!
l

Hnh 1.24. Thao tc 

procedure UpTree(x: PNode);


var y, z, branch: PNode;
begin
y := x^.parent; //y^ l nt cha ca x^
z := y^.parent; //z^ l nt cha ca y^
if x = y^.left then //Quay phi
begin
branch := x^.right;
SetLink(y, branch, True);
SetLink(x, y, False);
end
else //Quay tri
begin
branch := x^.left;
SetLink(y, branch, False);
SetLink(x, y, True);
end;
73

>


H!
l

SetLink(z, x, z^.left = y); //Mc ni x^ vo lm con z^ thay cho y^


if root = y then root := x;
//Cp nht li gc BST nu trc t y^ l gc

end;

b) Chn
Php chn trn Treap trc ht thc hin nh php chn trn BST chn kha
vo mt nt l. Nt l x mi chn vo s c gn mt u tin ngu nhin.
Tip theo l php hiu chnh Treap: Gi >x l nt cha ca x, chng no thy
x mang u tin ln hn >x (vi phm th t Heap) ta thc hin lnh
!  y nt x ln lm cha nt >x v ko nt >x xung lm con nt
x.
//Chn kha k vo Treap, tr v con tr ti nt cha k

function Insert(k: TKey): PNode;


var x, y: PNode;
begin
//Thc hin php chn nh trn BST

y := nilT;
x := root;
while x nilT do
begin
y := x;
if k < x^.key then x := x^.left
else x := x^.right;
end;
New(x);
x^.key := k;
x^.left := nilT;
x^.right := nilT;
SetLink(y, x, k < y^.key);
if root = nilT then root := x;
//Chnh Treap

x^.priority := RP; //Gn u tin ngu nhin


repeat
y := x^.parent;
if (y nilT)
and (x^.priority > y^.priority) then UpTree(x)
74

else Break;
until False;
Result := x;
end;

V d chng ta c mt Treap cha cc kha A, B, E, G, H, K vi u tin l


A:1, B:5, E:2, G:7, H:4, K:3 v chn mt nt kha cha kha I v u tin 6
vo Treap, trc ht thut ton chn trn BST c thc hin nh trong hnh
1.25.
G:7

B:5

A:1

G:7

H:4

E:2

B:5

K:3

A:1

H:4

E:2

K:3

I:6

Hnh 1.15. Php chn trn Treap trc ht thc hin nh trong BST

Tip theo l hai php ! chuyn nt I:6 v v tr ng trn Treap


(h.1.26)
G:7

B:5

A:1

G:7

H:4

E:2

B:5

K:3

I:6

A:1

G:7

H:4

E:2

B:5

I:6

A:1

I:6

E:2

H:4

K:3

K:3

Hnh 1.26. Sau php chn BST l cc php UpTree chnh li Treap

S php ! cn thc hin ph thuc v tr v u tin ca nt mi chn


vo (C th l s no t 0 ti  vi  l cao ca Treap), nhng ngi ta
chng minh c nh l sau:
nh l 6.3

Trung bnh s php ! cn thc hin trong php chn ="! l 2.

75

c) Xa

Php xa nt x trn Treap c thc hin nh sau:




Nu x c t hn hai nhnh con, ta ly nt con (nu c) ca x ln thay cho


x v xa nt x.
Nu x c ng hai nhnh con, gi >x l nt con mang u tin ln hn
trong hai nt con, thc hin php !> ko nt x xung su pha
di l v lp li cho ti khi x ch cn mt nt con. Vic xa quy v
trng hp trn
procedure Delete(x: PNode);
var y, z: PNode;
begin
while (x^.left nilT) and (x^.right nilT) do
//Chng no x^ c 2 nt con

begin
//Xc nh y^ l nt con mang u tin ln hn

y := x^.left;
if y^.priority < x^.right^.priority then
y := x^.right;
UpTree(y); //y y ln pha gc, ko x xung pha l
end;
//By gi x^ ch c ti a mt nt con, xc nh y^ l nt con (nu c) ca x

if x^.left <> nilT then y := x^.left


else y := x^.right;
z := x^.parent; //z^ l nt cha ca x^
SetLink(z, y, z^.left = x); //Cho y^ lm con ca z^ thay cho x^
if x = root then root := y; //Cp nht li gc
Dispose(x); //Gii phng b nh
end;

V d chng ta c mt Treap cha cc kha A, B, E, G, H, I, K vi u tin l


A:1, B:5, E:2, G:7, H:4, I:6, K:3 v xa nt cha kha G. Ba php !
(quay) s c thc hin trc khi xa nt cha kha G

76

G:7

I:6

B:5

A:1

G:7

I:6

E:2

H:4

K:3

K:3

H:4

B:5

A:1

E:2

K:3

G:7
E:2

H:4

I:6

K:3

A:1

B:5

A:1

I:6

B:5

I:6

H:4
G:7

B:5

K:3

A:1

H:4
E:2

E:2

Hnh 1.27. Thc hin cc php quay y dn nt cn xa xung di l, khi nt cn xa cn t hn 1


nhnh con th xa trc tip.

Tng t nh php chn, s php ! cn thc hin ph thuc v tr v


u tin ca nt b xa, nhng ngi ta chng minh c nh l sau y.
nh l 6-4

Trung bnh s php ! cn thc hin trong php xa P l 2.

Bi tp
1.28. Th t thng k: Cho mt Treap, hy xy dng thut ton tm kha ng
th  khi sp th t. Ngc li cho mt nt, hy tm s th t ca nt
khi duyt Treap theo th t gia.
1.29. Treap biu din tp hp

Khi dng Treap  biu din tp hp cc gi tr kha, (tc l cc kha trong


Treap hon ton phn bit), php th  5  c th c thc hin thng

77

qua hm k
!l. Vic thm mt phn t vo tp hp c th thc hin
thng qua mt sa i ca hm ="! (Ch chn nu kha cha c trong
Treap). Vic xa mt phn t khi tp hp cng c thc hin thng qua
vic sa i th tc P (tm phn t trong Treap, nu tm thy th thc
hin php xa). Ngoi ra cn c nhiu thao tc khc c thc hin rt
hiu qu vi cu trc Treap, hy ci t cc thao tc sau y trn Treap:

Php tch (Split): Vi mt gi tr 4 , tch cc kha O 4 v cc kha


1 4 ra hai Treap biu din hai tp hp ring r.

Gi : Tm nt cha phn t 4 trong Treap, nu khng thy th chn 4


vo mt nt mi. t u tin ca nt ny bng . Theo nguyn l
ca cu trc Treap, nt ny s c y ln thnh gc cy. Ngoi ra theo
nguyn l ca cu trc BST, nhnh con tri ca gc cy s cha tt c cc
kha O 4 v nhnh con phi ca gc cy s cha tt c cc kha 1 4 .
Php hp (Union): Cho hai Treap cha hai tp kha, xy dng Treap mi
cha tt c cc kha ca hai Treap ban u

Php giao (Intersection): Cho hai Treap cha hai tp kha, xy dng
Treap mi cha tt c cc kha c mt trong c hai Treap ban u

Php ly hiu (Difference): Cho hai Treap 8 H cha hai tp kha, xy


dng Treap mi cha cc kha thuc  nhng khng thuc H.

7. Mt s ng dng ca cy nh phn tm kim


Ngoi ng dng biu din tp hp (Bi tp 6.2), cy nh phn tm kim cn
c nhiu ng dng quan trng khc na. Trong bi ny chng ta s kho st mt
vi ng dng khc ca cu trc BST.
Cu trc BST thng thng c th dng ci t chng trnh gii quyt
nhng vn trong bi, tuy nhin bn nn s dng mt dng BST t cn bng
hoc Treap trnh trng hp xu ca BST.

7.1. Cy biu din danh sch


Chng ta bit nhng cch c bn biu din danh sch l s dng mng
hoc danh sch mc ni. S dng mng c tc tt vi php truy cp ngu
nhin nhng s b chm nu danh sch lun b bin ng bi cc php chn/xa.
78

Trong khi , s dng danh sch mc ni c th thun tin hn trong cc php


chn/xa th li gp nhc im trong php truy cp ngu nhin.
Trong mc ny chng ta s trnh by mt phng php biu din danh sch bng
cy nh phn m cc trn , php truy cp ngu nhin, chn, xa u c thc
hin trong thi gian $%' . Ta s pht biu mt bi ton c th v ci t
chng trnh gii bi ton .
a) Bi ton

Cho mt danh sch # cha cc s nguyn. K hiu #[# l s phn t


trong danh sch. Xt cc thao tc cn bn trn danh sch:


Php chn ="!8 : Nu N  N #[#  , thao tc ny chn mt


s  vo v tr  ca danh sch, nu khng thao tc ny khng c hiu lc.
(Trng hp  #[#  th a
@ s c thm vo cui danh
sch).
Php xa P: Nu N  N #[#, thao tc ny xa phn t th
 trong danh sch, nu khng thao tc ny khng c hiu lc.

Cho danh sch # v  thao tc thuc mt trong hai loi, hy in ra cc phn


t theo ng th t trong danh sch cui cng.
Input



Dng 1 cha s nguyn dng  N 7


 dng tip, mi dng cho thng tin v mt thao tc. Mi dng bt u bi
mt k t 5 6=8 P9. Nu k t u dng l I th tip theo l hai s nguyn
8  tng ng vi php chn ="!8 , nu k t u dng l P th tip
theo l s nguyn  tng ng vi php xa P. Cc gi tr 8  l s
nguyn Integer.

Output
Cc phn t trong danh sch cui cng theo ng th t.

79

Sample Input

Sample Output

9 1 6 5

I 5 1
I 6 1
I 7 1
I 8 3
I 1 2
D 4
I 9 2
D 1

b) Gi
Gii thu
thu t v tQ
tQ chN
chNc dR
dR li;
li;u

Chng ta s lu tr cc phn t ca danh sch # trong mt cu trc Treap sao


cho nu duyt Treap theo th t gia th cc phn t ca # s c lit k theo
ng th t trong danh sch.
 Nt cm canh cui danh sch
u tin ca cc nt l mt s nguyn dng ngu nhin nh hn hng s
MaxInt. tin ci t, ta thm vo danh sch # mt phn t gi ng cui
danh sch v gn u tin MaxInt phn t ny tr thnh nt gc ca Treap.
Phn t gi ny c hai cng dng:


Mi php chn hiu lc u c mt phn t ca danh sch nm ti v tr


chn, ta bt i c cc php x l trng hp ring khi chn vo cui danh
sch.
Nt gc !x ca Treap khng bao gi b thay i, ta khng cn phi kim
tra v cp nht li gc sau cc php chn hoc xa.

Theo cch xy dng Treap nh vy, ton b cc phn t ca danh sch # s nm


trong nhnh con tri ca nt gc Treap. Ta ch cn duyt nhnh con tri ca nt
gc Treap theo th t gia l lit k c tt c cc phn t theo ng th t.
 Qun l s nt

Trong mi nt !x ca Treap, ta lu tr !xE "c l s lng nt nm trong nhnh


Treap gc !x. Trng "c ca cc nt s c cp nht mi khi c s thay i
80

cu trc Treap. Cng dng ca trng "c l qun l s nt trong mt nhnh


Treap, phc v cho php truy cp ngu nhin.
 Truy cp ngu nhin

C hai php chn v xa u c mt tham s v tr . Vic chn/xa trn danh


sch tru tng # s quy v vic chn/xa trn Treap sao cho duy tr c s
thng nht gia Treap v danh sch # nh nh. Vy vic u tin chnh l
xc nh nt tng ng vi v tr  l nt no trong Treap. Theo nguyn l ca
php duyt cy theo th t gia (duyt nhnh tri, duyt nt gc, sau duyt
nhnh phi), thut ton xc nh nt tng ng vi v tr  c th din t nh
sau: Xt bi ton tm nt th  trong nhnh Treap gc !x:



Nu  !xE xE "c  th nt cn tm chnh l nt !.


Nu  O !xE xE "c  th quy v tm nt th  trong nhnh con tri ca
!.
Nu  1 !xE xE "c  th quy v tm nt th  C !xE xE "c C
trong nhnh con phi ca !x.

S bc lp tm nt tng ng vi v tr  c th tnh bng su ca nt kt


qu (cng thm 1). Php truy cp ngu nhin c ci t bng hm :
Nhn vo mt s nguyn  v tr v nt tng ng vi v tr trn Treap.
 Chn

chn mt gi tr  vo v tr , trc ht ta to nt x cha gi tr , xc nh


nt >x l nt hin ang ng th . Nu >x khng c nhnh tri th mc ni x
vo thnh nt con tri ca >x. Nu khng ta i sang nhnh tri ca >x v mc
ni x vo thnh nt cc phi ca nhnh tri ny.

Tip theo l phi cp nht s nt, nt x chn vo s tr thnh nt l v c


xE "c , trng "c trong tt c cc nt tin bi ca x cng c tng ln
1 gi tnh ng b.

Cui cng, ta gn cho xE !!> mt u tin ngu nhin v thc hin cc


php !  y x ln v tr ng. Ch l trong php !, ngoi
nhng thao tc x l c bn trn Treap, ta phi cp nht li trng "c ca hai
nt chu nh hng qua php quay.

81

 Xa

xa phn t ti v tr , ta xc nh nt x nm ti v tr  v tin hnh xa nt


x. Php xa c thc hin nh trn Treap: Chng no x cn hai nt con, ta
xc nh >x l nt con mang u tin ln hn v thc hin !> ko
x su xung di l. Khi x cn t hn hai nt con, ta a nhnh con gc >x
(nu c) ca x vo th ch v xa nt x. Sau khi xa th ton b trng kc
trong cc nt tin bi ca x phi gim i 1 gi tnh ng b.
c) Ci ":
": t


DYNLIST.PAS  Cy biu din danh sch


{$MODE OBJFPC}
program DynamicList;
type
PNode = ^TNode; //Kiu con tr ti mt nt
TNode = record //Kiu nt Treap
value: Integer;
priority: Integer;
size: Integer;
left, right, parent: PNode;
end;
var
sentinel: TNode; //Lnh canh (= nilT^)
nilT, root: PNode;
n: Integer; //S thao tc
function NewNode: PNode; //Hm to nt mi, tr v con tr ti nt mi
begin
New(Result); //Cp pht b nh
with Result^ do //Khi to cc trng trong nt mi to ra
begin
priority := Random(MaxInt - 1) + 1;
//Gn u tin ngu nhin
size := 1; //Nt ng n c, size = 1

parent := nilT;
left := nilT;
right := nilT; //Cc trng lin kt c gn = nilT
end;
82

end;
procedure InitTreap; //Khi to Treap
begin
sentinel.priority := 0;
sentinel.size := 0;
nilT := @sentinel; //em con tr nilT tr ti sentinel
root := NewNode;
root^.priority := MaxInt; //root^ c gn u tin cc i
end;
//Mc ni ChildNode thnh con ca ParentNode

procedure SetLink(ParentNode, ChildNode: PNode;


InLeft: Boolean);
begin
ChildNode^.parent := ParentNode;
if InLeft then ParentNode^.left := ChildNode
else ParentNode^.right := ChildNode;
end;
function NodeAt(i: Integer): PNode; //Truy cp ngu nhin
begin
Result := root; //Bt u t gc Treap
repeat
if i = Result^.left^.size + 1 then Break;
//Nu nt ny ng th i th dng

if i <= Result^.left^.size then //Lp li, tm trong nhnh con tri


Result := Result^.left
else //Lp li, tm trong nhnh con phi
begin
Dec(i, Result^.left^.size + 1);
Result := Result^.right;
end;
until False;
end;
procedure UpTree(x: PNode); //y x^ ln pha gc Treap bng php quay
var y, z, branch: PNode;
begin
y := x^.parent;
z := y^.parent;
if x = y^.left then //Quay phi
83

begin
branch := x^.right;
SetLink(y, branch, True);
SetLink(x, y, False);
end
else //Quay tri
begin
branch := x^.left;
SetLink(y, branch, False);
SetLink(x, y, True);
end;
SetLink(z, x, z^.left = y);
//Cn thn, phi cp nht y^.size trc khi cp nht x^.size

with y^
with x^
end;
procedure
var x, y:
begin
if (i <

do size := left^.size + right^.size + 1;


do size := left^.size + right^.size + 1;
Insert(v, i: Integer); //Chn
PNode;
1) or (i > root^.size) then Exit;

//Php chn v hiu, b qua

x := NewNode;
x^.value := v; //To nt x^ cha value
y := NodeAt(i); //Xc nh nt y^ cn chn x^ vo trc
if y^.left = nilT then SetLink(y, x, True)
//y^ khng c nhnh tri, cho x^ lm nhnh tri

else
begin
y := y^.left; //i sang nhnh tri
while y^.right <> nilT do y := y^.right;
//Ti nt cc phi

SetLink(y, x, False); //Mc ni x^ vo lm nt cc phi


end;
//y = x^.parent, cp nht trng size ca cc nt t y ln gc

while y <> nilT do


begin
Inc(y^.size);
y := y^.parent;
end;
84

//Chnh Treap bng php UpTree

while x^.priority > x^.parent^.priority do


//Chng no x^ u tin hn nt cha
UpTree(x); //y x^ ln pha gc

end;
procedure Delete(i: Integer); //Xa
var x, y, z: PNode;
begin
if (i < 1) or (i >= root^.size) then Exit;
//Php xa v hiu, b qua

x := NodeAt(i); //Xc nh nt cn xa x^
while (x^.left <> nilT) and (x^.right <> nilT) do
//x^ c hai nt con
begin //Xc nh y^ l nt con mang u tin ln hn

if x^.left^.priority > x^.right^.priority then


y := x^.left
else y := x^.right;
UpTree(y); //Ko x^ xung su pha di l
end;
//x^ ch cn ti a 1 nt con, xc nh y^ l nt con nu c ca x^

if x^.left <> nilT then y := x^.left


else y := x^.right;
z := x^.parent; //z^ l cha ca x^
SetLink(z, y, z^.left = x); //Cho y^ vo lm con z^ thay cho x^
Dispose(x); //Gii phng b nh
while z <> nilT do //Cp nht trng size ca cc nt t z^ ln gc
begin
Dec(z^.size);
z := z^.parent;
end;
end;
procedure ReadOperators;
//c d liu, gp thao tc no thc hin ngay thao tc

var
k, v, i: Integer;
op: AnsiChar;
begin
ReadLn(n);
for k := 1 to n do
85

begin
Read(op);
case op of
'I': begin
ReadLn(v, i);
Insert(v, i);
end;
'D': begin
ReadLn(i);
Delete(i);
end;
end;
end;
end;
procedure PrintResult; //In kt qu
procedure InOrderTraversal(x: PNode); //Duyt cy theo th t gia
begin
if x = nilT then Exit;
InOrderTraversal(x^.left); //Duyt nhnh tri
Write(x^.value, ' '); //In ra gi tr trong nt
InOrderTraversal(x^.right); //Duyt nhnh phi
Dispose(x); //Duyt xong th gii phng b nh lun
end;
begin
InOrderTraversal(root^.left);
//Ton b danh sch tru tng L nm trong nhnh tri ca gc

Dispose(root); //Gii phng lun nt gc


WriteLn;
end;
begin
InitTreap;
ReadOperators;
PrintResult;
end.

86

c) Hon v>
v> Josephus
 Bi ton tm hon v Josephus
Bi ton ly tn ca Flavius Josephus, mt s gia Do Thi vo th k th nht.
Tng truyn rng Josephus v 40 chin s b ngi La M bao vy trong mt
hang ng. H quyt nh t vn ch khng chu b bt. 41 chin s ng thnh
vng trn v bt u m theo mt chiu vng trn, c ngi no m n 3 th
phi t vn v ngi k tip bt u m li t 1. Josephus khng mun cht v
chn c mt v tr m ng ta cng vi mt ngi na l hai ngi sng st
cui cng theo lut ny. Hai ngi sng st sau u hng v gia nhp qun
La M (Josephus sau ch ni rng l s may mn, hay bn tay ca Cha
mi gip ng v ngi kia sng st).
C rt nhiu truyn thuyt v tn gi khc nhau v bi ton Josephus, trong ton
hc ngi ta pht biu bi ton di dng mt tr chi: Cho  ngi ng
quanh vng trn theo chiu kim ng h nh s t 1 ti . H bt u m t
ngi th nht theo chiu kim ng h, ngi no m n  th b loi khi
vng v ngi k tip bt u m li t 1. Tr chi tip din cho ti khi vng
trn khng cn li ngi no. Nu ta xp s hiu ca  ngi theo th t h b
loi khi vng th s c mt hon v b( 8 b+ 8 8 b.  ca dy s  8;8 8  gi l
hon v Josephus 8  . V d vi  W8  V , hon v Josephus s l
V8T8;8W8\8 8X. Bi ton t ra l cho trc hai s 8  hy xc nh hon v
Josephus 8 .
 Thut ton

Bi ton tm hon v Josephus 8  c th gii quyt d dng nu s dng


danh sch ng (Mc 0): Danh sch c xy dng c  phn t tng ng vi
 ngi. Vic xc nh ngi s phi ra khi vng sau xa ngi khi
danh sch n gin ch l php truy cp ngu nhin v xa mt phn t khi
danh sch ng.

Nhn xt: Nu sau mt lt no , ngi va b loi l ngi th  v danh


sch cn li  ngi. Khi ngi k tip b loi l ngi ng th:    C
; &p   trong danh sch.

87

Tuy bi ton kh n gin nhng lin quan ti mt k thut ci t quan trng


nn ta s ci t c th chng trnh tm hon v Josephus 8 .

Input

Hai s nguyn dng 8  N 7


Output

Hon v Josephus 8 

Sample Input

Sample Output

7 3

3 6 2 7 5 1 4

Xy dng danh sch gm  phn t, ban u cc phn t u cha nh du


(cha b xa). Thut ton s tin hnh  bc, mi bc s nh du mt phn
t tng ng vi mt ngi b loi.

C th quan st rng nu biu din danh sch ny bng cy nh phn gm  nt,


th chng ta ch cn ci t hai thao tc:


Truy cp ngu nhin: Nhn vo mt s th t  v tr v nt ng th 


trong s cc nt cha nh du (theo th t gia)
nh du: nh du mt nt tng ng vi mt ngi b loi

Vy c th biu din danh sch bng mt cy nh phn gn hon chnh dng


sn. C th l chng ta t chc d liu trong cc mng sau:


Mng !  biu din cy nh phn gm  nt c gc l nt 1, ta


quy nh nt th  c nt con tri l ; v nt con phi l ;  , nt cha ca
nt b l nt _bU;`. Cy ny ban u s c duyt theo th t gia v cc
phn t 8;8 8  s c in ln lt vo cy (mng !) theo th t
gia.
Mng y
!  nh du, trong y
!  !@ nu nt
th  b nh du, ban u mng y
!  c khi to bng
ton gi tr ?
".
Mng kc  trong kc  l s nt cha b nh du trong nhnh
cy gc . Mng kc  cng c khi to ngay trong qu trnh dng
cy.

88

Php truy cp ngu nhin - nhn vo mt s th t  v tr v ch s nt ng


th  cha b nh du theo th t gia - s c thc hin nh sau: Bt u t
nt gc , gi #kc l s nt cha nh du trong cy con tri ca .
Nu nt cha b nh du v  #kc  th tr v ngay nt v dng
ngay, nu khng th qu trnh tm kim s tip tc trn cy con tri ( N
#kc) hoc cy con phi ca ( 1 #kc).

Php nh du mt nt ch n thun gn y
!  z !@, sau i
ngc t ln gc cy, i qua nt > no th gim kc > i 1 gi tnh ng
b.
 Ci t


JOSEPHUS.PAS  Tm hon v Josephus


{$MODE OBJFPC}
program JosephusPermutation;
const max = 100000;
var
n, m: Integer;
tree: array[1..max] of Integer;
Marked: array[1..max] of Boolean;
size: array[1..max] of Integer;
procedure BuildTree; //Dng sn cy nh phn gn hon chnh gm n nt
var Person: Integer;
procedure InOrderTraversal(Node: Integer);
//Duyt cy theo th t gia

begin
if Node > n then Exit;
InOrderTraversal(Node * 2); //Duyt nhnh tri
Inc(Person);
tree[Node] := Person; //in phn t k tip vo nt
InOrderTraversal(Node * 2 + 1); //Duyt nhnh phi
//Xy dng xong nhnh tri v nhnh phi th bt u tnh trng size

size[Node] := 1;
if Node * 2 <= n then
Inc(size[Node], size[Node * 2]);
if Node * 2 + 1 <= n then
Inc(size[Node], size[Node * 2 + 1]);
89

end;
begin
Person := 0;
InOrderTraversal(1);
FillChar(Marked, SizeOf(Marked), False);
//Tt c cc nt u cha nh du

end;
//Truy cp ngu nhin, nhn vo s th t p, tr v nt ng th p trong s cc nt cha nh
du

function NodeAt(p: Integer): Integer;


var LeftSize: Integer;
begin
Result := 1; //Bt u t gc
repeat
//Tnh s nt trong nhnh con tri

if Result * 2 <= n then


LeftSize := size[Result * 2]
else LeftSize := 0;
if not Marked[Result] and (LeftSize + 1 = p) then
Break; //Nt Result chnh l nt th p, dng
if LeftSize >= p then
Result := Result * 2 //Tm tip trong nhnh tri
else
begin
Dec(p, LeftSize);
//Trc ht tnh li s th t tng ng trong nhnh phi

if not Marked[Result] then Dec(p);


Result := Result * 2 + 1; //Tm tip trong nhnh phi
end;
until False;
end;
procedure SetMark(Node: Integer); //nh du mt nt
begin
Marked[Node] := True; //nh du
while Node > 0 do //ng b ha trng size ca cc nt tin bi
begin
Dec(size[Node]);
Node := Node div 2; //i ln nt cha
end;
90

end;
procedure FindJosephusPermutation;
var Node, p, k: Integer;
begin
p := 1;
for k := n downto 1 do
begin //Danh sch c k ngi
p := (p + m - 2) mod k + 1; //Xc nh s th t ca ngi b loi
Node := NodeAt(p); //Tm nt cha ngi b loi
Write(tree[Node], ' '); //In ra s hiu ngi b loi
SetMark(Node); //nh du nt tng ng trn cy
end;
end;
begin
Readln(n, m);
BuildTree;
FindJosephusPermutation;
WriteLn;
end.

 Tm ngi cui cng cn li 


Mt bi ton khc lin quan ti bi ton Josephus l cho trc hai s nguyn
dng 8 , hy tm ngi cui cng b loi. Ta c th s dng thut ton tm
hon v Josephus v in ra phn t cui cng trong hon v. Tuy nhin c thut
ton quy hoch ng hiu qu hn tm ngi cui cng b loi. Thut ton
da trn cng thc truy hi sau:


8 o 

 C  C   &p   8 o  1

(7.1)

Trong  l ch s ngi b loi cui cng trong tr chi vi tr chi gm


 ngi. Cng thc truy hi (7.2) c th gii trong thi gian  bng mt
on chng trnh n gin.
Input n, m;
f := 1;
for i := 2 to n do
f := (f - 1 + m) mod i + 1;
91

Output f;

7.2. Th t thng k ng

Nhc li: Bi ton th t thng k: Cho mt tp k gm  i tng, mi i


tng c mt kha sp xp. Hy cho bit nu sp xp  i tng theo th t
tng dn ca kha th i tng th  l i tng no?.

Chng ta bit thut ton tm th t thng k trong thi gian $. Tuy nhin
trong trng hp tp k lin tc c nhng s thay i phn t (thm vo hay bt
i mt i tng), ng thi c rt nhiu truy vn v th t thng k i km vi
nhng s thay i th thut ton ny t ra khng hiu qu. Chng ta cn c
phng php tt hn i vi bi ton th t thng k ng (Dynamic Order
Statistics).

Cy tm kim nh phn l mt cch gii quyt hiu qu vn ny. Chng ta


lu tr cc i tng ca k trong mt BST, mi nt cha mt i tng vi
kha so snh chnh l kha ca i tng cha trong.

Mi i tng  c gn vi mt con tr !  ti nt tng ng trn BST,


con tr ny c cp nht mi khi c php thm/bt i tng. Ti mi nt ta
duy tr s nt trong nhnh con bng trng "c, trng ny c cp nht
mi khi cu trc BST b thay i (chn/xa/quay). Khi php thm v bt i
tng c thc hin t nhin bng php chn v xa trn BST $%' . Da
vo trng "c mi nt, mi truy vn v th t thng k c tr li trong thi
gian $%'  (Xem li mc 0 v cch s dng trng kc).

7.3. Interval tree

Cy cha khong (Interval tree) l mt cu trc d liu lu tr mt tp cc


khong trn trc s.
C ba loi khong trn trc s: khong ng (closed interval), khong m (open
interval) v khong na m.
"8  6 5 M " N

"8  6 5 M " O
"8  6 5 M " N
"8  6 5 M " O

N 9

O 9
O 9
N 9
92

Khong ng cn c tn gi l on. nhng vn trong phn ny chng ta


quan tm ti khong ng, nu mun lm vic vi khong m hoc khong na
m cn c mt s sa i nh. Chng ta quy nh thm l vi mt khong ng
"8  bt k th " N .
nh l 7-1

Vi hai on ( "( 8 (  v + "+ 8 + , ng mt trong ba mnh di y


tha mn (interval trichotomy):





v + gi nhau (overlap), tc l hai on ( v + c im chung


( nm bn tri + : ( O "+
( nm bn phi + : + O "(
(

Interval tree bn cht l mt BST, mi nt cha mt on v kha so snh l u


mt tri ca mi on. Tc l nu duyt cy theo th t gia ta s lit k c
tt c cc on theo th t tng dn ca u mt tri.

Ti mi nt , ta lu tr thm mt trng ![": Gi tr ln nht ca cc


u mt phi ca cc on nm trong nhnh cy gc . Nt gi x c trng
![" C. Hnh 1.28 l v d v cy cha 10 on:
T8;  e8 ;\8V7 \8e \8;V W8  ;T8;T 78V T8 7 8;7

78V
V

\8e
7

e8
;V

T8 7
7

!


T8; 
V7

\8;V
;V

!["

W8 
;7

;\8V7
V7

8;7
;7

Hnh 1.28. Interval tree

Cu trc nt ca Interval tree c th c t nh sau:


type
PNode = ^TNode;
TNode = record
s, f: Real; //s: u mt tri, f: u mt phi
93

;T8;T
;T

rightmost: Real; //Thng tin ph tr


parent, left, right: PNode;
end;
var
sentinel: TNode;
nilT, root: PNode;
begin
sentinel.rightmost := -;
nilT := @sentinel;
root := nilT;
...
end.

Trng ![" ca mi nt x c tnh theo cng thc truy hi:


xE xE !["

xE ![" z n xE 
xE ![xE !["

(7.2)

Khi mt nt x c chn vo thnh mt nt l hay b xa khi BST, tt c cc


trng ![" trong x v cc nt tin bi ca x phi c cp nht li.
Nu bn ci t Interval tree bng Treap hay mt dng cy nh phn tm kim t
cn bng, cn ch cp nht li trng ![" sau php quay cy
(!).
a) Tm "o9
"o9n c giao v4
v4i m8
m8t "o9
"o9n cho trF4
trF4c

Bi ton t ra l cho mt tp k gm  on. Cho mt on


8 0, hy ch ra
mt on ca k c giao vi (hay gi ln) on
8 0. Mt dng truy vn c th
hn l hy ch ra mt on ca k cha mt im cho trc. Bi ton ny c
th quy v bi ton tng qut vi
8 0 8 

D nhin ta c th tr li truy vn ny trong thi gian $: Duyt tt c cc


on ca k v s dng hm !
 di y tm cng nh lit k cc
on gi ln on . Hm !
 nhn vo 2 on "( 8 ( 8 "+ 8 +  v tr
v gi tr !@ nu hai on gi nhau:
function Overlapped(s1, f1, s2, f2: Real): Boolean;
begin
Result := (s1 f2) and (s2 f1);

94

end;

Tuy vy nu tp k lin tc c s bin ng (thm/bt) cc on th phng php


ny t ra khng hiu qu. S dng Interval tree cho php thc hin thm/bt
on v tr li truy vn ny hiu qu hn.

Xy dng Interval tree cha tt c cc on ca tp k. Bt u t nt x


!x , nu on trong x c giao vi
8 0 th xong. Ngc li, nu
xE xE ![" w
, ta quy v tm trong nhnh con tri ca x, nu khng
ta quy v tm trong nhnh con phi ca x:
//Tr v nt cha on giao vi [a, b], tr v nilT nu khng thy

function IntervalSearch(a, b: Real): PNode;


begin
Result := root; //Bt u t gc
while (Result nilT) and
not Overlapped(Result^.s, Result^.f, a, b) do
//Result cha on khng giao vi [a, b]

if (Result^.left^.rightmost a) then
Result := Result^.left //Sang tri
else Result := Result^.right; //Sang phi
end;

Tnh ng n ca thut ton c ch ra trong hai nhn xt sau:




Nu xE xE ![" w
th ch cn tm trong nhnh con tri ca x
l , bi nu tm trong nhnh con tri ca x khng thy th chc chn tm
trong nhnh con phi cng tht bi.
Nu xE xE ![" O
th nhnh con tri ca x chc chn khng
cha on no c giao vi
8 0.

Thi gian thc hin gii thut =!


k
!l l $ vi  l chiu cao ca
Interval tree. Cc php thm/bt on trong tp k c x l nh trn BST, sau
cp nht cc trng ![", cng c thi gian thc hin $ ( $%' 
nu s dng mt dng BST t cn bng).
b) Tm "o9
"o9n "
" u tin c giao v4
v4i m8
m8t "o9
"o9n cho trF4
trF4c
Trong mt s trng hp chng ta cn tm nt u tin trn Interval tree (theo
th t gia) cha on c giao vi on
8 0. iu ny c thc hin da trn
mt hm quy ?!"=!
k
!l nh sau:
95

//Tm on u tin giao vi [a, b] trong nhnh cy gc x^

function FirstIntervalSearch(x: PNode;


a, b: Real): PNode;
begin
Result := nilT;
if x = nilT then Exit; //Nhnh rng th tr v nilT
if x^.left^.rightmost a then //Nu c th phi c trong nhnh tri
Result := FirstIntervalSearch(x^.left, a, b);
else //Nhnh tri chc chn khng c
if Overlapped(x^.s, x^.f, a, b) then
//on trong x^ c giao vi [a, b]

Result := x
else //Nu c th ch c trong nhnh phi
Result := FirstIntervalSearch(x^.right, a, b);
end;

c) Li;
Li;t k cc "o9
"o9n c giao v4
v4i m8
m8t "o9
"o9n cho trF4
trF4c

Bi ton t ra l cho tp k gm  on, hy lit k cc on c giao vi on



8 0 cho trc. D nhin chng ta c th duyt tt c cc on ca k v dng
hm !
 lit k cc on tha mn trong thi gian , trn thc t
khng c thut ton no tt hn trong trng hp xu nht: Tt c cc on ca
k u c giao vi
8 0.
Tuy nhin chng ta c th tm mt thut ton khc m thi gian thc hin gii
thut ph thuc vo s on c lit k v t ph thuc vo gi tr ca .

Trc ht ta xy dng Interval tree cha cc on ca k. Sau s dng th tc


#"=!
"D8
8 0 lit k. Th tc #"=!
" c ci t nh
sau:
//Lit k cc on c giao vi [a, b] trong nhnh cy gc x^

procedure ListIntervals(x: PNode; a, b: Real);


begin
if x = nilT then Exit;
if x^.left^.rightmost >= a then //Trong nhnh con tri c th c
ListIntervals(x^.left); //Lit k trong nhnh con tri
if Overlapped(x^.s, x^.f, a, b) then //on cha trong x^ c giao
Output [x^.s, x^.f]; //Lit k
if x^.s <= b then //Trong nhnh con phi c th c
96

ListIntervals(x^.right); //Lit k trong nhnh con phi


end;

Thi gian thc hin gii thut l $%'    vi  l s nt c lit k

7.4. Tm tt v k thut ci t

Cn rt nhiu ng dng khc lin quan ti cu trc cy nh phn, nhng ch vi


mt s ng dng k trn, ta c th thy rng cy nh phn l mt cu trc d liu
tt biu din danh sch: Bng c ch nh s nt theo th t gia, chng ta
c hnh nh mt danh sch vi cc nt c sp th t, qua c th ci t cc
php chn/xa v truy cp ngu nhin rt hiu qu.
Ti sao li l th t gia m khng phi th t trc hay th t sau? Mc d cc
thao tc c bn ny vn c th ci t nu cc nt ca cy c nh s theo th
t trc (hoc sau), nhng chng ta s gp phi kh khn khi thc hin thao tc
cn bng cy. Hin ti hu ht cc k thut cn bng cy nh phn (trn cy
AVL, cy en, cy Splay hay Treap) u da vo php quay, m php quay
th khng bo ton th t trc v th t sau ca cc nt. Nu nh chng ta
khng cn s dng php quay (nh bi ton tm hon v Josephus) th hon ton
c th nh s cc nt trn cy theo th t trc hoc th t sau.
Mt ch quan trng na l c ch lu tr v ng b ha thng tin ph tr.
Thng thng i vi cc bi ton s dng cy nh phn, mi nt s c cha
mt thng tin h tr qu trnh tm kim trn cy (ti mi bc th i tip sang
nhnh tri hay nhnh phi). Nh v d cy biu din danh sch chng ta s
dng trng "c cha s nt trong mt nhnh cy, hay v d Interval tree,
chng ta s dng trng ![" cha u mt phi ln nht ca mt
on nm trong nhnh cy. Thng tin ph tr s c cp nht mi khi c s
thay i cu trc gi tnh ng b. C hai nguyn l chn thng tin ph tr:
Th nht, thng tin ph tr mi nt phi l thng tin tng hp t tt c cc
nt trong nhnh , th hai, tuy l s tng hp thng tin t tt c cc nt trong
nhnh nhng thng tin ph tr c th tnh c ch bng thng tin gc
nhnh v hai nt con.
Nhng rng buc nh vy m bo cho qu trnh ng b thng tin ph tr
khng lm tng cp phc tp ca thi gian thc hin gii thut. Vic thay i

97

thng tin ph tr mt nt ch ko theo vic cp nht li thng tin ph tr


nhng nt tin bi m thi*.
Ch cui cng l nu nh bit trc cy nh phn s ch cha cc phn t
trong mt tp hu hn k, ng thi c cch no trnh khng phi ci t php
chn v xa th c th dng sn mt cy nh phn gn hon chnh gm k nt.
Khi chng ta loi b c cc con tr lin kt v khng cn thc hin cc
php cn bng cy hai th d gy nhm ln nht trong vic ci t cy nh
phn.
Ta xt mt v d cui cng trc khi kt thc bi.

7.5. im giao nhiu nht


a) TrFU
TrFUng h0
h0p m8
m8t chiE
chiEu
Bi ton tm im giao nhiu nht (point of Maximum Overlap POM) (mt
chiu) pht biu nh sau: Cho  khong ng trn trc s, khong ng th  l
"2 8 2  ("2 N 2 ), hy tm mt im trn trc s thuc nhiu khong nht trong s
 khong cho.

Thut ton gii quyt bi ton POM mt chiu kh n gin: Vi mt khong


ng "2 8 2 , ta gi "2 l u mt m v 2 l u mt ng. Sp xp ; u mt
ca cc khong cho t tri qua phi (t nh n ln), nu nhiu u mt
cng ta th tt c u mt m ti v tr c xp cc u mt ng. Khi
to mt bin m bng 0 v duyt cc u mt theo th t sp xp, gp u
mt m th bin m tng 1 cn gp u mt ng th bin m gim 1. Qu
trnh kt thc, bin m tr li thnh 0, ni bin m t cc i chnh l im
cn tm. Gi tr cc i ca b m t c chnh l s khong ng ph qua
im .
Tuy vy, thut ton trn khng thc s hiu qu nu tp cc khong ng lin
tc bin ng i km vi nhng truy vn v POM. Chng ta cn xy dng cu

C nhng bi ton c th s dng cy nh phn m thng tin ph tr khng tun theo hai nguyn l ny,
nhng cn n mt c ch ng b ha c bit.

98

trc d liu h tr cc php thm/bt khong v tr li cc truy vn v im


giao nhiu nht hiu qu hn.
Gii php l ta lu tr cc u mt trong mt BST sao cho nu duyt BST theo
th t gia th ta s c th t sp xp ni trn (u mt nh hn xp trc v
u mt m c xp trc u mt ng nu cng v tr trn trc s).

Thng tin ph tr th nht trong mi nt x l nhn "[. y xE "[ 


nu nt cha u mt m v xE "[ C nu nt cha u mt ng.
Thng tin ph tr th hai trong mi nt x l trng "@: Tng ca tt c cc
nhn trong cc nt nm trong nhnh cy gc x. Trng "@ c tnh theo
cng thc:
xE "@ z xE xE "@  xE "[  xE ![xE "@

(7.3)

xE 
"@
xE xE 
"@

z n xE xE "@  xE "[


xE #xE "@  xE "[  xE ![xE 
"@

(7.4)

Thng tin ph tr th ba trong mi nt x l trng 


"@: Cho bit nu ta
duyt nhnh cy gc x theo th t gia v cng dn ln lt cc trng "[
mi nt th gi tr ln nht t c trong qu trnh cng l bao nhiu. Trng

"@ c tnh theo cng thc:

Cng thc truy hi (7.3) kh d hiu, ta s phn tch tnh ng n ca cng


thc truy hi (7.4). R rng trong qu trnh cng dn cc trng "[ mi nt
vo mt bin m, gi tr cc i ca bin m ny c th bng:


Gi tr ln nht t c khi cng xong nhnh con tri, khi


xE 
"@ xE x
"@.
Gi
tr
t
c
khi
cng
ti
nt
x ,
khi

xE 
"@ xE xE "@  xE "[
Gi tr t c khi cng ti mt nt no nhnh con phi, khi
xE 
"@ xE xE "@  xE "[  xE ![xE 
"@

Vy ta c th ly gi tr ln nht trong ba kh nng ny gn cho xE 


"@.
99

tin hn trong vic tr li truy vn POM, ti mi nt ta lu tr mt trng


By cha im m ti qu trnh cng dn cc trng "[ t cc i (bng

"@). Php cp nht By c thc hin song song vi qu trnh tnh

"@: Ty theo 
"@ t ti nhnh tri, chnh nt x hay nhnh phi, ta
s cp nht li trng By ca x.

C th nhn thy rng trng "@ v 


"@ tuy l thng tin tng hp t tt
c cc nt trong mt nhnh, nhng c th tnh c ch da vo thng tin trong
nt gc v hai nt con. Tc l ta c th duy tr v ng b thng tin ph tr
trong mi nt sau mi php chn/xa m khng lm tng cp phc tp ca thi
gian thc hin gii thut.
Vy th nu  l s nt trn BST,


Chn mt on "8  vo tp tru tng cc khong ng tng ng vi


chn mt u mt " vi "[ vo BST v chn mt u mt  vi
"[ C vo BST. Thi gian $%' .
Xa mt on "8  tng ng vi xa i u mt " v u mt  khi
BST. Thi gian $%' .
Tr li truy vn POM, ch cn truy xut !xE By. Thi gian $ .

b) TrFU
TrFUng h0
h0p hai chiE
chiEu

Bi ton tm im giao nhiu nht (hai chiu) c pht biu nh sau: Cho 
hnh ch nht nh s t 1 ti  trong mt phng trc giao $ >. Cc hnh ch
nht c cnh song song vi cc trc ta . Mi hnh ch nht c cho bi 4
ta ( 8 >( 8 + 8 >+ trong  ( 8 >(  l ta gc tri di v  + 8 >+  l ta
gc phi trn ( ( O + 8 >( O >+ ). Hy tm mt im trn mt phng thuc nhiu
hnh ch nht nht trong s cc hnh ch nht cho (im nm trn cnh mt
hnh ch nht vn tnh l thuc hnh ch nht ).
Bi ton POM hai chiu l mt trong nhng v d hay v k thut ci t, chng
ta s vit chng trnh y gii bi ton POM hai chiu vi khun dng
Input/Output nh sau.
Input

Dng 1 cha s nguyn dng  N 7 .


100

 dng tip theo, dng th  cha 4 s nguyn dng

( O + N 7 C 7 N >( O >+ N 7 .

( 8 >( 8 + 8 >+ .

C 7 N

Output

im giao nhiu nht v s hnh ch nht cha im giao nhiu nht.


Sample Input

Sample Output

point of Maximum Overlap: (4, 3)

1 3 5 7

Number of Rectangles: 3

3 1 6 4
4 2 8 5
6 5 8 7

7
6
5
4
3
2
1
0

 Bin i ta
Mi hnh ch nht tng ng vi hai cnh ngang (cnh y v cnh nh) v hai
cnh dc (cnh tri v cnh phi). Nh vy c tt c ; cnh ngang v ; cnh
dc. Sp xp hai dy ta ny theo quy tc sau:


101

Dy ; cnh dc c xp theo th t tng dn theo honh (tri qua


phi), nu nhiu cnh dc cng honh th nhng cnh tri c xp
trc nhng cnh phi.
Dy ; cnh ngang c xp theo th t tng dn theo tung (di ln
trn), nu nhiu cnh ngang cng tung th nhng cnh y c xp
trc nhng cnh nh.

Sau ta nh x honh mi cnh ngang cng nh tung mi cnh dc


thnh ch s ca n trong hai dy sp xp.
Ta nhng hnh ch nht ban u s b bin i qua nh x ny, tuy nhin ta
c th tm POM trong tp cc hnh ch nht mi v nh x ngc ta POM
thnh ta ban u. V d:
8
7

Hnh 1.19. Php nh x ta

Php bin i ny c nhng cng dng:




Tt c cc honh ca cnh dc cng nh tt c cc tung ca cnh


ngang tr thnh ; s nguyn hon ton phn bit.
Cho d ta ca cc hnh ch nht ban u c th rt ln, hoc l s thc,
qua nh x ny chng ta s ch x l cc ta nguyn 8;8 8;.
Ta POM c th nh x ngc li d dng. Bi khi xc nh c im
giao nhiu nht nm trn ng ngang th my v ng dc th my, ta c
th chiu vo hai dy ta ban u tm ta trc khi nh x.

Bn c th thc mc rng POM c th khng nm trn ng ngang cng nh


ng dc no (nh v d trn c th ta tm c POM l VE\8VE\ trn bn
nh x). Khi ta c th xc nh POM nm gia hai ng ngang lin tip no
v nm gia hai ng dc lin tip no, sau nh x ngc li. Tuy nhin
khng cn phi rc ri nh vy, thut ton m chng ta s trnh by lun tm
c POM nm trn giao ca mt ng ngang v mt ng dc.

102

 ng qut ngang

G im giao nhiu nht c ta 


8 0, khi nu ta xt ng thng > 0,
n s ct ngang qua mt s hnh ch nht. Giao ca cc hnh ch nht vi ng
thng > 0 to thnh cc khong ng trn ng thng . Khi ta

chnh l im giao nhiu nht ca cc khong ng (mt chiu).


8
7
6
5
4

> V

3
2
1
0

V d nh vi bn trn, ta xt ng thng > V, n s ct ngang qua 3 hnh


ch nht to thnh 3 khong ng: 8X ;8T V8e. im giao nhiu nht ca 3
khong ng ny l im V (hay bt c im no nm trong on V8X).
Vy POM tng ng c ta V8V.

Thut ton tm POM hai chiu c th trnh by nh sau: Xt tt c cc ng


thng nm ngang c phng trnh > 0, vi mi ng ta xt cc giao vi
cc hnh ch nht cho v tm im giao nhiu nht, ghi nhn li im giao
nhiu nht trn tt c cc gi tr 0 th.

Chng ta s phi th vi bao nhiu ng thng dng > 0?, c th nhn thy
rng ch cn th vi ln lt cc gi tr 0 8;8 8; l .
R rng vi 0 7, tp cc khong ng to ra trn ng thng > 7 l rng.
Sau khi xt xong mi ng thng > 0, xt tip n ng thng > 0  ,
c hai kh nng xy ra:


103

Nu ng > 0  l mt cnh y ca hnh ch nht  ( 8 >( 8 + 8 >+ 


( >( 0  ), ta b sung ( 8 +  vo tp cc khong ng (thi gian
$%' ) v tm POM ($ ).

Nu ng > 0  l mt cnh nh ca hnh ch nht  ( 8 >( 8 + 8 >+ 


( >+ 0  ), ta loi b ( 8 +  khi tp cc khong ng (thi gian
$%' ).

 Dng sn BST

Nhc li trong k thut ci t bi ton tm POM mt chiu, ta s dng BST


cha cc u mt ca cc khong ng. Tuy nhin do cc u mt l cc s
nguyn hon ton phn bit trong phm vi 8;8 8;, nn ta c th dng sn cy
nh phn cha ; nt, mi nt s cha mt u mt vi nhn k[  nu
l u mt m, k[ C nu l u mt ng v k[ 7 nh du
u mt khng c hiu lc (do khong ng tng ng cha c xt n
hoc b loi b). C th thy rng cch gn gi tr k[ 7 ny khng lm
nh hng n tnh ng n ca cng thc (7.3) v (7.4).
Cy nh phn dng sn c biu din bi mt mng ! 0 ;, mi phn t
l mt bn ghi cha cc trng  : ta im, "[ : Nhn u mt
5 6C 878  9, "@, 
"@ v By. ngha ca cc trng c gii thch
nh trn. Nt gc ca cy l ! . Nt  c con tri l ; v con phi l
;  . Hai hm  v ![ di y tr v nt con tri v con phi ca mt
nt, (tr v 0 trong trng hp nt  khng c con tri hoc con phi)
function valid(x: Integer): Boolean;
begin
Result := x <= 2 * n;
end;
function left(x: Integer): Integer;
begin
if IsNode(x * 2) then Result := x * 2
else Result := 0;
end;
function right(x: Integer): Integer;
begin
if IsNode(x * 2 + 1) then Result := x * 2 + 1
else Result := 0;
end;

V nu nt khng c con tri (phi) th hm  (![) tr v 0, ta s gn cc


trng "@ v 
"@ ca ! 7 bng 0 cho tin ci t.
104

 Ci t


POM.PAS  im giao nhiu nht


{$MODE OBJFPC}
program PointOfMaximumOverlap;
const max = 100000;
type
TEndPointType = (eptOpen, eptClose);
TEndPoint = record //Kiu u mt ca khong ng
value: Integer; //Ta
ept: TEndPointType; //Loi: u mt m hay u mt ng
rid: Integer; //Ch s hnh ch nht tng ng
end;
TRect = record //Kiu hnh ch nht
x1, y1, x2, y2: Integer; //(x1, y1): Tri Di, (x2, y2): Phi Trn
end;
TEndPointArray = array[1..2 * max] of TEndPoint;
//Kiu danh sch cc u mt

TNode = record //Thng tin nt ca cy nh phn


point: Integer;
sign: Integer;
sum, maxsum: Integer;
POM: Integer;
end;
var
x, y: TEndPointArray;
r: array[1..max] of TRect;
tree: array[0..2 * max] of TNode;
ptr: array[1..2 * max] of Integer;
n, ResX, ResY, m: Integer;
procedure Enter; //Nhp d liu
var i, j: Integer;
begin
ReadLn(n);
for i := 1 to n do //c 2n ta x v 2n ta y
begin
j := 2 * n + 1 - i;
Read(x[i].value);
105

x[i].Ept := eptOpen;
x[i].rid := i;
Read(y[i].value);
y[i].Ept := eptOpen;
y[i].rid := i;
Read(x[j].value);
x[j].Ept := eptClose;
x[j].rid := i;
Read(y[j].value);
y[j].Ept := eptClose;
y[j].rid := i;
end;
end;
operator < (const p, q: TEndPoint): Boolean;
//p s c xp trc q nu...

begin
Result := (p.value < q.value) or
(p.value = q.value) and (p.Ept < q.Ept);
//Open < Close

end;
procedure Sort(var k: TEndPointArray);
//Sp xp danh sch cc u mt

procedure Partition(L, H: Integer);


var
i, j: Integer;
Pivot: TEndPoint;
begin
if L >= H then Exit;
i := L + Random(H - L + 1);
Pivot := k[i];
k[i] := k[L];
i := L;
j := H;
repeat
while (Pivot < k[j]) and (i < j) do Dec(j);
if i < j then
begin
k[i] := k[j];
Inc(i);
106

end
else Break;
while (k[i] < Pivot) and (i < j) do Inc(i);
if i < j then
begin
k[j] := k[i];
Dec(j);
end
else Break;
until i = j;
k[i] := Pivot;
Partition(L, i - 1);
Partition(i + 1, H);
end;
begin
Partition(1, 2 * n);
end;
procedure RefineRects; //nh x ta
var i: Integer;
begin
for i := 1 to 2 * n do
begin
with x[i] do
if ept = eptOpen then r[rid].x1 := i
else r[rid].x2 := i;
with y[i] do
if ept = eptOpen then r[rid].y1 := i
else r[rid].y2 := i;
end;
end;
function valid(x: Integer): Boolean; //Nt c hp l khng
begin
Result := x <= 2 * n;
end;
function left(x: Integer): Integer; //Tm nt con tri ca Node
begin
if valid(x * 2) then Result := x * 2 //Nt con tri hp l
else Result := 0; //Nu khng tr v 0
107

end;
function right(x: Integer): Integer; //Tm nt con phi ca Node
begin
if valid(x * 2 + 1) then Result := x * 2 + 1
//Nt con phi hp l

else Result := 0; //Nu khng tr v 0


end;
procedure BuildTree; //Dng sn BST gm 2n nt
var
i: Integer;
procedure InOrderTraversal(x: Integer);
//Duyt cy theo th t gia

begin
if not valid(x) then Exit;
InOrderTraversal(x * 2);
Inc(i);
tree[x].point := i; //a im i vo nt Node
ptr[i] := x; //ptr[i]: Nt cha im ta i trong BST
InOrderTraversal(x * 2 + 1);
end;
begin
FillByte(tree, SizeOf(tree), 0); //sum, maxsum := 0
i := 0;
InOrderTraversal(1);
end;
//target := Max(a, b, c)

function ChooseMax3(var target: Integer;


a, b, c: Integer): Integer;
begin
target := a;
Result := 1; //Tr v 1 nu Max t ti a
if target < b then
begin
target := b;
Result := 2; //Tr v 2 nu Max t ti b
end;
if target < c then
begin
target := c;
108

Result := 3; //Tr v 3 nu Max t ti c


end;
end;
//t nhn sign = s cho nt mang ta p trong BST

procedure SetPoint(p: Integer; s: Integer);


var
Node, L, r, Choice: Integer;
begin
Node := ptr[p]; //Xc nh nt cha im p
tree[Node].sign := s; //t nhn sign
repeat //Cp nht thng tin ph tr t Node ln gc 1
L := left(Node);
r := right(Node); //L: Con tri; r: Con phi
//Tnh trng sum

tree[Node].sum := tree[Node].sign + tree[L].sum


+ tree[r].sum;
//Tnh trng maxsum

Choice := ChooseMax3(tree[Node].maxsum,
tree[L].maxsum,
tree[L].sum + tree[Node].sign,
tree[L].sum + tree[Node].sign
+ tree[r].maxsum);
case Choice of //Tnh POM ty theo maxsum t ti u
1: tree[Node].POM := tree[L].POM; //t ti nhnh tri
2: tree[Node].POM := tree[Node].point;
//t ti chnh Node

3: tree[Node].POM := tree[r].POM; //t ti nhnh phi


end;
Node := Node div 2; //i ln nt cha
until Node = 0;
end;
//Thm mt on [x1, x2] vo tp cn tm POM

procedure InsertInterval(x1, x2: Integer);


begin
SetPoint(x1, +1); //t nhn u mt m l +1
SetPoint(x2, -1); //t nhn u mt ng l -1
end;
//Loi mt on [x1, x2] khi tp cn tm POM (t nhn ca hai u mt thnh 0)

procedure DeleteInterval(x1, x2: Integer);


109

begin
SetPoint(x1, 0);
SetPoint(x2, 0);
end;
procedure Sweep; //S dng cc dng qut ngang tm POM
var
sweepY, POM: Integer;
begin
BuildTree;
m := 0;
for sweepY := 1 to 2 * n do //Xt cc ng qut y = 1, 2, ..., 2n
with y[sweepY] do
if ept = eptOpen then //Qut vo mt cnh y
begin
InsertInterval(r[rid].x1, r[rid].x2);
//Thm mt on vo tp tm POM

if tree[1].maxsum > m then


//POM mi l giao ca nhiu hnh ch nht hn POM c

begin
m := tree[1].maxsum;
POM := tree[1].POM;
//nh x ngc li, tm ta

ResX := x[POM].value;
ResY := y[sweepY].value;
end;
end
else //Qut vo mt cnh nh
DeleteInterval(r[rid].x1, r[rid].x2);
end;
procedure PrintResult;
begin
WriteLn('Point of Maximum Overlap:
(', ResX, ', ', ResY, ')');
WriteLn('Number of Rectangles: ', m);
end;
begin
Enter; //Nhp d liu
Sort(x);
110

Sort(y); //Sp xp hai dy ta


RefineRects; //nh x sang ta mi
Sweep; //S dng ng qut ngang tm POM
PrintResult; //In kt qu
end.

Thi gian thc hin gii thut tm im giao nhiu nht ca  hnh ch nht l
$ %' .

Bi tp

1.30. Cho mt BST cha  kha, v hai kha


8 0. Ngi ta mun lit k tt c
cc kha  ca BST tha mn
N  N 0. Hy tm thut ton $  %' 
tr li truy vn ny ( l s kha c lit k).

1.31. Cho  l mt s nguyn dng v  ( 8 + 8 8 .  l mt hon v ca


dy s  8;8 8 . Vi LM N  N , gi 2 l s phn t ng trc gi
tr  m ln hn  trong dy . Khi dy  ( 8 + 8 8 .  c gi l
dy nghch th ca dy  ( 8 + 8 8 . .
V d vi  T , dy
 ;8 878 8 87

V8;8 8T8X8\ th dy nghch th ca n l

Xy dng thut ton $ %'  tm dy nghch th t dy hon v cho trc


v thut ton $ %'  tm dy hon v t dy nghch th cho trc.

1.32. Trn mt phng vi h ta trc giao $ > cho  hnh ch nht c cnh
song song vi cc trc ta . Hy tm thut ton $ %'  tnh din
tch phn mt phng b  hnh ch nht chim ch.

1.33. Cho  dy cung ca mt hnh trn, khng c hai dy cung no chung u


mt. Tm thut ton $ %'  xc nh s cp dy cung ct nhau bn trong
hnh trn. (V d nu  dy cung u l ng knh th s cp l g.+h).

1.35. Trn trc s cho  on ng, on th  l


2 8 02 , 
2 8 02 5 . Hy chn
trn trc s mt s t nht cc im nguyn phn bit sao cho c t nht l2
im c chn thuc vo on th .  N  N 7 7 N
2 8 02 8 l2 N 7 .

111

1.36. Bn mt khu t hnh ch nht kch thc  Y  c chia thnh li


vung n v. Trn c nh du  trng cy 8 8  N 7 . Ngi
ta mun gii phng mt mt bng nm trong khu t ny. Bn mt bng
c cc rng buc sau:




Cnh mt bng l s nguyn


Mt bng chim trn mt s trn bn
Cnh mt bng song song vi cnh bn
Hy tr li hai cu hi:

Nu mun xy dng mt bng vi cnh l P th phi gii phng t nht bao


nhiu trng cy?
Nu khng mun gii phng trng cy no th c th xy dng c mt
bng vi cnh ln nht l bao nhiu?

1.37. Mt b  N 7 l bi c xp thnh tp v mi l bi c ghi s th t


ban u ca l bi trong tp bi (v tr cc l bi c nh s t 1 ti 
t trn xung di).
Xt php tro k hiu bi k8 b: rt ra l bi th  v chn ln trn l bi
th b trong s  C l bi cn li  N 8 b N , quy c rng nu b 
th l bi th  s c t vo v tr di cng ca tp bi.
V d vi  T

+8

g 8 ; 8 V8X8\8Th g 8V8 ; 8 X8\8Th


(8+

g 8 V8;8X8\8Th gV8 8 ;8X8\8Th


8

gV8 8;8 X 8 \8Th gV8 8;8\8 X 8 Th


(8

g V 8 8;8\8X8Th g 8;8\8X8T8 V h

Ngi ta tro b bi bng php tro ( N 7 ). Bn c cho bit


php tro , hy s dng thm t nht cc php tro na a cc l bi
v v tr ban u. Nh v d trn, chng ta cn s dng thm 2 php tro
kT8V v k\8X.

112

Chuyn 7

TH
1. ng i ngn nht
1.1. th c trng s
Trong cc ng dng thc t, chng hn trong mng li giao thng, ngi ta
khng ch quan tm n vic tm ng i gia hai a im m cn phi la
chn mt hnh trnh tit kim nht (theo tiu chun khng gian, thi gian hay
mt i lng m chng ta cn gim thiu theo hnh trnh). Khi ngi ta gn
cho mi cnh ca th mt gi tr phn nh chi ph i qua cnh v c gng
tm mt con ng m tng chi ph cc cnh i qua l nh nht.

th c trng s l mt b ba A a8 8  trong A a8  l mt th,


 l hm trng s:
M 
 

Hm trng s gn cho mi cnh  ca th mt s thc  gi l trng s


(weight) ca cnh. Nu cnh  @8  th ta cng k hiu @8  .

Tng t nh th khng trng s, c nhiu cch biu din th c trng s


trong my tnh. Nu ta s dng danh sch cnh, danh sch k hay danh sch lin
thuc, mi phn t ca danh sch s cha thm mt thng tin v trng s ca
cnh tng ng. Trng hp biu din n th gm  nh, ta cn c th s
dng ma trn trng s 6 9.Y. trong  l trng s ca cnh @8 .
Trong trng hp @8   th ty bi ton c th,  s c gn mt gi tr
c bit nhn bit @8  khng phi l cnh (chng hn c th gn bng ,
0 hay C).
ng i, chu trnh trong th c trng s cng c nh ngha ging nh
trong trng hp khng trng s, ch c khc l di ng i khng tnh

113

bng s cnh i qua, m c tnh bng tng trng s ca cc cnh i qua.


di ca mt ng i B c k hiu l B.

1.2. ng i ngn nht xut pht t mt nh

Bi ton tm ng i ngn nht xut pht t mt nh (single-source shortest


path) c pht biu nh sau: Cho th c trng s A a8 8 , hy tm cc
ng i ngn nht t nh xut pht " 5 a n tt c cc nh cn li ca
th. di ca ng i t nh " ti nh , k hiu "8 , gi l khong cch
(distance) t " n . Nu nh khng tn ti ng i t " ti  th ta s t
khong cch bng . C mt vi bin i khc ca bi ton tm ng i
ngn nht xut pht t mt nh:


Tm cc con ng ngn nht t mi nh ti mt nh  cho trc. Bng


cch o chiu cc cung ca th, chng ta c th quy v bi ton tm
ng i ngn nht xut pht t .
Tm ng i ngn nht t nh " ti nh  cho trc. D nhin nu ta tm
c ng i ngn nht t " ti mi nh khc th bi ton tm ng i
ngn nht t " ti  cng s c gii quyt. Hn na, vn cha c mt
thut ton no tm ng i ngn nht t " ti  m khng cn quy v bi
ton tm ng i ngn nht t " ti mi nh khc.
Tm ng i ngn nht gia mi cp nh ca th: Mc d c nhng
thut ton n gin v hiu qu tm ng i ngn nht gia mi cp
nh, chng ta vn c th gii quyt bng cch thc hin thut ton tm
ng i ngn nht xut pht t mt nh vi mi cch chn nh xut pht.

a) C6u trc bi ton con t!


t!i Fu
Cc thut ton tm ng i ngn nht m chng ta s kho st u da vo mt
c tnh chung: Mi on ng trn ng i ngn nht phi l mt ng i
ngn nht.
nh l 1-1

Cho th c trng s A a8 8 , gi B ( 8 + 8 8 I l mt ng i


ngn nht t ( ti I , khi vi mi 8 bM N  N b N , on ng B2
2 8 2K( 8 8  l mt ng i ngn nht t 2 ti  .
114

Chng ta s thy rng hu ht cc thut ton tm ng i ngn nht u l thut


ton quy hoch ng (v d thut ton Floyd) hoc tham lam (v d thut ton
Dijkstra) bi tnh cht bi ton con ti u nu ra trong nh l 1-1.
Nu nh th c chu trnh m (chu trnh vi di m) th khong cch gia
mt s cp nh no c th khng xc nh, bi v bng cch i vng theo
chu trnh ny mt s ln ln, ta c th ch ra ng i gia hai nh no
trong chu trnh ny nh hn bt k mt s cho trc no. Trong trng hp nh
vy, c th t vn tm ng i n ngn nht. Vn li l mt bi ton
NP-y , hin cha ai chng minh c s tn ti hay khng mt thut ton
a thc tm ng i n ngn nht trn th c chu trnh m.
b) Quy vE
vE bi ton "o kho
khong cch
Nu nh th khng c chu trnh m th c th chng minh c rng mt
trong nhng ng i ngn nht l ng i n. Khi ch cn bit c
khong cch t " ti tt c nhng nh khc th ng i ngn nht t " ti  c
th tm c mt cch d dng qua thut ton sau:

Trc tin ta tm nh ( d  "8  "8 (   l( 8 . D thy rng lun


tn ti nh ( nh vy v nh s l nh ng lin trc  trn ng i
ngn nht t " ti . Nu ( " th ng i ngn nht l ng i trc tip
theo cung "8 . Nu khng th vn tr thnh tm ng i ngn nht t " ti
( . V ta li tm c mt nh + 68 ( 9 "8 (  "8 +  
l+ 8 C tip tc nh vy sau mt s hu hn bc cho ti khi xt ti nh
I ", Ta c dy  4 8 ( 8 + 8 I " khng cha nh lp li. Lt ngc
th t dy cho ta ng i ngn nht t " ti .
"

+

(

c) Nhn kho
khong cch v php co
Tt c nhng thut ton chng ta s kho st tm ng i ngn nht xut
pht t mt nh u s dng k thut gn nhn khong cch: Vi mi nh
 5 a, nhn khong cch   l di mt ng i no t " ti . Trong
115

trng hp chng ta cha xc nh c ng i no t " ti , nhn  


c gn gi tr .

Ban u chng ta cha xc nh c bt k ng i no t " ti cc nh khc


nn cc   c gn gi tr khi to l:
 

78 nu  "
 8;8 8 
8 nu  d "

(1.1)

procedure Init;
begin
for Lv 5 V do d[v] := +;
d[s] := 0;
end;

Do tnh cht ca nhn khong cch, ta c   w "8 8 L 5 a. Cc thut ton


tm ng i ngn nht s cc tiu ha dn cc nhn  E  cho ti khi  
"8 8 L 5 a. Trong cc thut ton m chng ta s kho st, vic cc tiu ha
cc nhn khong cch c thc hin bi cc php co.

Php co theo cnh @8  5 , gi tt l php co @8  c thc hin nh sau:


Gi s chng ta xc nh c  @ l di mt ng i t " ti @, ta ni
thm cnh @8  c mt ng i t " ti  vi di  @  @8 .
Nu ng i ny c di ngn hn  , ta ghi nhn li   bng  @ 
@8 . iu ny c ngha l nu " @ ni thm cnh @8  li ngn hn
ng i "  ang c, th ta hy b ng i "  hin ti v ghi nhn li
ng i "  mi l ng i " @ G .
"

 @

 

l@8 


Hnh 2.1. Php co

C th hnh dung hot ng ca php co nh sau: Cng mt on dy n hi


dc theo ng i " ti , on dy s dn ra ti di  . Tip theo ta th
ly on dy cng dc theo ng i t " ti @ ri ni tip n . Nu on
dy b chng xung (co li) hn so vi cch cng c, ta ghi nhn ng i tng
116

ng vi cch cng mi, nu on dy khng chng xung (hoc cng thm) th


ta vn gi on dy cng theo ng c. Chnh v php co khng lm di
thm  , ta ni rng   b cc tiu ha qua php co @8 .
Php co @8  c thc hin bi hm D
, hm nhn vo cnh @8  v tr
v True nu nhn   b gim i qua php co @8 :
function Relax(e = (u,v)5 E): Boolean;
begin
Result := d[v] > d[u] + w(e);
if Result then
begin
d[v] := d[u] + w(e); //cc tiu ha nhn d[v]
trace[v] := u; //Lu vt ng i
end
end;

Mi khi   b gim xung sau php co @8 , ta lu li vt !


l  z @ vi
ngha ng i ngn nht t " ti  cho ti thi im c ghi nhn s l
ng i qua @ trc ri i tip theo cung @8 , vt ny c s dng truy
vt tm ng i khi thut ton kt thc.
d) M8t s!
s! tnh ch6
ch6t v quy F4
F 4c
Cc tnh cht sau y tuy n gin nhng quan trng chng minh tnh ng
n ca cc thut ton trong bi:


117

Bt ng thc tam gic (triangle inequality): Vi mt cnh @8  5 , ta c


"8  N "8 @  @8 .
Cn di (lower bound) v s hi t (convergence): Cc   sau mt lot
php co s gim dn nhng khng bao gi nh hn khong cch "8 .
Tc l khi   "8  (  t cn di) th khng mt php co no
lm gim   i c na.
Cy ng i ngn nht (shortest-path tree): Nu ta khi to cc   v
thc hin cc php co cho ti khi   bng khong cch t " ti  (L 5
a) th chng ta cng xy dng c mt cy gc " trong nt  l con ca
nt !
l . ng i trn cy t nt gc " ti mt nt  chnh l ng
i ngn nht.

S khng tn ti ng i (no path): Nu khng tn ti ng i t " ti 


th cho d chng ta co nh th no chng na,   lun bng .

tin trong trnh by thut ton, ta a vo mt quy c khi cng gi tr vi


hng s F. Bi trong my tnh khng c khi nim , cc chng trnh ci t
thng s dng mt hng s c bit thay th, nhng c th phi i km vi
vi sa i hp l ha cc php ton:
F     F 
F  C C  F C

Di y ta s xt mt s thut ton tm ng i ngn nht t nh " ti nh 


trn th c hng A a8  c  nh v  cung, cc nh c nh s t
1 ti . Trong trng hp th v hng vi trng s khng m, bi ton tm
ng i ngn nht c th quy dn v bi ton tm ng i ngn nht trn phin
bn c hng ca th.
Input


Dng 1 cha s nh  N 7 , s cung  N 7 ca th, nh xut pht


", nh ch .
 dng tip theo, mi dng c dng ba s @, , , cho bit @8  l mt
cung 5  v trng s ca cung l  ( l s nguyn c gi tr tuyt i
N 7 )

Output

ng i ngn nht t " ti  v di ng i .

118

Sample Input

Sample Output

6 7 1 4

Distance from 1 to 4: 15

1 2 1

4<-5<-6<-3<-2<-1

3
20

1 6 10

2 3 2

10

3 4 20

5
6

3 6 3

5 4 5
6 5 4

e) Thu
Thu t ton BellmanBellman-Ford
 Thut ton
Thut ton Bellman-Ford[5][14] c th s dng tm ng i ngn nht xut
pht t mt nh " 5 a trong trng hp th 8 8  khng c chu
trnh m. Thut ton ny kh n gin: Khi to cc nhn khong cch
 " z 7 v   z 8 L d ", sau thc hin php co theo mi cnh ca
th. C lp li nh vy n khi khng th cc tiu ha thm bt k mt nhn
  no na.
Init;
repeat
Stop := True;
for Le 5 E do
if Relax(e) then Stop := False;
until Stop;

 Tnh ng v tnh dng

Gi I "8  l di ngn nht ca mt ng i t " ti  qua ng  cnh,


nu khng tn ti ng i t " ti  qua  cnh th I "8  .
Ta chng minh rng sau mi ln lp th  ca vng lp repeatuntil th
  N I "8 8 L 5 a

(1.2)

Ti bc khi to, r rng   4 "8  . Gi s bt ng thc (1.2) ng


trc ln lp th , ta chng minh rng bt ng thc vn ng sau ln lp th
. Tht vy, ng i ngn nht t " ti  qua  cnh s phi thnh lp bng
119

cch ly mt ng i ngn nht t " ti mt nh @ no qua  C cnh ri


i tip ti  bng cung @8 : " @ G . V th I "8  c th c tnh bng
cng thc truy hi:
I "8  o 6I3( "8 @  @8 9
5
85s

w o 6 @  @8 9
5
85s

(1.3)

w  

Bt ng thc th nht ng do gi thit quy np v cc php co khng bao gi


lm tng  @. Bt ng thc th hai ng v sau khi cng theo tt c cc cnh
 8  th khng th tn ti @   1  @  @8  c na.

Trong cc ng i ngn nht t " ti , s c mt ng i n (qua khng qu


 C cnh). Tc l "8  oIM(I.3( I "8 . Sau  C bc lp ca
vng lp repeatuntil, ta thu c cc   tha mn   N I "8  vi mi
 5 a v mi s  8;8 8  C . iu ny ch ra rng:   N "8 8 L 5
a. Mt khc   w "8  (tnh b chn di), vy L 5 aM   "8  sau
 C bc lp repeatuntil, iu ny cng cho thy thut ton Bellman-Ford
s kt thc sau khng qu  C bc lp repeatuntil.
 Ci t

Cch biu din th tt nht ci t thut ton Bellman-Ford l s dng


danh sch cnh. Danh sch cnh ca th c lu tr trong mng  ,
mi phn t ca mng l mt bn ghi cha ch s hai nh u mt @8  v trng
s  tng ng vi mt cnh

BELLMANFORD.PAS  Thut ton Bellman-Ford

{$MODE OBJFPC}
program BellmanFordShortestPath;
const
maxN = 10000;
maxM = 100000;
maxW = 100000;
maxD = maxN * maxW;
type
120

TEdge = record //Cu trc biu din cung


x, y: Integer; //nh u v nh cui
w: Integer; //Trng s
end;
var
e: array[1..maxM] of TEdge; //Danh sch cung
d: array[1..maxN] of Integer; //Nhn trng s
trace: array[1..maxN] of Integer; //Vt
n, m, s, t: Integer;
procedure Enter; //Nhp d liu
var i: Integer;
begin
ReadLn(n, m, s, t);
for i := 1 to m do
with e[i] do ReadLn(x, y, w);
end;
procedure Init; //Khi to
var v: Integer;
begin
for v := 1 to n do d[v] := MaxD; //Cc nhn d[v] := +
d[s] := 0; //Ngoi tr d[s] = 0
end;
function Relax(const e: TEdge): Boolean; //Php co theo cnh e
begin
with e do
begin
Result := (d[x] < maxD) and (d[y] > d[x] + w);
if Result then //Co c
begin
d[y] := d[x] + w; //Cc tiu ha nhn d[v]
trace[y] := x; //Lu vt
end;
end;
end;
procedure BellmanFord;
var
Stop: Boolean;
i, CountLoop: Integer;
121

begin
for CountLoop := 1 to n - 1 do //Lp ti a n 1 ln
begin
Stop := True; //Cha c s thay i nhn no
for i := 1 to m do
if Relax(e[i]) then Stop := False;
if Stop then Break; //Khng nhn no thay i, dng
end;
end;
procedure PrintResult; //In kt qu
begin
if d[t] = maxD then //d[t] = +, khng c ng
WriteLn('There is no path from ', s, ' to ', t)
else
begin
WriteLn('Distance from ', s, ' to ', t, ':
', d[t]);
while t <> s do //Truy vt t t
begin
Write(t, '<-');
t := trace[t];
end;
WriteLn(s);
end;
end;
begin
Enter;
Init;
BellmanFord;
PrintResult;
end.

D thy rng thi gian thc hin gii thut Bellman-Ford trn th Aa8 8 
l $a.

122

f) Thu
Thu t ton Dijkstra
 Thut ton

Trong trng hp th 8 8  c trng s trn cc cung khng m,


thut ton do Dijkstra [8] xut di y hot ng hiu qu hn nhiu so vi
thut ton Bellman-Ford bi qu trnh sa nhn s ch xt mi cnh ti a mt
ln. Ti mi bc, thut ton i tm nh @ m nhn  @ t cn di bng
"8 @. Nhn  @ chc chn khng th cc tiu ha c na, khi thut ton
mi tin hnh cc tiu ha cc nhn   khc bng cc php sa nhn theo
cnh @8 . Cc bc c th c tin hnh nh sau:

Bc 1: Khi to

Gi th tc Init khi to cc nhn khong cch  " z 7 v   z


8 L d ". Mt nhn   gi l c nh nu ta bit chc   "8  v
khng th cc tiu ha   thm na bng php co, ngc li nhn   gi l
t do. Ta s nh du trng thi nhn bng mng

 E E  trong


  q nu nhn   cn t do. Ban u tt c cc nhn u t do.
Bc 2: Lp, bc lp gm c hai thao tc:


C nh nhn: Chn trong cc nh c nhn t do, ly ra nh @ l nh c


 @ nh nht, nh du c nh nhn nh @ (

 @ z n%).
Sa nhn: Dng nh @, xt tt c nhng nh  ni t @ v thc hin php
co theo cung @8  cc tiu ha nhn  .

Bc lp s kt thc khi m nh ch  c c nh nhn (tm c ng i


ngn nht t " ti ); hoc ti thao tc c nh nhn, tt c cc nh t do u c
nhn l  (khng tn ti ng i).

Ti ln lp u tin, nh " c  " nh nht (bng 0) s c c nh nhn. C


th t cu hi ti sao nh @ c nhn t do nh nht c c nh nhn ti tng
bc, gi s  @ cn c th lm nh hn na th tt phi c mt nh mang
nhn t do sao cho  @ 1     8 @. Do trng s  8 @ khng m nn
 @ 1  , tri vi cch chn  @ nh nht.
Bc 3: Truy vt

123

Kt hp vi vic lu vt ng i trn tng bc sa nhn, thng bo ng i


ngn nht tm c hoc cho bit khng tn ti ng i.
 Ci t
Thut ton Dijkstra hot ng tt nht nu th c biu din bng danh sch
k dng forward star. Cu trc danh sch k c khai bo nh sau:
type
TAdjNode = record //Cu trc nt ca danh sch k
v: Integer; //nh k
w: Integer; //Trng s cnh tng ng
end;
var
adj: array[1..maxM] of TAdjNode; //Mng cc nt
head: array[1..maxN] of Integer;
//head[u]: Ch s nt u tin ca danh sch k u

link: array[1..maxM] of Integer;

Mi nh @ s tng ng vi mt danh sch cc nt, mi nt cha mt nh  v


trng s  ca mt cung @8  . Tt c cc nt c lu tr trong mng

b  v mi nt s thuc ng mt danh sch k. Cc nt thuc danh


sch k ca nh @ l
b ( 8
b + 8
b   , trong ( 
 @ +
 (    +  y chnh l cu trc d liu biu din danh sch mc
ni n, nhng khc vi nhng php ci t truyn thng, ta s dng mng cc
nt thay cho c ch cp pht bin ng v s dng ch s vi vai tr nh con tr.
//link[i]: Ch s nt k tip nt adj[i] trong cng mt danh sch k

DIJKSTRA.PAS 
{$MODE OBJFPC}
program DijkstraShortestPath;
const
maxN = 10000;
maxM = 100000;
maxW = 100000;
maxD = maxN * maxW;
type
TAdjNode = record //Cu trc nt ca danh sch k
v: Integer; //nh k
w: Integer; //Trng s cung tng ng
124

link: Integer; //Ch s nt k tip trong cng danh sch k


end;
var
adj: array[1..maxM] of TAdjNode; //Mng cha tt c cc nt
head: array[1..maxN] of Integer;
//head[u]: Ch s nt ng u danh sch k ca u
d: array[0..maxN] of Integer; //Nhn khong cch

avail: array[1..maxN] of Boolean; //nh du t do/c nh


trace: array[1..maxN] of Integer; //Vt ng i
n, m, s, t: Integer;
procedure Enter; //Nhp d liu
var i, u: Integer;
begin
ReadLn(n, m, s, t);
FillChar(head[1], n * SizeOf(head[1]), 0);
//Khi to cc danh sch k rng

for i := 1 to m do
begin
ReadLn(u, adj[i].v, adj[i].w);
//c mt cung (u, v) trng s w, a v v w vo trong nt adj[i]

adj[i].link := head[u]; //Chn nt adj[i] vo u danh sch k ca u


head[u] := i; //Cp nht ch s nt ng u danh sch k ca u
end;
end;
procedure Init; //Khi to
var v: Integer;
begin
for v := 0 to n do d[v] := MaxD;
//Cc nhn d[v] := +, d[0]: phn t cm canh

d[s] := 0; //Ngoi tr d[s] = 0


FillChar(avail[1], n * SizeOf(avail[1]), True);
//Cc nhn u t do

end;
procedure Relax(u, v: Integer; w: Integer);
//Php co theo cung (u, v) trng s w

begin
if d[v] > d[u] + w then
begin
d[v] := d[u] + w;
125

trace[v] := u;
end;
end;
procedure Dijkstra; //Thut ton Dijkstra
var u, v, i: Integer;
begin
repeat
//Tm nh u c nhn t do nh nht

u := 0;
for v := 1 to n do
if avail[v] and (d[v] < d[u]) then
u := v;
if (u = 0) or (u = t) then Break;
//u = 0: khng tn ti ng i, u = t, xong

avail[u] := False; //C nh nhn nh u


//Co theo cc cung ni t u
i := head[u]; //Duyt t u danh sch k

while i <> 0 do
begin
Relax(u, adj[i].v, adj[i].w); //Thc hin php co
i := adj[i].link; //Chuyn sang nt k tip trong danh sch k
end;
until False;
end;
procedure PrintResult; //In kt qu
begin
if d[t] = maxD then
WriteLn('There is no path from ', s, ' to ', t)
else
begin
WriteLn('Distance from ', s, ' to ', t, ':
', d[t]);
while t <> s do
begin
Write(t, '<-');
t := trace[t];
end;
WriteLn(s);
126

end;
end;
begin
Enter;
Init;
Dijkstra;
PrintResult;
end.

Mi lt ca vng lp repeatuntil s c mt nh mang nhn t do b c nh


nhn, suy ra s lt lp ca vng lp repeatuntil l $a. Vic tm nh @ c
nhn t do nh nht c thc hin trong thi gian $a, vy nn xt trn ton
thut ton, tng thi gian thc hin ca cc pha c nh nhn l $a+ .

Mi lt ca vng lp repeatuntil khi c nh nhn nh @ s phi duyt danh


sch cc nh ni t @ thc hin pha sa nhn. V vy xt trn ton thut
ton, tng thi gian thc hin ca cc pha sa nhn l $:5 p' K @
$.
Vy th tc Dijkstra thc hin trong thi gian $a+  .

 Kt hp vi hng i u tin

thut ton Dijkstra lm vic hiu qu hn, ngi ta thng kt hp vi mt


cu trc d liu hng i u tin cha cc nh t do c nhn d  thun
tin trong vic ly ra nh c nhn nh nht cng nh cp nht li nhn ca cc
nh. Hng i u tin cn h tr cc thao tc sau:


 !
lM Ly ra mt nh u tin nht (nh @ c  @ nh nht) khi hng
i u tin.

: Thao tc ny bo cho hng i u tin bit rng nhn  
b gim i, cn t chc li (thm  vo hng i u tin nu  ang nm
ngoi).

Khi thut ton Dijkstra c th vit theo m hnh mi s dng hng i u


tin:
Init;
PQ := (s); //Hng i u tin c khi to ch gm nh xut pht
repeat
u := Extract; //Ly ra nh u c d[u] nh nht
127

if u = t then Break;
for L(u, v) 5 E do
if Relax(u, v) then Update(v);
until PQ = ;
if d[t] = + then
Output Khng c ng
else
Truy vt tm ng i t s ti t

Vng lp repeatuntil mi ln s ly mt nh khi hng i u tin v nh ly


ra s khng bao gi b y vo hng i u tin li na. Vng lp for bn trong
xt trong tng th c chng trnh s duyt qua tt c cc cung @8  ca th.
Vy thut ton Dijkstra cn thc hin khng qu  php  !
l v  php

 vi  l s nh v  l s cung ca th.

Trong chng trnh ci t thut ton Dijkstra di y ti s dng Binary Heap


biu din hng i u tin, khi thi gian thc hin gii thut s l
$ %'    %' . Ngoi cu trc Binary Heap, ngi ta cng nghin cu
nhiu cu trc d liu hiu qu hn biu din hng i u tin, chng hn
Fibonacci Heap[17], Relaxed Heap[11], 2-3 Heap[39], v.v Nhng cu trc
d liu ny cho php ci t thut ton Dijkstra chy trong thi gian $ %'  
. Tuy nhin vic ci t cc cu trc d liu ny kh phc tp, cc bn c th
tham kho trong nhng ti liu khc.


DIJKSTRAHEAP.PAS  Thut ton Dijkstra v cu trc Heap


{$MODE OBJFPC}
program DijkstraShortestPathUsingHeap;
const
maxN = 10000;
maxM = 100000;
maxW = 100000;
maxD = maxN * maxW;
type
TAdjNode = record //Cu trc nt ca danh sch k
v: Integer; //nh k
w: Integer; //Trng s cung tng ng
link: Integer; //Ch s nt k tip trong cng danh sch k
128

end;
THeap = record //Cu trc Heap
Items: array[1..maxN] of Integer; //Cc phn t cha trong
nItems: Integer; //S phn t cha trong
Pos: array[1..maxN] of Integer;
//Pos[v] = v tr ca nh v trong Heap

end;
var
adj: array[1..maxM] of TAdjNode; //Mng cha tt c cc nt
head: array[1..maxN] of Integer;
//head[u]: Ch s nt ng u danh sch k ca u

d: array[1..maxN] of Integer;
trace: array[1..maxN] of Integer;
n, m, s, t: Integer;
Heap: THeap;
procedure Enter; //Nhp d liu
var i, u: Integer;
begin
ReadLn(n, m, s, t);
FillChar(head[1], n * SizeOf(head[1]), 0);
//Khi to cc danh sch k rng

for i := 1 to m do
begin
ReadLn(u, adj[i].v, adj[i].w);
//c mt cung (u, v) trng s w, a v v w vo trong nt adj[i]

adj[i].link := head[u]; //Chn nt adj[i] vo u danh sch k ca u


head[u] := i; //Cp nht ch s nt ng u danh sch k ca u
end;
end;
procedure Init;
var v: Integer;
begin
for v := 1 to n do d[v] := MaxD;
d[s] := 0;
with Heap do //Khi to Heap ch cha mi phn t s
begin
FillChar(Pos[1], n * SizeOf(Pos[1]), 0);
Items[1] := s;
Pos[s] := 1;
129

nItems := 1;
end;
end;
function Extract: Integer; //Ly nh u c nhn d[u] nh nht ra khi Heap
var p, c, v: Integer;
begin
with Heap do
begin
Result := Items[1]; //Tr v nh gc Heap
v := Items[nItems]; //Vun li Heap bng php Down-Heap
Dec(nItems);
p := 1; //Bt u t gc
repeat
//Tm c l nt con cha nh mang nhn khong cch nh hn trong hai nt con

c := p * 2;
if (c < nItems)
and (d[Items[c + 1]] < d[Items[c]]) then
Inc(c);
if (c > nItems)
or (d[v] <= d[Items[c]]) then Break;
Items[p] := Items[c]; //Chuyn nh t c ln p
Pos[Items[p]] := p; //Cp nht v tr
p := c; //i xung nt con
until False;
Items[p] := v; //t nh v vo nt p ca Heap
Pos[v] := p; //Cp nht v tr
end;
end;
procedure Update(v: Integer); //d[v] va b cc tiu ha, t chc li Heap
var p, c: Integer;
begin
with Heap do
begin
c := Pos[v]; //c l v tr ca nh v trong Heap
if c = 0 then //Nu v cha c trong Heap
begin
Inc(nItems);
c := nItems; //Cho v vo Heap v tr mt nt l
130

end;
repeat //Thc hin Up-Heap
p := c div 2; //Xt nt cha ca c
if (p = 0) or (d[Items[p]] <= d[v]) then Break;
//Dng nu xt ln gc hoc gp v tr ng

Items[c] := Items[p]; //Ko nh t nt cha xung nt con


Pos[Items[c]] := c; //Cp nht v tr
c := p; //i ln nt cha
until False;
Items[c] := v; //t v vo nt c
Pos[v] := c; //Cp nht v tr
end;
end;
function Relax(u, v: Integer; w: Integer): Boolean;
//Php co theo cnh (u, v) trng s w

begin
Result := d[v] > d[u] + w;
if Result then
begin
d[v] := d[u] + w;
trace[v] := u;
end;
end;
procedure Dijkstra; //Thut ton Dijkstra
var u, i: Integer;
begin
repeat
u := Extract; //Ly ra nh u c d[u] nh nht
if (u = 0) or (u = t) then Break;
i := head[u]; //Duyt t u danh sch k ca u
while i <> 0 do
begin
if Relax(u, adj[i].v, adj[i].w) then
//Nu thc hin c php co

Update(adj[i].v); //T chc li Heap


i := adj[i].link; //Chuyn sang nt k tip trong danh sch k
end;
until Heap.nItems = 0;
end;
131

procedure PrintResult; //In kt qu


begin
if d[t] = maxD then
WriteLn('There is no path from ', s, ' to ', t)
else
begin
WriteLn('Distance from ', s, ' to ', t, ':
', d[t]);
while t <> s do
begin
Write(t, '<-');
t := trace[t];
end;
WriteLn(s);
end;
end;
begin
Enter;
Init;
Dijkstra;
PrintResult;
end.

g) \FU
\FUng "i ng]
ng]n nh6
nh6t trn "^
"^ th>
th> khng c chu trnh
 Thut ton
Xt trng hp th c hng, khng c chu trnh (Directed Acyclic Graph
- DAG), c mt thut ton hiu qu tm ng i ngn nht da trn k thut
sp xp T p (Topological Sorting), c s ca thut ton da vo nh l: Nu
A a8  l mt DAG th cc nh ca n c th nh s sao cho mi cung ca
A ch ni t nh c ch s nh hn n nh c ch s ln hn.

132

7
3

2
1

6
3

7
5

Hnh 2.2. Php nh ch s li theo th t t p

Php nh s theo th t t p c trnh by trong thut ton KosarajuSharir (Error! Reference source not found., Mc Error! Reference source
not found.): Dng thut ton tm kim theo chiu su trn th o chiu v
nh s cc nh theo th t duyt xong (Finish).
procedure TopoSort;
procedure DFSVisit(v5V);
//Thut ton tm kim theo chiu su t nh v trn th o chiu

begin
avail[v] := False; //avail[v] = False v thm
for u 5 V:(u, v)5 E do //Duyt mi nh v cha thm ni n u
if avail[u] then
DFSVisit(u); //Gi quy tm kim theo chiu su t nh u
nh s v; //nh s v theo th t duyt xong
end;
begin
for v 5 V do avail[v] := True; //nh du mi nh u cha thm
for v 5 V do
if avail[v] then DFSVisit(v);
end.

Mt cch khc nh s theo th t t p l s dng thut ton tm kim theo


chiu rng: Vi mi nh  ta tnh v lu tr p' 3  l bn bc vo ca n. S
dng mt hng i cha cc nh c bn bc vo bng 0 (nh khng c cung i
vo). Sau c ly mt nh @ khi hng i, nh s cho nh @ v xa
nh @ khi th. Vic xa nh @ khi th tng ng vi vic gim tt c
cc p' 3  ca nhng nh  ni t @ i 1, nu p' 3  b gim v 0 th y 
vo hng i chQu trnh nh s s kt thc khi hng i rng (tt c
133

cc nh u c nh s th t mi). Phng php ny tuy ci t c di


dng hn v chm hn mt cht nhng khng cn s dng quy.
Nu cc nh c nh s sao cho mi cung phi ni t mt nh ti mt nh
khc mang ch s ln hn th thut ton tm ng i ngn nht c th thc hin
kh n gin:
Init;
for v := s + 1 to t do
for Lu:(u, v) 5 E do Relax(u, v); //Co theo cc cung ni ti v

C th thy rng sau mi bc lp vi nh , nhn   khng th co thm


c na ( @ "8 @).
 Ci t

V mc tiu ca chng ta ch cn tm ng i t " ti , v th chng ta ch cn


nh s th t t p cho nhng nh n c  bng li gi P?ka",
nhng nh n c t  (c th t t p ln hn ) s b b qua.

Cch ci t thng thng nht tm ng i ngn nht trn th khng c


chu trnh l tch bit hai pha: Sp xp t p v ti u nhn. Pha sp xp t p
trc ht thc hin tm kim theo chiu su trn th o chiu bng li gi
P?ka". Mi khi mt nh c duyt xong (nh s th t t p), n s
c y vo mt hng i. Pha ti u nhn ln lt ly cc nh ra khi hng
i (theo ng th t t p) v thc hin php co theo tt c cc cung ni ti
nh va ly ra. Cch ci t ny c u im l kh sng sa, trong trng hp
m ta b qua c khu sp xp t p hoc c th xc nh th t t p bng
mt cch n gin hn, chng trnh tr nn rt gn.

Tuy nhin nu ta phi gii quyt bi ton tng qut bao gm c hai pha sp xp
t p v ti u nhn th c th kho lo lng pha ti u nhn vo pha sp xp t
p: Trc khi nh  c nh s (duyt xong), ta thc hin tt c cc php co
theo cc cung @8  vi mi nh @ ni n .


SHORTESTPATHDAG.PAS  ng i ngn nht trn DAG

{$MODE OBJFPC}
program DAGShortestPath;
const
maxN = 10000;
134

maxM = 100000;
maxW = 100000;
maxD = maxN * maxW;
type
TAdjNode = record //Cu trc nt ca danh sch k dng reverse star
u: Integer; //nh k
w: Integer; //Trng s cung tng ng
link: Integer; //Ch s nt k tip trong cng danh sch k
end;
var
adj: array[1..maxM] of TAdjNode; //Mng cha tt c cc nt
head: array[1..maxN] of Integer;
//head[u]: Ch s nt ng u danh sch k ca u

d: array[1..maxN] of Integer; //Nhn khong cch


trace: array[1..maxN] of Integer; //Vt
avail: array[1..maxN] of Boolean;
n, m, s, t: Integer;
procedure Enter; //Nhp d liu
var i, v: Integer;
begin
ReadLn(n, m, s, t);
FillChar(head[1], n * SizeOf(head[1]), 0);
for i := 1 to m do
begin
ReadLn(adj[i].u, v, adj[i].w);
//c mt cung (u, v) trng s w, a u v w vo trong nt adj[i]
adj[i].link := head[v]; //Chn nt adj[i] vo u danh sch k ca v

head[v] := i; //Cp nht ch s nt ng u danh sch k ca v


end;
end;
procedure Init;
var v: Integer;
begin
FillChar(avail[1], n * SizeOf(avail[1]), True);
for v := 1 to n do d[v] := maxD;
d[s] := 0;
end;
procedure Relax(u, v: Integer; w: Integer);
135

begin
if (d[u] < maxD) and (d[v] > d[u] + w) then
begin
d[v] := d[u] + w;
trace[v] := u;
end;
end;
procedure DFSVisit(v: Integer); //DFS trn th o chiu
var i: Integer;
begin
avail[v] := False;
i := head[v];
while i <> 0 do //Duyt danh sch cc nh ni n v
begin
if avail[adj[i].u] then
//adj[i].u l mt nh ni n v, nu adj[i].u cha thm th i thm,
DFSVisit(adj[i].u); //sau li gi ny d[adj[i].u] s bng (s, adj[i].u)

Relax(adj[i].u, v, adj[i].w);
//Thc hin lun php co (adj[i].u, v)

i := adj[i].link; //Nhy sang nt k tip trong danh sch k


end;
end; //Khi th tc kt thc, d[v] s bng (s,v)
procedure PrintResult; //In kt qu
begin
if d[t] = maxD then
WriteLn('There is no path from ', s, ' to ', t)
else
begin
WriteLn('Distance from ', s, ' to ', t, ':
', d[t]);
while t <> s do
begin
Write(t, '<-');
t := trace[t];
end;
WriteLn(s);
end;
end;
136

begin
Enter;
Init;
DFSVisit(t);
PrintResult;
end.

Thi gian thc hin gii c th nh gi qua thi gian thc hin gii thut DFS,
tc l bng $ khi th c biu din bi danh sch k.

1.3. ng i ngn nht gia mi cp nh

Trong mt s ng dng thc t, i khi ngi ta ta c nhu cu tnh sn ng i


ngn nht gia mi cp nh ca th (all-pairs shortest paths) tr li
nhanh nhng truy vn tm ng i ngn nht m khng cn thc hin li thut
ton. R rng ta c th p dng thut ton tm ng i ngn nht xut pht t
mt nh vi  lt chn nh xut pht, nhng nhng thut ton trong mc ny
c th thc hin nhanh hn v n gin hn nhiu.
a) Thu
Thu t ton Floyd

Cho n th c hng, c trng s A a8  vi  nh v  cung. Thut


ton Floyd tnh tt c cc phn t ca ma trn khong cch P 6 9.Y. , trong
 @8  l khong cch t @ ti . Cch lm tng t nh thut ton Warshall
tm bao ng th: t ma trn trng s 6 @8 9.Y. , trong
 8  78 L 5 a, thut ton Floyd tnh li cc  @8  thnh di ng i
ngn nht t @ ti  theo cch sau: Vi L 5 a c xt theo th t t 1 ti ,
thut ton xt mi cp nh @8  v cc tiu ha  @8  theo cng thc:
 @8  z o6 @8 c 8  @8    8 9

(1.4)

Tc l nu nh ng i t @ ti  ang c li di hn ng i t @ ti  cng
vi ng i t  ti  th ta hu b ng i t @ ti  hin thi v coi ng
i t @ ti  s l ni ca hai ng i t @ ti  ri t  ti :
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
w[u, v] := min(w[u, v], w[u, k] + w[k, v]);

137

 Tnh ng ca thut ton

Gi I @8  l di ng i ngn nht t @ ti  m ch i qua cc nh


trung gian thuc tp 6 8;8 8 9 . R rng khi  7 th 4 @8   @8 
(ng i ngn nht l ng i trc tip khng qua nh trung gian no).
Nu ng i ngn nht t @ ti  m ch qua cc nh trung gian thuc tp
6 8;8 8 9 li:


Khng i qua nh  , tc l ch qua cc nh trung gian thuc tp


6 8;8 8  C 9 th I @8  I3( @8 .
C i qua nh , th ng i s l ni ca mt ng i ngn nht t @
ti  v mt ng i ngn nht t  ti , hai ng i ny ch i qua cc
nh trung gian thuc tp 6 8;8 8  C 9 , vy I @8  I3( @8  
I3( 8 E

V ta mun I @8  nh nht nn suy ra:

I @8  o6I3( @8 8 I3( @8   I3( 8 9

(1.5)

Cui cng ta quan tm ti cc . @8 : di ng i ngn nht t @ ti  m


ch i qua cc nh trung gian thuc tp 6 8;8 8 9, tc l khong cch gia @ v
: @8 .
Ta s chng minh rng sau mi bc lp ca vng lp for k, th:
 @8  N I @8 

(1.6)

Php chng minh c thc hin quy np theo . K hiu I @8  l gi tr


 @8  sau vng lp th  , khi  7 th nh ch ra trn, 4 @8 
4 @8 . Gi s bt ng thc ng vi  C , trc ht d thy rng cc
 @8  s c ti u ha gim dn theo tng bc. T cng thc (1.5), ta c:
@8
@8
8
I @8  o
 8
 


I3(
I3(
I3(
* 8

* 8I

* I8

w I @8 
Mt khc c th thy thut ton Floyd tm c . @8  l di ca mt
ng i t @ ti . Tc l . @8  w . @8 . T nhng kt qu trn suy ra
138

khi kt thc thut ton, . @8  . @8  @8  l di ng i ngn


nht t @ ti .

 Ci t

Ta s ci t thut ton Floyd trn th c hng gm  nh,  cung vi


khun dng Input/Output nh sau:
Input


Dng 1 cha s nh  N 7 , s cung  N 7 ca th, nh xut pht


", nh cn n .
 dng tip theo, mi dng c dng ba s @, , , cho bit @8  l mt
cung 5  v trng s ca cung l  ( l s nguyn c gi tr tuyt i
N 7 )

Output

ng i ngn nht t " ti  v di ng i .


Sample Input

Sample Output

6 7 1 4

Distance from 1 to 4: 15

1 2 1

1->2->3->6->5->4

1 6 10
2 3 2
3 4 20
3 6 3

3
20

1
3

10

5
6

5 4 5
6 5 4

Thut ton Floyd ch cn thc hin mt ln trn th v khi cn tm ng i


ngn nht gia mt cp nh khc, ta ch cn d ng da trn ma trn khong
cch m thi. Trn thc t ngi ta thng kt hp vi mt c ch lu vt tr
li nhanh nhiu truy vn v ng i ngn nht: Gi !
l @8  l nh ng
lin sau @ trn ng i ngn nht t @ ti  . Sau mi php cc tiu ha
l @8  z l @8   l 8  (ng i ngn nht t @ ti  phi i vng qua ), ta
cp nht li vt !
l @8  z !
l @8 .

139

FLOYD.PAS  Thut ton Floyd


{$MODE OBJFPC}
program FloydAllPairsShortestPaths;
const
maxN = 1000;
maxW = 1000;
maxD = maxN * maxW;
var
w: array[1..maxN, 1..maxN] of Integer; //Ma trn trng s
trace: array[1..maxN, 1..maxN] of Integer; //Vt
n, m, s, t: Integer;
procedure Enter; //Nhp d liu, cc cnh khng c c gn trng s +
var
i, u, v, weight: Integer;
begin
ReadLn(n, m, s, t);
for u := 1 to n do
for v := 1 to n do
if u = v then w[u, v] := 0
else w[u, v] := maxD;
for i := 1 to m do
begin
ReadLn(u, v, weight);
if w[u, v] > weight then
//Phng trng hp nhiu cung ni t u ti v (a th)
w[u, v] := weight; //Ch ghi nhn cung trng s nh nht

end;
end;
procedure Floyd;
var k, u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do trace[u, v] := v;
//Khi to ng i ngn nht l ng i trc tip

for k := 1 to n do
for u := 1 to n do
if w[u, k] < maxD then
for v := 1 to n do
140

if (w[k, v] < maxD)


and (w[u, v] > w[u, k] + w[k, v]) then
begin //Cc tiu ha c[u, v]
w[u, v] := w[u, k] + w[k, v];
//Ghi nhn ng i vng qua k

trace[u, v] := trace[u, k]; //Lu vt


end;
end;
procedure PrintResult; //In kt qu
begin
if w[s, t] = maxD then
WriteLn('There is no path from ', s, ' to ', t)
else
begin
WriteLn('Distance from ', s, ' to ', t, ':
', w[s, t]);
while s <> t do
begin
Write(s, '->');
s := trace[s, t];
end;
WriteLn(t);
end;
end;
begin
Enter;
Floyd;
PrintResult;
end.

D thy rng thi gian thc hin gii thut Floyd l   v chi ph b nh l
+ .

b) Thu
Thu t ton Johnson

Trong trng hp A a8  l th tha gm  nh v  cnh:  + ,


thut ton Johnson tm ng i ngn nht gia mi cp nh hot ng hiu
qu hn thut ton Floyd. Bn cht ca thut ton Johnson l thc hin thut

141

ton Bellman-Ford gn li trng s v thc hin tip thut ton Dijkstra


tm ng i ngn nht.

Nu th khng c cnh trng s m, ta c th thc hin thut ton Dijkstra 


ln vi cch chn ln lt  nh lm nh xut pht. Bng cch kt hp vi mt
hng i u tin c t chc di dng Fibonacci Heap, thi gian thc hin
mt ln thut ton Dijkstra l $ %'   , v nh vy ta c th tm ng i
ngn nht gia mi cp nh trong thi gian $+ %'   .
Nu th c cnh trng s m nhng khng c chu trnh m, thut ton
Johnson thc hin mt k thut gi l gn li trng s (re-weighting). Tc l
trng s M  G s c bin i thnh trng s 
M  G tha mn hai iu
kin sau y:

Vi mi cp nh @8  5 a, ng i B l ng i ngn nht t @ ti  ng
vi trng s  nu v ch nu B cng l ng i ngn nht t @ ti  ng
vi trng s 

Vi mi cnh  5 , trng s 
 l mt s khng m

nh l 1-2

Cho th A a8  vi trng s M  G . Gi M a G l mt hm gn cho


mi nh  mt s thc . Xt trng s 
M  G nh ngha bi:

@8  @8   @ C 

Xt  4 8 ( 8 8 I l mt ng i t 4 ti I , khi  l ng i ngn
nht t 4 ti I vi trng s  nu v ch nu  l ng i ngn nht t 4 ti
I vi trng s 
. Hn na A c chu trnh m tng ng vi trng s  nu v
ch nu A c chu trnh m vi trng s 
.
Chng minh

K hiu  v 
 ln lt l di ng i  vi trng s  v 
. Ta c
I


 
23( 8 2 
2<(
I

g23( 8 2   23(  C h


2<(

142

23( 8 2   4  C I 


2<(

  4  C I 

Vy qua php bin i trng s, di mi ng i t 4 ti I s c cng


thm mt lng 4  C I . Hay ni cch khc, ng i no ngn nht vi
trng s  cng l ng i ngn nht vi trng s 
.

Nu  l mt chu trnh, 4 I , ta suy ra 


 . di ca chu trnh
c bo ton qua php bin i trng s, tc l A c chu trnh m vi trng s 
nu v ch nu A c chu trnh m vi trng s 
.

nh l 1-3

Mc tiu tip theo l ch ra mt php gn trng s mi cho th A m bo


cc trng s khng m. Nu A khng c chu trnh m ta thm vo th mt nh
gi " v cc cung ni t nh " ti tt c cc nh cn li ca th, trng s ca
cc cung ny c t bng 0. Do nh " khng c cung i vo, th mi to
thnh cng khng c chu trnh m. Thc hin thut ton Bellman-Ford trn th
mi vi nh xut pht " xc nh cc   "8  l di ng i ngn
nht t " ti  tng ng vi trng s l.

Trng s 
M  G xc nh bi 
@8  @8    @ C   l mt hm
trng s khng m.
Chng minh

Khi thut ton Bellman-Ford kt thc, s khng tn ti mt cnh @8  no m


 1 @  @8 

hay ni cch khc, vi mi cnh @8  ca th, ta c


@8   @ C  w 7

Cc nhn xt k trn, c bit l nh l 1-2 v nh l 1-3, cho ta m hnh ci


t thut ton Johnson:


143

Thm vo th mt nh " v cc cung trng s 0 ni t " ti tt c cc


nh khc, dng thut ton Bellman-Ford tnh cc   l di ng i
ngn nht t " ti . Thi gian thc hin gii thut $
Loi b " v cc cung mi thm vo khi th, gn li trng s
cnh 
@8  z @8    @ C   vi mi cnh @8  5 . Thi gian
thc hin gii thut 

Ln lt ly cc nh  5 a lm nh xut pht, thc hin thut ton


Dijkstra tm ng i ngn nht t  ti tt c cc nh khc. Thi gian
thc hin gii thut $+ %'    nu s dng Fibonacci Heap

Vy thut ton Johnson tm ng i ngn nht gia mi cp nh c th thc


hin trong thi gian $+ %'   . Thut ton da trn hai thut ton bit
tm ng i ngn nht xut pht t mt nh, vic ci t xin dnh cho bn
c.

1.4. Mt s ch
mt s chng trnh trong bi, i khi ta s dng ma trn trng s v em
trng s  gn cho nhng cnh khng c trong th ban u, hay khi khi
to cc nhn khong cch, chng ta thng gn   z  v cc tiu ha dn
cc nhn . Trn my tnh th khng c khi nim tru tng  nn ta s
phi chn mt s dng 
P ln thay. Nh th no l ln?. S
phi ln hn tt c trng s ca cc ng i n cho d ng i tht c
ti t n u vn tt hn ng i trc tip theo cnh tng tng ra .
Trong trng hp th c cnh trng s m, cn cn thn vi php cng trng
s: Nu mt trong hai hng t l 
P, ta coi nh tng bng 
P (F 
) v khng cn cng na. L do th nht l hn ch li trn s khi hng s

P trong bi ton c th qu ln, l do th hai l khng b tnh sai khi
cng 
P vi mt s m c kt qu O 
P, khi rt c th   O

P mc d khng tn ti ng i t " ti .

Nhng thut ton tm ng i ngn nht bc l rt r u, nhc im trong


tng trng hp c th (V d nh s nh ca th qu ln lm cho khng th
biu din bng ma trn trng s th thut ton Floyd s gp kh khn, hay thut
ton Ford-Bellman lm vic kh chm). V vy cn phi hiu bn cht v thnh
tho trong vic ci t tt c cc thut ton trn c th s dng chng mt
cch uyn chuyn trong tng bi ton thc t.

144

Bi tp

2.1. Cho th c hng A a8  khng c chu trnh m, hy tm thut ton


$a tnh tt c cc @ o5 6@8 9
2.2. Cho th c hng A a8  gm  nh v  cung, hy tm thut ton
$ xc nh th c chu trnh m hay khng v ch ra mt chu
trnh m nu c.
Gi : Thc hin thut ton Bellman-Ford (ti a  C ln qut danh sch
cnh v thc hin php co), sau ta qut li danh sch cnh xem c th
thc hin c php co no na hay khng. Nu cn c th co theo cnh
@8  no , ta kt lun th c chu trnh m v thc hin php co ny,
sau ln ngc vt ng i t nh , nu qu trnh ln vt i lp li
mt nh no , ta c mt chu trnh bt u v kt thc nh .

2.3. H rng buc: Cho


buc c dng:

(8 +8 8 .

l cc bin s, cho  rng buc, mi rng

N 2 8 g2 5 h

(8 +8 8 .

Vn t ra l hy tm cch gn gi tr cho cc bin


mn tt c cc rng buc cho.

tha

Gi : C nhiu v d v h rng buc trn thc t, chng hn mt cng


trnh xy dng c  cng on. V l do k thut, mt cng on khng
c bt u mun hn 2 thi gian so vi cng on

c th vit di dng
on

2.

N 2 . Mt dng rng buc khc l cng

phi bt u sau khi cng on

bt u c t nht 2 thi
C

Coi mi bin l mt nh ca th, mi rng buc

gian, rng buc ny cng c th vit di dng

Rng buc ny

N C2 .

w 2 hay
C

N 2 cho

tng ng vi mt cnh g 2 8 h c trng s 2 . Khi nu th c chu


trnh m th khng tn ti gii php. Tht vy, gi s tn ti chu trnh m,
khng gim tnh tng qut, gi s chu trnh m l F
( 8 + 8 8 I 8 ( , ta c
+

145

N (+

+
I

N +

N I (

Tng v tri ca cc bt ng thc trn bng 0 v tng v phi chnh l


trng s ca chu trnh (m), bt ng thc 7 N l O 7 khng th c
tha mn.

Nu th khng c chu trnh m, ta thm vo mt nh " v cc cung ni


trng s 0 t " ti mi nh khc. Dng thut ton Bellman-Ford tm
ng i ngn nht t ", khi cc nhn  2  "8 2  chnh l mt
cch gn gi tr tha mn tt c cc rng buc. Hn na cch ny cn lm
khong gi tr gn cho cc bin l hp nht:
n 6 2 9 C o G o

(2.

(.

2.4. (Ci tin ca Yen cho thut ton Bellman-Ford) Vi th c hng


A a8  gm  nh, ta nh s cc nh t 1 ti , chia tp cnh  lm
hai tp con: ( gm cc cung ni t nh c ch s nh ti nh c ch s
ln v + gm cc cung ni t nh c ch s ln ti nh c ch s nh.
t A( a8 (  v A+ a8 + , hai th ny l th c hng khng
c chu trnh c biu din bng danh sch k.
Thut ton Bellman-Ford sau c thc hin nh sau:
Init;
repeat
Stop := True;
for u := 1 to n - 1 do
for Lv: (u, v)5 E1 do
if Relax(u, v) then Stop := False;
for u := n downto 2 do
for Lv: (u, v)5 E2 do
if Relax(u, v) then Stop := False;
until Stop;

Bn trong vng lp repeatuntil l hai pha ti u nhn: pha th nht xt


cc nh theo th t tng dn cn pha th hai xt cc nh theo th t gim
dn ca ch s. Mi khi mt nh c xt v thc hin php co theo tt c
146

cc cung i ra khi @, mi pha thc hin tng t nh thut ton tm


ng i ngn nht trn th khng c chu trnh.
Ch ra rng vng lp repeatuntil trong ci tin ca Yen lp khng qu
U; ln. Ci t thut ton v so snh vi cch ci t chun ca thut
ton Bellman-Ford.
2.5. Arbitrage l mt cch s dng s bt hp l trong hi oi tin t kim
li. V d nu 1$ mua c 0.7, 1 mua c 190, 1 mua c 0.009$
th t 1$, ta c th i sang 0.7, sau sang 0.7x190=133, ri i li
sang 133x0.009=1.197$. Kim c 0.197$ li.
Gi s rng c  loi tin t nh s t 1 ti . Bng D !2

.Y.

cho bit

t l hi oi: mt n v tin  i c !2 n v tin b. Hy tm thut


ton xc nh xem c th kim li t bng t gi hi oi ny bng
phng php arbitrage hay khng? Nu c th s dng arbitrage, hy ch
ra mt cch kim li.
2.6. (Thut ton Karp tm chu trnh c trung bnh trng s nh nht) Cho th
c hng A a8  gm  nh, hm trng s M  G . Ta nh ngha
trung bnh trng s ca mt chu trnh F gm cc cnh ( 8 + 8 8 I l:
I


F 2 

2<(

o6F9

Khi chu trnh F c F gi l chu trnh c trung bnh trng s


nh nht (minimum mean-weight cycle). Chu trnh c trung bnh trng s
nh nht c nhiu ngha trong cc thut ton tm lung vi chi ph cc
tiu.

147

Khng gim tnh tng qut, gi s mi nh  5 a u n c t mt


nh " 5 a (Ta c th thm mt nh gi " v cung trng s 0 ni t " ti
mi nh khc, " khng nm trn chu trnh n no nn khng nh hng
ti tnh ng n ca thut ton). t  l di ng i ngn nht t
" ti . t I  l di ng i ngn nht trong s cc ng i t "

ti  qua ng  cnh (ta c th thm vo cc cung trng s ln vi


mi cp nh @8  lun tn ti cung @8  v 8 @, vic tm chu trnh
trung bnh trng s nh nht khng b nh hng bi nhng cung thm
vo v I  lun l gi tr hu hn).
a) Chng minh rng nu 7, th A khng c chu trnh m v:


o 6I 9 8 L 5 a

4I.3(

b) Chng minh rng nu 7 th

.  C I 
w 7 8 L 5 a
4I.3(
C
(Gi : S dng kt qu cu a)
n

c) Gi F l mt chu trnh trng s 0, @8  l hai nh nm trn F, gi s


7 v l di ng i t @ ti  dc theo chu trnh F. Chng
minh rng
 @ 

d) Chng minh rng nu 7 th trn mi chu trnh trng s 0 s tn ti


mt nh  sao cho:
.  C I 
7
4I.3(
C
n

e) Chng minh rng nu 7 th

.  C I 
7
4I.3(
C

o n
5

f) Ch ra rng nu chng ta cng thm mt hng s vo tt c cc trng


s cnh th tng ln . S dng tnh cht ny chng minh rng
.  C I 
4I.3(
C

o n
5

g) Tm thut ton $a v lp chng trnh tnh v ch ra mt


chu trnh c trung bnh trng s nh nht.

2.7. Trn mt phng cho  ng trn, ng trn th  c cho bi b ba s


thc  2 8 >2 8 !2 ,  2 8 >2  l to tm v !2 l bn knh. Chi ph di chuyn
trn mi ng trn bng 0. Chi ph di chuyn gia hai ng trn bng
148

khong cch gia chng. Hy tm phng n di chuyn gia hai ng


trn "8  cho trc vi chi ph t nht.

2.8. Thut ton Dijkstra c th sai nu th c cnh trng s m, hy ch ra


mt v d.

2.9. Cho th v hng A a8  c  nh v  cnh, cc cnh c trng s


l s nguyn trong phm vi t 0 ti . Hy thay i thut ton Dijkstra
c thut ton $   tm ng i ngn nht xut pht t mt nh
" 5 a.

Gi : rng nu mt nhn   O  th nhn ny phi l s nguyn


nm trong khong 7  C  Y , ng thi nu xt nhn khong cch
ca cc nh ly ra khi hng i u tin th cc nhn khong cch ny
c sp xp theo th t khng gim. Ta t chc hng i u tin di
dng bng bm:  7  C  Y  trong   l cht ca mt danh
sch mc ni cha cc nh  m   . Khi cc php chn, cp
nht trn hng i u tin ch mt thi gian $ . Php ly ra mt phn t
trong hng i u tin tnh tng th mt thi gian $.

2.10. Tng t nh Bi tp 2.9 nhng hy tm mt thut ton $g   %&' h

Gi : rng ti mi bc ca thut ton Dijkstra, c ti a   ; gi


tr khc nhau ca cc nhn   trong hng i u tin. Mi gi tr s
cho tng ng vi mt danh sch mc cc nt  m   , cc cht
ca danh sch mc ni c lu tr trong mt Binary Heap, khi cc
php y vo, ly ra, co nhn khong cch c thc hin trong thi gian
$%&' .

2.11. (Thut ton Gabow) Xt th A a8  c cc trng s cnh l s t


nhin: M  G . Gi s rng t nh xut pht " c ng i ti mi nh
khc. Gi  l trng s ln nht ca cc cnh trong . Gi c %' 
, khi trng s mi cnh c th c biu din bng mt dy c bit.
Vi mi cnh  5  mang trng s , ta k hiu 2  l s to thnh
bng  bit u tin ca , tc l:
2   p ;32 8 L 8;8 8 cE

149

V d c \ v  7 7 + . Ta c:

(  7+ 7
+  7 +

  7 7+ ;
  7 7 + \
  7 7 +

nh ngha 2 "8  l di ng i ngn nht t " ti  trn th A


vi hm trng s 2 . R rng    nn "8  "8  vi
L 5 a.

a) Gi s rng "8  N  vi mi nh  c ng i t ", tm thut


ton $ xc nh tt c cc "8 . (Gi : S dng hng i u
tin nh trong Error! Reference source not found.).

b) Chng minh rng cc ( "8  c th tnh c trong thi gian $.


(Gi : Ch rng cc trng s (  5 678 9).

c) Ch ra rng vi mi  ;8V8 8 c : 2  ;E 23(  hoc 2 


;E 23(   E T chng minh rng:
;E 23( "8  N 2 "8  O ;E 23( "8   a

(Gi : di ng i ngn nht t " ti  s nhn i nu ta nhn i


cc trng s cnh)
d) Vi mi cnh  @8  5 , nh ngha:


2  
2 @8  2 @8   ;E 23( "8 @ C ;E 23( "8 

Chng minh rng vi mi ng i M @ , ta c:


2  2   ;E 23( "8 @ C ;E 23( "8 

e) nh ngha 2 "8  l di ng i ngn nht t " ti  trn th A


vi hm trng s 
2 . Chng minh rng vi  ;8V8 8 c v L 5 a:
2 "8  2 "8  C ;E 23( "8  N 

f) Tm thut ton tnh cc 2 "8  t cc 23( "8  trong thi gian $.
T chng minh rng c th tm ng i ngn nht trn th A trong
thi gian $E c $ %' .
150

2.12. Cho mt bng cc s t nhin kch thc  Y . T mt c th di


chuyn sang mt k cnh vi n. Hy tm mt cch i t  8 > ra mt
bin sao cho tng cc s ghi trn cc i qua l nh nht.
2.13. Cho mt dy s nguyn  
( 8
+ 8 8
. . Hy tm mt dy con gm
nhiu nht cc phn t ca dy cho m tng ca hai phn t lin tip l
s nguyn t.

2.14. Mt cng trnh ln c chia lm  cng on. Cng on  phi thc


hin mt thi gian 2 . Quan h gia cc cng on c cho bi bng

2 .Y. trong
2 nu cng on b ch c bt u khi m
cng on  hon thnh v
2 7 trong trng hp ngc li. Mi
cng on khi bt u cn thc hin lin tc cho ti khi hon thnh, hai
cng on c lp nhau c th tin hnh song song, hy b tr lch thc
hin cc cng on sao cho thi gian hon thnh c cng trnh l sm nht,
cho bit thi gian sm nht .

Gi : Dng th c hng A a8 , mi nh tng ng vi mt


cng on, nh @ c cung ni ti nh  nu cng on @ phi hon thnh
trc khi cng on  bt u. Thm vo A mt nh " v cung ni t " ti
tt c cc nh cn li. Gn trng s mi cung @8  ca th bng  .

Nu th c chu trnh, khng th c cch xp lch, nu th khng c


chu trnh (DAG) tm ng i di nht xut pht t " ti tt c cc nh
ca th, khi nhn khong cch   chnh l thi im hon thnh
cng on , ta ch cn xp lch cng on  c bt u vo thi
im   C  l xong.

2.15. Cho th A a8 , cc cnh c gn trng s khng m. Tm thut


ton v vit chng trnh tm mt chu trnh c di ngn nht trn A.

2. Cy khung nh nht

Cho A a8 8  l th v hng lin thng c trng s. Vi mt cy khung


 ca A, ta gi trng s ca cy , k hiu , l tng trng s cc cnh trong
. Bi ton t ra l trong s cc cy khung ca A, ch ra cy khung c trng s
nh nht, cy khung nh vy c gi l cy khung nh nht (minimum
151

spanning tree) ca th. Sau y ta s xt hai thut ton thng dng gii bi
ton cy khung nh nht ca n th v hng c trng s, c hai thut ton
ny u l thut ton tham lam.

2.1. Phng php chung

Xt th v hng lin thng c trng s A a8 8 . C hai thut ton


tm cy khung ngn nht u da trn mt cch lm chung: N dn cy khung.
Cch lm ny c m t nh sau: Thut ton qun l mt tp cc cnh  
v c gng duy tr tnh cht sau (tnh bt bin vng lp):
lun nm trong tp cnh ca mt cy khung nh nht.

Ti mi bc lp, thut ton tm mt cnh @8  thm vo tp  sao cho tnh


bt bin vng lp c duy tr, tc l  @8  phi nm trong tp cnh ca
mt cy khung nh nht. Ta ni nhng cnh @8  nh vy l an ton (safe) i
vi tp .
procedure FindMST; //Tm cy khung ngn nht
begin
A := ;
while A cha phi cy khung do
begin
Tm cnh an ton (u, v) i vi A;
A := A {(u, v)}; //B sung (u, v) vo A
end;
end;

Vn cn li l tm mt thut ton hiu qu tm cnh an ton i vi tp .


Chng ta cn mt s khi nim gii thch tnh ng n ca nhng thut ton
sau ny.

Mt lt ct (cut) trn th l mt cch phn hoch tp nh a thnh hai tp ri


nhau 8 : a . Ta ni mt lt ct a tng thch vi
tp  nu khng c cnh no ca  ni gia mt nh thuc v mt nh thuc
. Trong nhng cnh ni vi , ta gi nhng cnh c trng s nh nht l
nhng cnh nh (light edge) ca lt ct a .

152

5
1
1
2

Lt ct

Hnh 2.3. Lt ct v cnh nh

nh l 2-1

Cho th v hng lin thng c trng s A a8 8 . Gi  l mt tp con


ca tp cnh ca mt cy khung nh nht v a l mt lt ct tng
thch vi . Khi mi cnh nh ca lt ct a u l cnh an ton i
vi .
Chng minh

Gi @8  l mt cnh nh ca lt ct a , gi  l cy khung nh nht


cha tt c cc cnh ca . Nu  cha cnh @8 , ta c iu phi chng minh.
Nu  khng cha cnh @8 , ta thm cnh @8  vo  s c mt chu trnh,
trn chu trnh ny c nh thuc v cng c nh thuc , v vy s phi c t
nht hai cnh trn chu trnh ni vi . Ngoi cnh @8  ni vi , ta gi
@8  l mt cnh khc ni vi trn chu trnh, theo gi thit @8  l cnh
nh nn @8  N @8 . Ngoi ra do lt ct a tng thch vi  nn
@8  .

Ct b cnh @8  khi cy , cy s b tch ri lm hai thnh phn lin thng,


sau thm cnh @8  vo cy ni li hai thnh phn lin thng c cy
. Ta c
  C @8   @8 
N 

H qu

Do  l cy khung nh nht,  cng phi l cy khung nh nht. Ngoi ra cy 


cha cnh @8  v tt c cc cnh ca . Ta c iu phi chng minh.

Cho th v hng lin thng c trng s A a8 8 . Gi  l mt tp con


ca tp cnh ca mt cy khung nh nht. Gi F l tp cc nh ca mt thnh
phn lin thng trn th A a8 . Khi nu @8  5  l cnh trng s
153

nh nht ni t F ti mt thnh phn lin thng khc th @8  l cnh an ton


i vi .
Chng minh

Xt lt ct a F a C F, lt ct ny tng thch vi  v cnh @8  l cnh

nh ca lt ct ny. Theo nh

l 3-17, @8  an ton i vi .

Chng ta s trnh by hai thut ton tm cy khung nh nht trn n th v


hng v ci t chng trnh vi khun dng Input/Output nh sau:
Input



Dng 1 cha s nh  N 777 v s cnh  ca th


 dng tip theo, mi dng cha ch s hai nh u mt v trng s ca
mt cnh. Trng s cnh l s nguyn c gi tr tuyt i khng qu 1000.

Output
Cy khung nh nht ca th
Sample Input

Sample Output

6 8

Minimum Spanning Tree:

1 2 3

(5, 6) = 1

1 3 3

(4, 5) = 2

2 4 3

(1, 2) = 3

2 5 3

(2, 5) = 3

3 5 4

(1, 3) = 3

4 5 2

Weight = 12

2
3

6
1

4 6 2
5 6 1

2.2. Thut ton Kruskal


Thut ton Kruskal [27] da trn m hnh xy dng cy khung bng thut ton
hp nht, ch c iu thut ton khng phi xt cc cnh vi th t tu m xt
cc cnh theo th t sp xp: tm cy khung ngn nht ca th A
a8 8 , thut ton khi to cy  ban u khng c cnh no. Duyt danh sch
cnh ca th t cnh c trng s nh n cnh c trng s ln, mi khi xt ti
mt cnh v vic thm cnh vo  khng to thnh chu trnh n trong  th
kt np thm cnh vo  C lm nh vy cho ti khi:
154

Hoc kt np c a C cnh vo trong  th ta c  l cy khung


nh nht
Hoc khi duyt ht danh sch cnh m vn cha kt np a C cnh.
Trong trng hp ny th A l khng lin thng, vic tm kim cy
khung tht bi.

Nh vy cn lm r hai thao tc sau khi ci t thut ton Kruskal:




Lm th no xt c cc cnh t cnh c trng s nh ti cnh c trng


s ln.
Lm th no kim tra xem vic thm mt cnh c to thnh chu trnh n
trong T hay khng.

a) Duy;
Duy;t danh sch c9
c9nh
V cc cnh ca th phi c xt t cnh c trng s nh ti cnh c trng
s ln. Ta c th thc hin mt thut ton sp xp danh sch cnh ri sau
duyt li danh sch sp xp. Tuy nhin khi ci t c th, ta c th kho lo
lng thut ton Kruskal vo QuickSort hoc HeapSort t hiu qu cao hn.
Chng hn vi QuickSort, tng l sau khi phn on danh sch cnh bng
mt cnh cht B, ta c ba phn on: on u gm cc cnh c trng s
N B , tip theo l cnh B , on sau gm cc cnh c trng s
w B. Ta gi quy sp xp v x l cc cnh thuc on u, tip
theo x l cnh B, cui cng li gi quy sp xp v x l cc cnh
thuc on sau. D thy rng th t x l cc cnh nh vy ng theo th t
tng dn ca trng s. Ngoi ra khi thy c  C cnh c kt np vo
cy khung, ta c th ngng ngay QuickSort m khng cn x l tip na.
b) K*t n9
n9p c9
c9nh v h0
h0p cy

Trong qu trnh xy dng cy khung, cc cnh trong  cc bc s to thnh


mt rng ( th khng c chu trnh n), mi thnh phn lin thng ca rng
ny l mt cy khung. Mun thm mt cnh @8  vo  m khng to thnh
chu trnh n th @8  phi ni hai cy khc nhau ca rng . iu ny lm
chng ta ngh n cu trc d liu biu din cc tp ri nhau: Ban u ta khi
to  tp k( 8 k+ 8 8 k. , mi tp cha ng mt nh ca th. Khi xt ti cnh
155

@8 , nu @ v  thuc hai tp khc nhau k 8 k th ta hp nht k 8 k li thnh


mt tp.
Vy c hai thao tc cn phi ci t hiu qu trong thut ton Kruskal: php
kim tra hai nh c thuc hai tp khc nhau hay khng v php hp nht hai
tp. Mt trong nhng cu trc d liu hiu qu ci t nhng thao tc ny l
rng cc tp ri nhau (disjoint-set forest). Cu trc d liu ny c ci t nh
sau:

Mi tp k E  c biu din bi mt cy, trong mi nh trong tp tng ng


vi mt nt trn cy. Cy c biu din bi mng con tr ti nt cha: 
0  l
nt cha ca nt . Trong trng hp  l nt gc ca cy, ta t:

0  z Chng ca cy

Hng (rank) ca mt cy l mt s nguyn khng nh hn cao ca cy. Ban


u mi tp k E  ch gm mt nh, nn h cc tp k( 8 k+ 8 8 k. c khi to
vi cc nhn 
0  z 7, L 5 a tng ng vi mt rng gm  cy cao 0.
xc nh hai nh @8  c thuc 2 tp khc nhau hay khng, ta ch cn xc
nh xem gc ca cy cha @ v gc ca cy cha  c khc nhau hay khng.
Vic xc nh gc ca cy cha @ c thc hin bi hm ?k@: i t @
ln nt cha, n khi gp nt gc (nt ! c 
0 ! N 7) th dng li. i km vi
hm ?k@ l php nn ng (path compression): Dc trn ng i t @
ti nt gc !, i qua nh no ta cho lun nh lm con ca !:
function FindSet(u: Integer): Integer;

//Xc nh gc cy cha nh u

begin
if lab[u] <= 0 then Result := u
//u l gc ca mt tp S[.] no , tr v chnh u

else //u khng phi gc


begin
Result := FindSet(lab[u]); //Gi quy tm gc
lab[u] := Result; //Nn ng, cho u lm con ca nt gc lun
end;
end;

156

Vic hp nht hai tp tc l xy dng cy mi cha tt c cc phn t trong hai


cy ban u. Gi s ! v " l gc ca hai cy tng ng vi hai tp cn hp
nht. Khi :

Nu cy gc ! c hng cao hn cy gc ", ta cho " lm con ca !, hng ca


cy gc ! khng thay i, tng t cho trng hp cy gc ! thp hn cy
gc ".
Nu hai cy ban u c cng hng, ta cho cy gc ! lm con ca gc " khi
cy gc " c th s b tng cao, do vy hp l ha ta tng hng ca
" ln 1, tng ng vi vic gim 
0 " i 1.

procedure Union(r, s: Integer); //Hp nht hai tp r v s


begin
if lab[r] < lab[s] then //hng ca r ln hn
lab[s] := r //cho s lm con ca r
else
begin
if lab[r] = lab[s] then Dec(lab[s]);
//Nu hai tp bng hng, tng hng ca s

lab[r] := s; //Cho r lm con ca s


end;
end;

Hnh 2.4 m t hai cy biu din hai tp ri nhau, sau khi xt ti mt cnh @8 
ni gia hai tp, hai cy c hp nht li bng cch cho mt cy lm cy con
ca gc cy kia.
!

"


"


Hnh 2.4. Hai tp ri nhau c hp nht li khi xt ti mt cnh ni mt nh ca tp ny vi mt


nh ca tp kia

KRUSKAL.PAS  Thut ton Kruskal


{$MODE OBJFPC}
program MinimumSpanningTree;

157

const
maxN = 1000;
maxM = maxN * (maxN - 1) div 2;
type
TEdge = record //Cu trc cnh
x, y: Integer; //Hai nh u mt
w: Integer; //Trng s
Selected: Boolean; //nh du chn/khng chn vo cy khung
end;
var
lab: array[1..maxN] of Integer; //Nhn ca disjoint set forest
e: array[1..maxM] of TEdge; //Danh sch cnh
n, m, k: Integer;
procedure Enter; //Nhp d liu
var i: Integer;
begin
ReadLn(n, m);
for i := 1 to m do
with e[i] do
begin
ReadLn(x, y, w);
Selected := False; //Cha chn cnh no
end;
for i := 1 to n do lab[i] := 0;
//Khi to n tp ri nhau hng ca mi tp bng 0

k := 0; //Bin m s cnh c kt np vo cy khung


end;
function FindSet(u: Integer): Integer; //Xc nh tp cha nh u
begin
if lab[u] <= 0 then Result := u //u l gc ca mt tp S[.] no
else //u khng phi gc
begin
Result := FindSet(lab[u]); //Gi quy tm gc
lab[u] := Result; //Nn ng
end;
end;
procedure Union(r, s: Integer); //Hp nht hai tp r v s
begin
158

if lab[r] < lab[s] then //hng ca r ln hn


lab[s] := r //cho s lm con ca r
else
begin
if lab[r] = lab[s] then Dec(lab[s]);
//Nu hai tp bng hng, tng hng ca s

lab[r] := s; //Cho r lm con ca s


end;
end;
procedure ProcessEdge(var e: TEdge); //X l mt cnh e
var r, s: Integer;
begin
with e do
begin
r := FindSet(x);
s := FindSet(y); //Xc nh 2 tp tng ng vi 2 u mt
if r <> s then //Hai u mt thuc hai tp khc nhau
begin
Selected := True; //Cnh e s c chn vo cy khung nh nht
Inc(k); //Tng bin m s cnh c kt np
Union(r, s); //Hp nht hai tp thnh mt
end;
end;
end;
procedure QuickSort(L, H: Integer); //X l danh sch cnh e[L...H]
var
i, j: Integer;
pivot: TEdge;
begin
//Nu cy c k cnh hoc danh sch cnh rng th thot lun

if (L > H) or (k = n - 1) then Exit;


//Ch L > H, khng phi L H nh trong QuickSort

i := L + Random(H - L + 1);
pivot := e[i];
e[i] := e[L];
i := L;
j := H;
repeat
159

while (e[j].w > pivot.w) and (i < j) do Dec(j);


if i < j then
begin
e[i] := e[j];
Inc(i);
end
else Break;
while (e[i].w < pivot.w) and (i < j) do Inc(i);
if i < j then
begin
e[j] := e[i];
Dec(j);
end
else Break;
until i = j;
QuickSort(L, i - 1);
//Cc cnh e[L...i 1] c trng s Pivot.w, gi quy x l trc

e[i] := Pivot;
if k < n - 1 then ProcessEdge(e[i]); //X l tip cnh e[i] = Pivot
QuickSort(i + 1, H);
//Cc cnh e[i + 1...H] c trng s Pivot.w, gi quy x l sau

end;
procedure PrintResult;
var
i, Weight: Integer;
begin
if k < n - 1 then //Khng kt np n 1 cnh, th khng lin thng
WriteLn('Graph is not connected!')
else //In ra cy khung nh nht
begin
WriteLn('Minimum Spanning Tree:');
Weight := 0;
for i := 1 to m do
with e[i] do
if Selected then //In ra cch cnh c nh du chn
begin
WriteLn('(', x, ', ', y, ') = ', w);
Inc(Weight, w);
160

end;
WriteLn('Weight = ', Weight);
end;
end;
begin
Enter;
QuickSort(1, m); //Lng thut ton Kruskal vo QuickSort
PrintResult;
end.

Tnh ng n ca thut ton Kruskal c suy ra t nh l 3-17: rng


cc cnh c kt np vo cy khung sau mi bc s to thnh mt rng (
th khng c chu trnh n). Mi khi cnh @8  c xt n, n s ch c
kt np vo cy khung nu nh @ v  thuc hai cy (hai thnh phn lin thng)
 8  khc nhau. K hiu  l tp cnh ca  , khi lt ct a  a C  
l tng thch vi tp , @8  l cnh nh ca lt ct nn @8  cng phi l
mt cnh trn mt cy khung nh nht.
c) ThU
ThUi gian thL
thLc hi;
hi;n gi
gii thu
thu t

Vi hai s t nhin 8 , hm Ackermann 8  c nh ngha nh sau:


  8 nu  7

8   C 8 8 nu  1 7 v  7
g C 8 8  C h8 nu  1 7 v  1 7

Di y l bng mt s gi tr hm Ackermann:

161

:

:

11

13

29

61

125

13

65533

; C V

;+

CV

;+

CV

Hm 8  l mt hm tng rt nhanh theo i s . C th chng minh c


78   
 8    ;
;8  ;  V
V8  ;.K C V
X8 

+
;
,

.K ly tha

CV

Chng hn X8; l mt s c 19729 ch s, X8X l mt s m s ch s ca


n ln hn c s nguyn t trong phn v tr m con ngi bit n.

Khi  1 7, xt hm 8 , gi l nghch o ca hm Ackerman, nh ngha


nh sau:

8  o  w M  f8 i w %' 

Ngi ta chng minh c rng vi cu trc d liu rng cc tp ri nhau,

vic thc hin  thao tc ?k v  mt thi gian $g8 h. y
8  l mt hng s rt nh (trn tt c cc d liu thc th, khng bao gi
8  vt qu 4). iu ch ra rng ngoi tr vic sp xp danh sch cnh,
thut ton Kruskal trn c thi gian thc hin $g8 ah.
Tuy nhin nu phi thc hin sp xp danh sch cnh, chng ta cn cng thm
thi gian thc hin gii thut sp xp $ %' na.
162

2.3. Thut ton Prim


a) TF tFB
tFBng c<
c<a thu
thu t ton
Trong trng hp th dy (c nhiu cnh), c mt thut ton hiu qu hn
tm cy khung ngn nht l thut ton Prim [32]. Vi mt cy khung  v mt
nh  , ta gi khong cch t  ti , k hiu  , l trng s nh nht ca
mt cnh ni  vi mt nh nm trong :
  o6@8 9
5

T tng ca thut ton c th trnh by nh sau: Ban u khi to mt cy 


ch gm 1 nh bt k ca th, sau ta c tm nh gn  nht (c khong
cch ti  ngn nht) kt np vo  v kt np lun cnh to ra khong cch gn
nht , c lm nh vy cho ti khi:



Hoc kt np  nh vo , ta c mt cy khung ngn nht.


Hoc cha kt np  nh nhng khng cn cnh no ni mt nh trong
 vi mt nh ngoi . Ta kt lun th khng lin thng v khng th
tn ti cy khung.

b) K` thu
thu t ci ":
" :t

Khi ci t thut ton Prim, ta s dng cc nhn khong cch   lu


khong cch t  ti  ti mi bc. Mi khi cy  b sung thm mt nh @, ta
tnh li cc nhn khong cch theo cng thc sau:
 mi z o 6 c 8 @8 9

Tnh ng n ca cng thc c th hnh dung nh sau:   l khong cch t


 ti cy , theo nh ngha l trng s nh nht trong s cc cnh ni  vi mt
nh nm trong . Khi cy  n ra thm nh @ na m nh @ ny li gn 
hn tt c cc nh khc trong , ta ghi nhn khong cch mi   l trng s
cnh @8 , nu khng ta vn gi khong cch c.

163

 c
@

@8 

Hnh 2.5. C ch cp nht nhn khong cch

Ti mi bc, nh ngoi cy c nhn khong cch nh nht s c kt np vo


cy, sau cc nhn khong cch c cp nht v lp li. M hnh ci t ca
thut ton c th vit nh sau:
u := Mt nh bt k;
T := {u};
for Lv T do d[v] := +;

//Cc nh ngoi T c khi to nhn khong cch +


for i := 1 to n - 1 do //Lm n 1 ln

begin
for (Lv T:(u, v) 5 E) do
d[v] := min{d[v], w(u, v)};
//Cp nht nhn khong cch ca cc nh k u nm ngoi T

u := arg min{d[v]:v T};


//Chn u l nh c nhn khong cch nh nht trong s cc nh nm ngoi T

if d[u] = + then // th khng lin thng


begin
Output "Khng tn ti cy khung";
Break;
end;
T := T {u}; //B sung u vo T
end;
Output T;

Ci t di y s dng ma trn trng s biu din th. K thut nh


du c s dng bit mt nh  ang nm ngoi (@"  !@) hay
nm trong cy  (@"  ?
"). Ngoi ra tin li hn trong vic ch
ra cy khung nh nht, vi mi nh  nm ngoi  ta lu li !
l  l nh @
nm trong  m cnh @8  to ra khong cch gn nht t  ti : @8 
164

  . Khi thut ton kt thc, cc cnh trong cy khung l nhng cnh


!
l 8 .


PRIM.PAS  Thut ton Prim

{$MODE OBJFPC}
program MinimumSpanningTree;
const
maxN = 1000;
maxW = 1000;
var
w: array[1..maxN, 1..maxN] of Integer; //Ma trn trng s
d: array[1..maxN] of Integer; //Cc nhn khong cch
outside: array[1..maxN] of Boolean; //nh du cc nh ngoi cy
trace: array[1..maxN] of Integer; //Vt
n: Integer;
procedure Enter;
var
i, m, u, v: Integer;
begin
ReadLn(n, m);
for u := 1 to n do
for v := 1 to n do w[u, v] := maxW + 1;
//Khi to ma trn trng s vi cc phn t +

for i := 1 to m do
begin
ReadLn(u, v, w[u, v]);
//Ch : n th mi c th c d liu th ny

w[v, u] := w[u, v]; // th v hng


end;
end;
function Prim: Boolean; //Thut ton Prim, tr v True nu tm c cy khung
var
u, v, dmin, i: Integer;
begin
u := 1; //Cy ban u ch gm nh 1
for v := 2 to n do d[v] := maxW + 1;
//Nhn khong cch cho cc nh ngoi cy khi to bng +

FillChar(outside[2],
165

(n - 1) * SizeOf(outside[2]),
True); //nh du cc nh 2...n nm ngoi cy
outside[1] := False; //nh 1 nm trong cy
for i := 1 to n - 1 do //Lm n 1 ln
begin
//Trc ht tnh li cc nhn khong cch

for v := 1 to n do
if outside[v] and (d[v] > w[u, v]) then
//Cnh (u, v) to khong cch ngn hn khong cch c

begin
d[v] := w[u, v]; //Cp nht nhn khong cch
trace[v] := u; //Lu vt
end;
//Tm nh u ngoi cy c nhn khong cch nh nht

dmin := maxW + 1;
u := 0;
for v := 1 to n do
if outside[v] and (d[v] < dmin) then
begin
dmin := d[v];
u := v;
end;
if u = 0 then Exit(False);
//Cy khng c cnh no ni ra ngoi, th khng lin thng, thot

outside[u] := False; //Kt np u vo cy


end;
Result := True;
end;
procedure PrintResult; //In kt qu trong trng hp tm ra cy khung nh nht
var
v, Weight: Integer;
begin
WriteLn('Minimum Spanning Tree:');
Weight := 0;
for v := 2 to n do
begin
WriteLn('(', trace[v], ', ', v, ') = ',
w[trace[v], v]);
Inc(Weight, w[trace[v], v]);
166

end;
WriteLn('Weight = ', Weight);
end;
begin
Enter;
if Prim then PrintResult
else WriteLn('Graph is not connected!');
end.

Tnh ng n ca thut ton Prim cng d dng suy ra c t nh l 3-17:


Gi  l tp cnh ca cy  ti mi bc, xt lt ct tch tp nh a lm 2 tp
ri nhau, mt tp gm cc nh 5  v tp cn li gm cc nh . nh 
c kt np vo cy  ti mi bc tng ng vi cnh !
l 8  l cnh
nh ca lt ct nn n l an ton vi tp , vic b sung cnh ny vo  vn m
bo  l tp con ca tp cnh mt cy khung ngn nht.

c) ThU
ThUi gian thL
thLc hi;
hi;n gi
gii thu
thu t

Chng trnh ci t thut ton Prim trn c thi gian thc hin + , hiu
qu hn thut ton Kruskal trong trng hp th dy nhng li km hn nu
th tha. Trong trng hp th tha, ta c th ci tin m hnh ci t thut
ton Prim bng cch kt hp vi mt hng i u tin cha cc nh ngoi cy
c nhn khong cch O . Hng i u tin cn h tr cc thao tc sau:


 !
lM Ly ra mt nh u tin nht (nh @ c  @ nh nht) khi hng
i u tin.

: Thao tc ny bo cho hng i u tin bit rng nhn  
b gim i, cn t chc li (thm  vo hng i u tin nu  ang nm
ngoi).

Khi thut ton Prim c th vit theo m hnh mi:


T := {Mt nh bt k u};
for Lv T do d[v] := +;

PQ := ; //Hng i u tin c khi to rng


for i := 1 to |V| - 1 do //Lm n 1 ln
begin
for (Lv 5 V:(u, v)5 E) do //Cp nht nhn cc nh ngoi cy k vi u

//Cc nh ngoi T c khi to nhn khong cch +

167

if (v T) and (d[v] > w(u, v)) then


begin
d[v] := w(u, v);
Update(v);
end;
if PQ = then // th khng lin thng
begin
Output "Khng tn ti cy khung";
Break;
end;
u := Extract;
T := T {u}; //B sung u vo T
end;

//Chn u l nh c nhn khong cch nh nht trong s cc nh nm ngoi T

Thi gian thc hin gii thut c th c lng theo s li gi 


 v
 !
l. Tng t nh thut ton Dijkstra, c th thy rng chng ta cn s
dng khng qu  C li gi  !
l v khng qu  li gi 
 vi  l
s nh v  l s cnh ca th.

Mt s cu trc d liu biu din hng i u tin c th s dng ci thin


tc thut ton Prim trong trng hp th tha. Chng hn nu s dng
Fibonacci Heap lm hng i u tin, thi gian thc hin gii thut l
$a %'a  . Mc d vy cn nhn mnh rng trong cc ng dng thc t
m danh sch cnh c th c sp xp trong thi gian $ (chng hn dng
cc thut ton sp xp c s hoc m phn phi), thut ton Kruskal lun l s
la chn hp l hn c v n c th tm c cy khun trong thi gian
$g8 ah.

Bi tp

2.16. Cho  l cy khung nh nht ca th A v @8  l mt cnh trong .


Chng minh rng nu ta tr trng s cnh @8  i mt s dng th  vn
l cy khung nh nht ca th A.
168

2.17. Cho A l mt th v hng lin thng, F l mt chu trnh trn A v  l


cnh trng s ln nht ca F. Chng minh rng nu ta loi b cnh  khi
th th khng nh hng ti trng s ca cy khung nh nht.
2.18. Chng minh rng th c duy nht mt cy khung nh nht nu vi mi
lt ct ca th, c duy nht mt cnh nh ni hai tp ca lt ct. Cho
mt v d ch ra rng iu ngc li khng ng.
2.19. Gi  l mt cy khung nh nht ca th v hng lin thng A, ta
gim trng s ca mt cnh khng nm trong cy , hy tm mt thut
ton n gin tm cy khung ca th mi.

Gi : Gi cnh b gim trng s l @8 , thm @8  vo  ta s c


ng mt chu trnh n, loi b cnh trng s ln nht trn chu trnh n
ny s c cy khung nh nht ca th mi.

2.20. Gi s rng th v hng lin thng A c cy khung nh nht , ngi


ta thm vo th mt nh mi v mt s cnh lin thuc vi nh .
Tm thut ton xc nh cy khung nh nht ca th mi.

2.21. Gio s X xut mt thut ton tm cy khung ngn nht da trn


tng chia tr: Vi th v hng lin thng A a8 , phn hoch
tp nh a lm hai tp ri nhau a( 8 a+ m lc lng ca hai tp ny hn
km nhau khng qu 1. Gi ( l tp cc cnh ch lin thuc vi cc nh
5 a( v + l tp cc cnh ch lin thuc vi cc nh 5 a+. Tm cy khung
nh nht trn th A( a( 8 (  v A+ a+ 8 +  bng thut ton quy,
sau chn cnh trng s nh nht ni a( vi a+ ni hai cy khung tm
c thnh mt cy. Chng minh tnh ng n ca thut ton hoc ch ra
mt phn v d cho thy thut ton sai.

2.22. (Cy khung nh th nh) Cho A a8 8  l th v hng lin thng


c trng s, gi s rng  w a v cc trng s cnh l hon ton phn
bit ( l n nh). Gi l tp tt c cc cy khung ca A v  l cy
khung nh nht ca A, khi cy khung nh th nh c nh ngha l
cy khung H 5 tha mn:
H o 69
5369

169

Ch ra rng th A c duy nht mt cy khung nh nht l , nhng c th


c nhiu cy khung nh th nh.
Chng minh rng lun tn ti mt cnh @8  5  v  8 >  nu ta
loi b cnh @8  khi  ri thm cnh  8 > vo  th s c cy khung
nh th nh.
Vi L@8  5 a, gi  @8  l cnh mang trng s ln nht trn ng i duy
nht t @ ti  trn cy . Tm thut ton $a+  tnh tt c cc  @8 ,
L@8  5 a.
Tm thut ton hiu qu tm cy khung nh th nh ca th.

2.23. Cho " v  l hai nh ca mt th v hng c trng s A a8 8 .


Tm mt ng i t " ti  tha mn: Trng s cnh ln nht i qua trn
ng i l nh nht c th.

Gi : C rt nhiu cch lm: Kt hp mt thut ton tm kim trn th


vi thut ton tm kim nh phn, hoc sa i thut ton Dijkstra, hoc
s dng thut ton tm cy khung ngn nht.
2.24. (Euclidean Minimum Spanning Tree) Trong trng hp cc nh ca
th y c t trn mt phng trc chun v trng s cnh ni gia
hai nh chnh l khong cch hnh hc gia chng. Ngi ta c mt php
tin x l gim bt s cnh ca th bng thut ton tam gic phn
Delaunay ($ %' ), th sau php tam gic phn Delaunay s cn
khng qu V cnh, do s lm cc thut ton tm cy khung nh nht
hot ng hiu qu hn. Hy t tm hiu v php tam gic phn Delaunay
v ci t chng trnh tm cy khung nh nht.

2.25. Trn mt nn phng vi h to trc chun t  my tnh, my tnh th


 c t to  2 8 >2 . c sn mt s dy cp mng ni gia mt
s cp my tnh. Cho php ni thm cc dy cp mng ni gia tng cp
my tnh. Chi ph ni mt dy cp mng t l thun vi khong cch gia
hai my cn ni. Hy tm cch ni thm cc dy cp mng cho cc my
tnh trong ton mng l lin thng v chi ph ni mng l nh nht.
2.26. H thng in trong thnh ph c cho bi  trm bin th v cc ng
dy in ni gia cc cp trm bin th. Mi ng dy in  c an
ton l  5 78 . an ton ca c li in l tch an ton trn cc
170

ng dy. Hy tm cch b i mt s dy in cho cc trm bin th


vn lin thng v an ton ca mng l ln nht c th.
Gi : Bng k thut ly logarithm, an ton trn li in tr thnh
tng an ton trn cc ng dy.

3. Lung cc i trn mng


3.1. Cc khi nim v bi ton
a) M9ng

Mng (flow network) l mt b nm A a8 8 l8 "8 , trong :

a v  ln lt l tp nh v tp cung ca mt th c hng khng c


khuyn (cung ni t mt nh n chnh n).
" v  l hai nh phn bit thuc a, " gi l nh pht (source) v  gi l nh
thu (sink).

l l mt hm xc nh trn tp cung M

lM  78 
 l

gn cho mi cung  5  mt s khng m gi l sc cha (capacity)* l w 7.

Bng cch thm vo mng mt s cung c sc cha 0, ta c th gi thit rng


mi cung  @8  5  lun c tng ng duy nht mt cung ngc chiu, k
hiu  8 @ 5 , gi l cung i ca cung , ta cng coi  l cung i ca

cung C (tc l C . C th thy rng s cung cn thm vo mng l


mt i lng $.
Ch rng mng l mt a th, tc l gia hai nh c th c nhiu cung
ni.
thun tin cho vic trnh by, ta quy c cc k hiu sau:

T ny cn c th dch l kh nng thng qua hay lu lng

171

Vi 8 l hai tp con ca tp nh a v M  G l mt hm xc nh trn tp


cnh :

K hiu 6 G 9 l tp cc cung ni mt t mt nh thuc ti mt nh thuc


:
6 G 9 6 @8  5 M @ 5 8 > 5 9

K hiu 8  l tng cc gi tr hm  trn cc cung  5 6 G 9:


8  

b) Lu^
Lu^ng

5G

Lung (flow) trn mng A l mt hm:

M 
 

gn cho mi cung  mt s thc , gi l lung trn cung , tha mn ba


rng buc sau y:


Rng buc v sc cha (Capacity constraint): Lung trn mi cung khng


c vt qu sc cha ca cung : L 5 M  N l.
Rng buc v tnh i xng lch (Skew symmetry): Vi L 5 , lung trn
cung  v lung trn cung i C c cng gi tr tuyt i nhng tri du
nhau: L 5 M  CC.
Rng buc v tnh bo tn (Flow conservation): Vi mi nh  khng phi
nh pht v cng khng phi nh thu, tng lung trn cc cung i ra khi
 bng 0: L 5 a C 6"8 9M 698 a 7.

T rng buc v tnh i xng lch v tnh bo tn, ta suy ra c: Vi mi nh


 5 a C 6"8 9, tng lung trn cc cung i vo  bng 0: a8 69 7.

Gi tr ca lung  trn mng A c nh ngha bng tng lung trn cc cung


i ra khi nh pht:
 6"98 a

(3.1)

172

Bi ton lung cc i trn mng (maximum-flow problem): Cho mt mng A


vi nh pht " v nh thu , hm sc cha l, hy tm mt lung c gi tr ln
nht trn mng A.
c) Lu^
Lu^ng dF#ng

Lung dng (positive flow) trn mng A l mt hm

M  78 
 
gn cho mi cung  mt s thc khng m  gi l lung dng trn cung 
tha mn hai rng buc sau y:

Rng buc v sc cha (Capacity constraint): Lung dng trn mi cung


khng c vt qu sc cha ca cung : L 5 M 7 N  N l.
Rng buc v tnh bo tn (Flow conservation): Vi mi nh  khng phi
nh pht v cng khng phi nh thu, tng lung dng trn cc cung i
vo  bng tng lung dng trn cc cung i ra khi : L 5 a C 6"8 9:
a8 69 698 a.

Gi tr ca mt lung dng c nh ngha bng tng lung dng trn cc


cung i ra khi nh pht tr i tng lung dng trn cc cung i vo nh
pht*:

6"98 a C a8 6"9


4

2
6

1
3
3

6
5

5
6

(3.2)
4
6

6
0

2
3

1
5

Hnh 2.6. Mng vi cc sc cha trn cung (1 pht, 6 thu) v mt lung dng vi gi tr 7

Mt s ti liu khc a vo thm rng buc: nh pht " khng c cung i vo v nh thu  khng c
cung i ra. Khi gi tr lung dng bng tng lung dng trn cc cung i ra khi nh pht. Cch
hiu ny c th quy v mt trng hp ring ca nh ngha.
*

173

d) M!i quan h;
h; giR
giRa lu^
lu^ng v lu^
lu^ng dF#ng
B 3-1

Cho M  G l mt lung dng trn mng A a8 8 l8 "8 . Khi hm


M 
   C C

l mt lung trn mng A v 


Chng minh

Trc ht ta chng minh  tha mn tt c cc rng buc v lung:

Rng buc v sc cha: Vi L 5 :

  C C


N  N l@8 
4

Rng buc v tnh i xng lch: Vi L 5 

  C C

CgC C h

CC

Rng buc v tnh bo tn: L 5 a, ta c:


698 a

g C Ch

569G

 C

 C

569G
569G

569G

35G69

698 a C a8 69

Nu  d " v  d , ta c:

C
C

698 a 698 a C a8 69 7

(Do tng lung dng i ra khi  bng tng lung dng i vo )


Nu  ", xt gi tr lung 

B 3-2

 6"98 a 6"98 a C a8 6"9

Cho M  G l mt lung trn mng A a8 8 l8 "8 . Khi hm:


174

M  78 

  n68 79

l mt lung dng trn mng v 

8 nu  w 7
78 nu  O 7

Chng minh

Trc ht ta chng minh tha mn cc rng buc v lung dng:

Rng buc v sc cha: L 5  , r rng  l s khng m v 


n68 79 N l.
Rng buc v tnh bo tn: L 5 a, tng lung dng ra khi  tr tng lung
dng i vo  bng:
698 a C 6a8 69

 C

 

569G
4
569G
4

5G69
4



3569G
34

C 698 a

Nu  d " v  d , 698 a 7 nn lung dng i vo  (698 a)) c bo


tn khi i ra khi  (a8 69).
Nu  ", ta c:

6"98 a C a8 6"9 6"98 a 

B 3-1 v B 3-2 cho ta mt mi tng quan gia lung v lung dng.


Khi nim v lung dng d hnh dung hn so vi khi nim lung, tuy nhin
nhng nh ngha v lung tng qut li thch hp hn cho vic trnh by v
chng minh cc thut ton trong bi. Ta s s dng lung dng trong cc
hnh v v output (ch quan tm ti cc gi tr lung dng ), cn cc khi
nim v lung s c dng din gii cc thut ton trong bi.
Trong qu trnh ci t thut ton, cc hm l v  s c xc nh bi tp cc
gi tr 6l 95s v 6 95s nn ta c th dng ln cc k hiu l8  (nu
mun cp ti gi tr hm) hoc l 8   (nu mun cp ti cc bin s).

e) M8t s!
s! tnh ch6
ch6t c# b
b n

Cho mng A a8 8 l8 "8  v mt lung  trn A. Gi l8  l lu lng t


sang v 8  l gi tr lung t sang .

175

nh l 3-3

Cho  l mt lung trn mng A a8 8 l8 "8 , khi :

a) L a, ta c 8  7.

b) L8 a, ta c 8  C8 .

c) L8 8 a v , ta c 8   8  ? 8 .
d) L a C 6"8 9, ta c 8 a 7.
Chng minh

a) L a, ta c:

8 

56G9



nh vy  xut hin trong tng nu v ch nu C cng xut hin trong
tng. Theo tnh i xng lch ca lung:  CC, ta c 8  7.

b) L8 a, ta c :

8 

 C

56G9

c) L8 8 a v , ta c:
 8 

d) L a C 6"8 9, do

356G9

56G9



 

56G9

8

C C8 



56G9

8

6@9

Nn theo chng minh phn c):

8 a 6@98 a
5

Mi hng t ca tng: 6@98 a chnh l tng lung trn cc cung i ra khi nh


@, do tnh bo tn lung v @ khng phi nh pht cng khng phi nh thu,
hng t ny phi bng 0, suy ra 8 a 7. T chng minh phn b), ta cn suy
ra a8  7 na.

176

nh l 3-4
Gi tr lung trn mng bng tng lung trn cc cung i vo nh thu
Chng minh

Gi s  l mt lung trn mng A a8 8 l8 "8 , ta c:

H qu

 6"98 a
a8 a C a C 6"98 a
Ca C 6"98 a
a8 a C 6"9
a8 69  a8 a C 6"8 9
a8 69

Gi tr lung dng trn mng bng tng lung dng i vo nh thu tr tng
lung dng ra khi nh thu.
f) M9ng th:
th:ng dF

Vi  l mt lung trn mng A a8 8 l8 "8 . Ta xt mng A cng l mng A


nhng vi hm sc cha mi cho bi:
l M  78 
 l  l C 

(3.3)

Mng A xy dng nh vy c gi l mng thng d (residual network) ca


mng A sinh ra bi lung . Sc cha ca cung  trn A thc cht l lng

lung ti a chng ta c th y thm vo lung  m khng lm vt qu


sc cha l.

Mt cung trn A gi l cung bo ha (saturated edge) nu lung trn cung


ng bng sc cha, ngc li cung gi l cung thng d (residual edge). K
hiu  l tp cc cung thng d trn mng thng d A . Mt ng i ch qua
cc cung thng d trn A gi l ng thng d (residual path).

Cung bo ha ca mng A trn mng thng d s c sc cha 0, cung ny t c


ngha trong thut ton nn chng ta s ch v cc cung thng d (5  ) trong cc
hnh v.

177

1
2

6:5

5:5

4
6:6

3:1

5
6

3:0

5:2
3

1:1

2
1

6
3

6:1

1
3

Hnh 2.7. Mt lung trn mng (s ghi trn cc cung l: sc cha:lung dng) v mng thng d
tng ng.

Hnh 2.7 l mt v d v mng thng d. Nh quy c, chng ta ch v cc


lung dng. th c cung ;8X vi sc cha l;8X T, tc l phi c cung
i X8; vi lX8; 7. Lung dng trn cung ;8X l ;8X ;8X \,
iu ny cng cho bit lung trn cung X8; l X8; C\ theo tnh i xng
lch. Vy trn mng thng d, ta c cung ;8X vi sc cha l;8X C ;8X
T C \ ng thi c cung X8; vi sc cha lX8; C X8; 7 C C\
\.
nh l 3-5

Cho  l mt lung trn mng A a8 8 l8 "8 . Khi nu  l mt lung trn
A th hm:
   M 
        

l mt lung trn mng A vi gi tr lung      .


Chng minh

Ta chng minh    tha mn ba tnh cht ca lung:


Rng buc v sc cha: Vi L 5 :

     

Tnh i xng lch: Vi L 5 :

N   gl C h

l

     


CC C C
178

CgC  Ch

C  C

Tnh bo tn: Vi L@ 5 a, tng lung    i ra khi @ bng:


   6@98 a

g   h

569G

569G

 

569G

6@98 a   6@98 a

 

Nu @ d " v @ d , ta c    6@98 a 6@98 a   6@98 a 7.


Thay @ ", ta c

nh l 3-6

      6"98 a 6"98 a   6"98 a   

Cho  v  l hai lung trn mng A a8 8 l8 "8  khi hm:


 C M 
  C    C 

l mt lung trn mng thng d A vi gi tr lung  C   C .


Chng minh

Ta chng minh rng  C  tha mn ba tnh cht ca lung

Rng buc v sc cha: Vi L 5 :

 C    C 


N l C 
l 

Tnh i xng lch: Vi L 5 :

 C    C 


Cg C C Ch
C C C

Tnh bo tn: Vi L 5 a

 C 698 a

569G

569G
698


179

g  C h
  C

569G

a C 698 a



Nu @ d " v @ d , ta c  C 698 a  698 a C 698 a 7.

Thay @ ", ta c

 C   C 6"98 a  6"98 a C 6"98 a  C 

3.2. Thut ton Ford-Fulkerson


a) \FU
\FUng t(ng lu^
lu^ng

Vi  l mt lung trn mng A a8 8 l8 "8 . Gi B l mt ng i n t "


ti  trn mng thng d A . Gi tr thng d (residual capacity) ca ng B,

k hiu , c nh ngha bng sc cha nh nht ca cc cung dc trn


ng B (xt trn A ):
ol M  nm trn B

V cc sc cha l  l s khng m nn lun l s khng m. Nu 1 7


tc l ng i B l mt ng thng d, khi ng i B gi l mt ng
tng lung (augmenting path) tng ng vi lung .

nh l 3-7

Cho  l mt lung trn mng A a8 8 l8 "8 , B l mt ng tng lung trn
A . Khi hm  M  G nh ngha nh sau:
 8 nu  5 B
  C 8 nu C  5 B
78 trng hp khc

(3.4)

l mt lung trn A vi gi tr lung  1 7.


Chng minh

Chng ta s khng chng minh c th v vic kim chng  tha mn ba tnh cht
ca lung kh d dng. Bn cht ca lung  l y mt gi tr lung t " ti 

dc theo cc cung trn ng B, ng thi ko mt gi tr lung t  v "


theo hng ngc li*.

C th hnh dung c ch ny nh mt qu trnh in phn: Bao nhiu ion dng (cation) chuyn n cc
m (catot)  th cng phi c by nhiu ion m (anion) chuyn n cc dng (anot) ".

180

nh l 3-5 v nh l 3-7 cho ta mt h qu sau:


H qu 3-8

Cho  l mt lung trn mng A a8 8 l8 "8  v B l mt ng tng lung


trn A , gi  l lung trn A nh ngha nh trong cng thc (3.4). Khi
   l mt lung mi trn A vi gi tr         .
6:5

2
5:5

4
6:6

3:1

6
3:0

5:2

6:1
2

a)

1:1

6:3

5:5

4
6:6

3:3

1
1
5

2
5

5:4

2
1

6
3

1:1

6:3
5

2
b)

6
3:2

1
3

Hnh 2.8. Tng lung dc ng tng lung.

Hnh 2.8 l v d v c ch tng lung trn mng vi nh pht 1, nh thu 6 v


lung  gi tr 7 (hnh a) (ch rng ta ch v cc lung dng cho ri). Vi
mng thng d A (hnh b), gi s ta chn ng i B 8V8X8;8\8T lm ng
tng lung, gi tr thng d ca B bng ; (sc cha ca cung V8X).
Lung  trn A s c cc gi tr sau:
  8V  V8X  X8;  ;8\  \8T ;
 V8   X8V  ;8X  \8;  T8\ C;

Cng cc gi tr ny vo lung  ang c, ta s c mt lung mi trn A vi


gi tr 9 (hnh c).

C ch cng lung  vo lung  hin c gi l tng lung dc theo ng


tng lung B.
181

b) Thu
Thu t ton FordFord-Fulkerson
Thut ton Ford-Fulkerson [14] tm lung cc i trn mng da trn c ch
tng lung dc theo ng tng lung. Bt u t mt lung  bt k trn mng
(chng hn lung trn mi cung u bng 0), thut ton tm ng tng lung B
trn mng thng d, gn  z    tng gi tr lung  v lp li cho ti khi
khng tm c ng tng lung na.
f := Mt lung bt k;
while Tm c ng tng lung P do
f := f + fP;
Output f;

c) Ci ":
": t
Chng ta s ci t thut ton Ford-Fulkerson tm lung cc i trn mng
vi khun dng Input/Output nh sau:
Input


Dng 1 cha s nh  N 7 , s cung  N 7 ca mng, nh pht ",


nh thu .
 dng tip theo, mi dng cha ba s nguyn dng @8 8 l tng ng vi
mt cung ni t @ ti  vi sc cha l N 7 .

Output

Lung cc i trn mng (nh quy c, ch a ra cc lung dng trn cc


cung).

182

Sample Input

Sample Output

6 8 1 6

Maximum flow:

5 6 6

e[1] = (5, 6): c = 6, f = 3

4 6 6

e[2] = (4, 6): c = 6, f = 6

3 5 1

e[3] = (3, 5): c = 1, f = 1

3 4 3

e[4] = (3, 4): c = 3, f = 3

2 5 3

e[5] = (2, 5): c = 3, f = 2

2 4 6

e[6] = (2, 4): c = 6, f = 3

1 3 5

e[7] = (1, 3): c = 5, f = 4

1 2 5

e[8] = (1, 2): c = 5, f = 5


Value of flow: 9
2

6:3

5:5

4
6:6

3:3

6
3:2

5:4
3

1:1

6:3
5

ci t thut ton c hiu qu cn c mt c ch t chc d liu hp l.


Chng ta cn lu tr lung  trn cc cung, tm ng tng lung B trn A v

cng lung  vo lung  hin c. Vic tm ng tng lung B trn A s c


thc hin bng mt thut ton tm kim trn th cn vic tng lung dc trn
ng B i hi phi tng gi tr lung trn cc cung dc trn ng i ng
thi gim gi tr lung trn cc cung i. Vy cu trc d liu cn t chc to
iu kin thun li cho thut ton tm ng tng lung cng nh d dng ch ra
cung i ca mt cung cho trc.

th c biu din bi danh sch lin thuc. Tt c  cung ca mng c


cha trong danh sch  . Ngoi ra ta thm  cung i ca chng vi sc
cha 0. Cc cung i ny c lu tr trong danh sch  C C , cung i
ca cung   l cung  C, cung  7 c s dng vi vai tr phn t cm
canh v khng c tnh n.
Mi phn t ca danh sch  l mt bn ghi gm 4 trng  8 >8 l8  trong ,
> l nh u v nh cui ca cung, l l sc cha v  l lung trn cung. Danh
183

sch lin thuc c xy dng bi hai mng 


  v  C ,
trong :



 @ l ch s cung u tin trong danh sch lin thuc cc cung i ra

khi @, trng hp @ khng c cung i ra, 


 @ c gn bng 0.
  l ch s cung k tip cung   trong cng danh sch lin thuc cc
cung i ra khi mt nh. Trng hp   l cung cui cng ca mt danh
sch lin thuc,   c gn bng 0

Vic duyt cc cung i ra khi nh @ s c thc hin theo cch sau:

i := head[u]; //i l ch s cung u tin trong danh sch lin thuc cc cung ra khi u
while i 0 do //Chng no cha duyt qua cung cui danh sch lin thuc
begin
X l cung e[i];
i := link[i]; //Nhy sang xt cung k tip trong danh sch lin thuc
end;

Ti mi bc, ta dng thut ton BFS tm ng i t " ti  trn A , mi

nh  trn ng i c lu vt !
l  l ch s cung i vo  trn ng i
B tm c. Da vo vt ny, ta s lit k c tt c cc cung trn ng i,
tng lung trn cc cung ny ln ng thi gim lung trn cc cung i i
.
Edmonds v Karp [12] xut m hnh ci t thut ton Ford-Fulkerson
trong thut ton BFS c s dng tm ng tng lung nn ngi ta cn
gi thut ton Ford-Fulkerson vi k thut s dng BFS tm ng tng lung l
thut ton Edmonds-Karp.


EDMONDSKARP.PAS  Thut ton Edmonds-Karp


{$MODE OBJFPC}
program MaximumFlow;
const
maxN = 1000;
maxM = 100000;
maxC = 10000;
type
TEdge = record //Cu trc mt cung
x, y: Integer; //Hai nh u mt
184

c, f: Integer; //Sc cha v lung


end;
TQueue = record //Hng i dng cho BFS
items: array[1..maxN] of Integer;
front, rear: Integer;
end;
var
e: array[-maxM..maxM] of TEdge; //Danh sch cc cung
link: array[-maxM..maxM] of Integer;
//Mc ni trong danh sch lin thuc

head: array[1..maxN] of Integer;


//head[u]: Ch s cung u tin trong danh sch lin thuc cc cung ra khi u

trace: array[1..maxN] of Integer; //Vt ng i


n, m, s, t: Integer;
FlowValue: Integer;
Queue: TQueue;
procedure Enter; //Nhp d liu
var i, u, v, capacity: Integer;
begin
ReadLn(n, m, s, t);
FillChar(head[1], n * SizeOf(head[1]), 0);
for i := 1 to m do
begin
ReadLn(u, v, capacity);
with e[i] do //Thm cung e[i] = (u, v) vo danh sch lin thuc ca u
begin
x := u;
y := v;
c := capacity;
link[i] := head[u];
head[u] := i;
end;
with e[-i] do //Thm cung e[-i] = (v, u) vo danh sch lin thuc ca v
begin
x := v;
y := u;
c := 0;
link[-i] := head[v];
185

head[v] := -i;
end;
end;
end;
procedure InitZeroFlow; //Khi to lung 0
var i: Integer;
begin
for i := -m to m do e[i].f := 0;
FlowValue := 0;
end;
function FindPath: Boolean; //Tm ng tng lung bng BFS
var u, v, i: Integer;
begin
FillChar(trace[1], n * SizeOf(trace[1]), 0);
trace[s] := 1; //trace[s] 0: nh thm, c th dng bt c hng s no khc 0
with Queue do
begin
items[1] := s;
front := 1;
rear := 1; //Hng i ch gm nh s
repeat
u := items[front];
Inc(front); //Ly mt nh u khi hng i
i := head[u];
while i <> 0 do //Duyt danh sch lin thuc ca u
begin
v := e[i].y; //nt e[i] che mt cung i t u ti v
if (trace[v] = 0)
and (e[i].f < e[i].c) then
//v cha thm v e[i] l cung thng d

begin
trace[v] := i; //Lu vt
if v = t then Exit(True);
//Tm thy ng tng lung, thot

Inc(rear);
items[rear] := v; //y v vo hng i
end;
i := link[i]; //Nhy sang nt k tip trong danh sch lin thuc
186

end;
until front > rear;
Result := False; //Khng tm thy ng tng lung
end;
end;
procedure AugmentFlow; //Tng lung dc ng mt tng lung
var Delta, v, i: Integer;
begin
//Trc ht xc nh Delta bng sc cha nh nht ca cc cung trn ng tng lung

v := t; //Bt u t t
Delta := maxC;
repeat
i := trace[v];
// e[i] l mt cung trn ng tng lung vi sc che e[i].c - e[i].f

if e[i].c - e[i].f < Delta then


Delta := e[i].c - e[i].f;
v := e[i].x; //i dn v s
until v = s;
//Tng lung thm Delta
v := t; //Bt u t t

repeat
i := trace[v]; // e[i] l mt cung trn ng tng lung
Inc(e[i].f, Delta); //Tng lung trn e[i] ln Delta
Dec(e[-i].f, Delta); //Gim lung trn cung i tng ng i Delta
v := e[i].x; //i dn v s
until v = s;
Inc(FlowValue, Delta); //Gi tr lung f c tng ln Delta
end;
procedure PrintResult; //In kt qu
var i: Integer;
begin
WriteLn('Maximum flow: ');
for i := 1 to m do
with e[i] do
if f > 0 then //Ch cn in ra cc cung c lung > 0
WriteLn('e[', i, '] = (', x, ', ', y, '): c
= ', c, ', f = ', f);
WriteLn('Value of flow: ', FlowValue);
end;
187

begin
Enter; //Nhp d liu
InitZeroFlow; //Khi to lung 0
while FindPath do //Thut ton Ford-Fulkerson
AugmentFlow;
PrintResult; //In kt qu
end.

d) Tnh "ng c<


c<a thu
thu t ton
Trc ht d thy rng thut ton Ford-Fulkerson tr v mt lung, tc l kt
qu m thut ton tr v tha mn cc tnh cht ca lung. Vic chng minh
lung l cc i xy dng mt nh l quan trng v mi quan h gia
lung cc i v lt ct hp nht.

Ta gi mt lt ct 8  l mt cch phn hoch tp nh a lm hai tp ri nhau:


v a. Lt ct c " 5 v  5 c gi l mt lt ct " C
.

Lu lng t sang (l8 ) v lung t sang (8 ) c gi l lu


lng v lung thng qua lt ct.
B 3-9

Vi  l mt lung trn mng A a8 8 l8 "8 . Khi lung thng qua mt lt
ct " C  bt k bng .
Chng minh

Vi a l mt lt ct " C  bt k, theo nh

l 3-3

8  8 a C 8 a C  8 a C 8  8 a

Cng theo nh l ny ta c:

8 a "8 a  
C 6"98
a "8 a 

B 3-10

Vi  l mt lung trn mng A a8 8 l8 "8 . Khi lung thng qua mt lt
ct " C  bt k khng vt qu lu lng ca lt ct .
Chng minh

Vi a l mt lt ct " C  bt k ta c

188

8 

 N

56G9

l l8 

56G9

nh l 3-11 (mi quan h gia lung cc i, ng tng lung v lt ct


hp nht)

Nu  l mt lung trn mng A a8 8 l8 "8 , khi ba mnh sau l tng
ng:
a)  l lung cc i trn mng A.

b) Mng thng d A khng c ng tng lung.

c) Tn ti a l mt lt ct " C  8  l8 


Chng minh
ab

Gi s phn chng rng mng thng d A c ng tng lung B th    cng

l mt lung trn A vi gi tr lung ln hn , tri gi thit  l lung cc i


trn mng.
bc

Nu A khng tn ti ng tng lung th ta t l tp cc nh n c t "


bng mt ng thng d v l tp cc nh cn li:

6M ng thng d "  9 a C

R rng , a v " 5 ,  5 ( khng th n c t " bi


mt ng thng d bi nu khng th ng i s l mt ng tng lung).

Cc cung  5 6 G 9 chc chn phi l cung bo ha, bi nu c cung thng d


 @8  5 6 G 9 th t " s ti c  bng mt ng thng d. Tc l
 5 , tri vi cch xy dng lt ct. T  l vi L 5 6 G 9, ta c
8 

ca



56G9

l l8 

56G9

B 16.9 v nh l 16.17 cho thy gi tr ca mt lung trn mng khng th


vt qu lu lng ca mt lt ct " C  bt k. Nu tn ti mt lt ct " C  m
lung thng qua lt ct ng bng lu lng th lung chc chn phi l lung
cc i.

Lt ct " C  c lu lng nh nht (bng gi tr lung cc i trn mng) gi l


Lt ct hp nht ca mng A.
189

e) Tnh da
dang c<
c<a thu
thu t ton
Thut ton Ford-Fulkerson c thi gian thc hin ph thuc vo thut ton tm
ng tng lung ti mi bc. C th ch ra c v d m nu dng DFS
tm ng tng lung th thi gian thc hin gii thut khng b chn bi mt
hm a thc ca s nh v s cnh. Thm na, nu sc cha ca cc cung l s
thc, ngi ta cn ch ra c v d m vi thut ton tm ng tng lung
khng tt, gi tr lung sau mi bc vn tng nhng khng bao gi t lung
cc i. Tc l nu c th ci t chng trnh tnh ton s thc vi chnh
xc tuyt i, thut ton s chy mi khng dng.
7
1
7

1
3

Hnh 2.8. Mng vi 4 nh (1 pht, 4 thu), thut ton Ford-Fulkerson c th mt 2 t ln tm ng


tng lung nu lun phin chn hai ng 8 8 8 v 8 8 8 lm ng tng lung, mi ln tng
gi tr lung ln 1 n v.

Chnh v vy nn trong mt s ti liu ngi ta gi l phng php FordFulkerson ch mt cch tip cn chung, cn t thut ton c dng ch
mt cch ci t phng php Ford-Fulkerson trn mt cu trc d liu c th,
vi mt thut ton tm ng tng lung c th. V d phng php FordFulkerson ci t vi thut ton tm ng tng lung bng BFS nh trn c
gi l thut ton Edmonds-Karp. Tnh dng ca thut ton Edmonds-Karp s
c ch ra khi chng ta nh gi thi gian thc hin gii thut.
Xt A l mng thng d ca mt mng A ng vi lung  no , ta gn trng

s 1 cho cc cung thng d ca A v gn trng s  cho cc cung bo ha

ca A . D thy rng thut ton tm ng tng lung bng BFS s tr v mt

ng i ngn nht t " ti  tng ng vi hm trng s cho. K hiu


@8  l di ng i ngn nht t @ ti  (khong cch t @ ti ) trn
mng thng d.

190

B 3-12
Nu ta khi to lung 0 v thc hin thut ton Edmonds-Karp trn mng
A a8  c nh pht " v nh thu . Khi vi mi nh  5 a, khong
cch t " ti  trn mng thng d khng gim sau mi bc tng lung.
Chng minh

Khi  ", r rng khong cch t " ti chnh n lun bng 0 t khi bt u ti
khi kt thc thut ton. Ta ch cn chng minh b ng vi nhng nh  d ".

Gi s phn chng rng tn ti mt nh  5 a C 6"9 m khi thut ton EdmondsKarp tng lung  ln thnh  s lm cho "8  nh hn "8 . Nu c

nhiu nh  nh vy ta chn nh  c "8  nh nht. Gi B " @ G  l

ng i ngn nht t " ti  trn A , ta c @8  l cung thng d trn A v


"8 @ "8  C

Bi cch chn nh , di ng i ngn nht t " ti @ khng th b gim i


sau php tng lung, tc l
"8 @ w "8 @

Ta chng minh rng @8  phi l cung bo ha trn A . Tht vy, nu @8  l

cung thng d (c trng s 1) trn A th:

"8  N "8 @  (bt ng thc tam gic)


N "8 @  (khong cch t " ti @ khng gim)
"8 

Tri vi gi thit rng khong cch t " ti  phi gim i sau php tng lung.

Lm th no @8  l cung bo ha trn A nhng li l cung thng d trn

A ? Cu tr li duy nht l do php tng lung t  ln  lm gim lung trn

cung @8 , tc l cung i 8 @ phi l mt cung trn ng tng lung tm
c. V ng tng lung ti mi bc lun l ng i ngn nht nn 8 @
phi l cung cui cng trn ng i ngn nht t " ti @ ca A . T suy ra:
"8  "8 @ C
N "8 @ C (khong cch t " ti @ khng gim)
"8  C ; (theo cch chn @ v )

Mu thun vi gi thuyt khong cch t " ti  phi gim i sau khi tng lung.
Ta c iu phi chng minh: Vi L 5 a, khong cch t " ti  trn mng thng
d khng gim sau mi bc tng lung.

191

B 3-13

Nu thut ton Edmonds-Karp thc hin trn mng A a8 8 l8 "8  vi lung
khi to l lung 0 th s lt tng lung c s dng trong thut ton l
$aE
Chng minh

Ta chia qu trnh thc hin thut ton Edmonds-Karp thnh cc pha. Mi pha tm
mt ng tng lung B v tng lung thm mt gi tr thng d . Gi tr thng
d ny theo nh ngha s phi bng sc cha ca mt cung thng d  no
trn ng B:
 5 BM l C 

Khi tng lung dc trn c B th cung  s tr thnh bo ha. Nhng cung


thng d tr nn bo ha sau khi tng lung gi l cung ti hn (critical edge) ti
mi pha. Mi pha c t nht mt cung ti hn.
Ta nh gi xem mi cung ca mng c th tr thnh cung ti hn bao nhiu ln.
Vi mt cung  @8 , ta xt pha  u tin lm  tr thnh cung ti hn v 
l lung khi bt u pha . Do  nm trn ng tng lung ngn nht trn A
nn khi pha ny bt u:

"8 @  "8 

Pha  sau khi tng lung s lm cung  s tr nn bo ha.

 c th tr thnh cung ti hn mt ln na th tip theo pha  phi c mt pha

H gim lung trn cung  bin  thnh cung thng d, tc l cung  8 @
phi l mt cung trn ng tng lung ca pha H. Gi  l lung khi pha H bt
u, cng v tnh cht ca ng i ngn nht, ta c
"8   "8 @

B 16.12 chng minh rng khong cch t " ti  trn mng thng d khng
gim i sau mi pha, nn "8  w "8 . Suy ra:
"8 @ "8  
w "8  

"8 @  ;

Nh vy nu mt cung @8  l cung ti hn trong  pha th khi pha th  bt


u, khong cch t " ti @ trn mng thng d tng ln t nht ; C  n v
so vi thi im trc pha th nht. Khong cch "8 @ ban u l s khng m
v chng no cn ng thng d i t " ti @, khong cch "8 @ khng th
vt qu a C . iu cho thy  N

K(
+

$a.

192

Tng hp li, ta c:




Mng c tt c  cung.
Mi pha c t nht mt cung ti hn
Mt cung c th tr thnh ti hn trong $a pha

Vy tng s pha c thc hin trong thut ton Edmonds-Karp l mt i lng


$a

nh l 3-14

C th ci t thut ton Edmonds-Karp tm lung cc i trn mng


A a8 8 l8 "8  trong thi gian $a+ .
Chng minh

B 3-15 chng minh rng thut ton Edmonds-Karp cn thc hin

$a lt tng lung. Ti mi lt thut ton tm ng tng lung bng


BFS v tng lung dc ng ny c thi gian thc hin $. Suy ra thi gian
thc hin gii thut Edmonds-Karp l $a+ .

Nu kh nng thng qua trn cc cung ca mng l s nguyn th cn c mt


cch nh gi khc da trn gi tr lung cc i, nu ta khi to lung 0 th sau
mi lt tng lung, gi tr lung c tng ln t nht 1 n v. Suy ra thi gian
thc hin gii thut khi l $ vi  l gi tr lung cc i.

3.3. Thut ton y tin lung

Thut ton Ford-Fulkerson khng nhng l mt cch tip cn thng minh m


vic chng minh tnh ng n ca n cho ta nhiu kt qu th v v mi lin h
gia lung cc i v lt ct hp nht. Tuy vy vi nhng th kch thc rt
ln th tc ca chng trnh tng i chm.
Trong phn ny ta s trnh by mt lp cc thut ton nhanh nht cho ti nay
gii bi ton lung cc i, tn chung ca cc thut ton ny l thut ton y
tin lung (preflow-push).

Hy hnh dung mng nh mt h thng ng ng dn nc t vi im pht "


ti im thu , cc cung l cc ng ng, sc cha l lu lng ng ng c
th ti. Nc chy theo nguyn tc t ch cao v ch thp. Vi mt lng nc
ln pht ra t " ti mt nh , nu c cch chuyn lng nc sang a im
khc th khng c vn g, nu khng th c hin tng trn xy ra ti , ta
dng cao im  lng nc sang im khc (c th ngc v ").

193

C tip tc qu trnh nh vy cho ti khi khng cn hin tng trn bt c


im no. Cch tip cn ny hon ton khc vi thut ton Ford-Fulkerson: thut
ton Ford-Fulkerson c gng tm mt dng chy ph t " ti  v thm dng
chy ny vo lung hin c n khi khng cn dng chy ph na.
a) TiE
TiEn lu^
lu^ng

Cho mt mng A a8 8 l8 "8 . Mt tin lung (preflow) trn A l mt hm:
M 
 

gn cho mi cung  5  mt s thc  tha mn ba rng buc:

Rng buc v sc cha (capacity constraint): tin lung trn mi cung


khng c vt qu sc cha ca cung : L 5 :  N l.
Rng buc v tnh i xng lch (skew symmetry): Vi L 5 , tin lung
trn cung  v cung i  c cng gi tr tuyt i nhng tri du nhau:
 CC.
Rng buc v tnh d: Vi mi nh khng phi nh pht, tng tin lung
trn cc cung i vo nh l s khng m: L 5 a C 6"9: a8 69
:5G69  w 7.

Vi L 5 a, ta gi lng trn ti , k hiu  l"" , l tng tin lung trn


cc cung i vo nh :
 l""  a8 69

5G69



nh  5 a C 6"8 9 gi l nh trn (overflowing vertex) nu  l""  1 7.


Khi nim nh trn ch c ngha vi cc nh khng phi nh pht cng khng
phi nh thu.
function Overflow(v5V): Boolean;
begin
Result := (v s) and (v t) and (excess[u] > 0);
end;

194

nh ngha v tin lung tng t nh nh ngha lung, ch khc nhau rng


buc th ba. V vy chng ta cng c khi nim mng thng d, cung thng d,
ng thng d ng vi tin lung tng t nh i vi lung.
b) KhB
KhBi t9
t9o

Cho  l mt tin lung trn mng A a8 8 l8 "8 . Ta gi M a G l mt


hm cao ng vi  nu  gn cho mi nh  5 a mt s t nhin  tha
mn ba iu kin:




" a.
 7.
@ N   vi mi cung thng d @8 .

Nhng rng buc ny gi l rng buc cao.

Hm cao  khi ci t s c xc nh bi tp cc gi tr 6 95 nn ty


theo tng trng hp, ta c th s dng k hiu  (nu mun ni ti gi tr
hm) hoc   (nu mun ni ti mt bin s).
Thao tc khi to = chu trch nhim khi to mt tin lung v mt hm
cao tng ng. Mt cch khi to l t tin lung trn mi cung  i ra khi "
ng bng sc cha l ca cung (d nhin s phi t c tin lung trn

cung i  bng l tha mn tnh i xng lch), cn tin lung trn
cc cung khc bng 0. Khi tt c cc cung i ra khi " l bo ha.
l8 nu  5  K "
 Cl8 nu C  5  K "
78 trng hp khc

Ta khi to hm cao M a G nh sau:

a8 o  "

 78 o  
8 nu  d 6"8 9

R rng mi cung thng d @8  khng th l cung i ra khi " (@ d ") nn ta


c @ N N   . Hm cao trn l thch ng vi tin lung .
Vic cui cng l khi to cc gi tr  l"" E  ng vi tin lung .
procedure Init;

195

begin
for Le 5 E do f[e] := 0;
for Lv 5 V do excess[v] := 0;
for Le =(s,v)5 E+(s) do
begin
f[e] := c(e);
f[-e] := -c(e);
excess[v] := excess[v] + c(e);
end;

//Khi to tin lung

for Lv 5 V do h[v] := 1;
h[s] := |V|;
h[t] := 0;
end;
//Khi to hm cao

c) Php "b
"by lu^
lu^ng

Php y lung B@" c th thc hin trn cung  @8  nu cc iu kin


sau c tha mn:





@ l nh trn: @ 5 a C 6"8 9 v  l"" @ 1 7


 l cung thng d trn A : l  l C  1 7
@ cao hn : @ 1 

Rng buc @ 1  kt hp vi rng buc cao: @ N   c th


vit thnh @   .

Php B@"g @8 h s tnh lng lung ti a c th thm vo theo cung :

o l"" @8 l , thm lng lung ny vo cung  v bt mt lng

lung t  v @ theo cung  gi tnh i xng lch ca tin lung. Vic


cui cng l cp nht li  l"" @ v  l""  theo tin lung mi. Bn cht
ca php B@"g @8 h l chuyn mt lng lung trn t nh @ sang

nh . D thy rng cc tnh cht ca tin lung vn c duy tr sau php


B@":
procedure Push(e = (u,v));
begin
:= min(excess[u], cf(u, v)); //Tnh lng lung ti a c th y

196

f[e] := f[e] + ; f[-e] := f[-e] ; //y lung


excess[u] := excess[u] ;
excess[v] := excess[v] + ; //Cp nht mc trn
end;

Php B@" bo tn tnh cht ca hm cao. Tht vy, khi thao tc B@"g
@8 h c thc hin, n ch c th sinh ra thm mt cung thng d C
8 @ m thi. Php B@" khng lm thay i cc cao, tc l trc khi B@",
 @ 1   th sau khi B@",   vn nh hn  @, tc l rng buc cao
  N  @  vn c duy tr trn cung thng d C 8 @.

Php B@"g @8 h y mt lng lung o l"" @8 l  trn t
@ sang . Nu ng bng l  l C  c ngha l khi php B@" tng

 ln th cung  s bo ha v khng cn l cung thng d trn A na, ta


gi php y lung ny l y bo ha (saturating push), ngc li php y
lung gi l y khng bo ha (non-saturating push), sau php y khng
bo ha th  l"" @ 7, tc l @ khng cn l nh trn na.
d) Php nng

Php nng #@ thc hin trn nh @ nu cc iu kin sau c tha mn:




@ l nh trn: @ d ", @ d  v  l"" @ 1 7.


@ khng chuyn c lung xung ni no thp hn: Vi mi cung thng
d  @8  5  : @ N .

Khi php #@ nng nh @ ln bng cch t  @ bng cao thp nht
ca mt nh  n c th chuyn ti sang cng thm 1:
 @ z o M @8  5  

procedure Lift(u5V);
begin
minH := +;
for Lv:(u,v)5 Ef do
if h[v] < minH then minH := h[v];
h[u] := minH + 1;
end;

197

Nu @ l nh trn th t nht phi c mt cung thng d i ra khi @, iu ny


m bo cho php ly o M @8  5  c thc hin trn mt tp khc
rng. Tht vy, do @ l nh trn, ta c  l"" @ :5G69  1 7 tc l t

nht c mt cung  5 a G 6@9  1 7. Cung i  chc chn l mt


cung thng d i ra khi @ bi:
l C lC C C lC   1 7

Php # khng ng chm g n tin lung . Ngoi ra php # ch tng
cao ca mt nh v bo tn rng buc cao: Vi mt cung thng d
8 @ i vo @, rng buc cao  N @  khng b vi phm nu ta
nng cao @ ca nh @. Mt khc, vi mt cung thng d @8  i ra khi
@ th vic t  @ z o M @8  5   cng m bo rng @ N
  .

e) M hnh chung v thu


thu t ton FIFO PreflowPreflow-Push
 M hnh chung
Thut ton y tin lung c m hnh ci t chung kh n gin: Khi to tin
lung  v hm cao, sau nu thy php nng (#) hay y lung (B@")
no thc hin c th thc hin nga Cho ti khi khng cn php nng hay
y no c th thc hin c na th tin lung  s tr thnh lung cc i
trn mng.

Chnh v th t cc php B@" v # c thc hin khng nh hng ti tnh


ng ng ca thut ton nn ngi ta xut rt nhiu c ch chn th t
thc hin nhm gim thi gian thc hin gii thut.
B 3-15

Cho mng A a8 8 l8 "8  c tin lung  v hm cao . Vi mt nh trn


@, lun c th thc hin c thao tc B@" trn mt cung  i ra khi @
hoc thc hin c thao tc #@
Chng minh

Nu thao tc B@" khng th p dng c cho cung thng d no i ra khi @


tc l vi mi cung thng d @8  5  , @ khng cao hn , iu chnh
l iu kin hp l thc hin thao tc #@.

198

 Thut ton FIFO Preflow-Push


nh l 3-17 l c s cho thut ton FIFO Preflow-Push. Thut ton c
Goldberg xut [18] da trn c ch x l nh trn ly ra t mt hng i.

Ti thao tc khi to, cc nh trn s c lu tr trong mt hng i u@@


h tr hai thao tc: B@"u@@ y mt nh trn  vo hng i v
B?!u@@ ly mt nh trn khi hng i. Thut ton s x l tng
nh trn c ly ra khi hng i theo cch sau: Trc ht c gng y lung trn
cc cung thng d i ra khi c bng php B@". Nu y c ht lng trn
( l"" c 7) th xong, nu khng ta dng cao nh c bng php #c v
y li c vo hng i ch x l sau. Thut ton s tip tc vi nh trn tip
theo trong hng i v kt thc khi hng i rng, bi khi mng khng cn nh
trn th khng cn thao tc B@" hay # no c th thc hin c na.
Gi s rng chng ta c mt nh trn @ v mt cung  @8  khng th y
lung c, tc l t nht mt trong hai iu kin sau y c tha mn:



@8  l cung bo ha l .


@ khng cao hn : @ N .

Khi :


Sau bt k php B@" no, chng ta vn khng th y lung c trn


cung  @8 . Tht vy, nu @ khng cao hn , php B@" khng lm
thay i hm cao nn sau php B@" th @ vn khng cao hn . Nu @
cao hn  th  phi l cung bo ha, lnh B@" duy nht c th bin n
thnh cung thng d l lnh B@"C lm gim  . Nhng lnh

B@"C khng th thc hin c v cung  8 @ c  thp hn @.


Sau bt k php # no ngoi tr #@, chng ta cng khng th y
lung c trn cung  @8 . Bi php # khng lm thay i tin
lung trn cc cung, tnh bo ha hay thng d ca cc cung c gi
nguyn. Nh vy nu @8  ang bo ha th sau php # n vn bo ha
v khng th y lung c. Nu @8  l cung thng d th @ ang khng
cao hn , lnh # duy nht c th khin @ cao hn  l lnh #@.

Hai nhn nh trn cho php ta xy dng mt cu trc d liu hiu qu ci t


thut ton:
199

Tng t nh chng trnh ci t thut ton Edmonds-Karp, ta s dng mng


 C  cha cc cung, mng    cha mc ni trong danh sch
lin thuc v mng 
  cha ch s cung u tin ca cc danh sch
lin thuc. Ngoi ra thut ton duy tr mt mng ch s l@!! , y
l@!!  l ch s ca mt cung no trong danh sch lin thuc cc cung
i ra khi , ban u l@!!  c gn bng 
  vi mi nh  5 a.
type
TEdge = record //Cu trc mt cung
x, y: Integer; //Hai nh u mt
c, f: Integer; //Sc cha v lung
end;
var
e: array[-maxM..maxM] of TEdge; //Danh sch cc cung
link: array[-maxM..maxM] of Integer;
//Mc ni trong danh sch lin thuc

head, current: array[1..maxN] of Integer;

Trn cu trc d liu ny, danh sch mc ni cc nt cha cc cung i ra khi c


l:
 ( 8  + 8   8

Trong ( 
 c, +  ( ,   + ,

Thut ton FIFO Preflow-Push s x l ln lt tng nh trn ly ra khi hng

i. Vi mi nh trn c ly khi hng i, cung l@!! c l mt cung i


ra khi c, gi s cung l c8 . Nu php y lung (B@") trn cung c
th thc hin c th thc hin ngay, ng thi y  vo hng i nu  cha
c trong hng i. Nu php y lung ny lm c ht trn th chuyn sang x l
nh trn k tip trong hng i, ngc li nu c vn cn l nh trn (tc l

khng th y lung trn cung l@!! c na), ta dch ch s l@!! c

sang cung k tip trong danh sch lin thuc (l@!! c z l@!! c)
chuyn sang xt mt cung khcKhi dch ch s l@!! c n ht danh
sch lin thuc m c vn trn, nh c s c nng ln bng php #c, ch s
l@!!  c t tr li bng 
 c n tr li v u danh sch lin
thuc. nh c sau c y li vo hng i ch x l sau
200

Tnh hp l ca thut ton nm ch : khi nh trn c bt u c x l, tt c


nhng cung ng trc cung l@!! c u khng th y lung c. Tc

l nu mun y lung ra khi c th ch cn xt cc cung t l@!! c tr i


l , khng cn duyt t u danh sch lin thuc.
procedure FIFOPreflowPush;
begin
Init; //Khi to tin lung, cao, hng i Queue cha cc nh trn
while Queue do
begin
z := PopFromQueue; //X l nh trn x ly ra t hng i
while current[z] <> 0 do //C gng y lung khi z
begin //Xt cung (z, v) cha trong nt e[current[z]]
v := e[current[z]].y;
if C th y lung trn cung (z, v) then
begin
NeedQueue := (v s) and (v t)
and (excess[v] = 0);
Push(z, v); //y lung
if NeedQueue then
//Sau php y, v ang khng trn tr thnh trn
PushToQueue(v); //y v vo hng i ch x l

if excess[z] = 0 then Break;


//Sau php y m z ht trn th dng y

end;
current[z] := link[current[z]];
//z cha ht trn, chuyn sang xt cung lin thuc tip theo

end;
if excess[z] > 0 then //Duyt ht danh sch lin thuc m x vn trn
begin
Lift(z); //Dng cao z
current[z] := head[z];
//t li ch s current[z] v nt u danh sch lin thuc
PushToQueue(z); //y z vo hng i ch x l sau

end;
end;
end;

201

T nhn xt trn, c th nhn thy rng nhng php B@" v # trong m hnh
ci t m bo c gi ti nhng thi im m nhng iu kin cn thc
thi chng c tha mn.
f) Tnh "ng c<
c<a thu
thu t ton

Sau mi bc ca vng lp chnh, hng i u@@ lun cha danh sch cc


nh trn v thut ton s kt thc khi khng cn nh trn no trn mng. Vi
L 5 a C 6"8 9, ta c:
698 a Ca8 69 C l""  7

Tc l vi L 5 a C 6"8 9 th tng lung trn cc cung i ra khi  bng 0, iu


ny ch ra rng khi thut ton kt thc, tin lung chng ta duy tr trn mng tr
thnh mt lung.
nh l 3-16

Cho  l mt tin lung trn mng A a8 8 l8 "8 , nu tn ti mt hm cao


M a G ng vi  th mng thng d A khng c ng tng lung.
Chng minh

Nhc li v rng buc cao: " a,  7 v vi mi cung thng d


@8  th @ N   . Gi s phn chng rng c ng tng lung "
4 8 ( 8 8 I  trn mng thng d A i qua  cung thng d. Khi :
hay

4  N (   N +   ; N - N I   


"

N 

Ta c a N , nhng ng tng lung phi l ng i n, tc l qua khng


qu a C cnh, vy  N a C . iu ny mu thun, ngha l khng th tn ti
ng tng lung trn A .

nh l 3-17 v nh l 3-11 (mi quan h gia lung cc i, ng tng


lung v lt ct hp nht) ch ra rng: thut ton y tin lung tr v mt lung
v mt hm cao ng vi lung nn lung tr v chc chn l lung cc
i.

202

g) Tnh da
dang c<
c<a thu
thu t ton
Tnh dng ca thut ton y tin lung trn s c suy ra khi chng ta phn
tch thi gian thc hin gii thut. Tng t nh thut ton Ford-Fulkerson,
chng ta s khng phn tch thi gian thc hin trn m hnh tng qut m ch
phn tch thi gian thc hin gii thut FIFO Preflow-Push m thi.
nh l 3-17

Cho  l mt tin lung trn mng A a8 8 l8 "8 , khi vi mi nh trn @,
tn ti mt ng thng d i t @ ti ".
Chng minh

Vi mt nh trn @ bt k, xt tp l tp cc nh c th n c t @ bng
mt ng thng d. t a C l tp nhng nh nm ngoi . Trc ht ta
ch ra rng tin lung trn cc cung thuc 6 G 9 khng th l s dng. Tht
vy nu c  5 6 G 9 m  1 7 th  5 6 G 9 v C O 7. Suy ra c

cung thng d  ni mt nh thuc vi mt nh > no thuc . Theo cch


xy dng tp , > s phi l nh thuc . Mu thun.

Tin lung trn cc cung thuc 6 G 9 khng th l s dng th 8  N 7.


Ta xt tng mc trn ca cc nh 5 :
 l"" a8  8
 8

N7

4

Lng trn ti mi nh khng phi nh pht u l s khng m, ngoi ra @ l


nh trn 5 nn  l"" @ 1 7, iu ny cho thy chc chn nh pht " phi
thuc  l"" N 7. Ni cch khc t @ n c " bng mt ng thng
d.

H qu

Cho mng A a8 8 l8 "8 . Gi s chng ta thc hin thut ton y tin lung
vi hm cao M a G th cao ca cc nh trong qu trnh thc hin gii
thut khng vt qu ;a C .
Chng minh

Mng phi c t nht mt nh pht v mt nh thu nn a w ;. Ban u,


" a,  7 v  8 L 6"8 9 nn cao ca cc nh u nh
hn ;a C .

cao ca " v  khng bao gi b thay i v vi mi nh @ 5 a C 6"8 9 th ch


php #@ c th lm tng cao ca nh @. iu kin thc hin php
203

#@ l @ phi l nh trn. Php # khng thay i tin lung nn sau php

#@ th @ vn trn. p dng kt qu ca nh l 3-17, tn ti ng i n


@ 4 8 ( 8 8 I " ch i qua  cung thng d
t @ ti "
4 8 ( ,( 8 + ,,I3( 8 I . T rng buc cao ta c:
@ 4  N (   N +   ; N - N I    N a  

ng i n th khng qua nhiu hn a C cnh nn ta c  N a C , kt


hp li c @ N ;a C . PCM.

nh l 3-18 (thi gian thc hin gii thut FIFO Preflow-Push)

C th ci t gii thut FIFO Preflow-Push tm lung cc i trn mng


A a8 8 l8 "8  trong thi gian $a  a.
Chng minh

Ta s chng minh m hnh ci t thut ton FIFO Preflow-Push trn c thi


gian thc hin l $a  a. Vng lp chnh ca thut ton mi lt ly
mt nh trn c khi hng i v c gng tho lung cho nh c bng cc
php B@" theo cc cung i ra khi c. Nu c cha ht trn th thc hin php
#c v y li c vo hng i. Nh vy thut ton FIFO Preflow-Push s thc
hin mt dy cc php # v B@":
#E 8 B@"E 8 B@"E  8 B@"E 8 #E 8 B@"E 8

Trc ht ta chng minh rng s php # trong dy thao tc trn l $a+  v
tng thi gian thc hin chng l $a. Tht vy, Mi php # s nng
cao ca mt nh ln t nht 1, ngoi ra cao ca mi nh khng vt qu

;a C (theo h qu ca nh l nh l 3-17). C cho l mi nh 5 a C


6"8 9 khi kt thc thut ton u c cao ;a C i na th do chng c khi
to bng 1, tng s php # cn thc hin cng khng vt qu:
a C ;;a C ; $a+ 

Mi cung @8  s c xt n ng mt ln trong php #@, php #@


li c gi khng qu ;a C ; ln. Vy tng cng trong tt c cc php # th
mi cung s c xt khng qu ;a C ; ln, mng c  cung suy ra tng thi
gian thc hin ca cc php # trong gii thut l ;a C ; $a.

Tip theo ta chng minh rng s php y bo ha cng nh tng thi gian thc
hin chng l $a. Sau php y bo ha B@", nu mun thc hin tip
php y B@" na th trc chc chn phi c php y B@"C lm

gim  v bin  tr li thnh cung thng d. Gi s  @8  v  8 @


th thc hin php B@", ta phi c @ 1 . thc hin B@"C,
ta phi c  1 @ v thc hin tip B@" na ta li phi c @ 1
204

. Bi cao ca cc nh khng bao gi gim i nn sau php B@" th


hai, cao @ ln hn t nht 2 n v so vi @ php B@" th nht.
Vy nu mt cung  @8  ca mng c y bo ha  ln th cao ca
nh @ s tng ln t nht l ; C . V cao ca cc nh khng vt qu
;a C nn s php y bo ha trn mi cung  l  N a. Mng c  cung
v thi gian thc hin php B@" l $  nn s php y bo ha l $a v
thi gian thc hin chng cng l $a.

i vi cc php y khng bo ha, vic nh gi thi gian thc hin gii thut
c thc hin bng hm tim nng (potential function). nh ngha hm tim
nng  l cao ln nht ca cc nh trn:
 n6 M  l nh trn9

Trong trng hp mng khng cn nh trn th ta quy c  7. Vy  N khi


khi to tin lung v tr li bng 0 khi thut ton kt thc.

Chia dy cc thao tc # v B@" lm cc pha lin tip. Pha th nht bt u khi
hng i c khi to gm cc nh trn v kt thc khi tt c cc nh (v
ch nhng nh thi) c ly ra khi hng i v x l. Pha th hai tip tc
vi hng i gm nhng nh c y vo trong pha th nht v kt thc khi tt
c cc nh ny c ly ra khi hng i v x l, pha th ba, th t c chia
ra theo cch tng t nh vy.

Nhn xt rng php B@" ch y lung t nh cao xung nh thp, vy nn


nhng nh c y vo hng i sau php B@" lun thp hn nh ang xt
va ly ra khi hng i. Suy ra nu mt pha ch cha php B@" th gi tr hm
tim nng  sau pha gim i t nht 1 n v.
Gi tr hm tim nng  ch c th tng ln sau mt pha nu pha c cha php
# v gi tr  tng ln phi bng mt cao ca mt nh  no sau php
# trong pha. Xt mc tng ca  sau pha ang xt:
mi C c  C c N  C c

Tc l sau mi pha lm  tng ln, lun tn ti mt nh  m mc tng cao


ca  ln hn mc tng ca . Xt trn ton b gii thut, cao ca mi nh
 5 a C 6"8 9 c khi to bng 0 v c nng ln ti a bng ;a C nn
tng ton b mc tng ca cc nh khng vt qu a C ;;a C 
$a+ .

Vy nu ta xt cc pha lm  tng th tng mc tng ca  trn cc pha ny l


$a+ , tc l s cc pha lm  gim cng phi l $a+ . Ni cch khc, s ch
c $a+  pha c cha php # v $a+  pha khng cha php #. Cng li
ta c s pha cn thc hin trong ton b gii thut l $a+ .
205

Mt pha s phi ly khi hng i ti a a C ; nh x l. Vi mi nh ly


t hng i, vic tho lung s ch s dng ti a 1 php y khng bo ha v
sau php y ny th nh s ht trn v qu trnh x l s chuyn sang nh tip
theo trong hng i. Vy trong mi pha c khng qu a C ; php y khng bo
ha. V tng s pha l $a+ , ta c s php y khng bo ha trong c gii
thut l $a  v tng thi gian thc hin chng cng l $a .

Cui cng, ta nh gi thi gian thc hin nhng thao tc duyt danh sch lin
thuc bng cc ch s l@!! E  trong thut ton FIFO Preflow-Push. Vi mi
nh c, ch s l@!! c ban u s ng vi nt u danh sch lin thuc v
chuyn dn n ht danh sch gm p' K c nt. Khi duyt ht danh sch lin
thuc m c vn trn th s c mt php #c v con tr l@!! c c t li
v u danh sch lin thuc. S php #c trong ton b gii thut khng vt
qu ;a C , nn s lt dch ch s l@!! c khng vt qu ;a p' K c.
Suy ra nu xt tng th, s php dch cc ch s l@!! E  trn tt c cc danh
sch lin thuc phi nh hn:
;a p' K c ;a $a

Kt lun:

Tng thi gian thc hin cc php nng: $a.

Tng thi gian thc hin cc php y bo ha: $a.

Tng thi gian thc hin cc php y khng bo ha: $a .

Tng thi gian thc hin cc php duyt danh sch lin thuc bng ch s
l@!! E : $a.

Thi gian thc hin gii thut FIFO Preflow-Push: $a  a.

h) M8t s!
s! k` thu
thu t t(ng t!
t!c "8
"8 gi
gii thu
thu t

Ta chng minh rng thut ton Edmonds-Karp c thi gian thc hin
$a+  v thut ton FIFO Preflow-Push c thi gian thc hin $a 
a. Nhng i lng ny thot nhn lm chng ta c cm gic nh thut
ton FIFO Preflow-Push thc hin nhanh hn thut ton Edmonds-Karp, c
bit trong trng hp th dy (  a).

Tuy vy, nhng nh gi ny ch l cn trn ca thi gian thc hin gii thut
trong trng hp xu nht. Hin ti cha c cc nh gi cht v cn trn v cn
di trong trng hp trung bnh. Nhng th nghim bng chng trnh c th
cng cho thy rng cc thut ton y tin lung nh FIFO Preflow-Push, Lift206

to-Front Preflow-Push, Highest-Label Preflow-Push khng c c ci thin g


v tc so vi thut ton Edmonds-Karp (thm ch cn chm hn) nu khng
s dng nhng mo ci t (heuristics).
Cha c nh gi l thuyt cht ch no v tc ng ca nhng mo ci t ln
thi gian thc hin gii thut nhng hu ht cc th nghim u cho thy vic s
dng nhng mo ci t trn thc t gn nh l bt buc i vi cc thut ton
y tin lung.
 Bn cht ca hm cao

Nhc li v rng buc cao: Xt mt tin lung  trn mng A a8 8 l8 "8 ,
hm cao M a G gi l tng ng vi tin lung  nu " a ;
 7; v vi mi cung thng d @8  th @ N   .

Nu ta gn trng s cho cc cung ca mng thng d A theo quy tc: Cung


thng d c trng s 1 v cung bo ha c trng s . K hiu @8  l
di ng i ngn nht t @ ti  trn A vi cch gn trng s ny. Khi
khng kh khn kim chng c rng vi L 5 a C 6"8 9:




 N 8 , tc l  lun l cn di ca di ng i ngn nht

t  ti nh thu.
Trong trng hp  1 a, t  chc chn khng c ng thng d i
ti  v  C a N 8 ", tc l  C a trong trng hp ny l
cn di ca di ng i ngn nht t  v nh pht.

Nhng mo ci t di y nhm y nhanh cc cao  trong tin trnh


thc hin gii thut da vo nhng nhn xt trn.
 Gn nhn li ton b
Ni dung ca phng php gn nhn li ton b (global relabeling heuristic)
c tm tt nh sau: Xt lt ct chia tp a lm hai tp ri nhau v : Tp
gm nhng nh n c  bng mt ng thng d v tp gm nhng nh
cn li. Chc chn khng c cung thng d ni t sang , ta c " 5 8  5 .
Php gn nhn li ton b s t:



207

Vi L 5 , ta gn li cao   z 8 .


Vi L@ 5 v @8 " O , ta gn li cao  @ z a  @8 "

Vi L@ 5 v @8 " , ta gn li cao  @ z ;a C

Khng kh khn kim chng tnh hp l ca hm cao mi. C th thy


rng cc cao mi t ra l khng thp hn cc cao c.
Cc gi tr 8  cng nh @8 " c th c xc nh bng hai lt thc

hin thut ton BFS t  v ". Bi ta cn thi gian $ cho hai lt BFS v
gn li cc cao, nn php gn nhn li ton b thng c gi thc hin sau
mt lot ch th s cp khng lm nh hng ti nh gi $ ln ca thi gian
thc hin gii thut (chng hn sau mi a php #). Ch l khi nng cao
 c ca mt nh c no , cn cp nht li l@!! c z 
 c.

 y nhn theo khe

Php y nhn theo khe (gap heuristic) c thc hin nh quan st sau:

Gi s ta c mt s nguyn 7 O [
 O a m khng nh no c cao [

(s nguyn [
 ny c gi l khe), khi mi nh c c  c 1 [
 u
khng c ng thng d i n .

Nhn nh trn c th chng minh bng phn chng: Gi s t c c ng thng


d i n , vi mt cung @8  trn ng i ta c @ N   , tc l trn
ng i ny, t mt nh @ ta ch c th i sang mt nh  khng thp hn
hoc thp hn @ ng mt n v. T c 1 [
 1 7 v  7, chc chn
trn ng thng d t ti  phi c mt nh cao [
. Mu thun vi gi
thuyt phn chng.
Php y nhn theo khe nu pht hin khe 7 O [
 O a s xt tt c nhng
nh c 5 a C 6"9 c [
 O c N a v t li  c z a  .

Ta s ch ra rng php y cao ny vn m bo rng buc cao ca hm .


cao ca nh pht v nh thu khng b ng chm n, tc l  " a v
  7. Trc khi thc hin php y theo khe, ta chia tp nh a thnh hai
tp ri nhau: Tp gm nhng nh cao hn [
 v tp gm nhng nh thp
hn [
. Do rng buc cao @ N   vi mi cung thng d @8 ,
khng tn ti cung thng d ni t ti . Php y theo khe ch tng cao
ca mt vi nh 5 v nh vy rng buc cao nu b vi phm th ch b vi
phm trn nhng cung thng d i ra khi . Nh lp lun trn, cung thng d i

208

ra khi chc chn phi i vo mt nh 5 c cao t nht l a sau php


y theo khe. T   a  ta c   N    .

Php y nhn theo khe s dng mng l@ 7 ;a C  m l@  l


s nh c cao . Mi khi c s thay i cao, ta phi ng b li mng
l@ theo tnh trng hm cao mi. Sau mi php #@, cao c ca
nh @ c lu tr li trong bin Q v php # thc hin nh bnh
thng. Sau nu 7 O Q O a v l@ Q 7, php y theo khe
Q s c gi v thc hin trong thi gian $a. Bi s php # cn
thc hin trong ton b gii thut l $a+ , tng thi gian thc hin cc php
y theo khe s l $a  nn khng nh hng ti nh gi $-ln ca thi
gian thc hin gii thut FIFO Preflow-Push.
Di y l bng so snh tc ca cc chng trnh ci t c th trn mt s
b d liu. Vi mt cp s 8 , 100 th vi  nh,  cung c sinh ngu
nhin vi sc cha l s nguyn trong khong t 0 ti 7 . C 4 chng trnh
c th nghim: A: Thut ton Edmonds-Karp, B: thut ton FIFO PreflowPush, C: thut ton FIFO Preflow-Push vi php gn nhn li ton b v D:
thut ton FIFO Preflow-Push vi php y nhn theo khe. Mi chng trnh
c th trn c 100 th v o thi gian thc hin trung bnh (tnh bng giy):

 77
 ;77
 \77
 e77
 777
 7777  V7777  X7777  7777  77777
0.0688

0.5925

0.6598

1.7158

2.7629

0.0983

0.7395

3.4377

9.9014

25.0723

0.0313

0.0624

0.0857

0.1809

0.2433

0.0282

0.0577

0.0828

0.1575

0.1889

 Ci t
Di y l chng trnh ci t thut ton FIFO Preflow-Push kt hp vi k
thut y nhn theo khe, vic ci t v nh gi hiu sut ca php gn nhn li
ton b chng ta coi nh bi tp. Cc bn c th th ci t kt hp c hai k
thut tng tc ny xc nh xem vic c thc s cn thit khng.

209

Input/Output c khun dng ging nh chng trnh ci t thut ton


Edmonds-Karp. Hng i cha cc nh trn c t chc di dng danh sch
vng: Cc ch s u/cui hng i s chy xui trong mt mng v khi chy
n ht mng s t ng quay v u mng.


FIFOPREFLOWPUSH.PAS  Thut ton FIFO Preflow-Push


{$MODE OBJFPC}
program MaximumFlow;
const
maxN = 1000;
maxM = 100000;
maxC = 10000;
type
TEdge = record //Cu trc mt cung
x, y: Integer; //Hai nh u mt
c, f: Integer; //Sc cha v lung
end;
TQueue = record //Cu trc hng i
items: array[0..maxN - 1] of Integer; //Danh sch vng
front, rear, nItems: Integer;
end;
var
e: array[-maxM..maxM] of TEdge; //Mng cha cc cung
link: array[-maxM..maxM] of Integer;
//Mc ni trong danh sch lin thuc

head, current: array[1..maxN] of Integer;


//con tr ti u v v tr hin ti ca danh sch lin thuc
excess: array[1..maxN] of Integer; //mc trn ca cc nh

h: array[1..maxN] of Integer; //hm cao


count: array[0..2 * maxN - 1] of Integer;
//count[k] = s nh c cao k

Queue: TQueue; //Hng i cha cc nh trn


n, m, s, t: Integer;
FlowValue: Integer;
procedure Enter; //Nhp d liu
var
i, u, v, capacity: Integer;
begin
210

ReadLn(n, m, s, t);
FillChar(head[1], n * SizeOf(head[1]), 0);
for i := 1 to m do
begin
ReadLn(u, v, capacity);
with e[i] do //Thm cung e[i] = (u, v) vo danh sch lin thuc ca u
begin
x := u;
y := v;
c := capacity;
link[i] := head[u];
head[u] := i;
end;
with e[-i] do //Thm cung e[-i] = (v, u) vo danh sch lin thuc ca v
begin
x := v;
y := u;
c := 0;
link[-i] := head[v];
head[v] := -i;
end;
end;
for v := 1 to n do current[v] := head[v];
end;
procedure PushToQueue(v: Integer); //y mt nh v vo hng i
begin
with Queue do
begin
rear := (rear + 1) mod maxN;
//Dch ch s cui hng i, rear = maxN - 1 s tr li thnh 0

items[rear] := v; //t v vo v tr cui hng i


Inc(nItems); //Tng bin m s phn t trong hng i
end;
end;
function PopFromQueue: Integer; //Ly mt nh khi hng i
begin
with Queue do
begin
211

Result := items[front]; //Tr v phn t u hng i


front := (front + 1) mod maxN;
//Dch ch s u hng i, front = maxN - 1 s tr li thnh 0

Dec(nItems); //Gim bin m s phn t trong hng i


end;
end;
procedure Init; //Khi to
var v, sf, i: Integer;
begin
//Khi to tin lung

for i := -m to m do e[i].f := 0;
FillChar(excess[1], n * SizeOf(excess[1]), 0);
i := head[s];
while i <> 0 do
//Duyt cc cung i ra khi nh pht v y bo ha cc cung , cp nht cc mc trn excess[.]

begin
sf := e[i].c;
e[i].f := sf;
e[-i].f := -sf;
Inc(excess[e[i].y], sf);
Dec(excess[s], sf);
i := link[i];
end;
//Khi to hm cao

for v := 1 to n do h[v] := 1;
h[s] := n;
h[t] := 0;
//Khi to cc bin m: count[k] l s nh c cao k

FillChar(count[0], (2 * n) * SizeOf(count[0]), 0);


count[n] := 1;
count[0] := 1;
count[1] := n - 2;
//Khi to hng i cha cc nh trn

Queue.front := 0;
Queue.rear := -1;
Queue.nItems := 0; //Hng i rng
for v := 1 to n do //Duyt tp nh
if (v <> s) and (v <> t) and (excess[v] > 0) then
//v trn

212

PushToQueue(v); //y v vo hng i


end;
procedure Push(i: Integer); //Php y lung theo cung e[i]
var Delta: Integer;
begin
with e[i] do
if excess[x] < c - f then Delta := excess[x]
else Delta := c - f;
Inc(e[i].f, Delta);
Dec(e[-i].f, Delta);
with e[i] do
begin
Dec(excess[x], Delta);
Inc(excess[y], Delta);
end;
end;
procedure SetH(u: Integer; NewH: Integer);
//t cao ca u thnh NewH, ng b ha mng count

begin
Dec(count[h[u]]);
h[u] := NewH;
Inc(count[NewH]);
end;
procedure PerformGapHeuristic(gap: Integer);
//y nhn theo khe gap

var v: Integer;
begin
if (0 < gap) and (gap < n) and (count[gap] = 0) then
//gap ng l khe tht

for v := 1 to n do
if (v <> s) and (gap < h[v]) and (h[v] <= n) then
begin
SetH(v, n + 1);
current[v] := head[v];
//Nng cao ca v cn phi cp nht li con tr current[v]

end;
end;
procedure Lift(u: Integer); //Php nng nh u
var minH, OldH, i: Integer;
213

begin
minH := 2 * maxN;
i := head[u];
while i <> 0 do //Duyt cc cung i ra khi u
begin
with e[i] do
if (c > f) and (h[y] < minH) then
//Gp cung thng d (u, v), ghi nhn nh v thp nht

minH := h[y];
i := link[i];
end;
OldH := h[u]; //Nh li h[u] c
SetH(u, minH + 1); //nng cao nh u
PerformGapHeuristic(OldH); //C th to ra khe OldH, y nhn theo khe
end;
procedure FIFOPreflowPush; //Thut ton FIFO Preflow-Push
var
NeedQueue: Boolean;
z: Integer;
begin
while Queue.nItems > 0 do //Chng no hng i vn cn nh trn
begin
z := PopFromQueue; //Ly mt nh trn x khi hng i
while current[z] <> 0 do //Xt mt cung i ra khi x
begin
with e[current[z]] do
begin
if (c > f) and (h[x] > h[y]) then
//Nu c th y lung c theo cung (u, v)

begin
NeedQueue := (y <> s) and (y <> t)
and (excess[y] = 0);
Push(current[z]); //y lung lun
if NeedQueue then
//v ang khng trn sau php y tr thnh trn

PushToQueue(y); //y v vo hng i


if excess[z] = 0 then Break;
//x ht trn th chuyn qua xt nh khc ngay

end;
214

end;
current[z] := link[current[z]];
//x cha ht trn th chuyn sang xt cung lin thuc tip theo

end;
if excess[z] > 0 then //Duyt ht danh sch lin thuc m x vn trn
begin
Lift(z); //Nng cao x
current[z] := head[z];
//t con tr current[x] tr li v u danh sch lin thuc

PushToQueue(z); //y li x vo hng i ch x l sau


end;
end;
FlowValue := excess[t];
//Thut ton kt thc, gi tr lung bng tng lung i vo nh thu (= - excess[s])

end;
procedure PrintResult; //In kt qu
var i: Integer;
begin
WriteLn('Maximum flow: ');
for i := 1 to m do
with e[i] do
if f > 0 then //Ch cn in ra cc cung c lung > 0
WriteLn('e[', i, '] = (', x, ', ', y, '): c
= ', c, ', f = ', f);
WriteLn('Value of flow: ', FlowValue);
end;
begin
Enter; //Nhp d liu
Init; //Khi to
FIFOPreflowPush; //Thc hin thut ton y tin lung
PrintResult; //In kt qu
end.

nh l 3-19 (nh l v tnh nguyn)


Nu tt c cc sc cha l s nguyn th thut ton Ford-Fulkerson cng nh
thut ton y tin lung lun tm c lung cc i vi lung trn cung l cc
s nguyn.

215

Chng minh
i vi thut ton Ford-Fulkerson, ban u ta khi to lung 0 th lung trn cc
cung l nguyn. Mi ln tng lung dc theo ng tng lung B, lung trn mi
cung hoc gi nguyn, hoc tng/gim mt lng cng l s nguyn. Vy nn
cui cng lung cc i phi c gi tr nguyn trn tt c cc cung.
i vi thut ton y tin lung, ban u ta khi to mt tin lung trn cc cung
l s nguyn. Php # v B@" khng lm thay i tnh nguyn ca tin lung
trn cc cung. Vy nn khi thut ton kt thc, tin lung tr thnh lung cc i
vi gi tr lung trn cc cung l s nguyn.

3.4. Mt s m rng v ng dng ca lung


a) M9ng v4
v4i nhiE
nhiEu "d
"dnh pht v nhiE
nhiEu "d
"dnh thu

Ta m rng khi nim mng bng cch cho php mng A c  nh pht:
"( 8 "+ 8 8 " v  nh thu ( 8 + 8 8  , cc nh pht v cc nh thu hon ton
phn bit. Hm sc cha v lung trn mng c nh ngha tng t nh
trong trng hp mng c mt nh pht v mt nh thu. Gi tr ca lung c
nh ngha bng tng lung trn cc cung i ra khi cc nh pht. Bi ton t
ra l tm lung cc i trn mng c nhiu nh pht v nhiu nh thu.
Thm vo mng hai nh: mt siu nh pht " v siu nh thu . Thm cc
cung ni t " ti cc nh "2 c sc cha , thm cc cung ni t cc nh 
ti  vi sc cha . Ta c mt mng mi A a8   (h.2.9).

"




"(

"+

"

(

+






Hnh 2.9. Mng vi nhiu nh pht v nhiu nh thu

C th thy rng nu  l mt lung cc i trn A, th  hn ch trn A cng l


lung cc i trn A. Vy tm lung cc i trn A, ta s tm lung cc i
216

trn A ri loi b siu nh pht ", siu nh thu  v tt c nhng cung gi mi


thm vo.
Mt cch khc c th thc hin tm lung trn mng c nhiu nh pht v
nhiu nh thu l loi b tt cc cc cung i vo cc nh pht cng nh cc
cung i ra khi cc nh thu. Chp tt c cc nh pht thnh mt siu nh " v
chp tt c cc nh thu li thnh mt siu nh thu , mng khng cn cc nh
"( 8 "+ 8 E E 8 " v ( 8 + 8 8  na m ch c thm nh pht " v nh thu . Trn
mng ban u, mi cung i vo/ra "2 c chnh li u mt n i vo/ra nh
", mi cung i vo/ra  cng c chnh li u mt n i vo/ra nh , ta
c mt mng mi A .

Khi ta ta c th tm  l mt lung cc i trn A v khi phc li u mt


ca cc cung nh c  tr thnh lung cc i trn A.
b) M9ng v4
v4i sN
sNc chN
chNa trn c
c cc "d
"dnh v cc cung

Cho mng A a8 8 l8 "8 , mi nh  5 a C 6"8 9 c gn mt s khng m


 gi l sc cha ca nh . Lung dng trn mng ny c nh
ngha vi tt c cc rng buc ca lung dng v thm mt iu kin: Tng
lung dng trn cc cung i vo mi nh  5 a C 6"8 9 khng c vt qu
: :5s   N . Bi ton t ra l tm lung dng cc i trn
mng c rng buc sc cha trn c cc nh v cc cung.

Tch mi nh 5 a C 6"8 9 thnh 2 nh mi 2. 8  v mt cung  2. 8  


vi sc cha  . Cc cung i vo c chnh li u mt i vo 2. v
cc cung i ra khi c chnh li u mt i ra khi  (h.2.10). Ta xy
dng c mng A a 8   vi nh pht " v nh thu .
2.

 

Hnh 2.10. Tch nh

217

 



Khi vic tm lung dng cc i trn mng A c th thc hin bng cch
tm lung dng cc i trn mng A , sau chp tt c cc cp  2. 8   tr
li thnh nh (L 5 a C 6"8 9) khi phc li mng A ban u.

c) M9ng v4
v4i rng bu8
bu8c lu^
lu^ng dF#ng b>
b> ch:
ch:n hai pha

Cho mng A a8 8 l8 "8  trong mi cung  5  ngoi sc cha (lu


lng) ti a l cn c gn mt s khng m  N l gi l lu lng
ti thiu. Mt lung dng tng thch trn A c nh ngha vi tt c cc
rng buc ca lung dng v thm mt iu kin: Lung dng trn mi cung
 5  khng c nh hn sc cha ti thiu ca cung :
 N  N l

Bi ton t ra l kim chng s tn ti ca lung dng tng thch trn mng


vi rng buc lung dng b chn hai pha.
Xy dng mt mng A a 8   t mng A theo quy tc:


Tp nh a c c t tp a thm vo nh pht gi " v nh thu gi  :


a a  6" 8  9.
Mi cung  @8  5  s tng ng vi ba cung trn  : cung ( @8 
c sc cha l C , cung + " 8  v cung  @8   c sc cha
. Ngoi ra thm vo cung 8 " 5  vi sc cha 


"



l C 

"






Hnh 2.11.

Gi P :5s  l tng sc cha ti thiu ca cc cung trn mng A. Khi


trn mng A , tng sc cha cc cung i ra khi " cng nh tng sc cha cc
cung i vo  bng P. V vy vi mi lung dng trn A th gi tr lung
khng th vt qu P.
218

T suy ra rng nu tn ti mt lung dng trn A c gi tr lung


P th bt buc l lung dng cc i trn A .
B 3-20 cho php ta kim chng s tn ti lung dng tng thch trn A
bng vic o gi tr lung cc i trn A .

B 3-20

iu kin cn v tn ti lung dng tng thch trn mng A l tn ti


lung dng cc i trn A vi gi tr lung PE
Chng minh

Gi s lung dng cc i trn A c P :5s  . Ta xy dng


lung trn A bng cch cng thm vo lung trn mi cung  mt lng
:
M  G 78 
 G    

Khi c th d dng kim chng c tha mn tt c cc rng buc ca


lung dng tng thch trn mng A.

Ngc li nu l mt lung dng tng thch trn A . Ta xy dng lung


dng trn A bng cch tr lung trn mi cung  i mt lng , ng
thi t lung trn cc cung i ra khi " cng nh trn cc cung i vo  ng
bng sc cha ca cung . Khi cng d dng kim chng c l lung
dng cc i v P.

d) M9ng v4
v4i sN
sNc chN
chNa m

Cho mng A a8 8 l8 8 "8  trong ta m rng khi nim sc cha bng
cch cho php c nhng sc cha m trn mt s cung. Khi nim lung c
nh ngha nh bnh thng.
Nu nh c th khi to c mt lung th thut ton Ford-Fulkerson vn hot
ng ng tm lung cc i trn mng c sc cha m. Vn khi to mt
lung bt k trn mng khng phi n gin v chng ta khng th khi to bng
lung 0, bi nu nh vy, rng buc sc cha ti a s b vi phm trn cc cung
c sc cha m.

Gi s mt cung  5  c sc cha l O 7. Theo tnh i xng lch ca lung


 CC v rng buc sc cha ti a  N l, ta c:
219

C C w Cl 1 7

(3.5)

Nh vy rng buc sc cha ti a  N l tng ng vi rng buc v

sc cha ti thiu l trn cung i . Vic ch ra mt lung bt k trn A


c th thc hin bng cch tm lung dng trn mng vi rng buc lung
dng b chn hai pha sau bin i lung dng ny thnh lung cn tm.
e) Lt c]
c]t he
hep nh6
nh6t

Ta quan tm ti th v hng lin thng A a8  vi hm trng s (hay


lu lng) lM  G 78 . Gi s a w ;, ngi ta mun b i mt s cnh
th mt tnh lin thng v yu cu tm phng n sao cho tng trng s cc
cnh b loi b l nh nht.
Bi ton cng c th pht biu di dng: hy phn hoch tp nh a thnh hai
tp khc rng ri nhau v sao cho tng lu lng cc cnh ni gia v
l nh nht c th. Cch phn hoch ny gi l lt ct tng qut hp nht ca A,
k hiu yF@A.
l8  G min

d d a

Mt cch t nht c th thc hin l th tt c cc cp nh "8 . Vi mi ln th


ta cho " lm nh pht v  lm nh thu trn mng A, sau tm lung cc i
v lt ct " C  hp nht. Cui cng l chn lt ct " C  c lu lng nh nht

.Y.3(
ln tm lung cc
trong tt c cc ln th. Phng php ny cn f i
+
;
i, c tc chm v khng kh thi vi d liu ln.
B 3-21

Vi " v  l hai nh bt k. T th A, ta xy dng th A bng cch chp


hai nh " v  thnh mt nh duy nht, k hiu ", cc cnh ni " vi  b hy
b, cc cnh lin thuc vi ch " hoc  c chnh li u mt tr thnh
cnh lin thuc vi ". Khi yF@A c th thu c bng ly lt ct c
lu lng nh nht trong hai lt ct:

220

Lt ct " C  hp nht: Coi " l nh pht v  l nh thu, lt ct " C  hp


nht c th xc nh bng vic gii quyt bi ton lung cc i trn mng
A.
Lt ct tng qut hp nht trn A : yF@A .
Chng minh

Xt lt ct tng qut hp nht trn A c th a " v  vo hai thnh phn lin


thng khc nhau hoc a chng vo cng mt thnh phn lin thng. Trong
trng hp th nht, yF@A l lt ct " C  hp nht. Trong trng hp th
hai, yF@A l yF@A .

B 3-21 cho php chng ta xy dng mt thut ton tt hn: Nu th ch


gm 2 nh th ch vic ct ri hai nh vo hai tp. Nu khng, ta chn hai nh
bt k "8  lm nh pht v nh thu, tm lung cc i v ghi nhn lt ct " C 
hp nht. Tip theo ta chp hai nh "8  thnh mt nh " v lp li vi th
A Cui cng l ch ra lt ct " C  hp nht trong s tt c cc lt ct c
ghi nhn. Phng php ny i hi phi thc hin a C ln tm lung cc
i, tuy c s ci thin v tc nhng cha phi tht tt.

Nhn xt rng ti mi bc ca cch gii trn, chng ta c th chn hai nh "8 


bt k min sao " d . V vy ngi ta mun tm mt cch chn cp nh "8 
mt cch hp l ti mi bc c th ch ra ngay lt ct " C  hp nht m
khng cn tm lung cc i. Thut ton di y [37] l mt trong nhng thut
ton hiu qu da trn tng .
Vi  l mt tp con ca tp nh a v l mt nh khng thuc . nh ngha
lc ht ca  i vi l tng trng s cc cnh ni vi cc nh thuc :
l8 6 9

B 3-22

<8m5s
m5

l

Bt u t tp  ch gm mt nh bt k
5 a, ta c tm mt nh b  ht
cht nht kt np thm vo  cho ti khi  a. Gi " v  l hai nh c kt
np cui cng theo cch ny. Khi lt ct a C 698 69 l lt ct " C  hp
nht.

221

Chng minh

Xt mt lt ct " C  bt k , ta s chng minh rng lu lng ca lt ct


a C 698 69 khng ln hn lu lng ca lt ct .

Mt nh  c gi l nh hot tnh nu  v nh c a vo  lin trc 


b ri vo hai pha ca lt ct . Gi  l tp cc nh c kt np vo  trc
nh  , l lt ct hn ch trn  69 (Lt ct dng ng cch phn
hoch ca lt ct nhng ch quan tm ti tp nh  69). Gi l  l lu
lng ca lt ct , l  l lu lng ca lt ct .
Trc ht ta s dng php quy np ch ra rng nu @ l nh hot tnh th:
l 8 6@9 N l 

(3.6)

l 8 69 l 8 69  l C  8 69

(3.7)

Nu @ l nh hot tnh u tin c kt np vo  , lt ct s chia tp


 6@9 lm hai tp, mt tp l  v mt tp l 6@9, khi ta c l 8 6@9 cng
chnh l l . Gi thit rng bt ng thc (3.6) ng vi nh hot tnh @, ta s
chng n cng ng vi nhng nh hot tnh  c kt np vo  sau @. Tht
vy,
Do  phi ht @ mnh hn , kt hp vi gi thit quy np, ta c:
l 8 69 N l 8 6@9 N l 

Hng t l C  8 69 l tng trng s cc cnh ni gia  v  C  . Do @ v


 l hai nh hot tnh lin tip, cc cnh ny s ni gia hai pha ca lt ct v
c ng gp trong php tnh l , mt khc do   6@9 nn nhng cnh ny
khng ng gp trong php tnh l . Vy t cng thc (3.7), ta suy ra:
l 8 69 l 8 69  l C  8 69
N l   l C  8 69
N l 

(3.8)

la C 698 69 l 8 69


N l  
l 

(3.9)

V l mt lt ct " C  nn chc chn " v  nm hai pha khc nhau ca lt ct


, hay ni cch khc,  l nh hot tnh. Bt ng thc (3.6) chng minh trn
cho ta kt qu:

Ta chng minh c lt ct a C 698 69 l lt ct " C  hp nht.

222

nh l 3-23
Vic tm lt ct tng qut trn th v hng lin thng vi hm trng s
khng m c th c thc hin bng thut ton trong thi gian $a+ %&'a 
a.
Chng minh

Bt u t tp  ch gm mt nh bt k, ta m rng  bng cch ln lt kt np


vo  nh b ht cht nht cho ti khi  a. Vic ny c thc hin vi k
thut tng t nh thut ton Prim: vi L , ta k hiu nhn   l lc ht
ca  i vi nh . khi  c kt np thm mt @ th cc nhn lc ht ca
nhng nh  khc s c cp nht li theo cng thc:
  z  
 l@8 8 L@8  5 

Bng vic t chc cc nh ngoi  trong mt hng i u tin dng Fibonacci


Heap, vic m rng tp  cho ti khi  a c thc hin trong thi gian
$a %&'a  . Trong qu trnh , " v  l hai nh cui cng c kt np
vo  cng c xc nh v yF@A c cp nht theo lt ct " C  hp
nht. Sau hai nh "8  c chp vo v thut ton lp li vi th A . Tng
cng ta c a C ln lp, suy ra lt ct tng qut hp nht c th tm c trong
thi gian $a+ %&'a  a.
Mc d tnh ng ng ca thut ton c chng minh da vo l thuyt v
lung cc i v lt ct hp nht, vic ci t thut ton li kh n gin v khng
ng chm g n lung cc i.

Bi tp

2.27. Cho ( v + l hai lung trn mng A a8 8 l8 "8  v  l mt s thc


nm trong on 78 . Xt nh x:
 M  G
   (    C + 

Chng minh rng  cng l mt lung trn mng A vi gi tr lung:


 (   C +

2.28. Cho  l mt lung trn mng A a8 8 l8 "8 , chng minh rng vi
L 5 , ta c:
223

l   l C l  lC

2.29. Cho  l lung cc i trn mng A a8 8 l8 "8 , gi l tp cc nh


n c  bng mt ng thng d trn A v a C . Chng minh
rng 8  l lt ct " C  hp nht ca mng A.

2.30. Vit chng trnh nhn vo mt th c hng A a8  vi hai nh


phn bit " v  v tm mt tp gm nhiu ng i nht t " ti  sao cho
cc ng i trong tp ny i mt khng c cnh chung.
Gi

Coi " l nh pht v  l nh thu, cc cung u c sc cha 1. Tm lung


cc i trn mng bng thut ton Ford-Fulkerson, theo nh l 3-19 (nh
l v tnh nguyn), lung trn cc cung ch c th l 0 hoc 1. Loi b cc
cung c lung 0 v ch gi li cc cung c lung 1. Tip theo ta tm mt
ng i t " ti , chn ng i ny vo tp hp, loi b tt c cc cung
dc trn ng i ny khi th v lp li, thut ton s kt thc khi
th khng cn cnh no (khng cn ng i t " ti ).

V k thut ci t, ta c th tm mt ng i t " ti  trn th A, o


chiu tt c cc cung trn ng i ny v lp li cho ti khi khng cn
ng i t " ti  na. C th thy rng th A ti mi bc chnh l
th cc cung thng d v ng i tm c mi bc chnh l ng
tng lung.

th A gi y khng cn ng i t " ti , ta tm mt ng i t 
v ", kt np ng i theo chiu ngc li (t " ti ) vo tp hp, xa b
tt c cc cung trn ng i v c tip tc nh vy cho ti khi khng cn
ng i t  v " na.

2.31. Tng t nh Bi tp 2.29 nhng yu cu thc hin trn th v hng.

2.32. (H i din phn bit) Mt lp hc c  bn nam v  bn n. Nhn ngy


8/3, lp c mua  mn qu cc bn nam tng cc bn n. Mi mn qu
c th thuc s thch ca mt s bn trong lp.
Hy lp chng trnh tm cch phn cng tng qu tha mn:

224





Mi bn nam phi tng qu cho ng mt bn n v mi bn n phi nhn


qu ca ng mt bn nam. Mn qu c tng phi thuc s thch ca c
hai ngi.
Mn qu no c mt bn nam chn tng th bn nam khc khng
c chn na.
Gi : Xy dng mt mng trong tp nh a gm 3 lp nh k, v :

Lp nh pht k 6"( 8 "+ 8 8 ". 9, mi nh tng ng vi mt bn nam.


Lp nh  ( 8 + 8 8 .  mi nh tng ng vi mt mn qu.
Lp nh thu  6( 8 + 8 8 . 9 mi nh tng ng vi mt bn n.

Nu bn nam  thch mn qu , ta cho cung ni t "2 ti I , nu bn n b


thch mn qu , ta cho cung ni t I ti  . Sc cha ca cc cung t

bng 1 v sc cha ca cc nh ( 8 + 8 8 . cng t bng 1. Tm lung


nguyn cc i trn mng A c  nh pht,  nh thu, ng thi c c
rng buc sc cha trn cc nh, nhng cung c lung 1 s ni gia mt
mn qu v ngi tng/nhn tng ng.

2.33. Cho mng in gm  Y  im nm trn mt li 


hng,  ct. Mt s im nm trn bin ca li l
ngun in, mt s im trn li l cc thit b s
dng in. Ngi ta ch cho php ni dy in gia
hai im nm cng hng hoc cng ct. Hy tm cch
t cc dy in ni cc thit b s dng in vi
ngun in sao cho hai ng dy bt k ni hai thit b s dng in vi
ngun in tng ng ca chng khng c c im chung.
2.34. (K thut gin sc cha) Cho mng A a8 8 l8 8 "8  vi sc cha
nguyn: lM  G . Gi F z n5s l.

a) Chng minh rng lt ct " C  hp nht ca A c lu lng khng vt


qu F

b) Vi mt s nguyn , tm thut ton xc nh ng tng lung c gi


tr thng d w  trong thi gian $.

c) Chng minh rng thut ton sau y tm c lung cc i trn mng


A:

225

procedure MaxFlowByScaling;
begin
f := Lung 0;
k := C; //k l sc cha ln nht ca mt cung trong E
while k 1 do
begin
while Tm c ng tng lung P
c gi tr thng d k do
Tng lung dc theo ng P;
k := k div 2;
end;
end;

d) Chng minh rng khi bc vo mi lt lp ca vng lp:


while k 1 do...

Lu lng ca lt ct hp nht trn mng thng d A khng vt qu


;.

e) Chng minh rng trong mi lt lp ca vng lp:


while k 1 do...

Vng lp while bn trong thc hin $ ln vi mi gi tr ca .

f) Chng minh rng thut ton trn (maximum flow by scaling) c th ci


t tm lung cc i trn A trong thi gian $+ %&' F.

4. B ghp cc i trn th hai pha


4.1. th hai pha

th v hng A a8  c gi l th hai pha nu tp nh a ca n c


th chia lm hai tp con ri nhau: v sao cho mi cnh ca th u ni
mt nh thuc vi mt nh thuc . Khi ngi ta cn k hiu A
 8 . thun tin trong trnh by, ta gi cc nh thuc l cc _nh
v cc nh thuc l cc _nh.

226

Hnh 2.12. th hai pha

Mt th v hng l th hai pha nu v ch nu tng thnh phn lin thng


ca n l th hai pha. kim tra mt th v hng lin thng c phi
th hai pha hay khng, ta c th s dng mt thut ton tm kim trn th
(BFS hoc DFS) bt u t mt nh " bt k. t:
z tp cc nh n c t " qua mt s chn cnh
z tp cc nh n c t " qua mt s l cnh

Nu tn ti cnh ca th ni hai nh 5 hoc hai nh 5 th th cho


khng phi th hai pha, ngc li th cho l th hai pha vi cch
phn hoch tp nh thnh hai tp 8 trn.
th hai pha gp rt nhiu m hnh trong thc t. Chng hn quan h hn
nhn gia tp nhng ngi n ng v tp nhng ngi n b, vic sinh vin
chn trng, thy gio chn tit dy trong thi kho biu v.v

4.2. Bi ton tm b ghp cc i trn th hai pha

Cho th hai pha A  8 . Mt b ghp (matching) ca A l mt tp


cc cnh i mt khng c nh chung. C th coi mt b ghp l mt tp
y  sao cho trn th  8 y, mi nh c bc khng qu 1.

Vn t ra l tm mt b ghp ln nht (maximum matching) (c nhiu cnh


nht) trn th hai pha cho trc.

4.3. M hnh lung

nh hng cc cnh ca A thnh cung t sang . Thm vo nh pht gi "


v cc cung ni t " ti cc _nh, thm vo nh thu gi  v cc cung ni t
227

cc _nh ti . Sc cha ca tt c cc cung c t bng 1, ta c mng


A . Xt mt lung trn mng A c lung trn cc cung l s nguyn, khi c
th thy rng nhng cung c lung bng 1 t sang s tng ng vi mt b
ghp trn A. Bi ton tm b ghp cc i trn A c th gii quyt bng cch tm
lung nguyn cc i trn A .

"

Hnh 2.13. M hnh lung ca bi ton tm b ghp cc i trn th hai pha.

Chng ta s phn tch mt s c im ca ng tng lung trong trng hp


ny tm ra mt cch ci t n gin hn.
Xt th hai pha A  8  v mt b ghp y trn A.


Nhng nh thuc y gi l nhng nh ghp (matched vertices), nhng


nh khng thuc y gi l nhng nh cha ghp (unmached vertices).
Nhng cnh thuc y gi l nhng cnh ghp, nhng cnh khng thuc
y c gi l nhng cnh cha ghp.
Nu nh hng li nhng cnh ca th thnh cung: Nhng cnh cha
ghp nh hng t sang , nhng cnh ghp nh hng ngc li t
v . Trn th nh hng , mt ng i c gi l ng pha
(alternating path) v mt ng i t mt _nh cha ghp ti mt
_nh cha ghp gi l mt ng m (augmenting path).

Dc trn mt ng pha, cc cnh ghp v cha ghp xen k nhau. ng


m cng l mt ng pha, i qua mt s l cnh, trong s cnh cha ghp
nhiu hn s cnh ghp ng mt cnh.
V d vi th hai pha trong hnh 2.14 v mt b ghp 6 ( 8 >( 8  + 8 >+ 9.
ng i 8 >+ 8 + 8 >( l mt ng pha, ng i 8 >+ 8 + 8 >( 8 ( 8 > l mt
ng m.
228

Hnh 2.14. th hai pha v cc cnh c nh hng theo mt b ghp

ng m thc cht l ng tng lung vi gi tr thng d 1 trn m hnh


lung. nh l 3-11 (mi quan h gia lung cc i, ng tng lung v lt
ct hp nht) ch ra rng iu kin cn v mt b ghp y l b ghp
cc i l khng tn ti ng m ng vi y.

Nu tn ti ng m B ng vi b ghp y, ta m rng b ghp bng cch: dc


trn ng B loi b nhng cnh ghp khi y v thm nhng cnh cha
ghp vo y. B ghp mi thu c s c lc lng nhiu hn b ghp c ng
mt cnh. y thc cht l php tng lung dc trn ng B trn m hnh
lung.

4.4. Thut ton ng m


T m hnh lung ca bi ton, chng ta c th xy dng c thut ton tm b
ghp cc i da trn c ch tm ng m v tng cp: Thut ton khi to
mt b ghp bt k trc khi bc vo vng lp chnh. Ti mi bc lp, ng
m (thc cht l mt ng i t mt _nh cha ghp ti mt _nh cha
ghp) c tm bng BFS hoc DFS v b ghp s c m rng da trn
ng m tm c.
M := Mt b ghp bt k, chng hn: ;
while Tm c ng m P do
begin
Dc trn ng P:
- Loi b nhng cnh ghp khi M
- Thm nhng cnh cha ghp vo M

end;

229

V d vi th trong hnh 2.14 v b ghp y 6 ( 8 >( 8  + 8 >+ 9, thut ton s


tm c ng m:
 +  >( G
 (  >
 >+ G
5

5

Dc trn ng m ny, ta loi b hai cnh >+ 8 +  v >( 8 (  khi b ghp v


thm vo b ghp ba cnh  8 >+ ,  + 8 >( ,  ( 8 > , c b ghp mi 3 cnh.
th vi b ghp mi khng cn nh cha ghp (khng cn ng m) nn y
chnh l b ghp cc i (h.2.15).

Hnh 2.15. M rng b ghp

4.5. Ci t

Chng ta s ci t thut ton tm b ghp cc i trn th hai pha A


 8 , trong ,  v  . Cc _nh c nh s t
1 ti  v cc _nh c nh s t 1 ti . Khun dng Input/Output nh
sau:
Input


Dng 1 cha ba s nguyn dng 8 8  ln lt l s _nh, s _nh


v s cnh ca th hai pha. 8  N 7  N 7 .
 dng tip theo, mi dng cha hai s nguyn dng 8 b tng ng vi
mt cnh g 2 8 > h ca th.

Output

B ghp cc i trn th.

230

Sample Input

Sample Output

3 3 5

1: x[2] - y[1]

3 2

2: x[3] - y[2]

2 2

3: x[1] - y[3]

2 1

1 3
1 1

a) Bi&
Bi&u di'
di'n "^
"^ th>
th> hai pha v b8
b8 ghp

th hai pha A  8  s c biu din bng cch danh sch k ca


cc _nh. C th l ta s s dng mng 
  vi cc phn t ban u
c khi to bng 0, mng
b  v mng  . Danh sch k
c xy dng ngay trong qu trnh c danh sch cnh: mi khi c mt cnh
2  8 > ta gn
b  z > , t   z 
  sau cp nht li

  z . Khi c xong danh sch cnh th danh sch k cng c xy
dng xong, khi duyt cc _nh k vi mt nh 5 , ta c th s dng
thut ton sau:
i := head[x]; //T u danh sch mc ni cc nh k x
while i 0 do
begin
X l nh adj[i];
i := link[i]; //Nhy sang phn t k tip trong danh sch mc ni
end;

B ghp trn th hai pha c biu din bi mng 


l >, trong

l b l ch s ca _nh ghp vi nh > . Nu > l nh cha ghp, ta

gn 
l b z 7.
b) Tm "FB
"FBng mB
mB

ng m thc cht l mt ng i t mt _nh cha ghp ti mt _nh


cha ghp trn th nh hng. Ta s tm ng m ti mi bc bng thut
ton DFS:

231

Bt u t mt nh 5 cha ghp, trc ht ta nh du cc _nh bng


mng

  trong

 b q nu nh > 5 cha thm v


 b n% nu nh > 5 thm (ch cn nh du cc _nh).

Thut ton DFS tm ng m xut pht t c thc hin bng mt th


tc quy a" , th tc ny s qut tt c nhng nh > 5 cha thm ni
t (d nhin qua mt cnh cha ghp), vi mi khi xt n mt nh > 5 ,
trc ht ta nh du thm >. Sau :


Nu > ghp, da vo s kin t > ch i n c 


l > qua mt
cnh ghp hng t v , li gi quy a"
l > c thc
hin thm lun nh 
l > 5 (thm lin hai bc).
Ngc li nu > cha ghp, tc l thut ton DFS tm c ng m kt
thc >, ta thot khi dy chuyn quy. Qu trnh thot dy chuyn
quy thc cht l ln ngc ng m, ta s li dng qu trnh ny m
rng b ghp da trn ng m.

thut ton hot ng hiu qu hn, ta s dng lin tip cc pha x l l: K


hiu l tp cc _nh cha ghp, mi pha s c gng m rng b ghp da
trn khng ch mt m nhiu ng m khng c nh chung xut pht t cc
nh khc nhau thuc . C th l mt pha s khi to mng nh du


  bi gi tr q, sau qut tt c nhng nh 5 , th tm
ng m xut pht t v m rng b ghp nu tm ra ng m. Trong mt
pha c th c nhiu _nh c ghp thm.
procedure Visit(x 5X); //Thut ton DFS
begin
for Ly: (x, y)5 E do //Qut cc Y_nh k x
if avail[y] then //y cha thm, ch (x, y) chc chn l cnh cha ghp
begin
avail[y] := False; //nh du thm y
if match[y] = 0 then Found := True
//y cha ghp, dng c bo tm thy ng m

else Visit(match[y]); //y ghp, gi quy tip tc DFS


if Found then // Ngay khi ng m c tm thy
begin
match[y] := x; //Chnh li b ghp theo ng m
232

Exit; //Thot lun, lnh Exit t y s thot c dy chuyn quy


end;
end;
end;
begin //Thut ton tm b ghp cc i trn th hai pha
Khi to mt b ghp bt k, chng hn ;
X* := Tp cc nh cha ghp;
repeat //Lp cc pha x l theo l
Old := |X*|; //Lu s nh cha ghp khi bt u pha
for Ly 5 Y do avail[y] := True; //nh du mi Y_nh cha thm
for Lx 5 X* do
begin
Found := False; //C bo cha tm thy ng m
Visit(x); //Tm ng m bng DFS
if Found then X* := X* - {x};
//x c ghp, loi b x khi X*

end;
until |X*| = Old; //Lp cho ti khi khng th ghp thm
end;

BMATCH.PAS  Tm b ghp cc i trn th hai pha


{$MODE OBJFPC}
program MaximumBipartiteMatching;
const
maxN = 10000;
maxM = 1000000;
var
p, q, m: Integer;
adj: array[1..maxM] of Integer;
link: array[1..maxM] of Integer;
head: array[1..maxN + 1] of Integer;
match: array[1..maxN] of Integer;
avail: array[1..maxN] of Boolean;
List: array[1..maxN] of Integer;
nList: Integer;
procedure Enter; //Nhp d liu
var i, x, y: Integer;
begin

233

ReadLn(p, q, m);
FillChar(head[1], p * SizeOf(head[1]), 0);
for i := 1 to m do
begin
ReadLn(x, y); //c mt cnh (x, y), a y vo danh sch k ca x
adj[i] := y;
link[i] := head[x];
head[x] := i;
end;
end;
procedure Init; //Khi to b ghp rng
var i: Integer;
begin
FillChar(match[1], q * SizeOf(match[1]), 0);
for i := 1 to p do List[i] := i;
//Mng List cha nList X_nh cha ghp

nList := p;
end;
procedure SuccessiveAugmentingPaths;
var
Found: Boolean;
Old, i: Integer;
procedure Visit(x: Integer); //Thut ton DFS t xX
var i, y: Integer;
begin
i := head[x]; //T u danh sch k ca x
while i <> 0 do
begin
y := adj[i]; //Xt mt nh yY k x
if avail[y] then //y cha thm, hin nhin (x, y) l cnh cha ghp
begin
avail[y] := False; //nh du thm y
if match[y] = 0 then Found := True
//y cha ghp th bo hiu tm thy ng m

else Visit(match[y]);
//Thm lun match[y]X (thm lin 2 bc)

if Found then //Tm thy ng m


begin
match[y] := x; //Chnh li b ghp
234

Exit; //Thot dy chuyn quy


end;
end;
i := link[i]; //Chuyn sang nh k tip trong danh sch cc nh k x
end;
end;
begin
repeat
Old := nList; //Lu li s X_nh cha ghp
FillChar(avail[1], q * SizeOf(avail[1]), True);
for i := nList downto 1 do
begin
Found := False;
Visit(List[i]); //C ghp List[i]
if Found then //Nu ghp c
begin //Xa List[i] khi danh sch cc X_nh cha ghp
List[i] := List[nList];
Dec(nList);
end;
end;
until Old = nList; //Khng th ghp thm X_nh no na
end;
procedure PrintResult; //In kt qu
var j, k: Integer;
begin
k := 0;
for j := 1 to q do
if match[j] <> 0 then
begin
Inc(k);
WriteLn(k, ': x[', match[j], '] - y[', j, ']');
end;
end;
begin
Enter;
Init;
SuccessiveAugmentingPath;
PrintResult;
235

end.

Nu th c  nh (   ) v  cnh, do mng nh du

 
ch c khi to mt ln trong pha, thi gian thc hin ca mt pha s bng
$   (suy ra t thi gian thc hin gii thut ca DFS).

Cc pha s c thc hin lp cho ti khi hoc khi mt pha thc hin
xong m khng ghp thm c nh no. Thut ton cn khng qu  ln thc
hin pha x l l, nn thi gian thc hin gii thut tm b ghp cc i trn
th hai pha l $+   trong trng hp xu nht. Cn trong trng hp tt
nht, ta c th tm c b ghp cc i ch qua mt lt thc hin pha x l l,
tc l bng thi gian thc hin gii thut DFS. Cn lu rng y ch l nhng
nh gi $ ln v cn trn ca thi gian thc hin. Thut ton ny chy rt
nhanh trn thc t nhng hin ti cha c nh gi no cht hn.
tng tm mt lc nhiu ng m khng c nh chung c nghin cu
trong bi ton lung cc i bi Dinic[10]. Da trn tng ny, Hopcroft v
Karp[21] tm ra thut ton tm b ghp cc i trn th hai pha trong thi

gian $ fai. Thut ton Hopcroft-Karp trc ht s dng BFS phn lp


cc nh theo di ng i ngn nht sau mi s dng DFS trn rng cc
cy BFS x l l tng t nh cch lm ca chng ta trn.

Bi tp

2.35. C  th v  vic. Mi th cho bit mnh c th lm c nhng vic


no, v mi vic khi giao cho mt th thc hin s c hon thnh xong
trong ng 1 n v thi gian. Ti mt thi im, mi th ch thc hin
khng qu mt vic.
Hy phn cng cc th lm cc cng vic sao cho:



Mi vic ch giao cho ng mt th thc hin.


Thi gian hon thnh tt c cc cng vic l nh nht. Ch l cc th c
th thc hin song song cc cng vic c giao, vic ca ai ngi ny lm,
khng nh hng ti ngi khc.

236

3.36. Mt b ghp y trn th hai pha gi l ti i nu vic b sung thm bt


c cnh no vo y s lm cho y khng cn l b ghp na.

a) Ch ra mt v d v b ghp ti i nhng khng l b ghp cc i trn


th hai pha

b) Tm thut ton $ xc nh mt b ghp ti i trn th hai


pha
c) Chng minh rng nu  v H l hai b ghp ti i trn cng mt th
hai pha th  N ;H v H N ;. T ch ra rng nu thut ton
ng m c khi to bng mt b ghp ti i th s lt tm ng
m gim i t nht mt na so vi vic khi to bng b ghp rng.

3.37. (Ph nh Vertex Cover) Cho th hai pha A  8 . Bi ton


t ra l hy chn ra mt tp F gm t nht cc nh sao cho mi cnh 5 
u lin thuc vi t nht mt nh thuc F.

Bi ton tm ph nh nh nht trn th tng qut l NP-y , hin ti


cha c thut ton a thc gii quyt. Tuy vy trn th hai pha, ph
nh nh nht c th tm c da trn b ghp cc i.
Da vo m hnh lung ca bi ton b ghp cc i, gi s cc cung
8  c sc cha , cc cung "8  v 8  c sc cha 1. Gi k8 
l lt ct hp nht ca mng. t F 6 5 9 6> 5 k9.

a) Chng minh rng F l mt ph nh

b) Chng minh rng F l ph nh nh nht

c) Gi s ta tm c y l b ghp cc i trn th hai pha, khi chc


chn khng cn tn ti ng m tng ng vi b ghp y. t:
> 5 M 5 cha ghp8 n c > qua mt ng pha
6 5 M ghp v nh ghp vi khng thuc 9

Chng minh rng  8  l lt ct hp nht.

d) Xy dng thut ton tm ph nh nh nht trn th hai pha da trn


thut ton tm b ghp cc i.

3.38. Cho y l mt b ghp trn th hai pha A  8 . Gi  l s


_nh cha ghp. Chng minh rng ba mnh sau y l tng ng:

237





y l b ghp cc i.
A khng c ng m tng ng vi b ghp y.
Tn ti mt tp con  ca sao cho   C . y  l tp
cc _nh k vi mt nh no trong  (Gi : Chn  l tp cc
_nh n c t mt _nh cha ghp bng mt ng pha)

2.39. (nh l Hall) Cho A  8  l th hai pha c . Chng


minh rng A c b ghp y (b ghp m mi nh u c ghp) nu
v ch nu  N  vi mi tp  .

2.40. (Ph ng ti thiu) Cho A a8  l th c hng khng c chu


trnh. Mt ph ng (path cover) l mt tp B cc ng i trn A tha
mn: Vi mi nh  5 a, tn ti duy nht mt ng i trong B cha .
ng i c th bt u v kt thc bt c u, tnh c ng i di 0
(ch gm mt nh). Bi ton t ra l tm ph ng ti thiu (minimum
path cover): Ph ng gm t ng i nht.

Gi  l s nh ca th, ta nh s cc nh thuc a t 1 ti . Xy
dng th hai pha A  8   trong :
6 (8 +8 .9
6>( 8 >+ 8 >. 9

Tp cnh  c xy dng nh sau: Vi mi cung 8 b 5 , ta thm vo


mt cnh g 2 8 > h 5  (h.2.16)

238

>(

>+
>
>

>

B( 8V8\
B+ ;8X8T

>

Hnh 2.16. Bi ton tm ph ng ti thiu trn DAG c th quy v bi ton b ghp cc i trn
th hai pha.

Gi y l mt b ghp trn A . Khi to B l tp  ng i, mi ng i


ch gm mt nh trong A, khi B l mt ph ng. Xt ln lt cc
cnh ca b ghp, mi khi xt ti cnh g 2 8 > h ta t cnh 8 b ni hai

ng i trong B thnh mt ngKhi thut ton kt thc, B vn l mt


ph ng.

a) Chng minh tnh bt bin vng lp: Ti mi bc khi xt ti cnh


g 2 8 > h 5 y, cnh 8 b 5  chc chn s ni hai ng i trong B: mt

ng i kt thc  v mt ng i khc bt u b. T ch ra tnh

ng n ca thut ton. (Gi : mi khi xt ti cnh g 2 8 > h 5 y v t


cnh 8 b ni hai ng i ca B thnh mt ng th B gim 1. Vy khi
thut ton trn kt thc, B  C y , tc l mun B G o th
y G n).

b) Vit chng trnh tm ph ng cc tiu trn th c hng khng


c chu trnh.
c) Ch ra v d thy rng thut ton trn khng ng trong trng hp A
c chu trnh.

d) Chng minh rng nu tm c thut ton gii bi ton tm ph ng


cc tiu trn th tng qut trong thi gian a thc th c th tm c
ng i Hamilton trn th (nu c) trong thi gian a thc. (L
239

thuyt v phc tp tnh ton chng minh c rng trn th tng


qut, bi ton tm ng i Hamilton l NP-y v bi ton tm ph
ng cc tiu l NP-kh. C ngha l mt thut ton vi phc tp a
thc gii quyt bi ton ph ng cc tiu trn th tng qut s l
mt pht minh ln v ng ngc nhin).
2.41. T tm hiu v thut ton Hopcroft-Karp. Ci t v so snh tc thc t
vi thut ton trong bi.
2.42. (B ghp cc i trn th chnh quy hai pha) Mt th v hng
A a8  gi l th chnh quy bc  (-regular graph) nu bc ca
mi nh u bng . th chnh quy bc 0 l th khng c cnh no,
th chnh quy bc 1 th cc cnh to thnh b ghp y , th chnh
quy bc 2 c cc thnh phn lin thng l cc chu trnh n.
a) Chng minh rng th hai pha A  8  l th chnh quy th
.

b) Chng minh rng lun tn ti b ghp y trn th hai pha chnh


quy bc  ( w .

c) Tm thut ton $ %&' tm mt b ghp y trn th


chnh quy bc  w .

240

You might also like