Professional Documents
Culture Documents
Tai Lieu Giao Khoa Chuyen Tin Quyen 2 PDF
Tai Lieu Giao Khoa Chuyen Tin Quyen 2 PDF
chuyn tin
quyn 2
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
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.
var i: Integer;
begin
for i := n downto p do a[i + 1] := a[i];
a[p] := v;
n := n + 1;
end;
Cng d dng chng minh c rng thi gian thc hin trung bnh ca php
chn l .
c) Xa ph
phn t
t kh
khi m
mng
info: TElement;
link: PNode;
end;
a) Truy c
c p ph
phn 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
phn t
t vo danh sch n!
n!i "#n
a
c
d
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
phn t
t kh
khi danh sch n!
n!i "#n:
Cng ging nh php chn, php xa mt phn t khi danh sch ni n cng
mt thi gian trung bnh thc hin.
info: TElement;
link: Integer;
end;
TList = array[1..max] of TNode;
var
Nodes: TList;
head: Integer;
e
"
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.
12
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
Chn
Xa
Mng
Danh sch ni n
Danh sch ni kp
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.4. Mt s nh phn
.
.3(
4 , trong
2 5 6789 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
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:
a) Bi&
Bi&u di'
di'n ng(n x*
x*p b+
b+ng m
mng
procedure Init;
begin
Stack.top := 0;
end;
//Hm kim tra ngn xp c rng khng?
end;
//y mt phn t x vo ngn xp
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
procedure Init;
begin
top := nil;
end;
//Kim tra ngn xp c rng khng
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
a) Bi&
Bi&u di'
di'n hng "0
"0i b+
b+ng m
mng
procedure Init;
begin
Queue.front := 1;
Queue.rear := 0;
end;
//Kim tra hng i c rng khng
19
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
!
!
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;
procedure Init;
begin
with Queue do
begin
front := 0;
rear := max - 1;
n := 0;
end;
end;
//Kim tra hng i c rng khng
begin
Result := Queue.n = 0;
end;
//Kim tra hng i c y khng
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
procedure Init;
begin
front := nil;
end;
//Kim tra hng i c rng khng
var p: PNode;
begin
New(p); //To mt nt mi
p^.info := x;
p^.link := nil;
//Ni nt vo danh sch
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
II
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.
27
Y
C
V
U
T
TZ; V Y W C X
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
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).
b) Bi&
Bi&u di'
di'n b+
b+ng c6
c6u trc lin k*
k*t
"0[ V
!" \
P
6
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)
32
33
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
2
B
5
C
7
F
10
11
12
13
14
15
D
C
D
Hnh 1.15. Nhc im ca phng php biu din cy nh phn bng mng
35
![
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:
37
?
P
H
Q
Hnh 1.17
?8 P8 H8 8 F8 8 Q8 A8 =
38
3.5. Cy k-phn
8 F8 H8 8 P8 A8 =8 Q8 ?
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.
39
Bi tp
nm bn tri >
nm bn phi >
l tin bi thc s ca >
> l tin bi thc s ca
U
T
C
X
e
TZ; X Y e C V
41
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.
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).
43
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
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.
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
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
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
')':
//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
Ngn xp
Output
y ( vo ngn xp
Hin th
y / vo ngn xp
(/
Hin th
(/
62
(+
62/
(+
62/4
62/4+
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
62/4+83-
62/4+83-
4
)
Ht
Ch thch
/ > (
( < + < /
- > )
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 - *
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
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
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
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)
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:
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
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.
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
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:
if (Result = nilT)
or (x = Result^.right) then Break;
x := Result; //Nu khng th i tip ln pha gc
until False;
end;
57
if (Result = nilT)
or (x = Result^.left) then Break;
x := Result; //i tip ln pha gc
until False;
end;
e) Tm ki*
ki*m
else x := x^.right;
//k chc chn khng nm trong cy con tri, tm trong cy con phi
Result := x;
end;
58
f) Chn
end;
59
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:
60
>
>
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
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 .
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
~
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
>
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);
end
else //Quay tri
begin
branch := x^.left;
SetLink(y, branch, False);
//Chuyn nhnh gc branch^ ca x^ sang lm con phi y^
63
end;
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
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.
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
$.
67
0
0
10
1
011
100
1
1011
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 $%' .
68
.U,
g $Uh
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
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.
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
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).
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.
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.
end;
72
>
l nhnh tri
Quay phi
H!
l
>
H!
l
>
l nhnh phi
Quay tri
H!
l
>
H!
l
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
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
else Break;
until False;
Result := x;
end;
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
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
Trung bnh s php ! cn thc hin trong php chn ="! l 2.
75
c) Xa
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
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
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
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 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
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
81
Xa
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
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 <
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
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
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
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\88X. Bi ton t ra l cho trc hai s 8 hy xc nh hon v
Josephus 8 .
Thut ton
87
Input
Sample Input
Sample Output
7 3
3 6 2 7 5 1 4
88
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
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
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.
8 o
C C &p 8 o 1
(7.1)
Output f;
7.2. Th t thng k ng
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).
"8 6 5 M " O
"8 6 5 M " N
"8 6 5 M " O
N 9
O 9
O 9
N 9
92
78V
V
\8e
7
e8
;V
T87
7
!
T8;
V7
\8;V
;V
!["
W8
;7
;\8V7
V7
8;7
;7
;T8;T
;T
xE ![" z n xE
xE ![xE !["
(7.2)
94
end;
if (Result^.left^.rightmost a) then
Result := Result^.left //Sang tri
else Result := Result^.right; //Sang phi
end;
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.
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
7.4. Tm tt v k thut ci t
97
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
(7.3)
xE
"@
xE xE
"@
(7.4)
xE
"@ xE xE "@ xE "[
Gi tr t c khi cng ti mt nt no nhnh con phi, khi
xE
"@ xE xE "@ xE "[ xE ![xE
"@
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
( O + N 7 C7 N >( O >+ N 7 .
( 8 >( 8 + 8 >+ .
C7 N
Output
Sample Output
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
102
ng qut ngang
> V
3
2
1
0
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
Dng sn BST
Ci t
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
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
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)
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
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
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
Thi gian thc hin gii thut tm im giao nhiu nht ca hnh ch nht l
$ %' .
Bi tp
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.
111
+8
g V 8 8;8\8X8Th g8;8\8X8T8 V h
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.
113
+
(
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
78 nu "
8;8
8
8 nu d "
(1.1)
procedure Init;
begin
for Lv 5 V do d[v] := +;
d[s] := 0;
end;
@
l@8
117
Output
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;
(1.2)
w o 6@ @8 9
5
85s
(1.3)
w
{$MODE OBJFPC}
program BellmanFordShortestPath;
const
maxN = 10000;
maxM = 100000;
maxW = 100000;
maxD = maxN * maxW;
type
120
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
Bc 1: Khi to
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:
123
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
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]
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
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.
Kt hp vi hng i u tin
!
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).
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
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]
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
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
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
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.
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 .
{$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
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)
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.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
(1.5)
(1.6)
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
Ci t
Output
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
139
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
D thy rng thi gian thc hin gii thut Floyd l v chi ph b nh l
+ .
b) Thu
Thu t ton Johnson
141
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
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
142
nh l 1-3
Trng s
M G xc nh bi
@8 @8 @ C l mt hm
trng s khng m.
Chng minh
143
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 .
144
Bi tp
(8 +8 8 .
N 2 8 g2 5 h
(8 +8 8 .
tha
c th vit di dng
on
2.
bt u c t nht 2 thi
C
Rng buc ny
N C2 .
w 2 hay
C
N 2 cho
145
N (+
+
I
N +
N I (
(2.
(.
.Y.
cho bit
F 2
2<(
o6F9
147
o 6I 9 8 L 5 a
4I.3(
. C I
w 7 8 L 5 a
4I.3(
C
(Gi : S dng kt qu cu a)
n
. C I
7
4I.3(
C
o n
5
o n
5
149
V d c \ v 77+ . Ta c:
( 7+ 7
+ 7+
77+ ;
77+ \
77+
2
2 @8 2 @8 ;E 23( "8 @ C ;E 23( "8
2 2 ;E 23( "8 @ C ;E 23( "8
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. Cy khung nh nht
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.
152
5
1
1
2
Lt ct
nh l 2-1
H qu
nh ca lt ct ny. Theo nh
Output
Cy khung nh nht ca th
Sample Input
Sample Output
6 8
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
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
//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
156
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.
!
"
"
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
i := L + Random(H - L + 1);
pivot := e[i];
e[i] := e[L];
i := L;
j := H;
repeat
159
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.
8 C 88 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
+
;
,
.K ly tha
CV
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
b) K` thu
thu t ci ":
" :t
163
c
@
@8
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
{$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
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
end;
WriteLn('Weight = ', Weight);
end;
begin
Enter;
if Prim then PrintResult
else WriteLn('Graph is not connected!');
end.
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).
167
Bi tp
169
l l mt hm xc nh trn tp cung M
lM 78
l
171
b) Lu^
Lu^ng
5G
M
(3.1)
172
M 78
gn cho mi cung mt s thc khng m gi l lung dng trn cung
tha mn hai rng buc sau y:
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
CgC C h
CC
g C Ch
569G
C
C
569G
569G
569G
35G69
Nu d " v d , ta c:
C
C
B 3-2
M 78
n68 79
8 nu w 7
78 nu O 7
Chng minh
C
569G
4
569G
4
5G69
4
3569G
34
C 698 a
e) M8t s!
s! tnh ch6
ch6t c# b
b n
175
nh l 3-3
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
8 a 6@98 a
5
176
nh l 3-4
Gi tr lung trn mng bng tng lung trn cc cung i vo nh thu
Chng minh
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
(3.3)
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.
Cho l mt lung trn mng A a8 8 l8 "8 . Khi nu l mt lung trn
A th hm:
M
l
CgC Ch
C C
g h
569G
569G
569G
6@98 a 6@98 a
nh l 3-6
Tnh bo tn: Vi L 5 a
C 698 a
569G
569G
698
179
g C h
C
569G
a C 698 a
Thay @ ", ta c
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)
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
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
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
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
Output
182
Sample Input
Sample Output
6 8 1 6
Maximum flow:
5 6 6
4 6 6
3 5 1
3 4 3
2 5 3
2 4 6
1 3 5
1 2 5
6:3
5:5
4
6:6
3:3
6
3:2
5:4
3
1:1
6:3
5
@ l ch s cung u tin trong danh sch lin thuc cc cung i ra
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;
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.
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
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.
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
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
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.
ca
56G9
l l8
56G9
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
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
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
Ta chng minh rng @8 phi l cung bo ha trn A . Tht vy, nu @8 l
Tri vi gi thit rng khong cch t " ti phi gim i sau php tng lung.
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
"8 @ "8
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 @ ;
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
nh l 3-14
193
Cho mt mng A a8 8 l8 "8 . Mt tin lung (preflow) trn A l mt hm:
M
5G69
194
" a.
7.
@ N vi mi cung thng d @8 .
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
a8 o "
78 o
8 nu d 6"8 9
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;
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 B@"g @8 h s tnh lng lung ti a c th thm vo theo cung :
196
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
Php nng #@ thc hin trn nh @ nu cc iu kin sau c tha mn:
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 oM @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
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 oM @8 5 cng m bo rng @ N
.
198
Khi :
Trong (
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
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
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
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
#@ l @ phi l nh trn. Php # khng thay i tin lung nn sau php
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
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
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:
n6M l nh trn9
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.
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 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
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 .
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.
207
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.
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 .
208
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
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
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
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
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
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
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.
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.
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).
"
"(
"+
"
(
+
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
"
l C
"
Hnh 2.11.
B 3-20
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.
(3.5)
d d a
220
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
(3.6)
(3.7)
(3.8)
(3.9)
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
Bi tp
2.28. Cho l mt lung trn mng A a8 8 l8 "8 , chng minh rng vi
L 5 , ta c:
223
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.
224
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;
226
"
end;
229
5
4.5. Ci t
Output
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
gn
lb z 7.
b) Tm "FB
"FBng mB
mB
231
b n% nu nh > 5 thm (ch cn nh du cc _nh).
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
end;
until |X*| = Old; //Lp cho ti khi khng th ghp thm
end;
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)
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
Bi tp
236
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)
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
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.
240