You are on page 1of 264

Bi ton lit k

\
1[

MC LC
0. GII THIU...................................................................................................................................... 2
1. NHC LI MT S KIN THC I S T
HP....................................................................... 3
I. CHNH HP LP
...........................................................................................................................................3
II. CHNH HP KHNG
LP...........................................................................................................................3
III. HON V ......................................................................................................................................................3
IV. T HP.........................................................................................................................................................3
2. PHNG PHP SINH (GENERATE) ............................................................................................
5
I. SINH CC DY NH PHN DI
N.......................................................................................................6
II. LIT K CC TP CON K PHN
T........................................................................................................7
III. LIT K CC HON V
.............................................................................................................................9
3. THUT TON QUAY LUI .............................................................................................................
12
I. LIT K CC DY NH PHN DI
N...............................................................................................13
II. LIT K CC TP CON K PHN
T......................................................................................................14
III. LIT K CC CHNH HP KHNG LP CHP K
..............................................................................15
IV. BI TON PHN TCH S .....................................................................................................................16
V. BI TON XP HU.................................................................................................................................18
4. K THUT NHNH CN..............................................................................................................
22
I. BI TON TI U......................................................................................................................................22
II. S BNG N T
HP...............................................................................................................................22
III. M HNH K THUT NHNH CN .....................................................................................................22
IV. BI TON NGI DU LCH...................................................................................................................23
V. DY ABC ....................................................................................................................................................25

L Minh Hong

Bi ton lit k

\
2[

0. GII THIU
Trong thc t, c mt s bi ton yu cu ch r: trong mt tp cc i tng cho trc c bao
nhiu i tng tho mn nhng iu kin nht nh. Bi ton gi l bi ton m cu hnh t
hp.
Trong lp cc bi ton m, c nhng bi ton cn yu cu ch r nhng cu hnh tm c tho
mn iu kin cho l nhng cu hnh no. Bi ton yu cu a ra danh sch cc cu hnh c th
c gi l bi ton lit k t hp.
gii bi ton lit k, cn phi xc nh c mt thut ton c th theo ln lt xy dng
c tt c cc cu hnh ang quan tm. C nhiu phng php lit k, nhng chng cn phi p
ng c hai yu cu di y:
Khng c lp li mt cu hnh
Khng c b st mt cu hnh
C th ni rng, phng php lit k l phng k cui cng gii c mt s bi ton t hp
hin nay. Kh khn chnh ca phng php ny chnh l s bng n t hp. xy dng 1 t cu
hnh (con s ny khng phi l ln i vi cc bi ton t hp - V d lit k cc cch xp n13
ngi quanh mt bn trn) v gi thit rng mi thao tc xy dng mt khong 1 giy, ta phi mt
qung 31 nm mi gii xong. Tuy nhin cng vi s pht trin ca my tnh in t, bng phng
php lit k, nhiu bi ton t hp tm thy li gii. Qua , ta cng nn bit rng ch nn dng
phng php lit k khi khng cn mt phng php no khc tm ra li gii. Chnh nhng n
lc gii quyt cc bi ton thc t khng dng phng php lit k thc y s pht trin ca
nhiu ngnh ton hc.
Cui cng, nhng tn gi sau y, tuy v ngha khng phi ng nht, nhng trong mt s trng
hp ngi ta c th dng ln ngha ca nhau c. l:
Phng php lit k
Phng php vt cn trn tp phng n
Phng php duyt ton b

L Minh Hong

Bi ton lit k

\
3[

1. NHC LI MT S KIN THC I S T HP


Cho S l mt tp hu hn gm n phn t v k l mt s t nhin.
Gi X l tp cc s nguyn dng t 1 n k: X = {1, 2, ..., k}
I. CHNH HP LP
Mi nh x f: X S. Cho tng ng vi mi i X, mt v ch mt phn t f(i) S.
c gi l mt chnh hp lp chp k ca S.
Nhng do X l tp hu hn (k phn t) nn nh x f c th xc nh qua bng cc gi tr f(1), f(2),
..., f(k).
V d: S = {A, B, C, D, E, F}; k = 3. Mt nh x f c th cho nh sau:
i
1
2
3
f(i)
E
C
E
Nn ngi ta ng nht f vi dy gi tr (f(1), f(2), ..., f(k)) v coi dy gi tr ny cng l mt
chnh hp lp chp k ca S. Nh v d trn (E, C, E) l mt chnh hp lp chp 3 ca S. D dng
chng minh c kt qu sau bng quy np hoc bng phng php nh gi kh nng la chn:
S chnh hp lp chp k ca tp gm n phn t:
k

An n

II. CHNH HP KHNG LP


Khi f l n nh c ngha l vi i, j X ta c f(i) = f(j) i = j. Ni mt cch d hiu, khi dy gi
tr f(1), f(2), ..., f(k) gm cc phn t thuc S khc nhau i mt th f c gi l mt chnh hp
khng lp chp k ca S. V d mt chnh hp khng lp (C, A, E):
i
1
2
3
f(i)
C
A
E
S chnh hp khng lp chp k ca tp gm n phn t:
n!
A kn n(n 1)(n 2)...(n k 1)
(n k)!

III. HON V
Khi k = n. Mt chnh hp khng lp chp n ca S c gi l mt hon v cc phn t ca S.
V d: mt hon v: (A, D, C, E, B, F) ca S = {A, B, C, D, E, F}
i
1
2
3
4
5
6
f(i)
A
D
C
E
B
F
rng khi k = n th s phn t ca tp X = {1, 2, .., n} ng bng s phn t ca S. Do tnh cht
i mt khc nhau nn dy f(1), f(2), ..., f(n) s lit k c ht cc phn t trong S. Nh vy f l
ton nh. Mt khc do gi thit f l chnh hp khng lp nn f l n nh. Ta c tng ng 1-1 gia
cc phn t ca X v S, do f l song nh. Vy nn ta c th nh ngha mt hon v ca S l mt
song nh gia {1, 2, ..., n} v S.
S hon v ca tp gm n phn t = s chnh hp khng lp chp n:
Pn n!
IV. T HP
Mt tp con gm k phn t ca S c gi l mt t hp chp k ca S.
L Minh Hong

Ly mt tp con k phn t ca S, xt tt c k! hon v ca tp con ny. D thy rng cc hon v


l cc chnh hp khng lp chp k ca S. V d ly tp {A, B, C} l tp con ca tp S trong v d
trn th: (A, B, C), (C, A, B), (B, C, A), ... l cc chnh hp khng lp chp 3 c a S. iu tc l
khi lit k tt c cc chnh hp khng lp chp k th mi t hp chp k s c tnh k! ln. Vy:
S t hp chp k ca tp gm n phn t:
A nk
n!
k
Cn

k! k!(n k)!
S tp con ca tp n phn t:
0
Cn
C n 1 ... C nn (1 1)n 2n

2. PHNG PHP SINH (GENERATE)


Phng php sinh c th p dng gii bi ton lit k t hp t ra nu nh hai iu kin sau
tho mn:
1. C th xc nh c mt th t trn tp cc cu hnh t hp cn lit k. T c th xc
nh c cu hnh u tin v cu hnh cui cng trong th t xc nh
2. Xy dng c thut ton t cu hnh cha phi cu hnh cui, sinh ra c cu hnh k
tip n.
Phng php sinh c th m t nh sau:
<Xy dng cu hnh u tin>;
repeat
<a ra cu hnh ang c>;
<T cu hnh ang c sinh ra cu hnh k tip nu cn>;
until <ht cu hnh>;

Th t t in
Trn cc kiu d liu n gin chun, ngi ta thng ni ti khi nim th t. V d trn kiu s
th c quan h: 1 < 2; 2 < 3; 3 < 10; ..., trn kiu k t Char th cng c quan h 'A' < 'B'; 'C' < 'c'...
Xt quan h th t ton phn "nh hn hoc bng" k hiu "" trn mt tp hp S, l quan h hai
ngi tho mn bn tnh cht:
Vi a, b, c S
Tnh ph bin: Hoc l a b, hoc b a;
Tnh phn x: a a
Tnh phn i xng: Nu a b v b a th bt buc a = b.
Tnh bc cu: Nu c a b v b c th a c.
Trong trng hp a b v a b, ta dng k hiu "<" cho gn, (ta ngm hiu cc k hiu nh , >,
khi phi nh ngha)
V d nh quan h "" trn cc s nguyn cng nh trn cc kiu v hng, lit k l quan h th t
ton phn.
Trn cc dy hu hn, ngi ta cng xc nh mt quan h th t:
Xt a = (a1, a2, ..., an) v b = (b1, b2, ..., bn); trn cc phn t ca a1, ..., an, b1, ..., bn c quan h
th t "". Khi a b nu nh
Hoc ai = bi vi i: 1 i n.
Hoc tn ti mt s nguyn dng k: 1 k < n :
a1
=
b1
=
a2
b2
...
ak-1 =
bk-1
=
ak
bk
ak+1 <
bk+1
Trong trng hp ny, ta c th vit a < b.
Th t gi l th t t in trn cc dy di n.
Khi di hai dy a v b khng bng nhau, ngi ta cng xc nh c th t t in. Bng cch
thm vo cui dy a hoc dy b nhng phn t c bit gi l phn t di ca a v b bng

nhau, v coi nhng phn t ny nh hn tt c cc phn t khc, ta li a v xc nh th t t


in ca hai dy cng di. V d:
(1, 2, 3, 4) < (5, 6)

(a, b, c) < (a, b, c, d)

'calculator' < 'computer'

I. SINH CC DY NH PHN DI N
Mt dy nh phn di n l mt dy x = x1x2...xn trong xi {0, 1} (i : 1 i n).
D thy: mt dy nh phn x di n l biu din nh phn ca mt gi tr nguyn p(x) no nm
n

trong on [0, 2 - 1]. S cc dy nh phn di n = s cc s nguyn [0, 2 - 1] = 2 . Ta s lp


chng trnh lit k cc dy nh phn theo th t t in c ngha l s lit k ln lt cc dy nh
n

phn biu din cc s nguyn theo th t 0, 1,..., 2 -1.


V d: Khi n = 3, cc dy nh phn di 3 c lit k nh sau:
p(x)
0
1
2
3
4
5
6
7
x
000
001
010
011
100
101
110
111
Nh vy dy u tin s l 00...0 v dy cui cng s l 11...1. Nhn xt rng nu dy x = (x1, x2, ...,
xn) l dy ang c v khng phi dy cui cng th dy k tip s nhn c bng cch cng thm 1
( theo c s 2 c nh) vo dy hin ti.
V d khi n = 8:
Dy ang c:
cng thm 1:
Dy mi:

10010000
+ 1

Dy ang c:
cng thm 1:

10010001

Dy mi:

10010111
+ 1
10011000

Nh vy k thut sinh cu hnh k tip t cu hnh hin ti c th m t nh sau: Xt t cui


dy v u (xt t hng n v ln), gp s 0 u tin th thay n bng s 1 v t tt c cc phn
t pha sau v tr bng 0.
i := n;
while (i > 0) and (xi = 1) do i := i - 1;
if i > 0 then
begin
xi := 1;
for j := i + 1 to n do xj := 0;
end;

D liu vo (Input): nhp t file vn bn BSTR.INP cha s nguyn dng n 30


Kt qu ra(Output): ghi ra file vn bn BSTR.OUT cc dy nh phn di n.
BSTR.INP
3

BSTR.OUT
000
001
010
011
100
101
110
111

PROG02_1.PAS * Thut ton sinh lit k cc dy nh phn di n


program Binary_Strings;
const
max = 30;

var
x: array[1..max] of Integer;
n, i: Integer;
begin
{nh ngha li thit b nhp/xut chun}

Assign(Input, 'BSTR.INP'); Reset(Input);


Assign(Output, 'BSTR.OUT'); Rewrite(Output);
ReadLn(n);
FillChar(x, SizeOf(x), 0);
{Cu hnh ban u x1 = x2 = ... = xn := 0}
repeat
{Thut ton sinh}
for i := 1 to n do Write(x[i]);
{In ra cu hnh hin ti}
WriteLn;
i := n;
{xi l phn t cui dy, li dn i cho ti khi gp s 0 hoc khi i = 0 th dng}
while (i > 0) and (x[i] = 1) do Dec(i);
if i > 0 then
{Cha gp phi cu hnh 11...1}
begin
x[i] := 1;
{Thay xi bng s 1}
FillChar(x[i + 1], (n - i) * SizeOf(x[1]), 0);
{t xi + 1 = xi + 2 = ... = xn := 0}
end;
until i = 0;
{ ht cu hnh}
{ng thit b nhp xut chun, thc ra khng cn v BP s t ng ng Input v Output trc khi thot chng trnh}

Close(Input); Close(Output);
end.

II. LIT K CC TP CON K PHN T


Ta s lp chng trnh lit k cc tp con k phn t ca tp {1, 2, ..., n} theo th t t in
V d: vi n = 5, k = 3, ta phi lit k 10 tp con:
1.{1, 2, 3}
6.{1, 4, 5}

2.{1, 2, 4}
7.{2, 3, 4}

3.{1, 2, 5}
8.{2, 3, 5}

4.{1, 3, 4} 5.{1, 3, 5}
9.{2, 4, 5} 10.{3, 4, 5}

Nh vy tp con u tin (cu hnh khi to) l {1, 2, ..., k}.


Cu hnh kt thc l {n - k + 1, n - k + 2, ..., n}.
Nhn xt: Ta s in ra tp con bng cch in ra ln lt cc phn t ca n theo th t tng dn. T
, ta c nhn xt nu x = {x1, x2, ..., xk} v x1 < x2 < ... < xk th gii hn trn (gi tr ln nht c
th nhn) ca xk l n, ca xk-1 l n - 1, ca xk-2 l n - 2...
C th: gii hn trn ca xi = n - k + i;
Cn tt nhin, gii hn di ca xi (gi tr nh nht xi c th nhn) l xi-1 + 1.
Nh vy nu ta ang c mt dy x i din cho mt tp con, nu x l cu hnh kt thc c ngha l
tt c cc phn t trong x u t ti gii hn trn th qu trnh sinh kt thc, nu khng th ta
phi sinh ra mt dy x mi tng dn tho mn va ln hn dy c theo ngha khng c mt tp
con k phn t no chen gia chng khi sp th t t in.
V d: n = 9, k = 6. Cu hnh ang c x = {1, 2, 6, 7, 8, 9}. Cc phn t x3 n x6 t ti gii
hn trn nn sinh cu hnh mi ta khng th sinh bng cch tng mt phn t trong s cc x6, x5,
x4, x3 ln c, ta phi tng x2 = 2 ln thnh x2 = 3. c cu hnh mi l x = {1, 3, 6, 7, 8, 9}. Cu
hnh ny tho mn ln hn cu hnh trc nhng cha tho mn tnh cht va ln mun vy
ta li thay x3, x4, x5, x6 bng cc gii hn di ca n. Tc l:
x3 := x2 + 1 = 4
x4 := x3 + 1 = 5
x5 := x4 + 1 = 6
x6 := x5 + 1 = 7
Ta c cu hnh mi x = {1, 3, 4, 5, 6, 7} l cu hnh k tip. Nu mun tm tip, ta li nhn thy
rng x6 = 7 cha t gii hn trn, nh vy ch cn tng x6 ln 1 l c x = {1, 3, 4, 5, 6, 8}.
Vy k thut sinh tp con k tip t tp c x c th xy dng nh sau:

Tm t cui dy ln u cho ti khi gp mt phn t xi cha t gii hn trn n - k + i.


i := n;
while (i > 0) and (xi = n - k + i) do i := i - 1;

(1, 2, 6, 7, 8, 9);
Nu tm thy:
if i > 0 then

Tng xi ln 1.
xi := xi + 1;

(1, 3, 6, 7, 8, 9)
t tt c cc phn t pha sau xi bng gii hn di:
for j := i + 1 to k do xj := xj-1 + 1;

(1, 3, 4, 5, 6, 7)
Input: file vn bn SUBSET.INP cha hai s nguyn dng n, k (1 k n 30) cch nhau t nht
mt du cch
Output: file vn bn SUBSET.OUT cc tp con k phn t ca tp {1, 2, ..., n}
SUBSET.INP
5 3

SUBSET.OUT
{1, 2, 3}
{1, 2, 4}
{1, 2, 5}
{1, 3, 4}
{1, 3, 5}
{1, 4, 5}
{2, 3, 4}
{2, 3, 5}
{2, 4, 5}
{3, 4, 5}

PROG02_2.PAS * Thut ton sinh lit k cc tp con k phn t


program Combinations;
const
max = 30;
var
x: array[1..max] of Integer;
n, k, i, j: Integer;
begin
{nh ngha li thit b nhp/xut chun}

Assign(Input, 'SUBSET.INP'); Reset(Input);


Assign(Output, 'SUBSET.OUT'); Rewrite(Output);
ReadLn(n, k);
for i := 1 to k do x[i] := i;
{x1 := 1; x2 := 2; ... ; x3 := k (Cu hnh khi to)}
Count := 0;
{Bin m}
repeat
{In ra cu hnh hin ti}

Write('{');
for i := 1 to k - 1 do Write(x[i], ', ');
WriteLn(x[k], '}');
{Sinh tip}

i := k;
{xi l phn t cui dy, li dn i cho ti khi gp mt xi cha t gii hn trn n - k + i}
while (i > 0) and (x[i] = n - k + i) do Dec(i);
if i > 0 then
{Nu cha li n 0 c ngha l cha phi cu hnh kt thc}

begin
Inc(x[i]);
{Tng xi ln 1, t cc phn t ng sau xi bng gii hn di ca n}
for j := i + 1 to k do x[j] := x[j - 1] + 1;
end;
until i = 0;
{Li n tn 0 c ngha l tt c cc phn t t gii hn trn - ht cu hnh}
Close(Input); Close(Output);
end.

III. LIT K CC HON V


Ta s lp chng trnh lit k cc hon v ca {1, 2, ..., n} theo th t t in.
V d vi n = 4, ta phi lit k 24 hon v:
1.1234
7.2134
13.3124
19.4123

2.1243
8.2143
14.3142
20.4132

3.1324
9.2314
15.3214
21.4213

4.1342
10.2341
16.3241
22.4231

5.1423
11.2413
17.3412
23.4312

6.1432
12.2431
18.3421
24.4321

Nh vy hon v u tin s l (1, 2, ..., n). Hon v cui cng l (n, n-1, ... , 1).
Hon v s sinh ra phi ln hn hon v hin ti, hn th na phi l hon v va ln hn hon v
hin ti theo ngha khng th c mt hon v no khc chen gia chng khi sp th t.
Gi s hon v hin ti l x = (3, 2, 6, 5, 4, 1), xt 4 phn t cui cng, ta thy chng c xp gim
dn, iu c ngha l cho d ta c hon v 4 phn t ny th no, ta cng c mt hon v b
hn hon v hin ti!. Nh vy ta phi xt n x2 = 2, thay n bng mt gi tr khc. Ta s thay bng
gi tr no?, khng th l 1 bi nu vy s c hon v nh hn, khng th l 3 v c x1 = 3 ri
(phn t sau khng c chn vo nhng gi tr m phn t trc chn). Cn li cc gi tr 4, 5,
6. V cn mt hon v va ln hn hin ti nn ta chn x2 = 4. Cn cc gi tr (x3, x4, x5, x6) s
ly trong tp {2, 6, 5, 1}. Cng v tnh va ln nn ta s tm biu din nh nht ca 4 s ny gn
cho x3, x4, x5, x6 tc l (1, 2, 5, 6). Vy hon v mi s l (3, 4, 1, 2, 5, 6).
(3, 2, 6, 5, 4, 1) (3, 4, 1, 2, 5, 6).
Ta c nhn xt g qua v d ny: on cui ca hon v c xp gim dn, s x5 = 4 l s nh nht
trong on cui gim dn tho mn iu kin ln hn x2 = 2. Nu i ch x5 cho x2 th ta s c x2
= 4 v on cui vn c sp xp gim dn. Khi mun biu din nh nht cho cc gi tr
trong on cui th ta ch cn o ngc on cui.
Trong trng hp hon v hin ti l (2, 1, 3, 4) th hon v k tip s l (2, 1, 4, 3). Ta cng c th
coi hon v (2, 1, 3, 4) c on cui gim dn, on cui ny ch gm 1 phn t (4)
Vy k thut sinh hon v k tip t hon v hin ti c th xy dng nh sau:
Xc nh on cui gim dn di nht, tm ch s i ca phn t xi ng lin trc on cui .
iu ny ng ngha vi vic tm t v tr st cui dy ln u, gp ch s i u tin tha mn xi
< xi+1. Nu ton dy l gim dn, th l cu hnh cui.
i := n - 1;
while (i > 0) and (xi > xi+1) do i := i - 1;

Trong on cui gim dn, tm phn t xk nh nht tho mn iu kin xk > xi. Do on cui
gim dn, iu ny thc hin bng cch tm t cui dy ln u gp ch s k u tin tho mn
xk > xi (c th dng tm kim nh phn).
k := n;
while xk < xi do k := k - 1;

i ch xk v xi, lt ngc th t on cui gim dn (t xi+1 n xk) tr thnh tng dn.


Input: file vn bn PERMUTE.INP cha s nguyn dng n 12
Output: file vn bn PERMUTE.OUT cc hon v ca dy (1, 2, ..., n)
PERMUTE.INP
3

PERMUTE.OUT
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

PROG02_3.PAS * Thut ton sinh lit k hon v


program Permute;
const
max = 12;
var
n, i, k, a, b: Integer;
x: array[1..max] of Integer;
procedure Swap(var X, Y: Integer); {Th tc o gi tr hai tham bin X,
Y}

var
Temp: Integer;
begin
Temp := X; X := Y; Y := Temp;
end;
begin
Assign(Input, 'PERMUTE.INP'); Reset(Input);
Assign(Output, 'PERMUTE.OUT'); Rewrite(Output);
ReadLn(n);
for i := 1 to n do x[i] := i;
{Khi to cu hnh u: x1 := 1; x2 := 2; ..., xn := n}
repeat
for i := 1 to n do Write(x[i], ' ');
{In ra cu hnh hon v hin
ti}

WriteLn;
i := n - 1;
while (i > 0) and (x[i] > x[i + 1]) do Dec(i);
if i > 0 then
{Cha gp phi hon v cui (n, n-1, ... ,1)}
begin
k := n;
{xk l phn t cui dy}

while x[k] < x[i] do Dec(k);


{Li dn k tm gp xk u tin ln hn
xi }

Swap(x[k], x[i]);
a := i + 1; b := n;

{i ch xk v xi}
{Lt ngc on cui gim dn, a: u on, b: cui

on}

while a < b do
begin
Swap(x[a], x[b]);
{i ch xa v xb}
Inc(a);
{Tin a v li b, i ch tip cho ti khi a, b chm nhau}
Dec(b);
end;
end;
until i = 0;{Ton dy l dy gim dn - khng sinh tip c - ht cu hnh}
Close(Input); Close(Output);
end.

Bi tp:
1. Cc chng trnh trn x l khng tt trong trng hp tm thng, l trng hp n = 0 i
vi chng trnh lit k dy nh phn cng nh trong chng trnh lit k hon v, trng hp k = 0
i vi chng trnh lit k t hp, hy khc phc iu .
2. Lit k cc dy nh phn di n c th coi l lit k cc chnh hp lp chp n ca tp 2 phn t
{0, 1}. Hy lp chng trnh:
Nhp vo hai s n v k, lit k cc chnh hp lp chp k ca {0, 1, ..., n -1}.
Gi : thay h c s 2 bng h c s n.
3. Hy lit k cc dy nh phn di n m trong cm ch s "01" xut hin ng 2 ln.
Bi tp:
4. Nhp vo mt danh sch n tn ngi. Lit k tt c cc cch chn ra ng k ngi trong s n
ngi .
Gi : xy dng mt nh x t tp {1, 2, ..., n} n tp cc tn ngi. V d xy dng mt mng

Tn: Tn[1] := 'Nguyn vn A'; Tn[2] := 'Trn th B';.... sau lit k tt c cc tp con k phn t

ca tp {1, 2, ..., n}. Ch c iu khi in tp con, ta khng in gi tr s {1, 3, 5} m thay vo s in


ra {Tn[1], Tn [3], Tn[5]}. Tc l in ra nh ca cc gi tr tm c qua nh x
5. Lit k tt c cc tp con ca tp {1, 2, ..., n}. C th dng phng php lit k tp con nh trn
hoc dng phng php lit k tt c cc dy nh phn. Mi s 1 trong dy nh phn tng ng vi
mt phn t c chn trong tp. V d vi tp {1, 2, 3, 4} th dy nh phn 1010 s tng ng vi
tp con {1, 3}. Hy lp chng trnh in ra tt c cc tp con ca {1, 2, ..., n} theo hai phng php.
5. Nhp vo danh sch tn n ngi, in ra tt c cc cch xp n ngi vo mt bn
6. Nhp vo danh sch n ngi nam v n ngi n, in ra tt c cc cch xp 2n ngi vo mt
bn trn, mi ngi nam tip n mt ngi n.
7. Ngi ta c th dng phng php sinh lit k cc chnh hp khng lp chp k. Tuy nhin c
mt cch l lit k tt c cc tp con k phn t ca tp hp, sau in ra k! hon v ca n. Hy
vit chng trnh lit k cc chnh hp khng lp chp k ca {1, 2, ..., n}.
8. Lit k tt c cc hon v ch ci trong t MISSISSIPPI theo th t t in.
9. Lit k tt c cc cch phn tch s nguyn dng n thnh tng cc s nguyn dng, hai cch
phn tch l hon v ca nhau ch tnh l mt cch.
Cui cng, ta c nhn xt, mi phng php lit k u c u, nhc im ring v phng php
sinh cng khng nm ngoi nhn xt . Phng php sinh khng th sinh ra c cu hnh th
p nu nh cha c cu hnh th p - 1, chng t rng phng php sinh t ra u im trong trng
hp lit k ton b mt s lng nh cu hnh trong mt b d liu ln th li c nhc im v
t tnh ph dng trong nhng thut ton duyt hn ch. Hn th na, khng phi cu hnh ban u
lc no cng d tm c, khng phi k thut sinh cu hnh k tip cho mi bi ton u n gin
nh trn (Sinh cc chnh hp khng lp chp k theo th t t in chng hn). Ta sang mt chuyn
mc sau ni n mt phng php lit k c tnh ph dng cao hn, gii cc bi ton lit k
phc tp hn l: Thut ton quay lui (Back tracking).

3. THUT TON QUAY LUI


Thut ton quay lui dng gii bi ton lit k cc cu hnh. Mi cu hnh c xy dng
bng cch xy dng tng phn t, mi phn t c chn bng cch th tt c cc kh nng.
Gi thit cu hnh cn lit k c dng (x1, x2,..., xn). Khi thut ton quay lui thc hin qua cc
bc sau:
1) Xt tt c cc gi tr x1 c th nhn, th cho x1 nhn ln lt cc gi tr . Vi mi gi tr th
gn cho x1 ta s:
2) Xt tt c cc gi tr x2 c th nhn, li th cho x2 nhn ln lt cc gi tr . Vi mi gi tr
th gn cho x2 li xt tip cc kh nng chn x3 ... c tip tc nh vy n bc:
n) Xt tt c cc gi tr xn c th nhn, th cho xn nhn ln lt cc gi tr , thng bo cu hnh
tm c (x1, x2, ..., xn).
Trn phng din quy np, c th ni rng thut ton quay lui lit k cc cu hnh n phn t dng
(x1, x2, .., xn) bng cch th cho x1 nhn ln lt cc gi tr c th. Vi mi gi tr th gn cho x1 li
lit k tip cu hnh n - 1 phn t (x2, x3, ..., xn).
M hnh ca thut ton quay lui c th m t nh sau:
{Th tc ny th cho xi nhn ln lt cc gi tr m n c th nhn}

procedure Try(i: Integer);


begin
for (mi gi tr V c th gn cho xi) do
begin
<Th cho xi := V>;
if (xi l phn t cui cng trong cu hnh) then
<Thng bo cu hnh tm c>
else
begin
<Ghi nhn vic cho xi nhn gi tr V (Nu cn)>;
Try(i + 1); {Gi quy chn tip xi+1}

<Nu cn, b ghi nhn vic th xi := V, th gi tr khc>;


end;
end;
end;

Thut ton quay lui s bt u bng li gi Try(1)


Ta c th trnh by qu trnh tm kim li gii ca thut ton quay lui bng cy sau:
Try(1)

Try(2)

Try(3)

Try(2)

Try(3)

Try(3)

Hnh 1: Cy tm kim quay lui

Try(3)

I. LIT K CC DY NH PHN DI N
Input/Output vi khun dng nh trong PROG2_1.PAS
Biu din dy nh phn di N di dng (x1, x2, ..., xn). Ta s lit k cc dy ny bng cch th
dng cc gi tr {0, 1} gn cho xi. Vi mi gi tr th gn cho xi li th cc gi tr c th gn cho
xi+1.Chng trnh lit k bng thut ton quay lui c th vit:
PROG03_1.PAS * Thut ton quay lui lit k cc dy nh phn di n
program BinaryStrings;
const
max = 30;
var
x: array[1..max] of Integer;
n: Integer;
procedure PrintResult;

{In cu hnh tm c, do th tc tm quy Try gi khi tm ra mt cu

hnh}

var
i: Integer;
begin
for i := 1 to n do Write(x[i]);
WriteLn;
end;
procedure Try(i: Integer);

{Th cc cch chn

xi}

var
j: Integer;
begin
for j := 0 to 1 do
begin
x[i] := j;
if i = n then PrintResult
else Try(i + 1);

{Xt cc gi tr c th gn cho xi, vi mi gi tr }


{Th t xi}
{Nu i = n th in kt qu}
{Nu i cha phi l phn t cui th tm tip

xi+1}

end;
end;
begin
Assign(Input, 'BSTR.INP'); Reset(Input);
Assign(Output, 'BSTR.OUT'); Rewrite(Output);
ReadLn(n);
{Nhp d liu}
Try(1);
{Th cc cch chn gi tr x1}
Close(Input);
Close(Output);
end.

V d: Khi n = 3, cy tm kim quay lui nh sau:


Try(1)
x1 := 0

x1 := 1

Try(2)
x2 := 0

Try(3)
x3 := 0

000

x3 := 1

001

Try(2)

x2 := 1

x2 := 0

Try(3)
x3 := 0

010

Try(3)

x3 := 1

011

x3 := 0

100

x2 := 1

Try(3)

x3 := 1

101

x3 := 0

110

x3 := 1

111

result

Hnh 2: Cy tm kim quay lui trong bi ton lit k dy nh phn

II. LIT K CC TP CON K PHN T


Input/Output c khun dng nh trong PROG02_2.PAS
lit k cc tp con k phn t ca tp S = {1, 2, ..., n} ta c th a v lit k cc cu hnh (x1, x2,
..., xk) y cc xi S v x1 < x2 < ... < xk. Ta c nhn xt:
xk n
xk-1 xk - 1 n - 1
...

xi n - k + i
...

x1 n - k + 1.
T suy ra xi-1 + 1 xi n - k + i (1 i k) y ta gi thit c thm mt s x0 = 0 khi xt i = 1.
Nh vy ta s xt tt c cc cch chn x1 t 1 (=x0 + 1) n n - k + 1, vi mi gi tr , xt tip tt
c cc cch chn x2 t x1 + 1 n n - k + 2,... c nh vy khi chn c n xk th ta c mt cu
hnh cn lit k. Chng trnh lit k bng thut ton quay lui nh sau:
PROG03_2.PAS * Thut ton quay lui lit k cc tp con k phn t
program Combinations;
const
max = 30;
var
x: array[0..max] of Integer;
n, k: Integer;
procedure PrintResult; (*In ra tp con {x1, x2, ..., xk}*)
var
i: Integer;
begin
Write('{');
for i := 1 to k - 1 do Write(x[i], ', ');
WriteLn(x[k], '}');
end;
procedure Try(i: Integer); {Th cc cch chn gi tr cho x[i]}
var
j: Integer;
begin
for j := x[i - 1] + 1 to n - k + i do
begin
x[i] := j;
if i = k then PrintResult
else Try(i + 1);
end;
end;
begin
Assign(Input, 'SUBSET.INP'); Reset(Input);
Assign(Output, 'SUBSET.OUT'); Rewrite(Output);
ReadLn(n, k);
x[0] := 0;
Try(1);
Close(Input); Close(Output);
end.

Nu chng trnh trn v chng trnh lit k dy nh phn di n, ta thy v c bn chng


ch khc nhau th tc Try(i) - chn th cc gi tr cho xi, chng trnh lit k dy nh phn ta
th chn cc gi tr 0 hoc 1 cn chng trnh lit k cc tp con k phn t ta th chn xi l mt
trong cc gi tr nguyn t xi-1 + 1 n n - k + i. Qua ta c th thy tnh ph dng ca thut ton
quay lui: m hnh ci t c th thch hp cho nhiu bi ton, khc vi phng php sinh tun t,
vi mi bi ton li phi c mt thut ton sinh k tip ring lm cho vic ci t mi bi mt khc,
bn cnh , khng phi thut ton sinh k tip no cng d ci t.
III. LIT K CC CHNH HP KHNG LP CHP K
lit k cc chnh hp khng lp chp k ca tp S = {1, 2, ..., n} ta c th a v lit k cc cu
hnh (x1, x2, ..., xk) y cc xi S v khc nhau i mt.
Nh vy th tc Try(i) - xt tt c cc kh nng chn xi - s th ht cc gi tr t 1 n n, m cc gi
tr ny cha b cc phn t ng trc chn. Mun xem cc gi tr no cha c chn ta s dng
k thut dng mng nh du:
Khi to mt mng c1, c2, ..., cn mang kiu logic. y ci cho bit gi tr i c cn t do hay
b chn ri. Ban u khi to tt c cc phn t mng c l TRUE c ngha l cc phn t t 1
n n u t do.
Ti bc chn cc gi tr c th ca xi ta ch xt nhng gi tr j c cj = TRUE c ngha l ch
chn nhng gi tr t do.
Trc khi gi quy tm xi+1: ta t gi tr j va gn cho xi l b chn c ngha l t cj :=
FALSE cc th tc Try(i + 1), Try(i + 2)... gi sau ny khng chn phi gi tr j na
Sau khi gi quy tm xi+1: c ngha l sp ti ta s th gn mt gi tr khc cho xi th ta s t
gi tr j va th thnh t do (cj := TRUE), bi khi xi nhn mt gi tr khc ri th cc phn
t ng sau: xi+1, xi+2 ... hon ton c th nhn li gi tr j . iu ny hon ton hp l trong
php xy dng chnh hp khng lp: x1 c n cch chn, x2 c n - 1 cch chn, ...Lu rng khi
th tc Try(i) c i = k th ta khng cn phi nh du g c v tip theo ch c in kt qu ch
khng cn phi chn thm phn t no na.
Input: file vn bn ARRANGES.INP cha hai s nguyn dng n, k (1 k n 20) cch nhau t
nht mt du cch
Output: file vn bn ARRANGES.OUT ghi cc chnh hp khng lp chp k ca tp {1, 2, ..., n}
ARRANGES.INP
3 2

ARRANGES.OUT
1 2
1 3
2 1
2 3
3 1
3 2

PROG03_3.PAS * Thut ton quay lui lit k cc chnh hp khng lp chp k


program Arranges;
const
max = 20;
var
x: array[1..max] of Integer;
c: array[1..max] of Boolean;
n, k: Integer;
procedure PrintResult;

{Th tc in cu hnh tm c}

var
i: Integer;
begin
for i := 1 to k do Write(x[i],' ');
WriteLn;
end;
procedure Try(i: Integer); {Th cc cch chn xi}
var
j: Integer;
begin
for j := 1 to n do
if c[j] then
{Ch xt nhng gi tr j cn t do}
begin
x[i] := j;
if i = k then PrintResult {Nu chn c n xk th ch vic in kt qu}

else
begin
c[j] := False; {nh du: j b chn}

{Th tc ny ch xt nhng gi tr cn t do gn cho xi+1, tc l s khng chn


Try(i + 1);
phinh
j} du: j li l t do, bi sp ti s th mt cch chn khc ca xi}

c[j] := True;
{B
end;
end;
end;
begin
Assign(Input, 'ARRANGES.INP'); Reset(Input);
Assign(Output, 'ARRANGES.OUT'); Rewrite(Output);
ReadLn(n, k);
FillChar(c, SizeOf(c), True); {Tt c cc s u cha b chn}
Try(1);
{Th cc cch chn gi tr ca x1}
Close(Input); Close(Output);
end.

Nhn xt: khi k = n th y l chng trnh lit k hon v


IV. BI TON PHN TCH S
Bi ton
Cho mt s nguyn dng n 30, hy tm tt c cc cch phn tch s n thnh tng ca cc s
nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l 1 cch.
Cch lm:
1. Ta s lu nghim trong mng x, ngoi ra c mt mng t. Mng t xy dng nh sau: ti s l tng
cc phn t trong mng x t x1 n xi: ti := x1 + x2 + ... + xi.
2. Khi lit k cc dy x c tng cc phn t ng bng n, trnh s trng lp ta a thm rng
buc xi-1 xi.
3. V s phn t thc s ca mng x l khng c nh nn th tc PrintResult dng in ra 1 cch
phn tch phi c thm tham s cho bit s in ra bao nhiu phn t.
4. Th tc quy Try(i) s th cc gi tr c th nhn ca xi (xi xi - 1)
5. Khi no th in kt qu v khi no th gi quy tm tip ?
Lu rng ti - 1 l tng ca tt c cc phn t t x1 n xi-1 do
Khi ti = n tc l (xi = n - ti - 1) th in kt qu
Khi tm tip, xi+1 s phi ln hn hoc bng xi. Mt khc ti+1 l tng ca cc s t x1 ti xi+1
khng c vt qu n. Vy ta c ti+1 n ti-1 + xi + xi+1 n xi + xi + 1 n - ti - 1 tc l xi

(n - ti - 1)/2. V d n gin khi n = 10 th chn x1 = 6, 7, 8, 9 l vic lm v ngha v nh


vy cng khng ra nghim m cng khng chn tip x2 c na.
Mt cch d hiu ta gi quy tm tip khi gi tr xi c chn cn cho php chn thm mt
phn t khc ln hn hoc bng n m khng lm tng vt qu n. Cn ta in kt qu ch khi
xi mang gi tr ng bng s thiu ht ca tng i-1 phn t u so vi n.
6. Vy th tc Try(i) th cc gi tr cho xi c th m t nh sau: ( tng qut cho i = 1, ta t x0 =
1 v t0 = 0).
Xt cc gi tr ca xi t xi - 1 n (n - ti-1) div 2, cp nht ti := ti - 1 + xi v gi quy tm tip.
Cui cng xt gi tr xi = n - ti-1 v in kt qu t x1 n xi.
Input: file vn bn ANALYSE.INP cha s nguyn dng n 30
Output: file vn bn ANALYSE.OUT ghi cc cch phn tch s n.
ANALYSE.INP
6

ANALYSE.OUT
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+1+3
6 = 1+1+2+2
6 = 1+1+4
6 = 1+2+3
6 = 1+5
6 = 2+2+2
6 = 2+4
6 = 3+3
6 = 6

PROG03_4.PAS * Thut ton quay lui lit k cc cch phn tch s


program Analyses;
const
max = 30;
var
n: Integer;
x: array[0..max] of Integer;
t: array[0..max] of Integer;
procedure Init;
begin
ReadLn(n);
x[0] := 1;
t[0] := 0;
end;

{Khi to}

procedure PrintResult(k: Integer);


var
i: Integer;
begin
Write(n,' = ');
for i := 1 to k - 1 do Write(x[i], '+');
WriteLn(x[k]);
end;
procedure Try(i: Integer);
var
j: Integer;
begin
for j := x[i - 1] to (n - T[i - 1]) div 2 do
begin
x[i] := j;

{Trng hp cn chn tip xi+1}

t[i] := t[i - 1] + j;
Try(i + 1);
end;
x[i] := n - T[i - 1];
{Nu xi l phn t cui th n bt buc phi l ... v in kt qu}
PrintResult(i);
end;
begin
Assign(Input, 'ANALYSE.INP'); Reset(Input);
Assign(Output, 'ANALYSE.OUT'); Rewrite(Output);
Init;
Try(1);
Close(Input);
Close(Output);
end.

By gi ta xt tip mt v d kinh in ca thut ton quay lui:


V. BI TON XP HU
Bi ton
Xt bn c tng qut kch thc nxn. Mt qun hu trn bn c c th n c cc qun khc nm
ti cc cng hng, cng ct hoc cng ng cho. Hy tm cc xp n qun hu trn bn c sao
cho khng qun no n qun no.
V d mt cch xp vi n = 8:

Hnh 3: Xp 8 qun hu trn bn c 8x8

Phn tch
R rng n qun hu s c t mi con mt hng v hu n c ngang, ta gi qun hu s t
hng 1 l qun hu 1, qun hu hng 2 l qun hu 2... qun hu hng n l qun hu n.
Vy mt nghim ca bi ton s c bit khi ta tm ra c v tr ct ca nhng qun hu.
Nu ta nh hng ng (Phi), Ty (Tri), Nam (Di), Bc (Trn) th ta nhn thy rng:
Mt ng cho theo hng ng Bc - Ty Nam (B-TN) bt k s i qua mt s , cc
c tnh cht: Hng + Ct = C (Const). Vi mi ng cho B-TN ta c 1 hng s C v
vi mt hng s C: 2 C 2n xc nh duy nht 1 ng cho B-TN v vy ta c th nh
ch s cho cc ng cho B- TN t 2 n 2n
Mt ng cho theo hng ng Nam - Ty Bc (N-TB) bt k s i qua mt s , cc
c tnh cht: Hng - Ct = C (Const). Vi mi ng cho N-TB ta c 1 hng s C v
vi mt hng s C: 1 - n C n - 1 xc nh duy nht 1 ng cho N-TB v vy ta c th
nh ch s cho cc ng cho N- TB t 1 - n n n - 1.

1
2

3
W

4
5

6
7
8

Hnh 4: ng cho B-TN mang ch s 10 v ng cho N-TB mang ch s 0, chung (5, 5)

Ci t:
1. Ta c 3 mng logic nh du:
Mng a[1..n]. ai = TRUE nu nh ct i cn t do, ai = FALSE nu nh ct i b mt qun hu
khng ch
Mng b[2..2n]. bi = TRUE nu nh ng cho B-TN th i cn t do, bi = FALSE nu nh
ng cho b mt qun hu khng ch.
Mng c[1 - n..n - 1]. ci = TRUE nu nh ng cho N-TB th i cn t do, ci = FALSE nu
nh ng cho b mt qun hu khng ch.
Ban u c 3 mng nh du u mang gi tr TRUE. (Cc ct v ng cho u t do)
2. Thut ton quay lui: Xt tt c cc ct, th t qun hu 1 vo mt ct, vi mi cch t nh vy,
xt tt c cc cch t qun hu 2 khng b qun hu 1 n, li th 1 cch t v xt tip cc cch t
qun hu 3...Mi cch t c n qun hu n cho ta 1 nghim
3. Khi chn v tr ct j cho qun hu th i, th ta phi chn (i, j) khng b cc qun hu t trc
n, tc l phi chn ct j cn t do, ng cho B-TN (i+j) cn t do, ng cho N-TB(i-j)
cn t do. iu ny c th kim tra (aj = bi+j = ci-j = TRUE)
4. Khi th t c qun hu th i vo ct j, nu l qun hu cui cng (i = n) th ta c mt
nghim. Nu khng:
Trc khi gi quy tm cch t qun hu th i + 1, ta nh du ct v 2 ng cho b qun
hu va t khng ch (aj = bi+j = ci-j := FALSE) cc ln gi quy tip sau chn cch t
cc qun hu k tip s khng chn vo nhng nm trn ct j v nhng ng cho ny na.
Sau khi gi quy tm cch t qun hu th i + 1, c ngha l sp ti ta li th mt cch t
khc cho qun hu th i, ta b nh du ct v 2 ng cho b qun hu va th t khng ch
(aj = bi+j = ci-j := TRUE) tc l ct v 2 ng cho li thnh t do, bi khi t qun hu i
sang v tr khc ri th ct v 2 ng cho hon ton c th gn cho mt qun hu khc
Hy xem li trong cc chng trnh lit k chnh hp khng lp v hon v v k thut nh du.
y ch khc vi lit k hon v l: lit k hon v ch cn mt mng nh du xem gi tr c t do
khng, cn bi ton xp hu th cn phi nh du c 3 thnh phn: Ct, ng cho B-TN,
ng cho N- TB. Trng hp n gin hn: Yu cu lit k cc cch t n qun xe ln bn c
nxn sao cho khng qun no n qun no chnh l bi ton lit k hon v
Input: file vn bn QUEENS.INP cha s nguyn dng n 12
Output: file vn bn QUEENS.OUT, mi dng ghi mt cch t n qun hu

QUEENS.INP
5

QUEENS.OUT
(1, 1); (2,
(1, 1); (2,
(1, 2); (2,
(1, 2); (2,
(1, 3); (2,
(1, 3); (2,
(1, 4); (2,
(1, 4); (2,
(1, 5); (2,
(1, 5); (2,

3);
4);
4);
5);
1);
5);
1);
2);
2);
3);

(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,

5);
2);
1);
3);
4);
2);
3);
5);
4);
1);

(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,
(4,

2); (5, 4);


5); (5, 3);
3); (5, 5);
1); (5, 4);
2); (5, 5);
4); (5, 1);
5); (5, 2);
3); (5, 1);
1); (5, 3);
4); (5, 2);

PROG03_5.PAS * Thut ton quay lui gii bi ton xp hu


program n_Queens;
const
max = 12;
var
n: Integer;
x: array[1..max] of Integer;
a: array[1..max] of Boolean;
b: array[2..2 * max] of Boolean;
c: array[1 - max..max - 1] of Boolean;
procedure Init;
begin
ReadLn(n);
FillChar(a, SizeOf(a), True);
FillChar(b, SizeOf(b), True);
FillChar(c, SizeOf(c), True);
end;

{Mi ct u t do}
{Mi ng cho ng Bc - Ty Nam u t do}
{Mi ng cho ng Nam - Ty Bc u t do}

procedure PrintResult;
var
i: Integer;
begin
for i := 1 to n do Write('(', i, ', ', x[i], '); ');
WriteLn;
end;
procedure Try(i: Integer); {Th cc cch t qun hu th i vo hng i}
var
j: Integer;
begin
for j := 1 to n do
if a[j] and b[i + j] and c[i - j] then {Ch xt nhng ct j m (i, j) cha b khng ch}
begin
x[i] := j;
{Th t qun hu i vo ct
j}

if i = n then PrintResult
else
begin
a[j] := False; b[i + j] := False; c[i - j] := False;

Try(i + 1);
{Tm cc cch t qun hu th i + 1}

a[j] := True; b[i + j] := True; c[i - j] := True;

end;
end;
end;
begin
Assign(Input, 'QUEENS.INP'); Reset(Input);
Assign(Output, 'QUEENS.OUT'); Rewrite(Output);
Init;

{nh du}
{B nh du}

Try(1);
Close(Input); Close(Output);
end.

Tn gi thut ton quay lui, ng trn phng din ci t c th nn gi l k thut vt cn bng


quay lui th chnh xc hn, tuy nhin ng trn phng din bi ton, nu nh ta coi cng vic gii
bi ton bng cch xt tt c cc kh nng cng l 1 cch gii th tn gi Thut ton quay lui cng
khng c g tri logic. Xt hot ng ca chng trnh trn cy tm kim quay lui ta thy ti bc
th chn xi n s gi quy tm tip xi+1 c ngha l qu trnh s duyt tin su xung pha di
n tn nt l, sau khi duyt ht cc nhnh, tin trnh li li th p t mt gi tr khc cho xi,
chnh l ngun gc ca tn gi "thut ton quay lui"
Bi tp:
1. Mt s chng trnh trn x l khng tt trong trng hp tm thng (n = 0 hoc k = 0), hy
khc phc cc li
2. Vit chng trnh lit k cc chnh hp lp chp k ca n phn t
3. Cho hai s nguyn dng l, n. Hy lit k cc xu nh phn di n c tnh cht, bt k hai xu
con no di l lin nhau u khc nhau.
4. Vi n = 5, k = 3, v cy tm kim quay lui ca chng trnh lit k t hp chp k ca tp {1, 2, ...,
n}
5. Lit k tt c cc tp con ca tp S gm n s nguyn {S1, S2, ..., Sn} nhp vo t bn phm
6. Tng t nh bi 5 nhng ch lit k cc tp con c max - min T (T cho trc).
7. Mt dy (x1, x2, ..., xn) gi l mt hon v hon ton ca tp {1, 2,..., n} nu n l mt hon v v
tho mn xi i vi i: 1 i n. Hy vit chng trnh lit k tt c cc hon v hon ton ca tp
trn (n vo t bn phm).
8. Sa li th tc in kt qu (PrintResult) trong bi xp hu c th v hnh bn c v cc cch t
hu ra mn hnh.
9. Bi ton m i tun: Cho bn c tng qut kch thc nxn v mt qun M, hy ch ra mt hnh
trnh ca qun M xut pht t ang ng i qua tt c cc cn li ca bn c, mi ng 1 ln.
10. Chuyn tt c cc bi tp trong bi trc ang vit bng sinh tun t sang quay lui.
11. Xt s giao thng gm n nt giao thng nh s t 1 ti n v m on ng ni chng, mi
on ng ni 2 nt giao thng. Hy nhp d liu v mng li giao thng , nhp s hiu hai
nt giao thng s v d. Hy in ra tt c cc cch i t s ti d m mi cch i khng c qua nt giao
thng no qu mt ln.

4. K THUT NHNH CN
I. BI TON TI U
Mt trong nhng bi ton t ra trong thc t l vic tm ra mt nghim tho mn mt s iu kin
no , v nghim l tt nht theo mt ch tiu c th, nghin cu li gii cc lp bi ton ti u
thuc v lnh vc quy hoch ton hc. Tuy nhin cng cn phi ni rng trong nhiu trng hp
chng ta cha th xy dng mt thut ton no thc s hu hiu gii bi ton, m cho ti nay
vic tm nghim ca chng vn phi da trn m hnh lit k ton b cc cu hnh c th v nh
gi, tm ra cu hnh tt nht. Vic lit k cu hnh c th ci t bng cc phng php lit k: Sinh
tun t v tm kim quay lui. Di y ta s tm hiu phng php lit k bng thut ton quay lui
tm nghim ca bi ton ti u.
II. S BNG N T HP
M hnh thut ton quay lui l tm kim trn 1 cy phn cp. Nu gi thit rng ng vi mi nt
tng ng vi mt gi tr c chn cho xi s ng vi ch 2 nt tng ng vi 2 gi tr m xi+1 c
n

th nhn th cy n cp s c ti 2 nt l, con s ny ln hn rt nhiu ln so vi d liu u vo n.


Chnh v vy m nu nh ta c thao tc tha trong vic chn xi th s phi tr gi rt ln v chi ph
thc thi thut ton bi qu trnh tm kim lng vng v ngha trong cc bc chn k tip xi+1, xi+2,
... Khi , mt vn t ra l trong qu trnh lit k li gii ta cn tn dng nhng thng tin tm
c loi b sm nhng phng n chc chn khng phi ti u. K thut gi l k thut
nh gi nhnh cn trong tin trnh quay lui.
III. M HNH K THUT NHNH CN
Da trn m hnh thut ton quay lui, ta xy dng m hnh sau:
procedure Init;
begin
<Khi to mt cu hnh bt k BESTCONFIG>;
end;
{Th tc ny th chn cho xi tt c cc gi tr n c th nhn}
procedure Try(i: Integer);
begin
for (Mi gi tr V c th gn cho xi) do
begin
<Th cho xi := V>;
if (Vic th trn vn cn hi vng tm ra cu hnh tt hn BESTCONFIG) then
if (xi l phn t cui cng trong cu hnh) then
<Cp nht BESTCONFIG>
else
begin
<Ghi nhn vic th xi = V nu cn>;
Try(i + 1); {Gi quy, chn tip xi+1 }
<B ghi nhn vic th cho xi = V (nu cn)>;
end;
end;
end;
begin
Init;
Try(1);
<Thng bo cu hnh ti u BESTCONFIG>
end.

K thut nhnh cn thm vo cho thut ton quay lui kh nng nh gi theo tng bc, nu ti
bc th i, gi tr th gn cho x i khng c hi vng tm thy cu hnh tt hn cu hnh
BESTCONFIG th th gi tr khc ngay m khng cn phi gi quy tm tip hay ghi nhn kt
qu lm g. Nghim ca bi ton s c lm tt dn, bi khi tm ra mt cu hnh mi (tt hn
BESTCONFIG - tt nhin), ta khng in kt qu ngay m s cp nht BESTCONFIG bng cu hnh
mi va tm c
IV. BI TON NGI DU LCH
Bi ton
Cho n thnh ph nh s t 1 n n v m tuyn ng giao thng hai chiu gia chng, mng li
giao thng ny c cho bi bng C cp nxn, y Cij = Cji = Chi ph i on ng trc tip t
thnh ph i n thnh ph j. Gi thit rng Cii = 0 vi i, Cij = + nu khng c ng trc tip t
thnh ph i n thnh ph j.
Mt ngi du lch xut pht t thnh ph 1, mun i thm tt c cc thnh ph cn li mi thnh
ph ng 1 ln v cui cng quay li thnh ph 1. Hy ch ra cho ngi hnh trnh vi chi ph t
nht. Bi ton gi l bi ton ngi du lch hay bi ton hnh trnh ca mt thng gia
(Traveling Salesman)
Cch gii
1) Hnh trnh cn tm c dng (x1 = 1, x2, ..., xn, xn+1 = 1) y gia xi v xi+1: hai thnh ph lin
tip trong hnh trnh phi c ng i trc tip (Cij +) v ngoi tr thnh ph 1, khng thnh
ph no c lp li hai ln. C ngha l dy (x1, x2, ..., xn) lp thnh 1 hon v ca (1, 2, ..., n).
2) Duyt quay lui: x2 c th chn mt trong cc thnh ph m x1 c ng i ti (trc tip), vi
mi cch th chn x2 nh vy th x3 c th chn mt trong cc thnh ph m x2 c ng i ti
(ngoi x1). Tng qut: xi c th chn 1 trong cc thnh ph cha i qua m t xi-1 c ng i
trc tip ti.(1 i n)
3) Nhnh cn: Khi to cu hnh BestConfig c chi ph = +. Vi mi bc th chn xi xem chi
ph ng i cho ti lc c < Chi ph ca cu hnh BestConfig?, nu khng nh hn th th
gi tr khc ngay bi c i tip cng ch tn thm. Khi th c mt gi tr xn ta kim tra xem xn
c ng i trc tip v 1 khng ? Nu c nh gi chi ph i t thnh ph 1 n thnh ph xn
cng vi chi ph t xn i trc tip v 1, nu nh hn chi ph ca ng i BestConfig th cp
nht li BestConfig bng cch i mi.
4) Sau th tc tm kim quay lui m chi ph ca BestConfig vn bng + th c ngha l n khng
tm thy mt hnh trnh no tho mn iu kin bi cp nht BestConfig, bi ton khng
c li gii, cn nu chi ph ca BestConfig < + th in ra cu hnh BestConfig - l hnh trnh
t tn km nht tm c
Input: file vn bn TOURISM.INP
Dng 1: Cha s thnh ph n (1 n 20) v s tuyn ng m trong mng li giao thng
m dng tip theo, mi dng ghi s hiu hai thnh ph c ng i trc tip v chi ph i trn
qung ng (chi ph ny l s nguyn dng 100)
Output: file vn bn TOURISM.OUT
Ghi hnh trnh tm c.

TOURISM.INP
4 6
1 2 3
1 3 2
1 4 1
2 3 1
2 4 2
3 4 4

TOURISM.OUT
1->3->2->4->1
Cost: 6

PROG04_1.PAS * K thut nhnh cn dng cho bi ton ngi du lch


program TravellingSalesman;
const
max = 20;
maxC = 20 * 100 + 1;
{+}
var
C: array[1..max, 1..max] of Integer;
{Ma trn chi ph}
X, BestWay: array[1..max + 1] of Integer; {X th cc kh nng, BestWay ghi nhn nghim}
T: array[1..max + 1] of Integer;
{Ti lu chi ph i t X1 n Xi}
Free: array[1..max] of Boolean;
{Free nh du, Freei= True nu cha i qua tp i}
m, n: Integer;
MinSpending: Integer;
{Chi ph hnh trnh ti u}
procedure Enter;
var
i, j, k: Integer;
begin
ReadLn(n, m);
for i := 1 to n do
{Khi to bng chi ph ban u}
for j := 1 to n do
if i = j then C[i, j] := 0 else C[i, j] := maxC;
for k := 1 to m do
begin
ReadLn(i, j, C[i, j]);
C[j, i] := C[i, j];
{Chi ph nh nhau trn 2 chiu}
end;
end;
procedure Init; {Khi to}
begin
FillChar(Free, n, True);
Free[1] := False;
{Cc thnh ph l cha i qua ngoi tr thnh ph 1}
X[1] := 1;
{Xut pht t thnh ph 1}
T[1] := 0;
{Chi ph ti thnh ph xut pht l 0}
MinSpending := maxC;
end;
procedure Try(i: Integer); {Th cc cch chn xi}
var
j: Integer;
begin
for j := 2 to n do
{Th cc thnh ph t 2 n n}
if Free[j] then
{Nu gp thnh ph cha i qua}

begin
X[i] := j;
{Th i}
T[i] := T[i - 1] + C[x[i - 1], j];
{Chi ph := Chi ph bc trc + chi ph ng i trc tip}
if T[i] < MinSpending then
{Hin nhin nu c iu ny th C[x[i - 1], j] < + ri}

if i < n then{Nu cha n c xn}

begin

Free[j] := False; {nh du thnh ph va th}


Try(i + 1);
{Tm cc kh nng chn xi+1}
Free[j] := True; {B nh du}
end
else
if T[n] + C[x[n], 1] < MinSpending then {T xn quay li 1 vn tn chi ph t hn trc}
begin {Cp nht BestConfig}
BestWay := X;
MinSpending := T[n] + C[x[n], 1];
end;

end;
end;

procedure PrintResult;
var
i: Integer;
begin
if MinSpending = maxC then WriteLn('NO SOLUTION')
else
for i := 1 to n do Write(BestWay[i], '->');
WriteLn(1);
WriteLn('Cost: ', MinSpending);
end;
begin
Assign(Input, 'TOURISM.INP'); Reset(Input);
Assign(Output, 'TOURISM.OUT'); Rewrite(Output);
Enter;
Init;
Try(2);
PrintResult;
Close(Input); Close(Output);
end.

Trn y l mt gii php nhnh cn cn rt th s gii bi ton ngi du lch, trn thc t ngi ta
cn c nhiu cch nh gi nhnh cn cht hn na. Hy tham kho cc ti liu khc tm hiu v
nhng phng php .
V. DY ABC
Cho trc mt s nguyn dng N (N 100), hy tm mt xu ch gm cc k t A, B, C tho mn
3 iu kin:
C di N

Hai on con bt k lin nhau u khc nhau (on con l mt dy k t lin tip ca xu)

C t k t C nht.
Cch gii:
Khng trnh by, ngh t xem chng trnh hiu, ch ch thch k thut nhnh cn nh sau:
Nu dy X1X2...Xn tho mn 2 on con bt k lin nhau u khc nhau, th trong 4 k t lin tip
bt k bao gi cng phi c 1 k t "C". Nh vy vi mt dy con gm k k t lin tip ca dy X
th s k t C trong dy con bt buc phi k div 4.
Ti bc th chn Xi, nu ta c Ti k t "C" trong on chn t X1 n Xi, th cho d cc
bc quy tip sau lm tt nh th no chng na, s k t "C" s phi chn thm bao gi cng
(n - i) div 4. Tc l nu theo phng n chn Xi nh th ny th s k t "C" trong dy kt qu (khi
chn n Xn) cho d c lm tt n u cng Ti + (n - i) div 4. Ta dng con s ny nh gi
nhnh cn, nu n nhiu hn s k t "C" trong BestConfig th chc chn c lm tip cng ch c
mt cu hnh ti t hn, ta b qua ngay cch chn ny v th phng n khc.

Input: file vn bn ABC.INP cha s nguyn dng n 100


Output: file vn bn ABC.OUT ghi xu tm c
ABC.INP
10

ABC.OUT
ABACABCBAB
"C" Letter Count

: 2

PROG04_2.PAS * Dy ABC
program ABC_STRING;
const
max = 100;
var
N, MinC: Integer;
X, Best: array[1..max] of 'A'..'C';
T: array[0..max] of Integer; {Ti cho bit s k t "C" trong on t X1 n Xi}
{Hm Same(i, l) cho bit xu gm l k t kt thc ti Xi c trng vi xu l k t lin trc n khng ?}

function Same(i, l: Integer): Boolean;


var
j, k: Integer;
begin
j := i - l;
{j l v tr cui on lin trc on }
for k := 0 to l - 1 do
if X[i - k] <> X[j - k] then
begin
Same := False; Exit;
end;
Same := True;
end;

{Hm Check(i) cho bit Xi c lm hng tnh khng lp ca dy X1X2 ... Xi hay khng}

function Check(i: Integer): Boolean;


var
l: Integer;
begin
for l := 1 to i div 2 do{Th cc di l}
if Same(i, l) then{Nu c xu di l kt thc bi Xi b trng vi xu lin

trc}

begin
Check := False; Exit;
end;
Check := True;
end;
{Gi li kt qu va tm c vo BestConfig (MinC v mng Best)}

procedure KeepResult;
begin
MinC := T[N];
Best := X;
end;
{Thut ton quay lui c nhnh cn}

procedure Try(i: Integer); {Th cc gi tr c th ca Xi}


var
j: 'A'..'C';
begin
for j := 'A' to 'C' do
{Xt tt c cc gi tr}
begin
X[i] := j;
if Check(i) then {Nu thm gi tr vo khng lm hng tnh khng lp }
begin
if j = 'C' then T[i] := T[i - 1] + 1 {Tnh Ti qua Ti - 1}
else T[i] := T[i - 1];

if T[i] + (N - i) div 4 < MinC then


if i = N then KeepResult
else Try(i + 1);
end;
end;

{nh gi nhnh cn}

end;
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to N do Write(Best[i]);
WriteLn;
WriteLn('"C" Letter Count : ', MinC);
end;
begin
Assign(Input, 'ABC.INP'); Reset(Input);
Assign(Output, 'ABC.OUT'); Rewrite(Output);
ReadLn(N);
T[0] := 0;
MinC := N; {Khi to cu hnh BestConfig ban u ht sc ti}
Try(1);
PrintResult;
Close(Input); Close(Output);
end.

Nu ta thay bi ton l tm xu t k t 'B' nht m vn vit chng trnh tng t nh trn th


chng trnh s chy chm hn cht t. L do: th tc Try trn s th ln lt cc gi tr 'A', 'B',
ri mi n 'C'. C ngha ngay trong cch tm, n tit kim s dng k t 'C' nht nn trong phn
ln cc b d liu n nhanh chng tm ra li gii hn so vi bi ton tng ng tm xu t k t 'B'
nht. Chnh v vy m nu nh bi yu cu t k t 'B' nht ta c lp chng trnh lm yu cu t
k t 'C' nht, ch c iu khi in kt qu, ta i vai tr 'B', 'C' cho nhau. y l mt v d cho thy
sc mnh ca thut ton quay lui khi kt hp vi k thut nhnh cn, nu vit quay lui thun tu
hoc nh gi nhnh cn khng tt th vi N = 100, ti cng khng kin nhn i chng
trnh cho kt qu (ch bit rng > 3 gi). Trong khi khi N = 100, vi chng trnh trn ch chy
ht hn 3 giy cho kt qu l xu 27 k t 'C'.
Ni chung, t khi ta gp bi ton m ch cn s dng mt thut ton, mt m hnh k thut ci t l
c th gii c. Thng thng cc bi ton thc t i hi phi c s tng hp, pha trn nhiu
thut ton, nhiu k thut mi c c mt li gii tt. Khng c lm dng mt k thut no v
cng khng xem thng mt phng php no khi bt tay vo gii mt bi ton tin hc. Thut ton
quay lui cng khng phi l ngoi l, ta phi bit phi hp mt cch uyn chuyn vi cc thut ton
khc th khi n mi thc s l mt cng c mnh.
Bi tp:
1. Mt dy du ngoc hp l l mt dy cc k t "(" v ")" c nh ngha nh sau:
i. Dy rng l mt dy du ngoc hp l su 0
ii. Nu A l dy du ngoc hp l su k th (A) l dy du ngoc hp l su k + 1
iii. Nu A v B l hay dy du ngoc hp l vi su ln lt l p v q th AB l dy du ngoc
hp l su l max(p, q)
di ca mt dy ngoc l tng s k t "(" v ")"
V d: C 5 dy du ngoc hp l di 8 v su 3:
1.
((()
()))
2.
((())

())

3. ((()))()
4. (()(()))
5. ()((()))
Bi ton t ra l khi cho bit trc hai s nguyn dng n v k. Hy lit k ht cc dy ngoc
hp l c di l n v su l k (lm c vi n cng ln cng tt).
2. Cho mt bi mn kch thc mxn vung, trn mt c th c cha mt qu mn hoc khng,
biu din bn mn , ngi ta c hai cch:
Cch 1: dng bn nh du: s dng mt li vung kch thc mxn, trn ti (i, j) ghi
s 1 nu c mn, ghi s 0 nu khng c mn
Cch 2: dng bn mt : s dng mt li vung kch thc mxn, trn ti (i, j) ghi
mt s trong khong t 0 n 8 cho bit tng s mn trong cc ln cn vi (i, j) ( ln cn
vi (i, j) l c chung vi (i, j) t nht 1 nh).
Gi thit rng hai bn c ghi chnh xc theo tnh trng mn trn hin trng.
V d: Bn nh du v bn mt tng ng: (m = n = 10)
1
0
0
0
0
0
1
1
0
1

0
1
0
1
1
0
1
0
0
0

1
0
1
1
1
0
1
0
1
0

0
0
0
1
1
1
0
1
0
0

1
0
1
1
0
0
0
0
1
0

0
1
0
0
0
1
1
1
1
1

1
0
0
0
0
0
1
0
1
0

0
0
0
1
1
1
0
1
1
0

0
1
0
1
0
0
1
0
1
0

0
1
1
0
1
0
1
1
0
0

1
2
2
2
2
3
2
2
2
0

3
3
4
4
3
5
3
5
3
2

1
3
4
6
6
6
3
4
1
1

2
4
5
6
5
3
3
3
3
2

1
3
3
3
5
4
5
5
4
3

3
3
3
2
2
2
3
5
4
3

1
2
2
2
4
5
5
7
5
4

2
2
3
2
3
3
4
5
3
3

2
2
5
4
5
5
4
6
3
2

2
2
3
3
1
3
2
3
2
1

V nguyn tc, lc ci bi mn phi v c bn nh du v bn mt , tuy nhin sau mt thi


gian di, khi ngi ta mun g mn ra khi bi th vn ht sc kh khn bi bn nh du
b tht lc !!. Cng vic ca cc lp trnh vin l: T bn mt , hy ti to li bn nh
du ca bi mn.
D liu: Vo t file vn bn MINE.INP, cc s trn 1 dng cch nhau t nht 1 du cch
Dng 1: Ghi 2 s nguyn dng m, n (2 m, n 30)
m dng tip theo, dng th i ghi n s trn hng i ca bn mt theo ng th t t tri qua
phi.
Kt qu: Ghi ra file vn bn MINE.OUT, cc s trn 1 dng ghi cch nhau t nht 1 du cch
Dng 1: Ghi tng s lng mn trong bi
m dng tip theo, dng th i ghi n s trn hng i ca bn nh du theo ng th t t tri
qua phi.
V d:
MINE.INP
10 15
0 3 2 3 3
1 4 3 5 5
1 4 3 5 4
1 4 2 4 4
1 3 2 5 4
2 3 2 3 3
2 3 2 4 3
2 6 4 5 2
4 6 5 7 3
2 4 4 4 2

3
4
3
5
4
5
3
4
5
3

5
5
5
4
2
3
2
1
3
1

3
4
4
2
2
2
3
3
5
2

4
7
4
4
3
4
4
3
5
2

4
7
4
4
2
4
6
5
6
2

5
7
4
3
3
3
6
5
5
3

4
5
3
2
3
4
5
5
4
3

4
6
4
3
2
2
3
6
4
3

4
6
5
5
5
4
3
4
4
4

3
5
5
4
2
1
1
3
3
2

MINE.OUT
80
1 0 1 1 1
0 0 1 0 0
0 0 1 0 0
1 0 1 1 1
1 0 0 0 1
0 0 0 0 1
0 1 1 0 0
1 0 1 0 1
0 1 1 0 1
1 1 1 1 1

1
1
1
0
1
0
1
0
0
0

0
1
0
0
1
0
0
1
0
1

1
1
0
1
0
0
0
0
0
1

1
0
1
0
0
0
1
1
0
1

1
1
1
0
1
1
1
1
0
1

1
1
1
0
0
1
0
1
1
0

1
1
0
0
0
0
0
1
1
0

1
0
0
0
1
1
1
0
1
0

1
1
1
1
0
0
0
1
1
0

1
1
1
1
1
0
0
0
1
1

Cu trc d liu v gii thut

\ 1[

MC LC
0. CC BC C BN KHI TIN HNH GII CC BI TON TIN HC
..................................... 3
I. XC NH BI TON
..................................................................................................................................3
II. TM CU TRC D LIU BIU DIN BI
TON..................................................................................3
III. TM THUT TON.....................................................................................................................................4
IV. LP TRNH ..................................................................................................................................................5
V. KIM TH ....................................................................................................................................................6
VI. TI U CHNG TRNH..........................................................................................................................6
1. PHN TCH THI GIAN THC HIN GII THUT
...................................................................... 8
I. PHC TP TNH TON CA GII THUT
.......................................................................................8
II. XC NH PHC TP TNH TON CA GII THUT
.................................................................8
V. PHC TP TNH TON VI TNH TRNG D LIU
VO.........................................................10
VI. CHI PH THC HIN THUT
TON.....................................................................................................11
2. QUY V GII THUT QUY...............................................................................................
12
I. KHI NIM V QUY
............................................................................................................................12
II. GII THUT QUY ...............................................................................................................................12
III. V D V GII THUT
QUY............................................................................................................12
IV. HIU LC CA
QUY.........................................................................................................................15
3. CU TRC D LIU BIU DIN DANH SCH ..........................................................................
17
I. KHI NIM DANH SCH
..........................................................................................................................17
II. BIU DIN DANH SCH TRONG MY TNH
......................................................................................17
4. NGN XP V HNG I...........................................................................................................
21
I. NGN XP
(STACK)...................................................................................................................................21
II. HNG I
(QUEUE)..................................................................................................................................23
5. CY (TREE)................................................................................................................................... 27
I. NH
NGHA................................................................................................................................................27
II. CY NH PHN (BINARY
TREE)............................................................................................................28
III. BIU DIN CY NH
PHN....................................................................................................................29

Cu trc d liu v gii thut

\ 2[
IV. PHP DUYT CY NH PHN...............................................................................................................30
V. CY K_PHN .............................................................................................................................................32
VI. CY TNG QUT ....................................................................................................................................32
6. K PHP TIN T, TRUNG T V HU T..............................................................................
35
I. BIU THC DI DNG CY NH
PHN.............................................................................................35
II. CC K PHP CHO CNG MT BIU THC......................................................................................35
III. CCH TNH GI TR BIU THC.........................................................................................................35
IV. CHUYN T DNG TRUNG T SANG DNG HU T
...................................................................38
V. XY DNG CY NH PHN BIU DIN BIU
THC........................................................................41
7. SP XP (SORTING)....................................................................................................................
42
I. BI TON SP XP....................................................................................................................................42
II. THUT TON SP XP KIU CHN (SELECTION SORT)
................................................................44
III. THUT TON SP XP NI BT (BUBBLE SORT)
..........................................................................44
IV. THUT TON SP XP KIU
CHN....................................................................................................45
V. SHELL SORT...............................................................................................................................................46

Cu trc d liu v gii thut

\ 3[

VI. THUT TON SP XP KIU PHN ON (QUICK SORT)


...........................................................47
VII. THUT TON SP XP KIU VUN NG (HEAP SORT)
..............................................................49
VIII. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)
.....................................52
IX. TNH N NH CA THUT TON SP XP
(STABILITY)............................................................53
X. THUT TON SP XP BNG C S (RADIX
SORT).......................................................................53
XI. THUT TON SP XP TRN (MERGE SORT)
.................................................................................57
XII. CI T ...................................................................................................................................................59
XIII. NHNG NHN XT CUI
CNG.......................................................................................................68
8. TM KIM (SEARCHING).............................................................................................................. 70
I. BI TON TM KIM.................................................................................................................................70
II. TM KIM TUN T (SEQUENTIAL
SEARCH)....................................................................................70
III. TM KIM NH PHN (BINARY
SEARCH)...........................................................................................70
IV. CY NH PHN TM KIM (BINARY SEARCH TREE - BST)
...........................................................71
V. PHP BM
(HASH)....................................................................................................................................74
VI. KHO S VI BI TON TM KIM
...................................................................................................75
VII. CY TM KIM S HC (DIGITAL SEARCH TREE - DST)
.............................................................75
VIII. CY TM KIM C S (RADIX SEARCH TREE - RST)
..................................................................78
IX. NHNG NHN XT CUI
CNG..........................................................................................................82

Cu trc d liu v gii thut

\ 4[

0. CC BC C BN KHI TIN HNH GII CC BI TON TIN HC


I. XC NH BI TON
Input Process Output
(D liu vo X l Kt qu ra)
Vic xc nh bi ton tc l phi xc nh xem ta phi gii quyt vn g?, vi gi thit no
cho v li gii cn phi t nhng yu cu no. Khc vi bi ton thun tu ton hc ch cn xc
nh r gi thit v kt lun ch khng cn xc nh yu cu v li gii, i khi nhng bi ton tin
hc ng dng trong thc t ch cn tm li gii tt ti mc no , thm ch l ti mc chp nhn
c. Bi li gii tt nht i hi qu nhiu thi gian v chi ph.
V d:
Khi ci t cc hm s phc tp trn my tnh. Nu tnh bng cch khai trin chui v hn th
chnh xc cao hn nhng thi gian chm hn hng t ln so vi phng php xp x. Trn thc t
vic tnh ton lun lun cho php chp nhn mt sai s no nn cc hm s trong my tnh u
c tnh bng phng php xp x ca gii tch s
Xc nh ng yu cu bi ton l rt quan trng bi n nh hng ti cch thc gii quyt v cht
lng ca li gii. Mt bi ton thc t thng cho bi nhng thng tin kh m h v hnh thc, ta
phi pht biu li mt cch chnh xc v cht ch hiu ng bi ton.
V d:
Bi ton: Mt d n c n ngi tham gia tho lun, h mun chia thnh cc nhm v mi nhm
tho lun ring v mt phn ca d n. Nhm c bao nhiu ngi th c trnh ln by nhiu
kin. Nu ly mi nhm mt kin em ghp li th c mt b kin trin khai d n. Hy
tm cch chia s b kin cui cng thu c l ln nht.
Pht biu li: Cho mt s nguyn dng n, tm cc phn tch n thnh tng cc s nguyn dng
sao cho tch ca cc s l ln nht.
Trn thc t, ta nn xt mt vi trng hp c th thng qua hiu c bi ton r hn v
thy c cc thao tc cn phi tin hnh. i vi nhng bi ton n gin, i khi ch cn qua v
d l ta c th a v mt bi ton quen thuc gii.
II. TM CU TRC D LIU BIU DIN BI TON
Khi gii mt bi ton, ta cn phi nh ngha tp hp d liu biu din tnh trng c th. Vic la
chn ny tu thuc vo vn cn gii quyt v nhng thao tc s tin hnh trn d liu vo. C
nhng thut ton ch thch ng vi mt cch t chc d liu nht nh, i vi nhng cch t chc
d liu khc th s km hiu qu hoc khng th thc hin c. Chnh v vy nn bc xy dng
cu trc d liu khng th tch ri bc tm kim thut ton gii quyt vn .
Cc tiu chun khi la chn cu trc d liu
Cu trc d liu trc ht phi biu din c y cc thng tin nhp v xut ca bi ton
Cu trc d liu phi ph hp vi cc thao tc ca thut ton m ta la chn gii quyt bi
ton.
Cu trc d liu phi ci t c trn my tnh vi ngn ng lp trnh ang s dng
i vi mt s bi ton, trc khi t chc d liu ta phi vit mt on chng trnh nh kho
st xem d liu cn lu tr ln ti mc no.

III. TM THUT TON


Thut ton l mt h thng cht ch v r rng cc quy tc nhm xc nh mt dy thao tc trn cu
trc d liu sao cho: Vi mt b d liu vo, sau mt s hu hn bc thc hin cc thao tc ch
ra, ta t c mc tiu nh.
Cc c trng ca thut ton
1. Tnh n nh
mi bc ca thut ton, cc thao tc phi ht sc r rng, khng gy nn s nhp nhng, ln
xn, tu tin, a ngha. Thc hin ng cc bc ca thut ton th vi mt d liu vo, ch cho duy
nht mt kt qu ra.
2. Tnh dng
Thut ton khng c ri vo qu trnh v hn, phi dng li v cho kt qu sau mt s hu hn
bc.
3. Tnh ng
Sau khi thc hin tt c cc bc ca thut ton theo ng qu trnh nh, ta phi c kt qu
mong mun vi mi b d liu u vo. Kt qu c kim chng bng yu cu bi ton.
4. Tnh ph dng
Thut ton phi d sa i thch ng c vi bt k bi ton no trong mt lp cc bi ton v
c th lm vic trn cc d liu khc nhau.
5. Tnh kh thi
a) Kch thc phi nh: V d: Mt thut ton s c tnh hiu qu bng 0 nu lng b nh m
n yu cu vt qu kh nng lu tr ca h thng my tnh.
b) Thut ton phi c my tnh thc hin trong thi gian cho php, iu ny khc vi li gii ton
(Ch cn chng minh l kt thc sau hu hn bc). V d nh xp thi kho biu cho mt hc k
th khng th cho my tnh chy ti hc k sau mi ra c.
c) Phi d hiu v d ci t.
V d:
Input: 2 s nguyn t nhin a v b khng ng thi bng 0
Output: c s chung ln nht ca a v b
Thut ton s tin hnh c m t nh sau: (Thut ton Euclide)
Bc 1 (Input): Nhp a v b: S t nhin
Bc 2: Nu b 0 th chuyn sang bc 3, nu khng th b qua bc 3, i lm bc 4
Bc 3: t r := a mod b; t a := b; t b := r; Quay tr li bc 2.
Bc 4 (Output): Kt lun c s chung ln nht phi tm l gi tr ca a. Kt thc thut ton.

begin
Input: a, b

b>0?

No

Output a;

Yes

r := a mod b;
a := b;
b := r;
end
Hnh 1: Lu thut gii

Khi m t thut ton bng ngn ng t nhin, ta khng cn phi qu chi tit cc bc v tin
trnh thc hin m ch cn m t mt cch hnh thc chuyn thnh ngn ng lp trnh.
Vit s cc thut ton quy l mt v d.
i vi nhng thut ton phc tp v nng v tnh ton, cc bc v cc cng thc nn m t
mt cch tng minh v ch thch r rng khi lp trnh ta c th nhanh chng tra cu.
i vi nhng thut ton kinh in th phi thuc. Khi gii mt bi ton ln trong mt thi gian
gii hn, ta ch phi thit k tng th cn nhng ch thuc th c vic lp rp vo. Tnh ng
n ca nhng m-un thuc ta khng cn phi quan tm na m tp trung gii quyt cc
phn khc.
IV. LP TRNH
Sau khi c thut ton, ta phi tin hnh lp trnh th hin thut ton . Mun lp trnh t hiu
qu cao, cn phi c k thut lp trnh tt. K thut lp trnh tt th hin k nng vit chng
trnh, kh nng g ri v thao tc nhanh. Lp trnh tt khng phi ch cn nm vng ngn ng lp
trnh l , phi bit cch vit chng trnh uyn chuyn, khn kho v pht trin dn dn
chuyn cc tng ra thnh chng trnh hon chnh. Kinh nghim cho thy mt thut ton hay
nhng do ci t vng v nn khi chy li cho kt qu sai hoc tc chm.
Thng thng, ta khng nn c th ho ngay ton b chng trnh m nn tin hnh theo phng
php tinh ch tng bc (Stepwise refinement):
Ban u, chng trnh c th hin bng ngn ng t nhin, th hin thut ton vi cc bc
tng th, mi bc nu ln mt cng vic phi thc hin.
Mt cng vic n gin hoc l mt on chng trnh c hc thuc th ta tin hnh vit
m lnh ngay bng ngn ng lp trnh.
Mt cng vic phc tp th ta li chia ra thnh nhng cng vic nh hn li tip tc vi
nhng cng vic nh hn .
Trong qu trnh tinh ch tng bc, ta phi a ra nhng biu din d liu. Nh vy cng vi s
tinh ch cc cng vic, d liu cng c tinh ch dn, c cu trc hn, th hin r hn mi lin h
gia cc d liu.

Phng php tinh ch tng bc l mt th hin ca t duy gii quyt vn t trn xung, gip
cho ngi lp trnh c c mt nh hng th hin trong phong cch vit chng trnh. Trnh
vic m mm, xo i vit li nhiu ln, bin chng trnh thnh t giy nhp.
V. KIM TH
1. Chy th v tm li
Chng trnh l do con ngi vit ra, m l con ngi th ai cng c th nhm ln. Mt chng
trnh vit xong cha chc chy c ngay trn my tnh cho ra kt qu mong mun. K nng
tm li, sa li, iu chnh li chng trnh cng l mt k nng quan trng ca ngi lp trnh. K
nng ny ch c c bng kinh nghim tm v sa cha li ca chnh mnh.
C ba loi li:
Li c php: Li ny hay gp nht nhng li d sa nht, ch cn nm vng ngn ng lp trnh
l . Mt ngi c coi l khng bit lp trnh nu khng bit sa li c php.
Li ci t: Vic ci t th hin khng ng thut ton nh, i vi li ny th phi xem li
tng th chng trnh, kt hp vi cc chc nng g ri sa li cho ng.
Li thut ton: Li ny t gp nht nhng nguy him nht, nu nh th phi iu chnh li thut
ton, nu nng th c khi phi loi b hon ton thut ton sai v lm li t u.
2. Xy dng cc b test
C nhiu chng trnh rt kh kim tra tnh ng n. Nht l khi ta khng bit kt qu ng l th
no?. V vy nu nh chng trnh vn chy ra kt qu (khng bit ng sai th no) th vic tm li
rt kh khn. Khi ta nn lm cc b test th chng trnh ca mnh.
Cc b test nn t trong cc file vn bn, bi vic to mt file vn bn rt nhanh v mi ln chy
th ch cn thay tn file d liu vo l xong, khng cn g li b test t bn phm. Kinh nghim lm
cc b test l:
Bt u vi mt b test nh, n gin, lm bng tay cng c c p s so snh vi kt qu
chng trnh chy ra.
Tip theo vn l cc b test nh, nhng cha cc gi tr c bit hoc tm thng. Kinh nghim
cho thy y l nhng test d sai nht.
Cc b test phi a dng, trnh s lp i lp li cc b test tng t.
C mt vi test ln ch kim tra tnh chu ng ca chng trnh m thi. Kt qu c ng
hay khng th trong a s trng hp, ta khng th kim chng c vi test ny.
Lu rng chng trnh chy qua c ht cc test khng c ngha l chng trnh ng. Bi
c th ta cha xy dng c b test lm cho chng trnh chy sai. V vy nu c th, ta nn tm
cch chng minh tnh ng n ca thut ton v chng trnh, iu ny thng rt kh.
VI. TI U CHNG TRNH
Mt chng trnh chy ng khng c ngha l vic lp trnh xong, ta phi sa i li mt vi
chi tit chng trnh c th chy nhanh hn, hiu qu hn. Thng thng, trc khi kim th th
ta nn t mc tiu vit chng trnh sao cho n gin, min sao chy ra kt qu ng l c,
sau khi ti u chng trnh, ta xem li nhng ch no vit cha tt th ti u li m lnh
chng trnh ngn hn, chy nhanh hn. Khng nn vit ti u ti u m n , bi chng trnh
c m lnh ti u thng phc tp v kh kim sot.
Ta nn ti u chng trnh theo cc tiu chun sau:

1. Tnh tin cy
Chng trnh phi chy ng nh d nh, m t ng mt gii thut ng. Thng thng khi vit
chng trnh, ta lun c thi quen kim tra tnh ng n ca cc bc mi khi c th.
2. Tnh uyn chuyn
Chng trnh phi d sa i. Bi t c chng trnh no vit ra hon ho ngay c m vn cn
phi sa i li. Chng trnh vit d sa i s lm gim bt cng sc ca lp trnh vin khi pht
trin chng trnh.
3. Tnh trong sng
Chng trnh vit ra phi d c d hiu, sau mt thi gian di, khi c li cn hiu mnh lm ci
g?. nu c iu kin th cn c th sa sai (nu pht hin li mi), ci tin hay bin i c
chng trnh gii quyt bi ton khc. Tnh trong sng ca chng trnh ph thuc rt nhiu vo
cng c lp trnh v phong cch lp trnh.
4. Tnh hu hiu
Chng trnh phi chy nhanh v t tn b nh, tc l tit kim c c v khng gian v thi gian.
c mt chng trnh hu hiu, cn phi c gii thut tt v nhng tiu xo khi lp trnh. Tuy
nhin, vic p dng qu nhiu tiu xo c th khin chng trnh tr nn ri rm, kh hiu khi sa
i. Tiu chun hu hiu nn dng li mc chp nhn c, khng quan trng bng ba tiu chun
trn. Bi phn cng pht trin rt nhanh, yu cu hu hiu khng cn phi t ra qu nng.
T nhng phn tch trn, chng ta nhn thy rng vic lm ra mt chng trnh i hi rt nhiu
cng on v tiu tn kh nhiu cng sc. Ch mt cng on khng hp l s lm tng chi ph vit
chng trnh. Ngh ra cch gii quyt vn kh, bin tng thnh hin thc cng khng
d cht no.
Nhng cu trc d liu v gii thut cp ti trong chuyn ny l nhng kin thc rt ph
thng, mt ngi hc lp trnh khng sm th mun cng phi bit ti. Ch hy vng rng khi hc
xong chuyn ny, qua nhng cu trc d liu v gii thut ht sc mu mc, chng ta rt ra c
bi hc kinh nghim: ng bao gi vit chng trnh khi m cha suy xt k v gii thut v
nhng d liu cn thao tc, bi nh vy ta d mc phi hai sai lm trm trng: hoc l sai v gii
thut, hoc l gii thut khng th trin khai ni trn mt cu trc d liu khng ph hp. Ch cn
mc mt trong hai li thi th nguy c sp ton b chng trnh l hon ton c th, cng c
(*)
cha cng b ri, kh nng hu nh chc chn l phi lm li t u .

(*)

Tt nhin, cn thn n u th cng c xc sut ri ro nht nh, ta hiu c mc tai hi ca hai li ny hn


ch n cng nhiu cng tt

1. PHN TCH THI GIAN THC HIN GII THUT


I. PHC TP TNH TON CA GII THUT
Vi mt bi ton khng ch c mt gii thut. Chn mt gii thut a ti kt qu nhanh nht l mt
i hi thc t. Nh vy cn c mt cn c no ni rng gii thut ny nhanh hn gii thut
kia ?.
Thi gian thc hin mt gii thut bng chng trnh my tnh ph thuc vo rt nhiu yu t. Mt
yu t cn ch nht l kch thc ca d liu a vo. D liu cng ln th thi gian x l cng
chm, chng hn nh thi gian sp xp mt dy s phi chu nh hng ca s lng cc s thuc
dy s . Nu gi n l kch thc d liu a vo th thi gian thc hin ca mt gii thut c th
biu din mt cch tng i nh mt hm ca n: T(n).
Phn cng my tnh, ngn ng vit chng trnh v chng trnh dch ngn ng y u nh hng
ti thi gian thc hin. Nhng yu t ny khng ging nhau trn cc loi my, v vy khng th da
vo chng khi xc nh T(n). Tc l T(n) khng th biu din bng n v thi gian gi, pht, giy
c. Tuy nhin, khng phi v th m khng th so snh c cc gii thut v mt tc . Nu
2

nh thi gian thc hin mt gii thut l T1(n) = n v thi gian thc hin ca mt gii thut khc l
T2(n) = 100n th khi n ln, thi gian thc hin ca gii thut T2 r rng nhanh hn gii thut T1.
2
Khi , nu ni rng thi gian thc hin gii thut t l thun vi n hay t l thun vi n cng cho ta
mt cch nh gi tng i v tc thc hin ca gii thut khi n kh ln. Cch nh gi thi
gian thc hin gii thut c lp vi my tnh v cc yu t lin quan ti my tnh nh vy s dn
ti khi nim gi l phc tp tnh ton ca gii thut.
Cho f v g l hai hm xc nh dng vi mi n. Hm f(n) c gi l O(g(n)) nu tn ti mt hng
s c > 0 v mt gi tr n0 sao cho:
f(n) c.g(n) vi n n0
Ngha l nu xt nhng gi tr n n0 th hm f(n) s b chn trn bi mt hng s nhn vi g(n). Khi
, nu f(n) l thi gian thc hin ca mt gii thut th ta ni gii thut c cp l g(n) (hay
phc tp tnh ton l O(g(n))).
II. XC NH PHC TP TNH TON CA GII THUT
Vic xc nh phc tp tnh ton ca mt gii thut bt k c th rt phc tp. Tuy nhin, trong
thc t, i vi mt s gii thut ta c th phn tch bng mt s quy tc n gin:
1. Quy tc tng
Nu on chng trnh P1 c thi gian thc hin T1(n) =O(f(n)) v on chng trnh P2 c thi
gian thc hin l T2(n) = O(g(n)) th thi gian thc hin P1 ri n P2 tip theo s l
T1(n) + T2(n) = O(max(f(n), g(n)))
Chng minh:
T1(n) = O(f(n)) nn n1 v c1 T1(n) c1.f(n) vi n n1.
T2(n) = O(g(n)) nn n2 v c2 T2(n) c2.g(n) vi n n2.
Chn n0 = max(n1, n2) v c = max(c1, c2) ta c:
Vi n n0:
T1(n) + T2(n) c1.f(n) + c2.g(n) c.f(n) + c.g(n) c.(f(n) + g(n)) 2c.(max(f(n), g(n))).
Vy T1(n) + T2(n) = O(max(f(n), g(n))).

2. Quy tc nhn
Nu on chng trnh P c thi gian thc hin l T(n) = O(f(n)). Khi , nu thc hin k(n) ln
on chng trnh P vi k(n) = O(g(n)) th phc tp tnh ton s l O(g(n).f(n))
Chng minh:
Thi gian thc hin k(n) ln on chng trnh P s l k(n)T(n). Theo nh ngha:
ck 0 v nk k(n) ck(g(n)) vi n nk
cT 0 v nT T(n) cT(f(n)) vi n nT
Vy vi n max(nT, nk) ta c k(n).T(n) cT.ck(g(n).f(n))
3. Mt s tnh cht
Theo nh ngha v phc tp tnh ton ta c mt s tnh cht:
k
a) Vi P(n) l mt a thc bc k th O(P(n)) = O(n ). V th, mt thut ton c phc tp cp a
k
thc, ngi ta thng k hiu l O(n )
b) Vi a v b l hai c s tu v f(n) l mt hm dng th logaf(n) = logab.logbf(n). Tc l:
O(logaf(n)) = O(logbf(n)). Vy vi mt thut ton c phc tp cp logarit ca f(n), ngi ta k
hiu l O(logf(n)) m khng cn ghi c s ca logarit.
c) Nu mt thut ton c phc tp l hng s, tc l thi gian thc hin khng ph thuc vo
kch thc d liu vo th ta k hiu phc tp tnh ton ca thut ton l O(1).
n
n
d) Mt gii thut c cp l cc hm nh 2 , n!, n c gi l mt gii thut c phc tp hm m.
Nhng gii thut nh vy trn thc t thng c tc rt chm. Cc gii thut c cp l cc hm
a thc hoc nh hn hm a thc th thng chp nhn c.
2
3
e) Khng phi lc no mt gii thut cp O(n ) cng tt hn gii thut cp O(n ). Bi nu nh gii
2

thut cp O(n ) c thi gian thc hin l 1000n , cn gii thut cp O(n ) li ch cn thi gian thc
3

hin l n , th vi n < 1000, r rng gii thut O(n ) tt hn gii thut O(n ). Trn y l xt trn
phng din tnh ton l thuyt nh ngha gii thut ny "tt" hn gii thut kia, khi chn mt
thut ton gii mt bi ton thc t phi c mt s mm do nht nh.
f) Cng theo nh ngha v phc tp tnh ton
Mt thut ton c cp O(1) cng c th vit l O(logn)
Mt thut ton c cp O(logn) cng c th vit l O(n)
Mt thut ton c cp O(n) cng c th vit l O(n.logn)
2

Mt thut ton c cp O(n.logn) cng c th vit l O(n )


2

Mt thut ton c cp O(n ) cng c th vit l O(n )


Mt thut ton c cp O(n ) cng c th vit l O(2 )
Vy phc tp tnh ton ca mt thut ton c nhiu cch k hiu, thng thng ngi ta chn
cp thp nht c th, tc l chn k php O(f(n)) vi f(n) l mt hm tng chm nht theo n.
Di y l mt s hm s hay dng k hiu phc tp tnh ton v bng gi tr ca chng
tin theo di s tng ca hm theo i s n.
log2n
0
1
2
3
4
5

n
1
2
4
8
16
32

nlog2n
0
2
8
24
64
160

V d:
Thut ton tnh tng cc s t 1 ti n:

n2
1
4
16
64
256
1024

n3
1
8
64
512
4096
32768

2n
2
4
16
256
65536
2147483648

Nu vit theo s nh sau:


Input n;
S := 0;
for i := 1 to n do S := S + i;
Output S;

Cc on chng trnh cc dng 1, 2 v 4 c phc tp tnh ton l O(1).


Vng lp dng 3 lp n ln php gn S := S + i, nn thi gian tnh ton t l thun vi n. Tc l
phc tp tnh ton l O(n).
Vy phc tp tnh ton ca thut ton trn l O(n).
Cn nu vit theo s nh sau:
Input n;
S := n * (n - 1) div 2;
Output S;

Th phc tp tnh ton ca thut ton trn l O(1), thi gian tnh ton khng ph thuc vo n.
4. Php ton tch cc
Da vo nhng nhn xt nu trn v cc quy tc khi nh gi thi gian thc hin gii thut, ta
ch cn ch n mt php ton m ta gi l php ton tch cc trong mt on chng trnh. l
mt php ton trong mt on chng trnh m s ln thc hin khng t hn cc php ton
khc.
x
Xt hai on chng trnh tnh e bng cng thc gn ng:
i
n
n
x 2
x
x
x

e 1 ...
vi x v n cho trc.
x
n! i 0 i!
1! 2!
{Chng trnh 1: Tnh ring tng hng t ri cng li}

program Exp1;
var
i, j, n: Integer;
x, p, S: Real;
begin
Write('x, n = '); ReadLn(x, n);
S := 0;
for i := 0 to n do
begin
p := 1;
for j := 1 to i do p := p * x / j;
S := S + p;
end;
WriteLn('exp(', x:1:4, ') = ', S:1:4);
end.
Ta c th coi php ton tch cc
y l p := p
* x / j;
S ln thc hin php ton ny l:
0 + 1 + 2 + ... + n = n(n - 1)/2 ln.
Vy phc tp tnh ton ca thut ton l
2
O(n )

{Tnh hng t sau qua hng t trc}

program Exp2;
var
i, n: Integer;
x, p, S: Real;
begin
Write('x, n = '); ReadLn(x, n);
S := 1; p := 1;
for i := 1 to n do
begin
p := p * x / i;
S := S + p;
end;
WriteLn('exp(', x:1:4, ') = ', S:1:4);
end.

Ta c th coi php ton tch cc y l


php p := p * x / i.
S ln thc hin php ton ny l n.
Vy phc tp tnh ton ca thut ton l O(n).

V. PHC TP TNH TON VI TNH TRNG D LIU VO


C nhiu trng hp, thi gian thc hin gii thut khng phi ch ph thuc vo kch thc d liu
m cn ph thuc vo tnh trng ca d liu na. Chng hn thi gian sp xp mt dy s theo
th t tng dn m dy a vo cha c th t s khc vi thi gian sp xp mt dy s sp xp
ri hoc sp xp theo th t ngc li. Lc ny, khi phn tch thi gian thc hin gii thut ta s
phi xt ti trng hp tt nht, trng hp trung bnh v trng hp xu nht. Khi kh khn trong

vic xc nh phc tp tnh ton trong trng hp trung bnh (bi vic xc nh T(n) trung bnh
thng phi dng ti nhng cng c ton phc tp), ngi ta thng ch nh gi phc tp tnh
ton trong trng hp xu nht.
VI. CHI PH THC HIN THUT TON
Khi nim phc tp tnh ton t ra l nh gi chi ph thc hin mt gii thut v mt thi
gian. Nhng chi ph thc hin gii thut cn c rt nhiu yu t khc na: khng gian b nh phi
s dng l mt v d. Tuy nhin, trn phng din phn tch l thuyt, ta ch c th xt ti vn
thi gian bi vic xc nh cc chi ph khc nhiu khi rt m h v phc tp. i vi ngi lp
trnh th khc, mt thut ton vi phc tp d rt thp cng s l v dng nu nh khng th ci
t c trn my tnh, chnh v vy khi bt tay ci t mt thut ton, ta phi bit cch t chc d
liu mt cch khoa hc, trnh lng ph b nh khng cn thit. C mt quy lut tng i khi t
chc d liu: Tit kim c b nh th thi gian thc hin thng s chm hn v ngc li. Bit
cn i, dung ho hai yu t l mt k nng cn thit ca ngi lp trnh, m k nng li ch
t kinh nghim mi c ch khng th hc c qua sch v.
Bi tp
1. Chng minh mt cch cht ch: Ti sao vi P(n) l a thc bc k th mt gii thut cp O(P(n))
k
cng c th coi cp l cp O(n )
2. Xc nh phc tp tnh ton ca nhng gii thut sau bng k php ch O ln:
a) on chng trnh tnh tng n s nhp t bn phm
Sum := 0;
for i := 1 to n do
begin
Write('Nhp s th ', i, ': '); ReadLn(x);
Sum := Sum + x;
end;

b) on chng trnh tnh tng hai a thc:


m
m-1
n
n-1
P(X) = amx + am-1x + ... + a1x + a0 v Q(X) = bnx + an-1x + ... + b1x + b0
c a thc
p
p-1
R(X) = cpx + cp-1x + ... + c1x + c0
if m < n then p := m else p := n;
{p = min(m, n)}
for i := 0 to p do c[i] := a[i] + b[i];
if p < m then
for i := p + 1 to m do c[i] := a[i]
else
for i := p + 1 to n do c[i] := b[i];
while (p > 0) and (c[p] = 0) do p := p - 1;

b) on chng trnh tnh tch hai a thc:


m
m-1
n
n-1
P(X) = amx + am-1x + ... + a1x + a0 v Q(X) = bnx + an-1x + ... + b1x + b0
c a thc
p
p-1
R(X) = cpx + cp-1x + ... + c1x + c0
p := m + n;
for i := 0 to p
for i := 0 to m
for j := 0 to
c[i + j] :=

do c[i] := 0;
do
n do
c[i + j] + a[i] * b[j];

2. QUY V GII THUT QUY


I. KHI NIM V QUY
Ta ni mt i tng l quy nu n c nh ngha qua chnh n hoc mt i tng khc cng
dng vi chnh n bng quy np.
V d: t hai chic gng cu i din nhau. Trong chic gng th nht cha hnh chic gng
th hai. Chic gng th hai li cha hnh chic gng th nht nn tt nhin n cha li hnh nh
ca chnh n trong chic gng th nht... mt gc nhn hp l, ta c th thy mt dy nh v
hn ca c hai chic gng.
Mt v d khc l nu ngi ta pht hnh trc tip pht thanh vin ngi bn my v tuyn truyn
hnh, trn mn hnh ca my ny li c chnh hnh nh ca pht thanh vin ngi bn my v
tuyn truyn hnh v c nh th...
Trong ton hc, ta cng hay gp cc nh ngha quy:
Giai tha ca n (n!): Nu n = 0 th n! = 1; nu n > 0 th n! = n.(n-1)!
S phn t ca mt tp hp hu hn S ( S ): Nu S = th S = 0; Nu S th tt c mt phn
t x S, khi S = S\{x} + 1. y l phng php nh ngha tp cc s t nhin.
II. GII THUT QUY
Nu li gii ca mt bi ton P c thc hin bng li gii ca bi ton P' c dng ging nh P th
l mt li gii quy. Gii thut tng ng vi li gii nh vy gi l gii thut quy. Mi
nghe th c v hi l nhng im mu cht cn lu l: P' tuy c dng ging nh P, nhng theo
mt ngha no , n phi "nh" hn P, d gii hn P v vic gii n khng cn dng n P.
Trong Pascal, ta thy nhiu v d ca cc hm v th tc c cha li gi quy ti chnh n, by
gi, ta tm tt li cc php quy trc tip v tng h c vit nh th no:
nh ngha mt hm quy hay th tc quy gm hai phn:
Phn neo (anchor): Phn ny c thc hin khi m cng vic qu n gin, c th gii trc tip
ch khng cn phi nh n mt bi ton con no c.
Phn quy: Trong trng hp bi ton cha th gii c bng phn neo, ta xc nh nhng
bi ton con v gi quy gii nhng bi ton con . Khi c li gii (p s) ca nhng bi
ton con ri th phi hp chng li gii bi ton ang quan tm.
Phn quy th hin tnh "quy np" ca li gii. Phn neo cng rt quan trng bi n quyt nh ti
tnh hu hn dng ca li gii.
III. V D V GII THUT QUY
1. Hm tnh giai tha
function Factorial(n: Integer): Integer;

{Nhn vo s t nhin n v tr v

n!}

begin
if n = 0 then Factorial := 1
{Phn neo}
else Factorial := n * Factorial(n - 1); {Phn quy}
end;

y, phn neo nh ngha kt qu hm ti n = 0, cn phn quy (ng vi n > 0) s nh ngha


kt qu hm qua gi tr ca n v giai tha ca n - 1.
V d: Dng hm ny tnh 3!, trc ht n phi i tnh 2! bi 3! c tnh bng tch ca 3 * 2!.
Tng t tnh 2!, n li i tnh 1! bi 2! c tnh bng 2 * 1!. p dng bc quy np ny thm
mt ln na, 1! = 1 * 0!, v ta t ti trng hp ca phn neo, n y t gi tr 1 ca 0!, n tnh

c 1! = 1*1 = 1; t gi tr ca 1! n tnh c 2!; t gi tr ca 2! n tnh c 3!; cui cng cho


kt qu l 6:
3!

3 * 2!

2!

2 *

1!

1!

1 * 0!
0!

2. Dy s Fibonacci
Dy s Fibonacci bt ngun t bi ton c v vic sinh sn ca cc cp th. Bi ton t ra nh sau:
1) Cc con th khng bao gi cht
2) Hai thng sau khi ra i, mi cp th mi s sinh ra mt cp th con (mt c, mt ci)
3) Khi sinh con ri th c mi thng tip theo chng li sinh c mt cp con mi
Gi s t u thng 1 c mt cp mi ra i th n gia thng th n s c bao nhiu cp.
V d, n = 5, ta thy:
Gia thng th 1: 1 cp (ab) (cp ban u)
Gia thng th 2: 1 cp (ab) (cp ban u vn cha )
Gia thng th 3: 2 cp (AB)(cd) (cp ban u ra thm 1 cp con)
Gia thng th 4: 3 cp (AB)(cd)(ef) (cp ban u tip tc )
Gia thng th 5: 5 cp (AB)(CD)(ef)(gh)(ik) (c cp (AB) v (CD) cng )
By gi, ta xt ti vic tnh s cp th thng th n: F(n)
Nu mi cp th thng th n - 1 u sinh ra mt cp th con th s cp th thng th n s l:
F(n) = 2 * F(n - 1)
Nhng vn khng phi nh vy, trong cc cp th thng th n - 1, ch c nhng cp th c
thng th n - 2 mi sinh con thng th n c thi. Do F(n) = F(n - 1) + F(n - 2) (= s c +
s sinh ra). Vy c th tnh c F(n) theo cng thc sau:
F(n) = 1 nu n 2
F(n) = F(n - 1) + F(n - 2) nu n > 2
function F(n: Integer): Integer;

{Tnh s cp th thng th

n}

begin
if n 2 then F := 1
else F := F(n - 1) + F(n - 2);
end;

{Phn neo}
{Phn quy}

3. Gi thuyt ca Collatz
Collatz a ra gi thuyt rng: vi mt s nguyn dng X, nu X chn th ta gn X := X div 2; nu
X l th ta gn X := X * 3 + 1. Th sau mt s hu hn bc, ta s c X = 1.
V du: X = 10, cc bc tin hnh nh sau:
1.
2.
3.
4.
5.
6.

X
X
X
X
X
X

=
=
=
=
=
=

10 (chn)
5 (l);
16 (chn)
8 (chn)
4 (chn)
2 (chn)

X
X
X
X
X
X

:=
:=
:=
:=
:=
:=

10 div 2;
5 * 3 + 1;
16 div 2;
8 div 2;
4 div 2;
2 div 2;

(X
(X
(X
(X
(X
(X

:=
:=
:=
:=
:=
:=

5)
16)
8)
4)
2)
1)

C cho gi thuyt Collatz l ng n, vn t ra l: Cho trc s 1 cng vi hai php ton * 2


v div 3, hy s dng mt cch hp l hai php ton bin s 1 thnh mt gi tr nguyn dng
X cho trc.
V d: X = 10 ta c 1 * 2 * 2 * 2 * 2 div 3 * 2 = 10.

D thy rng li gii ca bi ton gn nh th t ngc ca php bin i Collatz: biu din s
X > 1 bng mt biu thc bt u bng s 1 v hai php ton "* 2", "div 3". Ta chia hai trng hp:
Nu X chn, th ta tm cch biu din s X div 2 v vit thm php ton * 2 vo cui
Nu X l, th ta tm cch biu din s X * 3 + 1 v vit thm php ton div 3 vo cui
procedure Solve(X: Integer);
begin
if X = 1 then Write(X)
else
if X mod 2 = 0 then
begin
Solve(X div 2);
Write(' * 2');
end
else
begin
Solve(X * 3 + 1);

{In ra cch biu din s X}


{Phn neo}
{Phn quy}
{X chn}
{Tm cch biu din s X div 2}
{Sau vit thm php ton *

2}
{X l}
{Tm cch biu din s X * 3 +
1}

end;

Write(' div 3');


end;

{Sau vit thm php ton div 3}

Trn y l cch vit quy trc tip, cn c mt cch vit quy tng h nh sau:
procedure Solve(X: Integer); forward; {Th tc tm cch biu din s X: Khai bo trc, c t sau}
procedure SolveOdd(X: Integer);
begin
Solve(X * 3 + 1);
Write(' div 3');
end;

{Th tc tm cch biu din s X > 1 trong trng hp X l}

procedure SolveEven(X: Integer);


begin
Solve(X div 2);
Write(' * 2');
end;

{Th tc tm cch biu din s X trong trng hp X chn}

procedure Solve(X: Integer);


begin
if X = 1 then Write(X)
else
if X mod 2 = 1 then SolveOdd(X)
else SolveEven(X);
end;

{Phn c t ca th tc Solve khai bo trc trn}

Trong c hai cch vit, tm biu din s X theo yu cu ch cn gi Solve(X) l xong. Tuy nhin
trong cch vit quy trc tip, th tc Solve c li gi ti chnh n, cn trong cch vit quy
tng h, th tc Solve cha li gi ti th tc SolveOdd v SolveEven, hai th tc ny li cha
trong n li gi ngc v th tc Solve.
i vi nhng bi ton nu trn, vic thit k cc gii thut quy tng ng kh thun li v c
hai u thuc dng tnh gi tr hm m nh ngha quy np ca hm c xc nh d dng.
Nhng khng phi lc no php gii quy cng c th nhn nhn v thit k d dng nh vy. Th
th vn g cn lu tm trong php gii quy?. C th tm thy cu tr li qua vic gii p cc
cu hi sau:
1. C th nh ngha c bi ton di dng phi hp ca nhng bi ton cng loi nhng nh hn
hay khng ? Khi nim "nh hn" l th no ?
2. Trng hp c bit no ca bi ton s c coi l trng hp tm thng v c th gii ngay
c a vo phn neo ca php gii quy

4. Bi ton Thp H Ni
y l mt bi ton mang tnh cht mt tr chi, ni dung nh sau: C n a ng knh hon ton
phn bit, t chng ln nhau, cc a c xp theo th t gim dn ca ng knh tnh t di
ln, a to nht c t st t. C ba v tr c th t cc a nh s 1, 2, 3. Chng a ban u
c t v tr 1:

Hnh 2: Thp H Ni

Ngi ta mun chuyn c chng a t v tr 1 sang v tr 2, theo nhng iu kin:


Khi di chuyn mt a, phi t n vo mt trong ba v tr cho
Mi ln ch c th chuyn mt a v phi l a trn cng
Ti mt v tr, a no mi chuyn n s phi t ln trn cng
a ln hn khng bao gi c php t ln trn a nh hn (hay ni cch khc: mt a ch
c t trn mt t hoc t trn mt a ln hn)
Trong trng hp c 2 a, cch lm c th m t nh sau:
Chuyn a nh sang v tr 3, a ln sang v tr 2 ri chuyn a nh t v tr 3 sang v tr 2.
Nhng ngi mi bt u c th gii quyt bi ton mt cch d dng khi s a l t, nhng h s
gp rt nhiu kh khn khi s cc a nhiu hn. Tuy nhin, vi t duy quy np ton hc v mt
my tnh th cng vic tr nn kh d dng:
C n a.
Nu n = 1 th ta chuyn a duy nht t v tr 1 sang v tr 2 l xong.
Gi s rng ta c phng php chuyn c n - 1 a t v tr 1 sang v tr 2, th cch chuyn n 1 a t v tr x sang v tr y (1 x, y 3) cng tng t.
Gi s rng ta c phng php chuyn c n - 1 a gia hai v tr bt k. chuyn n a t
v tr x sang v tr y, ta gi v tr cn li l z (=6 - x - y). Coi a to nht l ... mt t, chuyn n 1 a cn li t v tr x sang v tr z, sau chuyn a to nht sang v tr y v cui cng li
coi a to nht l mt t, chuyn n - 1 a cn li ang v tr z sang v tr y chng ln a to
nht .
Cch lm c th hin trong th tc quy di y:
procedure Move(n, x, y: Integer);

{Th tc chuyn n a t v tr x sang v

tr y}

begin
if n = 1 then WriteLn('Chuyn 1 a t ', x, ' sang ', y)
else
{ chuyn n > 1 a t v tr x sang v tr y, ta chia lm 3 cng on}
begin
Move(n - 1, x, 6 - x - y);
{Chuyn n - 1 a t x sang v tr cn li}
Move(1, x, y);
{Chuyn a to nht t x sang
y}

Move(n - 1, 6 - x - y, y);
end;

{Chuyn n - 1 a t v tr cn li sang v tr y}

end;

Chng trnh chnh rt n gin, ch gm c 2 vic: Nhp vo s n v gi Move(n, 1, 2).


IV. HIU LC CA QUY
Qua cc v d trn, ta c th thy quy l mt cng c mnh gii cc bi ton. C nhng bi
ton m bn cnh gii thut quy vn c nhng gii thut lp kh n gin v hu hiu. Chng

hn bi ton tnh giai tha hay tnh s Fibonacci. Tuy vy, quy vn c vai tr xng ng ca n,
c nhiu bi ton m vic thit k gii thut quy n gin hn nhiu so vi li gii lp v trong
mt s trng hp chng trnh quy hot ng nhanh hn chng trnh vit khng c quy.
Gii thut cho bi Thp H Ni v thut ton sp xp kiu phn on (Quick Sort) m ta s ni ti
trong cc bi sau l nhng v d.
C mt mi quan h khng kht gia quy v quy np ton hc. Cch gii quy cho mt bi ton
da trn vic nh r li gii cho trng hp suy bin (neo) ri thit k lm sao li gii ca bi
ton c suy ra t li gii ca bi ton nh hn cng loi nh th. Tng t nh vy, quy np ton
hc chng minh mt tnh cht no ng vi s t nhin cng bng cch chng minh tnh cht
ng vi mt s trng hp c s (thng ngi ta chng minh n ng vi 0 hay ng vi 1) v
sau chng minh tnh cht s ng vi n bt k nu n ng vi mi s t nhin nh hn n.
Do ta khng ly lm ngc nhin khi thy quy np ton hc c dng chng minh cc tnh
cht c lin quan ti gii thut quy. Chng hn: Chng minh s php chuyn a gii bi ton
n
Thp H Ni vi n a l 2 -1:
1

R rng l tnh cht ny ng vi n = 1, bi ta cn 2 - 1 = 1 ln chuyn a thc hin yu


cu
n-1
Vi n > 1; Gi s rng chuyn n - 1 a gia hai v tr ta cn 2 - 1 php chuyn a, khi
chuyn n a t v tr x sang v tr y, nhn vo gii thut quy ta c th thy rng trong
n-1

trng hp ny n cn (2 - 1) + 1 + (2
minh ng vi n
Vy th cng thc ny s ng vi mi n.

n-1

- 1) = 2 - 1 php chuyn a. Tnh cht c chng

Tht ng tic nu nh chng ta phi lp trnh vi mt cng c khng cho php quy, nhng nh
vy khng c ngha l ta b tay trc mt bi ton mang tnh quy. Mi gii thut quy u c
cch thay th bng mt gii thut khng quy (kh quy), c th ni c nh vy bi tt c cc
chng trnh con quy s u c trnh dch chuyn thnh nhng m lnh khng quy trc
khi giao cho my tnh thc hin.
Vic tm hiu cch kh quy mt cch "my mc" nh cc chng trnh dch th ch cn hiu r
c ch xp chng ca cc th tc trong mt dy chuyn gi quy l c th lm c. Nhng mun
kh quy mt cch tinh t th phi tu thuc vo tng bi ton m kh quy cho kho. Khng
phi tm u xa, nhng k thut gii cng thc truy hi bng quy hoch ng l v d cho thy tnh
ngh thut trong nhng cch tip cn bi ton mang bn cht quy tm ra mt gii thut khng
quy y hiu qu.
Bi tp
1. Vit mt hm quy tnh c s chung ln nht ca hai s t nhin a, b khng ng thi bng 0,
ch r u l phn neo, u l phn quy.
k

2. Vit mt hm quy tnh C theo cng thc truy hi sau:


n

C n Cn 1

k
k1
k
Vi 0 < k < n: C n C n1 Cn1
k

Chng minh rng hm cho ra ng gi tr C n

n!
.
k!(n k)!

3. Nu r cc bc thc hin ca gii thut cho bi Thp H Ni trong trng hp n = 3.

3. CU TRC D LIU BIU DIN DANH SCH


I. 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, xo mt phn t khi
danh sch, sp xp li cc phn t trong danh sch theo mt trt t no v.v...
II. BIU DIN DANH SCH TRONG MY TNH
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.
1. Ci t bng mng mt chiu
Khi ci t danh sch bng mt mng, th c mt bin nguyn n 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 n.
Chn phn t vo mng:
Mng ban u:
A
1

B
2

...
...

G
p - 1

H
p

I
p + 1

...

Z
n

Nu mun chn mt phn t V vo mng ti v tr p, ta phi:


Dn tt c cc phn t t v tr p ti ti v tr n v sau mt v tr:
A
1

B
2

...
...

G
p - 1

...
...

G
p - 1

...
...

G
p - 1

...
...

G
p - 1

H
p + 1

I
p + 2

...

Z
n + 1

V
p

H
p + 1

I
p + 2

...

Z
n + 1

H
p

I
p + 1

...

Z
n

Sau t gi tr V vo v tr p:
A
1

B
2

Tng n ln 1
Xo phn t khi mng
Mng ban u:
A
1

B
2

Mun xo phn t th p ca mng, ta phi:


Dn tt c cc phn t t v tr p + 1 ti v tr n ln trc mt v tr:

A
1

B
2

I
p

...

Z
n - 1

Gim n i 1

2. Ci t bng danh sch ni n


Danh sch ni n gm cc nt c ni vi nhau theo mt chiu. Mi nt l mt bn ghi (record)
gm hai trng:
Trng th nht cha gi tr lu trong nt
Trng th hai 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.

Nt u tin trong danh sch c gi l cht ca danh sch ni n (Head). duyt danh sch
ni n, ta bt u t cht, da vo trng lin kt i sang nt k tip, n khi gp gi tr c
bit (duyt qua nt cui) th dng li
Value 1

Value 2

...

Value n-1

Value n

...

...
Head

Chn phn t vo danh sch ni n:


Danh sch ban u:
...

...

...

Head

Mun chn thm mt nt cha gi tr V vo v tr ca nt p, ta phi:


To ra mt nt mi NewNode cha gi tr V:
V

Tm nt q l nt ng trc nt p trong danh sch (nt c lin kt ti p).


Nu tm thy th chnh li lin kt: q lin kt ti NewNode, NewNode lin kt ti p
...

...

...

...
q

Head

Nu khng c nt ng trc nt p trong danh sch th tc l p = Head, ta chnh li lin kt:


NewNode lin kt ti Head (c) v t li Head = NewNode
Xo phn t khi danh sch ni n:
Danh sch ban u:
A

...

...
Head

...

...
q

Mun hu nt p khi danh sch ni n, ta phi:


Tm nt q l nt ng lin trc nt p trong danh sch (nt c lin kt ti p)
Nu tm thy th chnh li lin kt: q lin kt thng ti nt lin sau p, khi qu trnh duyt
danh sch bt u t Head khi duyt ti q s nhy qua khng duyt p na, trn thc t khi ci
t bng cc bin ng v con tr, ta nn c thao tc gii phng b nh cp cho nt p
A

...

...
Head

...
...

Nu khng c nt ng trc nt p trong danh sch th tc l p = Head, ta ch vic t li


Head bng nt ng k tip Head (c) trong danh sch. Sau c th gii phng b nh cp
cho nt p (Head c)
3. Ci t bng 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 th nht cha gi tr lu trong nt
Trng th hai (Next) 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 l nt cui cng (khng c nt k tip), trng
lin kt ny c gn mt gi tr c bit.
Trng th ba (Prev) cha lin kt (con tr) ti nt lin trc, tc l cha mt thng tin
bit nt ng trc nt trong danh sch l nt no, trong trng hp l nt u tin (khng
c nt lin trc) trng ny c gn mt gi tr c bit.
Khc vi danh sch ni n, danh sch ni kp c hai cht: Nt u tin trong danh sch c gi
l First, nt cui cng trong danh sch c gi l Last. duyt danh sch ni kp, ta c hai cch:
Hoc bt u t First, da vo lin kt Next i sang nt k tip, n khi gp gi tr c bit
(duyt qua nt cui) th dng li. Hoc bt u t Last, da vo lin kt Prev i sang nt lin
trc, n khi gp gi tr c bit (duyt qua nt u) th dng li
Last

First
Value 1

Value 2

...

Value n-1

Value n

...

Vic chn / xo vo danh sch ni kp cng n gin ch l k thut chnh li cc mi lin kt gia
cc nt cho hp l, ta coi nh bi tp.
4. Ci t bng danh sch ni vng mt hng
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 nil). 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 mt hng.
A

...

...
Head

...

...
q

i vi danh sch ni vng, 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 ca cc lin kt. Chnh v l do ny, khi chn xo
vo danh sch ni vng, ta khng phi x l cc trng hp ring khi chn xo ti v tr ca cht
5. Ci t bng danh sch ni vng hai hng
Danh sch ni vng mt hng ch cho ta duyt cc nt ca danh sch theo mt chiu, nu ci t
bng danh sch ni vng hai hng th ta c th duyt cc nt ca danh sch c theo chiu ngc li
na. Danh sch ni vng hai hng c th to thnh t danh sch ni kp nu ta cho trng Prev
ca nt First tr thng ti nt Last cn trng Next ca nt Last th tr thng v nt First.

Value 1

Value n

Value 2

Value n-1

...
...

Bi tp
1. Lp chng trnh qun l danh sch hc sinh, tu chn loi danh sch cho ph hp, chng trnh
c nhng chc nng sau: (H s mt hc sinh gi s c: Tn, lp, s in thoi, im TB ...)
Cho php nhp danh sch hc sinh t bn phm hay t file.
Cho php in ra danh sch hc sinh gm c tn v xp loi
Cho php in ra danh sch hc sinh gm cc thng tin y
Cho php nhp vo t bn phm mt tn hc sinh v mt tn lp, tm xem c hc sinh c tn
nhp vo trong lp khng ?. Nu c th in ra s in thoi ca hc sinh
Cho php vo mt h s hc sinh mi t bn phm, b sung hc sinh vo danh sch hc sinh,
in ra danh sch mi.
Cho php nhp vo t bn phm tn mt lp, loi b tt c cc hc sinh ca lp khi danh
sch, in ra danh sch mi.
C chc nng sp xp danh sch hc sinh theo th t gim dn ca im trung bnh
Cho php nhp vo h s mt hc sinh mi t bn phm, chn hc sinh vo danh sch m
khng lm thay i th t sp xp, in ra danh sch mi.
Cho php lu tr li trn a danh sch hc sinh khi thay i.
2. C n ngi nh s t 1 ti n ngi quanh mt vng trn (n 10000), cng chi mt tr chi:
Mt ngi no m 1, ngi k tip, theo chiu kim ng h m 2... c nh vy cho ti ngi
m n mt s nguyn t th phi ra khi vng trn, ngi k tip li m bt u t 1:
Hy lp chng trnh
a) Nhp vo 2 s n v S t bn phm
b) Cho bit nu ngi th nht l ngi m 1 th ngi cn li cui cng trong vng trn l ngi
th my
c) Cho bit nu ngi cn li cui cng trong vng trn l ngi th k th ngi m 1 l ngi
no?.
d) Gii quyt hai yu cu trn trong trng hp: u tin tr chi c m theo chiu kim ng
h, khi c mt ngi b ra khi cuc chi th vn l ngi k tip m 1 nhng qu trnh m
ngc li (tc l ngc chiu kim ng h)

4. NGN XP V HNG I
I. NGN XP (STACK)
Ngn xp l mt kiu danh sch c trang b hai php ton b sung mt phn t vo cui danh
sch v loi b mt phn t cng cui danh sch.
C th hnh dung ngn xp nh hnh 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" , Stack
cn c tn gi l danh sch kiu LIFO (Last In First Out) v v tr cui danh sch c gi l nh
(Top) ca Stack.
1. M t Stack bng mng
Khi m t Stack bng mng:
Vic b sung mt phn t vo Stack tng ng vi vic thm mt phn t vo cui mng.
Vic loi b mt phn t khi Stack tng ng vi vic loi b mt phn t cui mng.
Stack b trn khi b sung vo mng y
Stack l rng khi s phn t thc s ang cha trong mng = 0.
program StackByArray;
const
max = 10000;
var
Stack: array[1..max] of Integer;
Last: Integer;
procedure StackInit;

{Khi

to

Stack

rng}

begin
Last := 0;
end;
procedure Push(V: Integer);

{y mt gi tr V vo

Stack}

begin
if Last = max then WriteLn('Stack is full')

{Nu Stack y th khng y c thm vo

na}

else
begin
Inc(Last); Stack[Last] := V;
end;
end;
function Pop: Integer;

{Nu khng th thm mt phn t vo cui mng}

{Ly mt gi tr ra khi Stack, tr v trong kt qu

hm}

begin
if Last = 0 then WriteLn('Stack is empty')
else
begin
Pop := Stack[Last]; Dec(Last);
end;
end;

{Stack ang rng th khng ly c}

{Ly phn t cui ra khi mng}

begin
StackInit;
<Test>;
end.

Khi ci t bng mng, tuy cc thao tc i vi Stack vit ht sc n gin nhng y ta vn chia
thnh cc chng trnh con, mi chng trnh con m t mt thao tc, t v sau, ta ch cn
bit rng chng trnh ca ta c mt cu trc Stack, cn ta m phng c th nh th no th khng

cn phi quan tm na, v khi ci t Stack bng cc cu trc d liu khc, ch cn sa li cc th


tc StackInit, Push v Pop m thi.
2. M t Stack bng danh sch ni n kiu LIFO
Khi ci t Stack bng danh sch ni n kiu LIFO, th Stack b trn khi vng khng gian nh
dng cho cc bin ng khng cn thm mt phn t mi. Tuy nhin, vic kim tra iu ny
rt kh bi n ph thuc vo my tnh v ngn ng lp trnh. V d nh i vi Turbo Pascal, khi
Heap cn trng 80 Bytes th cng ch ch cho 10 bin, mi bin 6 Bytes m thi. Mt khc,
khng gian b nh dng cho cc bin ng thng rt ln nn ci t di y ta b qua vic kim
tra Stack trn.
V1

V2

...

Vn-1

Vn

...
Last

program StackByLinkedList;
type
PNode = ^TNode;
{Con tr ti mt nt ca danh
sch}

TNode = record

{Cu trc mt nt ca danh

sch}

Value: Integer;
Link: PNode;
end;
var
Last: PNode;

{Con tr nh Stack}

procedure StackInit; {Khi to Stack rng}


begin
Last := nil;
end;
procedure Push(V: Integer); {y gi tr V vo Stack thm nt mi cha V v ni nt vo danh sch}
var
P: PNode;
begin
New(P); P^.Value := V;
{To ra mt nt mi}
P^.Link := Last; Last := P;
{Mc nt vo danh sch}
end;
function Pop: Integer;
{Ly mt gi tr ra khi Stack, tr v trong kt qu hm}
var
P: PNode;
begin
if Last = nil then WriteLn('Stack is empty')
else
begin
Pop := Last^.Value;
{Gn kt qu hm}
P := Last^.Link;
{Gi li nt tip theo last^ (nt c y vo danh sch trc nt Last^)}
Dispose(Last); Last := P; {Gii phng b nh cp cho Last^, cp nht li Last mi}
end;
end;
begin
StackInit;
<Test>
end.

II. HNG I (QUEUE)


Hng i l mt kiu danh sch c trang b hai php ton b sung mt phn t vo cui danh
sch (Rear) v loi b mt phn t u danh sch (Front).
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" , Queue cn c tn gi l danh sch kiu
FIFO (First In First Out).
1. M t Queue bng mng
Khi m t Queue bng mng, ta c hai ch s First v Last, First lu ch s phn t u Queue cn
Last lu ch s cui Queue, khi to Queue rng: First := 1 v Last := 0;
thm mt phn t vo Queue, ta tng Last ln 1 v a gi tr vo phn t th Last.
loi mt phn t khi Queue, ta ly gi tr v tr First v tng First ln 1.
Khi Last tng ln ht khong ch s ca mng th mng y, khng th y thm phn t vo
na.
Khi First > Last th tc l Queue ang rng
Nh vy ch mt phn ca mng t v tr First ti Last c s dng lm Queue.
program QueueByArray;
const
max = 10000;
var
Queue: array[1..max] of Integer;
First, Last: Integer;
procedure QueueInit;

{Khi to mt hng i

rng}

begin
First := 1; Last := 0;
end;
procedure Push(V: Integer);

{y V vo hng

i}

begin
if Last = max then WriteLn('Overflow')
else
begin
Inc(Last);
Queue[Last] := V;
end;
end;
function Pop: Integer;

{Ly mt gi tr khi hng i, tr v trong kt qu

hm}

begin
if First > Last then WriteLn('Queue is Empty')
else
begin
Pop := Queue[First];
Inc(First);
end;
end;
begin
QueueInit;
<Test>
end.

Xem li chng trnh ci t Stack bng mt mng kch thc ti a 10000 phn t, ta thy rng
nu nh ta lm 6000 ln Push ri 6000 ln Pop ri li 6000 ln Push th vn khng c vn g xy
ra. L do l v ch s Last lu nh ca Stack s c tng ln 6000 ri li gim n 0 ri li tng

tr li ln 6000. Nhng i vi cch ci t Queue nh trn th s gp thng bo li trn mng, bi


mi ln Push, ch s cui hng i Last cng 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 First ti Last l thuc Queue, cc
phn t t v tr 1 ti First - 1 l v ngha.
khc phc iu ny, ta m t Queue bng mt danh sch vng: Coi nh cc phn t ca
mng c xp xung quanh mt vng trn theo chiu kim ng h. Cc phn t nm trn phn
cung trn t v tr First ti v tr Last l cc phn t ca Queue. C thm mt bin n lu s phn
t trong Queue. Vic thm mt phn t vo Queue tng ng vi vic ta dch ch s Last
theo chiu kim ng h mt v tr ri t gi tr mi vo .
Vic loi b mt phn t trong Queue tng ng vi vic ly ra phn t ti v tr First ri
dch First theo chiu kim ng h mt v tr.

Last

First

...

Lu l trong thao tc Push v Pop phi kim tra Queue trn hay Queue cn nn phi cp nht
li bin n. (Thc ra y dng thm bin n cho d hiu ch trn thc t ch cn hai bin First v
Last l ta c th kim tra c Queue trn hay cn ri)
program QueueByCList;
const
max = 10000;
var
Queue: array[1..max] of Integer;
i, n, First, Last: Integer;
procedure QueueInit;
{Khi to Queue rng}
begin
First := 1; Last := 0; n := 0;
end;
procedure Push(V: Integer);
{y gi tr V vo Queue}
begin
if n = max then WriteLn('Queue is Full')
else
begin
if Last = max then Last := 1 else Inc(Last);
Queue[Last] := V;
Inc(n);
end;
end;

{Last chy theo vng trn}

function Pop: Integer;


{Ly mt phn t khi Queue, tr v trong kt qu hm}
begin
if n = 0 then WriteLn('Queue is Empty')
else
begin
Pop := Queue[First];
if First = max then First := 1 else Inc(First); {First chy theo vng trn}
Dec(n);
end;
end;
begin

QueueInit;
<Test>
end.

2. M t Queue bng danh sch ni n kiu FIFO


Tng t nh ci t Stack bng danh sch ni n kiu LIFO, ta cng khng kim tra Queue trn
trong trng hp m t Queue bng danh sch ni n kiu FIFO.
V1

V2

...

Vn-1

Vn

...
First

Last

program QueueByLinkedList;
type
PNode = ^TNode;
{Kiu con tr ti mt nt ca danh sch}
TNode = record
{Cu trc mt nt ca danh sch}
Value: Integer;
Link: PNode;
end;
var
First, Last: PNode;
{Hai con tr ti nt u v nt cui ca danh
sch}

procedure QueueInit;
begin
First := nil;
end;

{Khi to Queue rng}

procedure Push(V: Integer);


{y gi tr V vo Queue}
var
P: PNode;
begin
New(P); P^.Value := V;
{To ra mt nt mi}
P^.Link := nil;
if First = nil then First := P {Mc nt vo danh sch}
else Last^.Link := P;
Last := P;
{Nt mi tr thnh nt cui, cp nht li con tr Last}
end;
function Pop: Integer;
{Ly gi tr khi Queue, tr v trong kt qu hm}
var
P: PNode;
begin
if First = nil then WriteLn('Queue is empty')
else
begin
Pop := First^.Value;
{Gn kt qu hm}
P := First^.Link;
{Gi li nt tip theo First^ (Nt c y vo danh sch ngay sau First^)}
Dispose(First); First := P; {Gii phng b nh cp cho First^, cp nht li First mi}
end;
end;
begin
QueueInit;
<Test>
end.

Bi tp
1. Vit chng trnh m t cch i c s t h thp phn sang h c s R dng ngn xp
2. Tm hiu c ch xp chng ca th tc quy, phng php dng ngn xp kh quy.
3. C cu ng tu ti mt ga xe la nh sau:

1
C

...

Ban u ng ray A cha cc toa tu nh s t 1 ti n theo th t t tri qua phi, ngi ta


mun chuyn cc toa sang ng ray C c mt th t mi l mt hon v ca (1, 2, ..., n),
ch c a cc toa tu chy theo ng ray theo hng mi tn, c th dng on ng ray B
cha tm cc toa tu trong qu trnh di chuyn.
a) Hy nhp vo hon v cn c, cho bit c phng n chuyn hay khng, v nu c hy a ra
cch chuyn:
V d: n = 4; Th t cn c (1, 4, 3, 2)
1.
2.
3.
4.
5.
6.

A
A
A
A
B
B

C
B
B
C
C
C

b) Nhng hon v no ca th t cc toa l c th to thnh trn on ng ray C vi lut di


chuyn nh trn
4. Tng t nh bi 3, nhng vi s ng ray sau:
C

...

2
A

5. CY (TREE)
I. NH NGHA
Cu trc d liu tru tng ta quan tm ti trong mc ny l cu trc cy. Cy l mt cu trc d
liu 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 cc quy nh sau:
1. Mi nt l mt cy, nt cng l gc ca cy y
2. Nu n l mt nt v n1, n2, ..., nk ln lt l gc ca cc cy T1, T2, ..., Tk; cc cy ny i mt
khng c nt chung. Th nu cho nt n tr thnh cha ca cc nt n 1, n2, ..., nk ta s c mt cy
mi T. Cy ny c nt n l gc cn cc cy T1, T2, ..., Tk tr thnh cc cy con (subtree) ca
gc.
3. tin, ngi ta cn cho php tn ti mt cy khng c nt no m ta gi l cy rng (null
tree).
Xt cy di y:
A

Hnh 3: Cy

A l cha ca B, C, D, cn G, H, I l con ca D
S cc con ca mt nt c gi l cp ca nt , v d cp ca A l 3, cp ca B l 2, cp
ca C l 0.
Nt c cp bng 0 c gi l nt l (leaf) hay nt tn cng. V d nh trn, cc nt E, F, C,
G, J, K v I l cc nt l. Nhng nt khng phi l l c gi l nt nhnh (branch)
Cp cao nht ca mt nt trn cy gi l cp ca cy , cy hnh trn l cy cp 3.
Gc ca cy ngi ta gn cho s mc l 1, nu nt cha c mc l i th nt con s c mc l i +
1. Mc ca cy trn c ch ra trong hnh sau:
A

2 B

3 F

2 C

2 D

3 G

3 H

K 4

Hnh 4: Mc ca cc nt trn cy

Chiu cao (height) hay chiu su (depth) ca mt cy l s mc ln nht ca nt c trn cy


Cy trn c chiu cao l 4
Mt tp hp cc cy phn bit c gi l rng (forest), mt cy cng l mt rng. Nu b nt
gc trn cy th s to thnh mt rng cc cy con.

V d:
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 v tp 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:
*

(a + b)*(c - d / e)
a

Hnh 5: Cy biu din biu thc

II. CY NH PHN (BINARY TREE)


Cy nh phn 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 .
Cy nh phn l cy c tnh n th t ca cc nhnh con.
Cn ch ti mt s dng c bit ca cy nh phn
1
2

1
2

2
3

3
4

b)

4
5

a)

c)

d)

Hnh 6: Cc dng cy nh phn suy bin

Cc cy nh phn trong Hnh 6 c gi l cy nh phn suy bin (degenerate binary tree), cc nt


khng phi l l ch c mt nhnh con. Cy a) c gi l cy lch tri, cy b) c gi l cy lch
phi, cy c) v d) c gi l cy zc-zc.

10

e)

f)

Hnh 7: Cy nh phn hon chnh v cy nh phn y

Cc cy trong Hnh 7 c gi l cy nh phn hon chnh (complete binary tree): Nu chiu cao
ca cy l h th mi nt c mc < h - 1 u c ng 2 nt con. Cn nu mi nt c mc h - 1 u
c ng 2 nt con nh trng hp cy f) trn th cy c gi l cy nh phn y (full
binary tree). Cy nh phn y l trng hp ring ca cy nh phn hon chnh.
Ta c th thy ngay nhng tnh cht sau bng php chng minh quy np:
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 hon chnh th c chiu cao nh nht.
i-1
S lng ti a cc nt trn mc i ca cy nh phn l 2 , ti thiu l 1 (i 1).
h

S lng ti a cc nt trn mt cy nh phn c chiu cao h l 2 -1, ti thiu l h (h 1).


Cy nh phn hon chnh, khng y , c n nt th chiu cao ca n l h = [log2(n + 1)] + 1.
Cy nh phn y c n nt th chiu cao ca n l h = log2(n + 1)
III. BIU DIN CY NH PHN
1. Biu din bng mng
Nu c mt cy nh phn y , ta c th d dng nh s cho cc nt trn cy theo th t ln
lt t mc 1 tr i, ht mc ny n mc khc v t tri sang phi i vi cc nt mi mc.
A 1

B 2

E 3

D 5

C 4

G 7

Hnh 8: nh s cc nt ca cy nh phn y biu din bng mng

Khi con ca nt th i s l cc nt th 2i v 2i + 1. Cha ca nt th j l nt j div 2.


Vy ta c th lu tr cy bng mt mng T, nt th i ca cy c lu tr bng phn t T[i].
Vi cy nh phn y trn th khi lu tr bng mng, ta s c mng nh sau:
A B E C D F G
1

Trong trng hp cy nh phn khng y , ta c th thm vo mt s nt gi c cy nh


phn y , v gn nhng gi tr c bit cho nhng phn t trong mng T tng ng vi nhng
nt ny. Hoc dng thm mt mng ph nh du nhng nt no l nt gi t ta thm vo. Chnh
v l do ny nn vi cy nh phn khng y , ta s gp phi s lng ph b nh v c th s phi
thm rt nhiu nt gi vo th mi c cy nh phn y .
V d vi cy lch tri, ta phi dng mt mng 31 phn t lu cy nh phn ch gm 5 nt

B
C

D
E

C
3

10

11

12

13

14

15

16

17

...

Ngoi ra nu cu trc ca cy lun lun bin ng (tc l thng xuyn c nhng thao tc thm vo
hay loi b mt nhnh con) th cc lu tr ny c th khin cho cc thao tc km hiu qu.
2. 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 3
trng:
Trng Info: Cha gi tr lu ti nt
Trng Left: 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 Right: 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 Left,
Right ta c th duyt mi nt khc.
A
L

B
L

C
R

D
L

E
R

H
L

F
R

G
R

I
R

J
R

Hnh 9: Biu din cy bng cu trc lin kt

IV. PHP DUYT CY 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 nu nh mt nt khng c nt con tri (hoc nt con phi) th lin kt Left (Right) ca
nt c lin kt thng ti mt nt c bit m ta gi l NIL (hay NULL), nu cy rng th nt
gc ca cy cng c gn bng NIL. Khi c ba cch duyt cy hay c s dng:
1. Duyt theo th t trc (preorder traversal)
Trong php duyt theo th t trc th gi tr trong mi nt bt k s c lit k trc gi tr lu
trong hai nt con ca n, c th m t bng th tc quy sau:
procedure Visit(N);

{Duyt nhnh cy nhn N l nt gc ca nhnh

begin
if N nil then
begin
<Output trng Info ca nt N>
Visit(Nt con tri ca N);
Visit(Nt con phi ca N);
end;
end;

Qu trnh duyt theo th t trc bt u bng li gi Visit(nt gc).


Nh cy trn, nu ta duyt theo th t trc th cc gi tr s ln lt c lit k theo th t:
ABDHIECFJG
2. Duyt theo th t gia (inorder traversal)
Trong php duyt theo th t gia th gi tr trong mi nt bt k s c lit k sau gi tr lu
nt con tri v c lit k trc gi tr lu nt con phi ca nt , c th m t bng th tc
quy sau:
procedure Visit(N);

{Duyt nhnh cy nhn N l nt gc ca nhnh

begin
if N nil then
begin
Visit(Nt con tri ca N);
<Output trng Info ca nt N>
Visit(Nt con phi ca N);
end;
end;

Qu trnh duyt theo th t gia cng bt u bng li gi Visit(nt gc).


Nh cy trn, nu ta duyt theo th t gia th cc gi tr s ln lt c lit k theo th t:
H D I B E AF J C G
3. Duyt theo th t sau (postorder traversal)
Trong php duyt theo th t sau th gi tr trong mi nt bt k s c lit k sau gi tr lu hai
nt con ca nt , c th m t bng th tc quy sau:
procedure Visit(N);

{Duyt nhnh cy nhn N l nt gc ca nhnh

begin
if N nil then
begin
Visit(Nt con tri ca N);
Visit(Nt con phi ca N);
<Output trng Info ca nt N>
end;
end;

Qu trnh duyt theo th t sau cng bt u bng li gi Visit(nt gc).


Cng vi cy trn, nu ta duyt theo th t sau th cc gi tr s ln lt c lit k theo th t:
HIDEBJFGCA

V. CY K_PHN
Cy K_phn l mt dng cu trc cy m mi nt trn cy c ti a K nt con (c tnh n th t
ca cc nt con).
1. Biu din cy K_phn bng mng
Cng tng t nh vic biu din cy nh phn, ngi ta c th thm vo cy K_phn mt s nt
gi cho mi nt nhnh ca cy K_phn u c ng K nt con, cc nt con c xp th t t
nt con th nht ti nt con th K, sau nh s cc nt trn cy K_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:
0

A
1

7
5

D
6

G
8

M
L
10

12

11

Hnh 10: nh s cc nt ca cy 3_phn biu din bng mng

Theo cch nh s ny, nt con th j ca nt i l: i * K + j. Nt cha ca nt x l nt (x - 1) div K. Ta


c th dng mt mng T nh s t 0 lu cc gi tr trn cc nt: Gi tr ti nt th i c lu tr
phn t T[i].
A
B
F
J
C
D
E
G
H
I
K
L
M
0

10

11

12

2. Biu din cy K_phn bng cu trc lin kt


Khi biu din cy K_phn bng cu trc lin kt, mi nt ca cy l mt bn ghi (record) gm hai
trng:
Trng Info: Cha gi tr lu trong nt .
Trng Links: L mt mng gm K phn t, phn t th i cha lin kt (con tr) ti nt con th
i, trong trng hp khng c nt con th i th Links[i] c gn mt gi tr c bit.
i vi cy K_ 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.
VI. 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.
Cng nh trng hp cy nh phn, ngi ta thng biu din cy tng qut bng hai cch: Lu tr
k tip bng mng v lu tr bng cu trc lin kt.
1. Lu tr cy tng qut bng mng
lu tr cy tng qut bng mng, trc ht, ta nh s cc nt trn cy bt u t 1 theo mt th
t tu . Gi s cy c n nt th ta s dng:
Mt mng Info[1..n], trong Info[i] l gi tr lu trong nt th i.
Mt mng Children c chia lm n on, on th i gm mt dy lin tip cc phn t l ch
s cc nt con ca nt i. Nh vy mng Children s cha tt c ch s ca mi nt con trn cy

(ngoi tr nt gc) nn n s gm n - 1 phn t, lu rng khi chia mng Children lm n on


th s c nhng on rng (tng ng vi danh sch cc nt con ca mt nt l)
Mt mng Head[1..n + 1], nh du v tr ct on trong mng Children: Head[i] l v tr u
on th i, hay ni chnh xc hn: Cc phn t trong mng Children t v tr Head[i] n
Head[i+1] - 1 l ch s cc nt con ca nt th i. Khi Head[i] = Head[i+1] c ngha l on th
i rng. Quy c: Head[n+1] = n.
Gi li ch s ca nt gc.
V d: Vi cy di y.
9

A
1

7
5

D
6

M
8

L
10

11

Mng Info:
Info[i]

10

11

12

Mng Children:
Children[i] 3

10

11

12

on 1

10

11

12

on 2
on 4
on 9
(Cc on 3, 5, 6, 7, 8, 10, 11, 12 l rng)

Mng Head:
Head[i]

12

12

12

12

10

11

12

13

2. Lu tr cy tng qut bng cu trc lin kt


Khi lu tr cy tng qut bng cu trc lin kt, mi nt l mt bn ghi (record) gm ba trng:
Trng Info: Cha gi tr lu trong nt .
Trng FirstChild: Cha lin kt (con tr) ti nt con u tin ca nt (con c), trong trng
hp l nt l (khng c nt con), trng ny c gn mt gi tr c bit.
Trng Sibling: Cha lin kt (con tr) ti nt em k cn bn phi (nt cng cha vi nt ang
xt, khi sp th t cc con th nt ng lin sau nt ang xt). Trong trng hp khng c
nt em k cn bn phi, trng ny c gn mt gi tr c bit.
D thy c tnh ng n ca phng php biu din, bi t mt nt N bt k, ta c th i theo
lin kt FirstChild n nt con c, nt ny chnh l cht ca mt danh sch ni n cc nt con
ca nt N: t nt con c, i theo lin kt Sibling, ta c th duyt tt c cc nt con ca nt N.
Bi tp
1. Vit chng trnh m t cy nh phn dng cu trc lin kt, mi nt cha mt s nguyn, v vit
cc th tc duyt trc, gia, sau.
2. Chng minh rng nu cy nh phn c x nt l v y nt cp 2 th x = y + 1

3. Chng minh rng nu ta bit dy cc nt c thm ca mt cy nh phn khi duyt theo th t


trc v th t gia th c th dng c cy nh phn . iu ny con ng na khng i vi
th t trc v th t sau? Vi th t gia v th t sau.
4. Vit cc th tc duyt trc, gia, sau khng quy.

6. K PHP TIN T, TRUNG T V HU T


I. 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, trong cc nt l biu th cc hng hay cc bin (cc ton hng), 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: Cy biu din biu
thc (6 / 2 + 3) * (7 - 4)
*
L

+
L

/
L

3
R

6
L

7
R

4
R

2
R

Hnh 11: Biu thc di dng cy nh phn

II. CC K PHP CHO CNG MT BIU THC


Vi cy nh phn biu din biu thc,
Nu ta duyt theo th t trc, ta s c dng tin t (prefix) ca biu thc: * + / 6 2 3 - 7 4.
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 ta duyt theo th t gia, ta s c: 6 / 2 + 3 * 7 - 4. K php ny hi mp m v thiu
du ngoc. Nu ta thm vo th tc duyt inorder vic b sung cc cp du ngoc vo mi biu
thc con th ta s c biu thc (((6 / 2) + 3) * (7 - 4)). 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 ta duyt theo th t sau, ta s c dng hu t (postfix) ca biu thc 6 2 / 3 + 7 4 - *.
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.
III. 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 +, -, *, /) 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 1 + 2 + 4 my s phi tnh 1 + 2 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 m t


mt biu thc trung gian m my cn tnh khi x l biu thc ln. Nh v d trn, my s phi
tnh hai biu thc 6 / 2 + 3 v 7 - 4 trc khi lm php tnh nhn cui cng. tnh biu thc 6 / 2
+ 3 th my li phi tnh biu thc 6 / 2 trc khi em cng vi 3.
Vy tnh mt biu thc lu tr trong mt nhnh cy nh phn gc nt n, my s tnh gn ging
nh hm quy sau:
function Calculate(n): Value;

{Tnh biu thc con trong nhnh cy

gc n}

begin
if <Nt n cha khng phi l mt ton t> then
Calculate := <Gi tr cha trong nt n>
else
{Nt n cha mt ton t R}
begin
x := Calculate(nt con tri ca n);
y := Calculate(nt con phi ca n);
Calculate := x R 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).
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 hu th t v k php
hu t. Trong nhng nm u 1950, nh l-gic hc ngi Balan Jan Lukasiewicz 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:
Bc 1: Khi ng mt Stack 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 , ta kim tra:
Nu phn t ny l mt ton hng th y gi tr ca n vo Stack.
Nu phn t ny l mt ton t, ta ly t Stack ra hai gi tr (y v x) sau p dng ton t (R)
vo hai gi tr va ly ra, y kt qu tm c (x R y) vo Stack (ra hai vo mt).
Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong, trong Stack ch cn duy
nht mt phn t, phn t chnh l gi tr ca biu thc.
V d: Tnh biu thc 10 2 / 3 + 7 4 - * (tng ng vi biu thc (10 / 2 + 3) * (7 - 4)
c
10
2
/
3
+
7
4
*

X l
y vo Stack
y vo Stack
Ly 2 v 10 khi Stack, Tnh c 10
y vo Stack
Ly 3 v 5 khi Stack, tnh c 5 +
y vo Stack
y vo Stack
Ly 4 v 7 khi Stack, tnh c 7 Ly 3 v 8 khi Stack, tnh c 8 *

/ 2 = 5, y 5 vo Stack
3 = 8, y 8 vo Stack
4 = 3, y 3 vo Stack
3 = 24, y 24 vo Stack

Stack
10
10, 2
5
5, 3
8
8, 7
8, 7, 4
8, 3
24

Ta c kt qu l 24
Di y ta s vit mt chng trnh n gin tnh gi tr biu thc RPN. Chng trnh s nhn
Input l biu thc RPN gm cc s thc v cc ton t + - * / v cho Output l kt qu biu thc .
Quy nh khun dng bt buc l hai s lin nhau trong biu thc RPN phi vit cch nhau t nht
mt du cch. qu trnh c mt phn t trong biu thc RPN c d dng hn, sau bc nhp

liu, ta c th hiu chnh i cht biu thc RPN v khun dng d c nht. Chng hn nh thm
v bt mt s du cch trong Input mi phn t (ton hng, ton t) u cch nhau ng mt du
cch, thm mt du cch vo cui biu thc RPN. Khi qu trnh c ln lt cc phn t trong
biu thc RPN c th lm nh sau:
T := '';
for p := 1 to Length(RPN) do

{Xt cc k t trong biu thc RPN t tri qua

phi}

if RPN[p] ' ' then T := T + RPN[p] {Nu RPN[p] khng phi du cch th ni k t vo T}
else
{Nu RPN[p] l du cch th phn t ang c c xong, tip theo s l phn t khc}
begin
<X l phn t T>
T := '';
{Chun b c phn t mi}
end;

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 m-un bt li ti mi bc.
V d v Input / Output ca chng trnh:
Enter RPN Expression: 10 2/3
+
4 7 -*
10 2 / 3 + 4 7 - * = 24.0000
CALRPN.PAS * Tnh gi tr biu thc RPN
{$N+,E+}

program CalculateRPNExpression;
const
Opt = ['+', '-', '*', '/'];
var
T, RPN: String;
Stack: array[1..255] of Extended;
p, Last: Integer;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cc thao tc i vi Stack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }

procedure StackInit;
begin
Last := 0;
end;
procedure Push(V: Extended);
begin
Inc(Last); Stack[Last] := V;
end;
function Pop: Extended;
begin
Pop := Stack[Last]; Dec(Last);
end;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - -}
procedure Refine(var S: String); {Hiu chnh biu thc RPN v khun dng d c nht}

var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1
if (S[i] in Opt) or (S[i + 1]
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1
if (S[i] = ' ') and (S[i + 1]
end;
procedure Process(T: String);
var

do
{Thm nhng du cch gia ton hng v ton t}
in Opt) then
do
{Xo nhng du cch tha}
= ' ') then Delete(S, i + 1, 1);
{X l phn t T c c t biu thc RPN}

x, y: Extended;
e: Integer;
begin
if not (T[1] in Opt) then
begin
Val(T, x, e); Push(x);
end
else
begin
y := Pop; x := Pop;
case T[1] of
'+': x := x + y;
'-': x := x - y;
'*': x := x * y;
'/': x := x / y;
end;
Push(x);
end;
end;

{T l ton hng}
{i T thnh s v y gi tr vo Stack}
{T l ton t}
{Ra hai}

{Vo mt}

begin
Write('Enter RPN Expression: '); ReadLn(RPN);
Refine(RPN);
StackInit;
T := '';
for p := 1 to Length(RPN) do
{Xt cc k t ca biu thc RPN t tri qua
phi} if RPN[p] <> ' ' then T := T + RPN[p] {nu khng phi du cch th ni n vo
sau xu T} else
{Nu gp du cch}
begin
Process(T); {X l phn t va c xong}
T := '';
{t li T chun b c phn t mi}
end;
WriteLn(RPN, ' = ', Pop:0:4);
{In gi tr biu thc RPN c lu trong Stack}
end.

IV. CHUYN T DNG TRUNG T SANG DNG 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, v
di y ta trnh by thut ton :
Thut ton s dng mt Stack cha cc ton t v du ngoc m. Th tc Push(V) y mt
phn t vo Stack, hm Pop ly ra mt phn t t Stack, hm Get c gi tr phn t nm
nh Stack m khng ly phn t ra. Ngoi ra mc u tin ca cc ton t c quy nh
bng hm Priority nh sau: u tin cao nht l du "*" v "/" vi Priority l 2, tip theo l du "+"
v "-" vi Priority l 1, u tin thp nht l du ngoc m "(" vi Priority l 0.
Stack := ;
for <Phn t T c c t biu thc infix> do
{T c th l hng, bin, ton t hoc du ngoc c c t biu thc infix theo th t t tri
qua phi}

case T of
'(': Push(T);
')':
repeat
x := Pop;

if x '(' then Output(x);


until x = '(';
'+', '-', '*', '/':
begin
while (Stack ) and (Priority(T) Priority(Get)) do Output(Pop);
Push(T);
end;
else Output(T);
end;
while (Stack ) do Output(Pop);

V d vi biu thc trung t (2 * 3 + 7 / 8) * (5 - 1)


c
(
2
*
3
+

7
/
8
)
*
(
5
1
)
Ht

X l
y vo Stack
Hin th
php "*" c u tin hn phn t nh
Stack l "(", y "*" vo Stack
Hin th
php "+" u tin khng cao hn phn t
nh Stack l "*", ly ra v hin th "*".
So snh tip, thy php "+" c u tin
cao hn phn t nh Stack l "(", y
"+" vo Stack
Hin th
php "/" c u tin hn phn t nh
Stack l "+", y "/" vo Stack
Hin th
Ly ra v hin th cc phn t trong Stack
ti khi ly phi du ngoc m
Stack ang l rng, y * vo Stack
y vo Stack
Hin th
php "-" c u tin hn phn t nh
Stack l "(", y "-" vo Stack
Hin th
Ly ra v hin th cc phn t nh Stack
cho ti khi ly phi du ngoc m
Ly ra v hin th ht cc phn t cn li
trong Stack

Stack
(
(
(*

Output

(*
(+

2 3
2 3 *

(+
(+/

2 3 * 7

(+/

2 3 * 7 8
2 3 * 7 8 / +

*
*(
*(
*(*(*

2 3 * 7 8 / + 5
2 3 * 7 8 / + 5 1
2 3 * 7 8 / + 5 1 2 3 * 7 8 / + 5 1 - *

Di y l chng trnh chuyn biu thc vit dng trung t sang dng RPN. Biu thc trung t
u vo s c hiu chnh sao cho mi thnh phn ca n c cch nhau ng mt du cch, v
thm mt du cch vo cui cho d tch cc phn t ra x l. V Stack ch dng cha cc ton
t v du ngoc m nn c th m t Stack di dng xu k t cho n gin.
V d v Input / Output ca chng trnh:
Infix:
(10*3 +
7 /8) * (5-1)
Refined: ( 10 * 3 + 7 / 8 ) * ( 5 - 1 )
RPN: 10 3 * 7 8 / + 5 1 - *
RPNCVT.PAS * Chuyn biu thc trung t sang dng RPN
program ConvertInfixToRPN;
const
Opt = ['(', ')', '+', '-', '*', '/'];
var
T, Infix, Stack: String; {Stack dng cha ton t v du ngoc m nn dng String cho tin}
p: Integer;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cc thao tc i vi Stack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }

procedure StackInit;
begin
Stack := '';

end;
procedure Push(V: Char);
begin
Stack := Stack + V;
end;
function Pop: Char;
begin
Pop := Stack[Length(Stack)];
Dec(Stack[0]);
end;
function Get: Char;
begin
Get := Stack[Length(Stack)];
end;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}
procedure Refine(var S: String);
{Hiu chnh biu thc trung t v khun dng d c nht}

var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1
if (S[i] in Opt) or (S[i + 1]
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1
if (S[i] = ' ') and (S[i + 1]
end;

do
{Thm nhng du cch trc v sau mi ton t v du ngoc}
in Opt) then
do
{Xo nhng du cch tha}
= ' ') then Delete(S, i + 1, 1);

function Priority(Ch: Char): Integer;


begin
case ch of
'*', '/': Priority := 2;
'+', '-': Priority := 1;
'(': Priority := 0;
end;
end;

{Hm ly mc u tin ca Ch}

procedure Process(T: String);


{X l mt phn t c c t biu thc trung t}
var
c, x: Char;
begin
c := T[1];
if not (c in Opt) then Write(T, ' ')
else
case c of
'(': Push(c);
')': repeat
x := Pop;
if x <> '(' then Write(x, ' ');
until x = '(';
'+', '-', '*', '/':
begin
while (Stack <> '') and (Priority(c) <= Priority(Get)) do
Write(Pop, ' ');
Push(c);
end;
end;
end;
begin
Write('Infix = '); ReadLn(Infix);
Refine(Infix);

WriteLn('Refined: ', Infix);


Write('RPN: ');
T := '';
for p := 1 to Length(Infix) do
if Infix[p] <> ' ' then T := T + Infix[p]
else
begin
Process(T);
T := '';
end;
while Stack <> '' do Write(Pop, ' ');
WriteLn;
end.

V. 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 Stack 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 N cha phn t mi c c
Nu phn t ny l mt ton t, ly t Stack ra hai nt (theo th t l y v x), sau em lin
kt tri ca N tr n x, em lin kt phi ca N tr n y.
y nt N vo Stack
Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong, trong Stack ch cn duy
nht mt phn t, phn t chnh l gc ca cy nh phn biu din biu thc.
Bi tp
1. Vit chng trnh chuyn biu thc trung t sang dng RPN, biu thc trung t c c nhng php
y
ton mt ngi: Php ly s i (-x), php lu tha x (x^y), li gi hm s hc (sqrt, exp, abs v.v...)
2. Vit chng trnh chuyn biu thc logic dng trung t sang dng RPN. V d:
Chuyn: a and b or c and d thnh: a b and c d and or
3. Chuyn cc biu thc sau y ra dng RPN
a)
c)
e)
g)
i)
j)

A * (B + C)
b)
A * (B + -C)
d)
A and B or C
f)
(A or B) and (C or (D and not E)) h)
(A < 9) and (A > 3) or not (A > 0)
((A > 0) or (A < 0)) and (B * B - 4 *

A + B / C + D
A - (B + C)d/e
A and (B or not C)
(A = B) or (C = D)
A * C < 0)

4. Vit chng trnh tnh biu thc logic dng RPN vi cc ton t and, or, not v cc ton hng l
TRUE hay FALSE

7. SP XP (SORTING)
I. BI TON SP XP
Sp xp l qu trnh b tr li cc phn t ca mt tp i tng no theo mt th t nht nh.
Chng hn nh th t tng dn (hay gim dn) i vi mt dy s, th t t in i vi cc t
v.v... Yu cu v sp xp thng xuyn xut hin trong cc ng dng Tin hc vi cc mc ch
khc nhau: sp xp d liu trong my tnh tm kim cho thun li, sp xp cc kt qu x l in
ra trn bng biu v.v...
Ni chung, d liu c th xut hin di nhiu dng khc nhau, nhng y ta quy c: Mt tp
cc i tng cn sp xp l tp cc bn ghi (records), mi bn ghi bao gm mt s trng (fields)
khc nhau. Nhng khng phi ton b cc trng d liu trong bn ghi u c xem xt n trong
qu trnh sp xp m ch l mt trng no (hay mt vi trng no ) c ch ti thi.
Trng nh vy ta gi l kho (key). Sp xp s c tin hnh da vo gi tr ca kho ny.
V d: H s tuyn sinh ca mt trng i hc l mt danh sch th sinh, mi th sinh c tn, s
bo danh, im thi. Khi mun lit k danh sch nhng th sinh trng tuyn tc l phi sp xp cc
th sinh theo th t t im cao nht ti im thp nht. y kho sp xp chnh l im thi.
STT
1
2
3
4

SBD
A100
B200
X150
G180

H v tn
Nguyn Vn A
Trn Th B
Phm Vn C
Th D

im thi
20
25
18
21

Khi sp xp, cc bn ghi trong bng s c t li vo cc v tr sao cho gi tr kho tng ng vi


chng c ng th t n nh. Ta thy rng kch thc ca kho thng kh nh so vi kch
thc ca ton bn ghi, nn nu vic sp xp thc hin trc tip trn cc bn ghi s i hi s
chuyn i v tr ca cc bn ghi, ko theo vic thng xuyn phi di chuyn, copy nhng vng nh
ln, gy ra nhng tn ph thi gian kh nhiu. Thng ngi ta khc phc tnh trng ny bng cch
xy dng mt bng kho: Mi bn ghi trong bng ban u s tng ng vi mt bn ghi trong bng
kho. Bng kho cng gm cc bn ghi nhng mi bn ghi ch gm c hai trng:
Trng th nht cha kho
Trng th hai cha lin kt ti mt bn ghi trong bng ban u, tc l cha mt thng tin
bit bn ghi tng ng vi n trong bng ban u l bn ghi no.
Sau , vic sp xp c thc hin trc tip trn bng kho . Nh vy, trong qu trnh sp xp,
bng chnh khng h b nh hng g, cn vic truy cp vo mt bn ghi no ca bng chnh,
khi cn thit vn c th thc hin c bng cch da vo trng lin kt ca bn ghi tng ng
thuc bng kho ny.
Nh v d trn, ta c th xy dng bng kho gm 2 trng, trng kho cha im v trng
lin kt cha s th t ca ngi c im tng ng trong bng ban u:
im thi
20
25
18
21

STT
1
2
3
4

Sau khi sp xp theo trt t im cao nht ti im thp nht, bng kho s tr thnh:

im thi
25
21
20
18

STT
2
4
1
3

Da vo bng kho, ta c th bit c rng ngi c im cao nht l ngi mang s th t 2,


tip theo l ngi mang s th t 4, tip na l ngi mang s th t 1, v cui cng l ngi
mang s th t 3, cn mun lit k danh sch y th ta ch vic i chiu vi bng ban u v
lit k theo th t 2, 4, 1, 3.
C th cn ci tin tt hn da vo nhn xt sau: Trong bng kho, ni dung ca trng kho hon
ton c th suy ra c t trng lin kt bng cch: Da vo trng lin kt, tm ti bn ghi tng
ng trong bng chnh ri truy xut trng kho trong bng chnh. Nh v d trn th ngi mang s
th t 1 chc chn s phi c im thi l 20, cn ngi mang s th t 3 th chc chn phi c im
thi l 18. Vy th bng kho c th loi b i trng kho m ch gi li trng lin kt. Trong
trng hp cc phn t trong bng ban u c nh s t 1 ti n v trng lin kt chnh l s
th t ca bn ghi trong bng ban u nh v d trn, ngi ta gi k thut ny l k thut sp
xp bng ch s: Bng ban u khng h b nh hng g c, vic sp xp ch n thun l nh li
ch s cho cc bn ghi theo th t sp xp. C th hn:
Nu r[1], r[2], ..., r[n] l cc bn ghi cn sp xp theo mt th t nht nh th vic sp xp bng ch
s tc l xy dng mt dy Index[1], Index[2], ..., Index[n] m y:
Index[j] := Ch s ca bn ghi s ng th j khi sp th t
(Bn ghi r[index[j]] s phi ng sau j - 1 bn ghi khc khi sp xp)
Do kho c vai tr c bit nh vy nn sau ny, khi trnh by cc gii thut, ta s coi kho nh
i din cho cc bn ghi v cho n gin, ta ch ni ti gi tr ca kho m thi. Cc thao tc
trong k thut sp xp l ra l tc ng ln ton bn ghi gi y ch lm trn kho. Cn vic ci t
cc phng php sp xp trn danh sch cc bn ghi v k thut sp xp bng ch s, ta coi nh bi
tp.
Bi ton sp xp gi y c th pht biu nh sau:
Xt quan h th t ton phn "nh hn hoc bng" k hiu "" trn mt tp hp S, l quan h hai
ngi tho mn bn tnh cht:
Vi a, b, c S
Tnh ph bin: Hoc l a b, hoc b a;
Tnh phn x: a a
Tnh phn i xng: Nu a b v b a th bt buc a = b.
Tnh bc cu: Nu c a b v b c th a c.
Trong trng hp a b v a b, ta dng k hiu "<" cho gn
Cho mt dy gm n kho. Gia hai kho bt k c quan h th t ton phn "". Xp li dy cc
kho c dy kho tho mn k1 k2 ... kn.
Gi s cu trc d liu cho dy kho c m t nh sau:
const
n = ...;
{S kho trong dy kho, c th khai di dng bin s nguyn tu bin hn}
type
TKey = ...;
{Kiu d liu mt kho}
TArray = array[1..n] of TKey;
var
k: TArray;
{Dy kho}

Th nhng thut ton sp xp di y c vit di dng th tc sp xp dy kho k, kiu ch s


nh cho tng kho trong dy c th coi l s nguyn Integer.
II. THUT TON SP XP KIU CHN (SELECTION SORT)
Mt trong nhng thut ton sp xp n gin nht l phng php sp xp kiu chn. tng c
bn ca cch sp xp ny l:
lt th nht, ta chn trong dy kho k1, k2, ..., kn ra kho nh nht (kho mi kho khc) v
i gi tr ca n vi k1, khi gi tr kho k1 tr thnh gi tr kho nh nht.
lt th hai, ta chn trong dy kho k2, ..., kn ra kho nh nht v i gi tr ca n vi k2.
...
lt th i, ta chn trong dy kho ki, ki+1, ..., kn ra kho nh nht v i gi tr ca n vi ki.
...
Lm ti lt th n - 1, chn trong hai kho kn-1, kn ra kho nh nht v i gi tr ca n vi kn-1.
procedure SelectionSort;
var
i, j, jmin: Integer;
begin
for i := 1 to n - 1 do
begin

{Lm n - 1 lt}

{Chn trong s cc kho t ki ti kn ra kho kjmin nh nht}

jmin := i;
for j := i + 1 to n do
if kj < kjmin then jmin := j;
if jmin i then
<o gi tr ca kjmin cho ki>
end;
end;

i vi phng php kiu la chn, ta c th coi php so snh (kj < kjmin) l php ton tch cc
nh gi hiu sut thut ton v mt thi gian. lt th i, chn ra kho nh nht bao gi cng
cn n - i php so snh, s lng php so snh ny khng h ph thuc g vo tnh trng ban u ca
dy kho c. T suy ra tng s php so snh s phi thc hin l:
(n - 1) + (n - 2) + ... + 1 = n * (n - 1) / 2
2
Vy thut ton sp xp kiu chn c cp l O(n )
III. THUT TON SP XP NI BT (BUBBLE SORT)
Trong thut ton sp xp ni bt, dy cc kho s c duyt t cui dy ln u dy (t kn v k1),
nu gp hai kho k cn b ngc th t th i ch ca chng cho nhau. Sau ln duyt nh vy,
phn t nh nht trong dy kho s c chuyn v v tr u tin v vn tr thnh sp xp dy
kho t k2 ti kn:
procedure BubbleSort;
var
i, j: Integer;
begin
for i := 2 to n do
for j := n downto i do{Duyt t cui dy ln, lm ni kho nh nht trong s ki-1, ...,kn v v tr i-1}
if kj < kj-1 then
<o gi tr kj v kj-1>
end;

i vi thut ton sp xp ni bt, ta c th coi php ton tch cc l php so snh kj < kj-1. V s
ln thc hin php so snh ny l:
(n - 1) + (n - 2) + ... + 1 = n * (n - 1) / 2

Vy thut ton sp xp ni bt cng c cp l O(n ). Bt k tnh trng d liu vo nh th no.


IV. THUT TON SP XP KIU CHN
Xt dy kho k1, k2, ..., kn. Ta thy dy con ch gm mi mt kho l k1 c th coi l sp xp ri.
Xt thm k2, ta so snh n vi k1, nu thy k2 < k1 th chn n vo trc k1. i vi k3, ta li xt dy
ch gm 2 kho k1, k2 sp xp v tm cch chn k3 vo dy kho c th t sp xp. Mt
cch tng qut, ta s sp xp dy k1, k2, ..., ki trong iu kin dy k1, k2, ..., ki-1 sp xp ri bng
cch chn ki vo dy ti v tr ng khi sp xp.
procedure InsertionSort;
var
i, j: Integer;
tmp: TKey;
{Bin gi li gi tr kho chn}
begin
for i := 2 to n do {Chn gi tr ki vo dy k1,..., ki-1 ton on k1, k2,..., ki tr thnh sp xp}
begin
tmp := ki;
{Gi li gi tr ki}
j := i - 1;
while (j > 0) and (tmp < kj) do {So snh gi tr cn chn vi ln lt cc kho kj (i1j0)}

begin
kj+1 := kj;

{y li gi tr kj v pha sau mt v tr, to ra "khong trng" ti


v tr j}

j := j - 1;
end;
kj+1 := tmp;
end;

{a gi tr chn vo "khong trng" mi to ra}

end;

i vi thut ton sp xp kiu chn, th chi ph thi gian thc hin thut ton ph thuc vo tnh
trng dy kho ban u. Nu coi php ton tch cc y l php so snh tmp < kj th:
Trng hp tt nht ng vi dy kho sp xp ri, mi lt ch cn 1 php so snh, v nh
vy tng s php so snh c thc hin l n - 1.
Trng hp ti t nht ng vi dy kho c th t ngc vi th t cn sp th lt th i,
cn c i - 1 php so snh v tng s php so snh l:
(n - 1) + (n - 2) + ... + 1 = n * (n - 1) / 2.
Trng hp cc gi tr kho xut hin mt cch ngu nhin, ta c th coi xc sut xut hin mi
kho l ng kh nng, th c th coi lt th i, thut ton cn trung bnh i / 2 php so snh v
tng s php so snh l:
(1 / 2) + (2 / 2) + ... + (n / 2) = (n + 1) * n / 4.
Nhn v kt qu nh gi, ta c th thy rng thut ton sp xp kiu chn t ra tt hn so vi thut
ton sp xp chn v sp xp ni bt. Tuy nhin, chi ph thi gian thc hin ca thut ton sp xp
kiu chn vn cn kh ln. V xt trn phng din tnh ton l thuyt th cp ca thut ton sp
2

xp kiu chn vn l O(n ).


C th ci tin thut ton sp xp chn nh nhn xt: Khi dy kho k1, k2, ..., ki-1 c sp xp
th vic tm v tr chn c th lm bng thut ton tm kim nh phn v k thut chn c th lm
bng cc lnh dch chuyn vng nh cho nhanh. Tuy nhin iu cng khng lm tt hn cp
phc tp ca thut ton bi trong trng hp xu nht, ta phi mt n - 1 ln chn v ln chn th i ta
phi dch li i kho to ra khong trng trc khi y gi tr kho chn vo ch trng .
procedure InsertionSortwithBinarySearching;
var
i, inf, sup, median: Integer;
tmp: TKey;
begin

for i := 2 to n do
begin
tmp := ki;
{Gi li gi tr ki}
inf := 1; sup := i - 1;
{Tm ch chn gi tr tmp vo on t kinf ti ksup+1}
repeat {Sau mi vng lp ny th on tm b co li mt na}
median := (inf + sup) div 2; {Xt ch s nm gia ch s inf v ch s sup}
if tmp < k[median] then sup := median - 1
else inf := median + 1;
until inf > sup; {Kt thc vng lp th inf = sup + 1 chnh l v tr chn}
<Dch cc phn t t kinf ti ki-1 li sau mt v tr>
kinf := tmp;
{a gi tr tmp vo "khong trng" mi to ra}
end;
end;

V. SHELL SORT
Nhc im ca thut ton sp xp kiu chn th hin khi m ta lun phi chn mt kha vo v tr
gn u dy. Trong trng hp , ngi ta s dng phng php Shell Sort.
Xt dy kho: k1, k2, ..., kn. Vi mt s nguyn dng h: 1 h n, ta c th chia dy thnh h dy
con:
Dy con 1: k1, k1+h, k1 + 2h, ...
Dy con 2: k2, k2+h, k2 + 2h, ...
...
Dy con h: kh, k2h, k3h, ...
V d nh dy (4, 6, 7, 2, 3, 5, 1, 9, 8); n = 9; h = 3. C 3 dy con.
D"ykhoch;nh:
D"ycon1:
D"ycon2:
D"ycon3:

4
4

2
2

3
7

1
1

9
5

Nhng dy con nh vy c gi l dy con xp theo di bc h. T tng ca thut ton Shell


Sort l: Vi mt bc h, p dng thut ton sp xp kiu chn tng dy con c lp lm mn dn
dy kho chnh. Ri li lm tng t i vi bc h div 2 ... cho ti khi h = 1 th ta c dy kho
sp xp.
Nh v d trn, nu dng thut ton sp xp kiu chn th khi gp kho k 7 = 1, l kho nh nht
trong dy kho, n phi chn vo v tr 1, tc l phi thao tc trn 6 kho ng trc n. Nhng nu
coi 1 l kho ca dy con 1 th n ch cn chn vo trc 2 kho trong dy con m thi. y
chnh l nguyn nhn Shell Sort hiu qu hn sp xp chn: Kho nh c nhanh chng a v
gn v tr ng ca n.
procedure ShellSort;
var
i, j, h: Integer;
tmp: TKey;
begin
h := n div 2;
while h <> 0 do
{Lm mn dy vi di bc h}
begin
for i := h + 1 to n do
begin
{Sp xp chn trn dy con ai-h, ai, ai+h, ai+2h, ...}
tmp := ki; j := i - h;
while (j > 0) and (kj > tmp) do
begin
kj+h := kj;

j := j - h;
end;
kj+h := tmp;
end;
h := h div 2;
end;
end;

VI. THUT TON SP XP KIU PHN ON (QUICK SORT)


1. T tng ca Quick Sort
Quick Sort l mt phng php sp xp tt nht, ngha l d dy kho thuc kiu d liu c th t
no, Quick Sort cng c th sp xp c v khng c mt thut ton sp xp no nhanh hn Quick
Sort v mt tc trung bnh (theo ti bit). Ngi sng lp ra n l C.A.R. Hoare mnh dn t
tn cho n l sp xp "NHANH".
tng ch o ca phng php c th tm tt nh sau: Sp xp dy kho k1, k2, ..., kn th c th
coi l sp xp on t ch s 1 ti ch s n trong dy kho . sp xp mt on trong dy kho,
nu on c 1 phn t th khng cn phi lm g c, cn nu on c t nht 2 phn t, ta
chn mt kho ngu nhin no ca on lm "cht". Mi kho nh hn kho cht c xp vo
v tr ng trc cht, mi kho ln hn kho cht c xp vo v tr ng sau cht. Sau php
hon chuyn nh vy th on ang xt c chia lm hai on khc rng m mi kho trong on
u u cht v mi kho trong on sau u cht. Hay ni cch khc: Mi kho trong on
u u mi kho trong on sau. V vn tr thnh sp xp hai on mi to ra (c di
ngn hn on ban u) bng phng php tng t.
procedure QuickSort;
procedure Partition(L, H: Integer); {Sp xp on t kL, kL+1, ..., kH}
var
i, j: Integer;
Key: TKey;
{Bin lu gi tr kho cht}
begin
if L H then Exit;
{Nu on ch c 1 phn t th khng phi lm g c}
Key := kRandom(H-L+1)+L;
{Chn mt kho ngu nhin trong on lm kho cht}
i := L; j := H;
{i := v tr u on; j := v tr cui on}
repeat
while ki < Key do i := i + 1;
{Tm t u on kho kho
cht}

while kj > Key do j := j - 1;

{Tm t cui on kho kho

cht}
{n y ta tm c hai kho ki v kj m ki key kj}

if i j then
begin
if i < j then
{Nu ch s i ng trc ch s j th o gi tr hai kho ki v kj}
<o gi tr ki v kj> {Sau php o ny ta c: ki key kj }
i := i + 1; j := j - 1;
end;
until i > j;
Partition(L, j); Partition(i, H);
{Sp xp hai on con mi to ra}
end;
begin
Partition(1, n);
end;

Ta th phn tch xem ti sao on chng trnh trn hot ng ng: Xt vng lp repeat...until
trong ln lp u tin, vng lp while th nht chc chn s tm c kho ki kho cht bi
chc chn tn ti trong on mt kho bng kha cht. Tng t nh vy, vng lp while th hai

chc chn tm c kho kj kho cht. Nu nh kho ki ng trc kho kj th ta o gi tr hai


kho, tng i v gim j. Khi ta c nhn xt rng mi kho ng trc v tr i s phi kho cht
v mi kho ng sau v tr j s phi kho cht.
kL
...
kho cht

ki

...

kj

...
kH
kho cht

iu ny m bo cho vng lp repeat...until ti bc sau, hai vng lp while...do bn trong chc


chn li tm c hai kho ki v kj m ki kho cht kj, nu kho ki ng trc kho kj th li o
gi tr ca chng, cho i tin v cui mt bc v j li v u mt bc. Vy th qu trnh hon
chuyn phn t trong vng lp repeat...until s m bo ti mi bc:
Hai vng lp while...do bn trong lun tm c hai kho ki, kj m ki kho cht kj. Khng c
trng hp hai ch s i, j chy ra ngoi on (lun lun c L i, j H).
Sau mi php hon chuyn, mi kho ng trc v tr i lun kho cht v mi kho ng sau
v tr j lun kho cht.
Vng lp repeat ...until s kt thc khi m ch s i ng pha sau ch s j.
kL

...
kj
kho cht

ki

kho cht
...

kH

Theo nhng nhn xt trn, nu c mt kho nm gia kj v ki th kho phi ng bng kho cht
v n c t v tr ng ca n, nn c th b qua kho ny m ch xt hai on hai u.
Cng vic cn li l gi quy lm tip vi on t kL ti kj v on t ki ti kH. Hai on ny
ngn hn on ang xt bi v L j < i H. Vy thut ton khng bao gi b ri vo qu trnh v
hn m s dng v cho kt qu ng n.
Xt v phc tp tnh ton:
Trng hp ti t nht, l khi chn kho cht, ta chn phi kho nh nht hay ln nht trong
on, khi php phn on s chia thnh mt on gm n - 1 phn t v on cn li ch c 1
2

phn t. C th chng minh trong trng hp ny, thi gian thc hin gii thut T(n) = O(n )
Trng hp tt nht, php phn on ti mi bc s chia c thnh hai on bng nhau. Tc
l khi chn kho cht, ta chn ng trung v ca dy kho. C th chng minh trong trng hp
ny, thi gian thc hin gii thut T(n) = O(nlog2n)
Trng hp cc kho c phn b ngu nhin, th trung bnh thi gian thc hin gii thut
cng l T(n) = O(nlog2n).
Vic tnh ton chi tit, c bit l khi xc nh T(n) trung bnh, phi dng cc cng c ton phc
tp, ta ch cng nhn nhng kt qu trn.
2. Vi ci tin ca Quick Sort
Vic chn cht cho php phn on quyt nh hiu qu ca Quick Sort, nu chn cht khng tt,
rt c th vic phn on b suy bin thnh trng hp xu khin Quick Sort hot ng chm v
trn ngn xp chng trnh con khi gp phi dy chuyn qui qu di. Mt ci tin sau c th
khc phc c hin tng trn ngn xp nhng cng ht sc chm trong trng hp xu, k thut
ny khi phn c [L, H] c hai on con [L, j] v [i, H] th ch gi quy tip tc i vi
on ngn, v lp li qu trnh phn on i vi on di.
procedure QuickSort;
procedure Partition(L, H: Integer); {Sp xp on t kL, kL+1, ..., kH}

var
i, j: Integer;
begin
repeat
if L H then Exit;
<Phn on [L, H] c hai on con [L, j] v [i, R]>
if <on [L, j] ngn hn on [i, R]> then
begin
Partition(L, j); L := i;
end
else
begin
Partition(i, R); R := j;
end;
until False;
end;
begin
Partition(1, n);
end;

Ci tin th hai i vi Quick Sort l qu trnh phn on nn ch lm n mt mc no , n khi


on ang xt c di M (M l mt s nguyn t chn nm trong khong t 9 ti 25) th khng
phn on tip m nn p dng thut ton sp xp kiu chn.
Ci tin th ba ca Quick Sort l: Nn ly trung v ca mt dy con trong on lm cht, (trung
v ca mt dy n phn t l phn t ng th n / 2 khi sp th t). Cch chn c nh gi cao
nht l chn trung v ca ba phn t u, gia v cui on.
Cui cng, ta c nhn xt: Quick Sort l mt cng c sp xp mnh, ch c iu kh chu gp phi
l trng hp suy bin ca Quick Sort (qu trnh phn on chia thnh mt dy rt ngn v mt dy
rt di). V iu ny trn phng din l thuyt l khng th khc phc c: V d vi n = 10000.
Nu nh chn cht l kho u on (Thay dng chn kho cht bng Key := kL) hay chn cht
l kho cui on (Thay bng Key := kH) th vi dy sau, chng trnh hot ng rt chm:
(1, 2, 3, 4, 5, ..., 9999, 10000)
Nu nh chn cht l kho gia on (Thay dng chn kho cht bng Key := k(L+H) div 2) th vi
dy sau, chng trnh cng rt chm:
(1, 2, ..., 4999, 5000, 5000, 4999, ..., 2, 1)
Trong trng hp chn cht l trung v dy con hay chn cht ngu nhin, tht kh c th tm ra
mt b d liu khin cho Quick Sort hot ng chm. Nhng ta cng cn hiu rng vi mi
chin lc chn cht, trong 10000! dy hon v ca dy (1, 2, ... 10000) th no cng c mt
dy lm Quick Sort b suy bin, tuy nhin trong trng hp chn cht ngu nhin, xc sut xy
ra dy ny qu nh ti mc ta khng cn phi tnh n, nh vy khi chn cht ngu nhin th
ta khng cn phi quan tm ti ngn xp quy, khng cn quan tm ti k thut kh quy v
vn suy bin ca Quick Sort.
VII. THUT TON SP XP KIU VUN NG (HEAP SORT)
1. ng (heap)
ng l mt dng cy nh phn hon chnh c bit m gi tr lu ti mi nt nhnh u ln hn
hay bng gi tr lu trong hai nt con ca n.

10
9

Hnh 12: Heap

2. Vun ng
Trong bi hc v cy, ta bit mt dy kho k1, k2, ..., kn l biu din ca mt cy nh phn hon
chnh m ki l gi tr lu trong nt th i, nt con ca nt th i l nt 2i v nt 2i + 1, nt cha ca nt
th j l nt j div 2. Vn t ra l sp li dy kho cho n biu din mt ng.
V cy nh phn ch gm c mt nt hin nhin l ng, nn vun mt nhnh cy gc r thnh
ng, ta c th coi hai nhnh con ca n (nhnh gc 2r v 2r + 1) l ng ri. V thut ton
vun ng s c tin hnh t di ln (bottom-up) i vi cy: Gi h l chiu cao ca cy, nt
mc h (nt l) l gc mt ng, ta vun ln nhng nt mc h - 1 cng l gc ca ng, ... c
nh vy cho ti nt mc 1 (nt gc) cng l gc ca ng.
Thut ton vun thnh ng i vi cy gc r, hai nhnh con ca r l ng ri:
Gi s nt r cha gi tr V. T r, ta c i ti nt con cha gi tr ln nht trong 2 nt con, cho ti
khi gp phi mt nt c m mi nt con ca c u cha gi tr V (nt l cng l trng hp ring
ca iu kin ny). Dc trn ng i t r ti c, ta y gi tr cha nt con ln nt cha v t gi
tr V vo nt c.
4

10

10

Hnh 13: Vun ng

3. T tng ca Heap Sort


u tin, dy kho k1, k2, ..., kn c vun t di ln n biu din mt ng, khi kho k1
tng ng vi nt gc ca ng l kho ln nht, ta o gi tr kho cho kn v khng tnh ti kn
na. Cn li dy kho k1, k2, ..., kn-1 tuy khng cn l biu din ca mt ng na nhng n li biu
din cy nh phn hon chnh m hai nhnh cy nt th 2 v nt th 3 (hai nt con ca nt 1) l
ng ri. Vy ch cn vun mt ln, ta li c mt ng, o gi tr k1 cho kn-1 v tip tc cho ti
khi ng ch cn li 1 nt.
V d:

10

10

Hnh 14: o k1 cho kn v xt phn cn li ca ng


9

Hnh 15: Vun phn cn li thnh ng ri li o tr k1 cho kn-1

Thut ton Heap Sort c hai th tc chnh:


Th tc Adjust(root, endnode) vun cy gc root thnh ng trong iu kin hai cy gc 2.root
v 2.root +1 l ng ri. Cc nt t endnode + 1 ti n nm v tr ng v khng c
tnh ti na.
Th tc Heap Sort m t li qu trnh vun ng v chn phn t theo tng trn:
procedure HeapSort;
var
r, i: Integer;
procedure Adjust(root, endnode: Integer); {Vun cy gc Root thnh ng}
var
c: Integer;
Key: TKey;
{Bin lu gi tr kho nt Root}
begin
Key := kroot;
while root * 2 endnode do
{Chng no root cha phi l l}
begin
c := Root * 2; {Xt nt con tri ca Root, so snh vi gi tr nt con phi, chn ra nt mang gi tr ln
nht}

if (c < endnode) and (kc


if kc Key then Break;
kroot := kc; root := c;
end;
kroot := Key;
end;

< kc+1) then c := c + 1;


{C hai nt con ca Root u mang gi tr Key th dng ngay}
{Chuyn gi tr t nt con c ln nt cha root v i xung xt nt con c}
{t gi tr Key vo nt root}

begin
{Bt u thut ton Heap Sort}
for r := n div 2 downto 1 do Adjust(r, n); {Vun cy t di ln to thnh ng}
for i := n downto 2 do
begin
<o gi tr k1 v ki>
{Kho ln nht c chuyn ra cui dy}
Adjust(1, i - 1);
{Vun phn cn li thnh ng}
end;
end;

V phc tp ca thut ton, ta bit rng cy nh phn hon chnh c n nt th chiu cao ca n
khng qu [log2(n + 1)] + 1. C cho l trong trng hp xu nht th tc Adjust phi thc hin tm
ng i t nt gc ti nt l xa nht th ng i tm c cng ch di bng chiu cao ca cy
v phc tp ca mt ln gi Adjust l O(log2n). T c th suy ra, trong trng hp xu nht,
phc tp ca Heap Sort cng ch l O(nlog2n). Vic nh gi thi gian thc hin trung bnh
phc tp hn, ta ch ghi nhn mt kt qu chng minh c l phc tp trung bnh ca Heap
Sort cng l O(nlog2n).
C th nhn xt thm l Quick Sort quy cn thm khng gian nh cho Stack, cn Heap Sort
ngoi mt nt nh ph thc hin vic i ch, n khng cn dng thm g khc. Heap Sort tt
hn Quick Sort v phng din l thuyt bi khng c trng hp ti t no Heap Sort c th mc
phi. Cng nh c Heap Sort m gi y khi gii mi bi ton c cha m-un sp xp, ta c th
ni rng phc tp ca th tc sp xp khng qu O(nlog2n).
VIII. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)
C mt thut ton sp xp n gin cho trng hp c bit: Dy kho k1, k2, ..., kn l cc s
nguyn nm trong khong t 0 ti M (TKey = 0..M).
Ta dng dy c0, c1, ..., cM cc bin m, y cV l s ln xut hin gi tr V trong dy kho:
for V := 0 to M do cV := 0;
{Khi to dy bin m}
for i := 1 to n do cki := cki + 1;

V d vi dy kho: 1, 2, 2, 3, 0, 0, 1, 1, 3, 3 (n = 10, M = 3), sau bc m ta c:


c0 = 2; c1 = 3; c2 = 2; c3 = 3.
Da vo dy bin m, ta hon ton c th bit c: sau khi sp xp th gi tr V phi nm t v tr
no ti v tr no. Nh v d trn th gi tr 0 phi nm t v tr 1 ti v tr 2; gi tr 1 phi ng lin
tip t v tr 3 ti v tr 5; gi tr 2 ng v tr 6 v 7 cn gi tr 3 nm ba v tr cui 8, 9, 10:
0 0 1 1 1 2 2 3 3 3

Tc l sau khi sp xp:


Gi tr 0 ng trong on t v tr 1 ti v tr c0.
Gi tr 1 ng trong on t v tr c0 + 1 ti v tr c0 + c1.
Gi tr 2 ng trong on t v tr c0 + c1 + 1 ti v tr c0 + c1 + c2.
...
Gi tr v trong on ng t v tr c0 + c1 + ... + cv-1 + 1 ti v tr c0 + c1 + c2 + ... + cv.
...
v tr cui ca mi on, nu ta tnh li dy c nh sau:
for V := 1 to M do cV := cV-1 + cV

Th cV l v tr cui ca on cha gi tr V trong dy kho sp xp.


Mun dng li dy kho sp xp, ta thm mt dy kho ph x1, x2, ..., xn. Sau duyt li dy kho
k, mi khi gp kho mang gi tr V ta a gi tr vo kho xcv v gim cv i 1.
for i := n downto 1 do
begin
V := ki;
XcV := ki; cV := cV - 1;
end;

Khi dy kho x chnh l dy kho c sp xp, cng vic cui cng l gn gi tr dy kho x
cho dy kho k.
procedure DistributionCounting;
var
c: array[0..M] of Integer;

{TKey = 0..M}
{Dy bin m s ln xut hin mi gi tr}

x: TArray;
{Dy kho ph}
i: Integer;
V: TKey;
begin
for V := 0 to M do cV := 0;
{Khi to dy bin m}
for i := 1 to n do cki := cki + 1;
{m s ln xut hin cc gi tr}
for V := 1 to M do cV := cV-1 + cV;
{Tnh v tr cui mi on}
for i := n downto 1 do
begin
V := ki;
xcV := ki; cV := cV - 1;
end;
k := x;
{Sao chp gi tr t dy kho x sang dy
kho k}

end;

R rng phc tp ca php m phn phi l O(max(M, n)). Nhc im ca php m phn
phi l khi M qu ln th cho d n nh cng khng th lm c.
C th c thc mc ti sao trong thao tc dng dy kho x, php duyt dy kho k theo th t no
th kt qu sp xp cng nh vy, vy ti sao ta li chn php duyt ngc t di ln?. tr li
cu hi ny, ta phi phn tch thm mt c trng ca cc thut ton sp xp:
IX. TNH N NH CA THUT TON SP XP (STABILITY)
Mt phng php sp xp c gi l n nh nu n bo ton th t ban u ca cc bn ghi
mang kho bng nhau trong danh sch. V d nh ban u danh sch sinh vin c xp theo th t
tn alphabet, th khi sp xp danh sch sinh vin theo th t gim dn ca im thi, nhng sinh vin
bng im nhau s c dn v mt on trong danh sch v vn c gi nguyn th t tn
alphabet.
Hy xem li nhng thut ton sp xp trc, trong nhng thut ton , thut ton sp xp ni
bt, thut ton sp xp chn v php m phn phi l nhng thut ton sp xp n nh, cn nhng
thut ton sp xp khc (v ni chung nhng thut ton sp xp i hi phi o gi tr 2 bn ghi
v tr bt k) l khng n nh.
Vi php m phn phi mc trc, ta nhn xt rng nu hai bn ghi c kho sp xp bng nhau
th khi a gi tr vo dy bn ghi ph, bn ghi no vo trc s nm pha sau. Vy nn ta s y
gi tr cc bn ghi vo dy ph theo th t ngc gi c th t tng i ban u.
Ni chung, mi phng php sp xp tng qut cho d khng n nh th u c th bin i n
tr thnh n nh, phng php chung nht c th hin qua v d sau:
Gi s ta cn sp xp cc sinh vin trong danh sch theo th t gim dn ca im bng mt thut
ton sp xp n nh. Ta thm cho mi sinh vin mt kho Index l th t ban u ca anh ta trong
danh sch. Trong thut ton sp xp c p dng, c ch no cn so snh hai sinh vin A v B
xem anh no phi ng trc, trc ht ta quan tm ti im s: Nu im ca A khc im ca B
th anh no im cao hn s ng trc, nu im s bng nhau th anh no c Index nh hn s
ng trc.
Trong mt s bi ton, tnh n nh ca thut ton sp xp quyt nh ti c tnh ng n ca ton
thut ton ln. Chnh tnh "nhanh" ca Quick Sort v tnh n nh ca php m phn phi l c s
nn tng cho hai thut ton sp xp cc nhanh trn cc dy kho s m ta s trnh by di y.
X. THUT TON SP XP BNG C S (RADIX SORT)
Bi ton t ra l: Cho dy kho l cc s t nhin k1, k2, ..., kn hy sp xp chng theo th t
khng gim. (Trong trng hp ta ang xt, TKey l kiu s t nhin)

1. Sp xp c s theo kiu hon v cc kho (Exchange Radix Sort)


Hy xem li thut ton Quick Sort, ti bc phn on n phn on ang xt thnh hai on tho
mn mi kho trong on u mi kho trong on sau v thc hin tng t trn hai on mi
to ra, vic phn on c tin hnh vi s so snh cc kho vi gi tr mt kho cht.
i vi cc s nguyn th ta c th coi mi s nguyn l mt dy z bt nh s t bt 0 (bt hng
n v) ti bt z - 1 (bt cao nht).
V d:
11 =
1 0 1 1
Bit
3 2 1 0 (z = 4)
Vy th ti bc phn on dy kho t k1 ti kn, ta c th a nhng kho c bt cao nht l 0 v
u dy, nhng kho c bt cao nht l 1 v cui dy. D thy rng nhng kho bt u bng bt 0
s phi nh hn nhng kho bt u bng bt 1. Tip tc qu trnh phn on vi hai on dy kho:
on gm cc kho c bt cao nht l 0 v on gm cc kho c bt cao nht l 1. Vi nhng kho
thuc cng mt on th c bt cao nht ging nhau, nn ta c th p dng qu trnh phn on
tng t trn theo bt th z - 2 v c tip tc nh vy ...
Qu trnh phn on kt thc nu nh on ang xt l rng hay ta tin hnh phn on n tn
bt n v, tc l tt c cc kho thuc mt trong hai on mi to ra u c bt n v bng nhau
(iu ny ng ngha vi s bng nhau tt c nhng bt khc, tc l bng nhau v gi tr kho).
V d:
Xt dy kho: 1, 3, 7, 6, 5, 2, 3, 4, 4, 5, 6, 7. Tng ng vi cc dy 3 bt:
001

011

111

110

101

010

011

100

100

101

110

111

111

100

100

101

110

111

100

100

111

110

110

111

101

110

110

111

111

Trc ht ta chia on da vo bt 2 (bt cao nht):


001

011

011

010

101

110

Sau chia tip hai on to ra da vo bt 1:


001

011

011

010

101

101

Cui cng, chia tip nhng on to ra da vo bt 0:


001

010

011

011

100

100

101

Ta c dy kho tng ng: 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 l dy kho sp xp.


Qu trnh chia on da vo bt b c th chia thnh mt on rng v mt on gm ton b cc
phn t cn li, nhng vic chia on khng bao gi b ri vo qu trnh quy v hn bi nhng
ln quy tip theo s phn on da vo bt b - 1, b - 2 ...v nu xt n bt 0 s phi dng li. Cn
cng vic gi y ca ta l c gng hiu on chng trnh sau v phn tch xem ti sao n hot
ng ng:
procedure ExchangeRadixSort;
var
z: Integer;
{ di dy bt biu din mi kho}
procedure Partition(L, H, b: Integer);
var
i, j: Integer;
begin
if L H then Exit;
i := L; j := H;
repeat

{Phn on [L, H] da vo bt b}

{Hai vng lp trong di y lun cm canh i < j}

while (i < j) and (Bt b ca ki = 0) do i := i + 1; {Tm kho c bt b = 1 t u on}


while (i < j) and (Bt b ca kj = 1) do j := j - 1; {Tm kho c bt b = 0 t cui on}
<o gi tr ki cho kj>;
until i = j;

if <Bt b ca kj = 0> then j := j + 1; {j l im bt u ca on c bt b l 1}


if b > 0 then
{Cha xt ti bt n v}
begin
Partition(L, j - 1, b - 1); Partition(j, R, b - 1);
end;
end;
begin
<Da vo gi tr ln nht ca dy kho,
xc nh z l di dy bt biu din mi kho>
Partition(1, n, z - 1);
end;

Vi Radix Sort, ta hon ton c th lm trn h c s R khc ch khng nht thit phi lm trn h
nh phn ( tng cng tng t nh trn), tuy nhin qu trnh phn on s khng phi chia lm 2
m chia thnh R on. V phc tp ca thut ton, ta thy phn on bng mt bt th thi
gian s l C.n chia tt c cc on cn chia bng bt (C l hng s). Vy tng thi gian phn
on bng z bt s l C.n.z. Trong trng hp xu nht, phc tp ca Radix Sort l O(n.z).
V phc tp trung bnh ca Radix Sort l O(n.min(z, log2n)).
Ni chung, Radix Sort ci t nh trn ch th hin tc ti a trn cc h thng cho php x l
trc tip trn cc bt: H thng phi cho php ly mt bt ra d dng v thao tc vi thi gian nhanh
hn hn so vi thao tc trn Byte v Word. Khi Radix Sort s tt hn nhiu Quick Sort. (Ta th
lp trnh sp xp cc dy nh phn di z theo th t t in kho st). Trn cc my tnh hin
nay ch cho php x l trc tip trn Byte (hay Word, DWord v.v...), vic tch mt bt ra khi Byte
x l li rt chm v lm nh hng khng nh ti tc ca Radix Sort. Chnh v vy, tuy
y l mt phng php hay, nhng khi ci t c th th tc cng ch ngang nga ch khng th
qua mt Quick Sort c.
2. Sp xp c s trc tip (Straight Radix Sort)
Ta s trnh by phng php sp xp c s trc tip bng mt v d: Sp xp dy kho:
925, 817, 821, 638, 639, 744, 742, 563, 570, 166.
Trc ht, ta sp xp dy kho ny theo th t tng dn ca ch s hng n v bng mt thut ton
sp xp khc, c dy kho:
570

821

742

563

744

925

166

817

638

639

Sau , ta sp xp dy kho mi to thnh theo th t tng dn ca ch s hng chc bng mt


thut ton sp xp n nh, c dy kho:
817

821

925

638

639

742

744

563

166

570

V thut ton sp xp ta s dng l n nh, nn nu hai kho c ch s hng chc ging nhau th
kho no c ch s hng n v nh hn s ng trc. Ni nh vy c ngha l dy kho thu c
s c th t tng dn v gi tr to thnh t hai ch s cui.
Cui cng, ta sp xp li dy kho theo th t tng dn ca ch s hng trm cng bng mt thut
ton sp xp n nh, thu c dy kho:
166

563

570

638

639

742

744

817

821

925

Lp lun tng t nh trn da vo tnh n nh ca php sp xp, dy kho thu c s c th t


tng dn v gi tr to thnh bi c ba ch s, l dy kho sp.
Nhn xt:
Ta hon ton c th coi s ch s ca mi kho l bng nhau, nh v d trn nu c s 15 trong
dy kho th ta c th coi n l 015.

Cng t v d, ta c th thy rng s lt thao tc sp xp phi p dng ng bng s ch s to


thnh mt kho. Vi mt h c s ln, biu din mt gi tr kho s phi dng t ch s hn. V
d s 12345 trong h thp phn phi dng ti 5 ch s, cn trong h c s 1000 ch cn dng 2
ch s AB m thi, y A l ch s mang gi tr 12 cn B l ch s mang gi tr 345.
Tc ca sp xp c s trc tip ph thuc rt nhiu vo thut ton sp xp n nh ti mi
bc. Khng c mt la chn no khc tt hn php m phn phi. Tuy nhin, php m phn
phi c th khng ci t c hoc km hiu qu nu nh tp gi tr kho qu rng, khng cho
php dng ra dy cc bin m hoc phi s dng dy bin m qu di (iu ny xy ra nu
chn h c s qu ln).
Mt la chn khn ngoan l nn chn h c s thch hp cho tng trng hp c th dung ho
ti mc ti u nht ba mc tiu:
Vic ly ra mt ch s ca mt s c thc hin d dng
S dng t ln gi php m phn phi.
Php m phn phi thc hin nhanh
procedure StraightRadixSort;
const
radix = ...;
{Tu chn h c s radix cho hp l}
var
t: TArray;
{Dy kho ph}
p: Integer;
nDigit: Integer; {S ch s cho mt kho, nh s t ch s th 0 l hng n v n ch s th nDigit - 1}
Flag: Boolean;
{Flag = True th sp dy k, ghi kt qu vo dy t; Flag = False th sp dy t, ghi kq vo k}
function GetDigit(Num: TKey; p: Integer): Integer; {Ly ch s th p ca s Num (0p<nDigit)}
begin
GetDigit := Num div radixp mod radix; {Trng hp c th c th c mo vit tt hn}
end;
{Sp xp n nh dy s x theo th t tng dn ca ch s th p, kt qu sp xp c cha vo dy s y}
procedure DCount(var x, y: TArray; p: Integer); {Thut ton m phn phi, sp t x sang y}
var
c: array[0..radix - 1] of Integer; {cd l s ln xut hin ch s d ti v tr p}
i, d: Integer;
begin
for d := 0 to radix - 1 do cd := 0;
for i := 1 to n do
begin
d := GetDigit(xi, p); cd := cd + 1;
end;
for d := 1 to radix - 1 do cd := cd-1 + cd; {cc cd tr thnh cc mc cui on}
for i := n downto 1 do
{in gi tr vo dy y}
begin
d := GetDigit(xi, p);
ycd := xi; cd := cd - 1;
end;
end;
begin
{Thut ton sp xp c s trc tip}
<Da vo gi tr ln nht trong dy kho,
xc nh nDigit l s ch s phi dng cho mi kho trong h radix>;
Flag := True;
for p := 0 to nDigit - 1 do {Xt t ch s hng n v ln, sp xp n nh theo ch s th p}
begin
if Flag then DCount(k, t, p) else DCount(t, k, p);
Flag := not Flag;
{o c, dng k tnh t ri li dng t tnh k
...}

end;

if not Flag then k := t;


end;

{Nu kt qu cui cng ang trong t th sao chp gi tr t t sang k}

Xt php m phn phi, ta bit phc tp ca n l O(max(radix, n)). M radix l mt hng s


t ta chn t trc, nn khi n ln, phc tp ca php m phn phi l O(n). Thut ton s dng
nDigit ln php m phn phi nn c th thy phc tp ca thut ton l O(n.nDigit) bt k
d liu u vo.
Ta c th coi sp xp c s trc tip l mt m rng ca php m phn phi, khi dy s ch ton
cc s c 1 ch s (trong h radix) th chnh l php m phn phi. S khc bit y l: Sp
xp c s trc tip c th thc hin vi cc kho mang gi tr ln; cn php m phn phi ch c
th lm trong trng hp cc kho mang gi tr nh, bi n cn mt lng b nh rng ging
ra dy bin m s ln xut hin cho tng gi tr.
XI. THUT TON SP XP TRN (MERGE SORT)
1. Php trn 2 ng
Php trn 2 ng l php hp nht hai dy kho sp xp ghp li thnh mt dy kho c
kch thc bng tng kch thc ca hai dy kho ban u v dy kho to thnh cng c th t sp
xp. Nguyn tc thc hin ca n kh n gin: so snh hai kho ng u hai dy, chn ra kho
nh nht v a n vo min sp xp (mt dy kho ph c kch thc bng tng kch thc hai
dy kho ban u) v tr thch hp. Sau , kho ny b loi ra khi dy kho cha n. Qu trnh
tip tc cho ti khi mt trong hai dy kho cn, khi ch cn chuyn ton b dy kho cn li
ra min sp xp l xong.
V d: Vi hai dy kho: (1, 3, 10, 11) v (2, 4, 9)
Dy 1
(1, 3, 10, 11)
(3, 10, 11)
(3, 10, 11)
(10, 11)
(10, 11)
(10, 11)

Dy
(2,
(2,
(4,
(4,
(9)

2
4, 9)
4, 9)
9)
9)

Kho nh nht trong 2 dy


1
2
3
4
9
Dy 2 l , a nt dy 1
vo min sp xp

Min sp xp
(1)
(1, 2)
(1, 2, 3)
(1, 2, 3, 4)
(1, 2, 3, 4, 9)
(1, 2, 3, 4, 9, 10, 11)

2. Sp xp bng trn 2 ng trc tip


Ta c th coi mi kho trong dy kho k1, k2, ..., kn l mt mch vi di 1, cc mch trong dy
c sp xp ri:
3

Trn hai mch lin tip li thnh mt mch c di 2, ta li c dy gm cc mch c sp:


C trn hai mch lin tip, ta c mt mch di ln hn, s mch trong dy s gim dn xung:
3

tin hnh thut ton sp xp trn hai ng trc tip, ta vit cc th tc:
Th tc Merge(var x, y: TArray; a, b, c: Integer); th tc ny trn mch xa, xa+1, ..., xb vi mch
xb+1, xb+2 ..., xc c mch ya, ya+1, ..., yc.
Th tc MergeByLength(var x, y: TArray; len: Integer); th tc ny trn ln lt cc cp mch
theo th t:
Trn mch x1...xlen v xlen+1...x2len thnh mch y1...y2len.

Trn mch x2len+1...x3len v x3len+1 ...x4len thnh mch y2len+1...y4len.


...
Lu rng n cui cng ta c th gp hai trng hp: Hoc cn li hai mch m mch th hai
c di < len. Hoc ch cn li mt mch. Trng hp th nht ta phi qun l chnh xc cc
ch s thc hin php trn, cn trng hp th hai th khng c qun thao tc a thng
mch duy nht cn li sang dy y.
Cui cng l th tc MergeSort, th tc ny cn mt dy kho ph t1, t2, ..., tn. Trc ht ta gi
MergeByLength(k, t, 1) trn hai phn t lin tip ca k thnh mt mch trong t, sau li
gi MergeByLength(t, k, 2) trn hai mch lin tip trong t thnh mt mch trong k, ri li gi
MergeByLength(k, t, 4) trn hai mch lin tip trong k thnh mt mch trong t ...Nh vy k
v t c s dng vi vai tr lun phin: mt dy cha cc mch v mt dy dng trn cc
cp mch lin tip c mch ln hn.
procedure MergeSort;
var
t: TArray;
{Dy kho ph}
len: Integer;
Flag: Boolean;
{Flag = True: trn cc mch trong k vo t; Flag = False: trn cc mch trong t
vo k}

procedure Merge(var X, Y: TArray; a, b, c: Integer);{Trn Xa...Xb v Xb+1...Xc}


var
i, j, p: Integer;
begin
{Ch s p chy trong min sp xp, i chy theo mch th nht, j chy theo mch th hai}

p := a; i := a; j := b + 1;
while (i b) and (j c) then {Chng no c hai mch u cha xt ht}
begin
if Xi Xj then {So snh hai phn t nh nht trong hai mch m cha b a vo min sp xp}
begin
Yp := Xi; i := i + 1;
{a xi vo min sp xp v cho i
end
else
begin
Yp := Xj; j := j + 1;
end;
p := p + 1;
end;
if i b then
(Yp, Yp+1, ...,
else
(Yp, Yp+1, ...,
end;

chy}

{a xj vo min sp xp v cho j
chy}

{Mch 2 ht trc}

Yc) := (Xi, Xi+1, ..., Xb)

{a phn cui ca mch 1 vo min sp xp}

{Mch 1 ht trc}

Yc) := (Xj, Xj+1, ..., Xc); {a phn cui ca mch 2 vo min sp xp}

procedure MergeByLength(var X, Y: TArray; len: Integer);


begin
a := 1; b := len; c := 2 * len;
while c n do
{Trn hai mch xa...xb v xb+1...xc u c di len}
begin
Merge(X, Y, a, b, c);
{Dch cc ch s a, b, c v sau 2.len v tr}

a :=
end;
if b < n
else
if a
(Ya,
end;

a + 2 * len; b := b + 2 * len; c := c + 2 * len;


then Merge(X, Y, a, b, n) {Cn li hai mch m mch th hai c di ngn hn len}
n then {Cn li mt mch}
Ya+1, ..., Yn) := (Xa, Xa+1, ..., Xn); {a thng mch sang min y}

begin

{Thut ton sp xp

trn}

Flag := True;
len := 1;
while len < n do
begin
if Flag then MergeByLength(k, t, len)
else MergeByLength(t, k, len);
len := len * 2;
Flag := not Flag;
{o c lun phin vai tr ca k v t}
end;
if not Flag then k := t; {Nu kt qu cui cng ang nm trong t th sao chp kt qu vo k}
end;

V phc tp ca thut ton, ta thy rng trong th tc Merge, php ton tch cc l thao tc a
mt kho vo min sp xp. Mi ln gi th tc MergeByLength, tt c cc phn t trong dy kho
c chuyn hon ton sang min sp xp, nn phc tp ca th tc MergeByLength l O(n).
Th tc MergeSort c vng lp thc hin khng qu log2n + 1 li gi MergeByLength bi bin len
s c tng theo cp s nhn cng bi 2. T suy ra phc tp ca MergeSort l O(nlog2n)
bt chp trng thi d liu vo.
Cng l nhng thut ton sp xp tng qut vi phc tp trung bnh nh nhau, nhng khng
ging nh QuickSort hay HeapSort, MergeSort c tnh n nh. Nhc im ca MergeSort l n
phi dng thm mt vng nh cha dy kho ph c kch thc bng dy kho ban u.
Ngi ta cn c th li dng c trng thi d liu vo khin MergeSort chy nhanh hn: ngay
t u, ta khng coi mi phn t ca dy kho l mt mch m coi nhng on c sp trong
dy kho l mt mch. Bi mt dy kho bt k c th coi l gm cc mch sp xp nm lin
tip nhau. Khi ngi ta gi phng php ny l phng php trn hai ng t nhin.
Tng qut hn na, thay v php trn hai mch, ngi ta c th s dng php trn k mch, khi ta
c thut ton sp xp trn k ng.
XII. CI T
Ta s ci t tt c cc thut ton sp xp nu trn, vi d liu vo c t trong file vn bn
SORT.INP cha khng nhiu hn 15000 kho v gi tr mi kho l s t nhin khng qu 15000.
Kt qu c ghi ra file vn bn SORT.OUT cha dy kho c sp, mi kho trn mt dng.
SORT.INP
1 4 3 2 5
7 9 8
10 6

SORT.OUT
1
2
3
4
5
6
7
8
9
10

Chng trnh c giao din di dng menu, mi chc nng tng ng vi mt thut ton sp xp.
Ti mi thut ton sp xp, ta thm mt vi lnh o thi gian thc t ca n (ch o thi gian thc
hin gii thut, khng tnh thi gian nhp liu v in kt qu).
thut ton sp xp bng c s theo cch hon v phn t, ta chn h nh phn. thut ton sp
xp bng c s trc tip, ta s dng h c s 256, khi mt gi tr s t nhin x 15000 s c
biu din bng hai ch s trong h 256:
8
Ch s hng n v l x mod 256 = x mod 2 = x and 255 = x and $FF;
8
Ch s cn li (= ch s hng cao nht) l x div 256 = x div 2 = x shr 8;

SORTDEMO.PAS * Cc thut ton sp xp


{$M 65520 0 655360}
program SortingAlgorithmsDemo;
uses crt;
const
max = 15000;
maxV = 15000;
Interval = 1193180 / 65536;
{Tn s ng h 18.2 ln / giy}
nMenu = 12;
SMenu: array[0..nMenu] of String =
(
' 0. Display Input',
' 1. Selection Sort',
' 2. Bubble Sort',
' 3. Insertion Sort',
' 4. Insertion Sort with binary searching',
' 5. Shell Sort',
' 6. Quick Sort',
' 7. Heap Sort',
' 8. Distribution Counting',
' 9. Radix Sort',
' 10. Straight Radix Sort',
' 11. Merge Sort',
' 12. Exit'
);
type
TArr = array[1..max] of Integer;
TCount = array[0..maxV] of Integer;
var
k: TArr;
n: Integer;
selected: Integer;
StTime: LongInt;
Time: LongInt absolute 0:$46C;
{Bin m nhp ng h}
procedure Enter;
{Trc mi thut ton sp xp, gi th tc ny nhp liu}
var
f: Text;
begin
Assign(f, 'SORT.INP'); Reset(f);
n := 0;
while not SeekEof(f) do
begin
Inc(n); Read(f, k[n]);
end;
Close(f);
StTime := Time; {Nhp xong bt u tnh thi gian ngay}
end;
procedure PrintInput;
{In d liu}
var
i: Integer;
begin
Enter;
for i := 1 to n do Write(k[i]:8);
Write('Press any key to return to menu...');
ReadKey
end;
procedure PrintResult; {In kt qu ca mi thut ton sp xp}
var
f: Text;
i: Integer;

ch: Char;
begin
{Trc ht in ra thi gian thc thi}

WriteLn('During Time = ', (Time - StTime) / Interval:1:10, ' (s)');


Assign(f, 'SORT.OUT'); Rewrite(f);
for i := 1 to n do WriteLn(f, k[i]);
Close(f);
Write('Press <P> to print Output, another key to return to menu...');
ch := ReadKey; WriteLn(ch);
if Upcase(ch) = 'P' then
begin
for i := 1 to n do Write(k[i]:8);
WriteLn;
Write('Press any key to return to menu...');
ReadKey;
end;
end;
procedure Swap(var x, y: Integer);
var
t: Integer;
begin
t := x; x := y; y := t;
end;

{Th tc o gi tr hai tham bin x, y}

(** SELECTION SORT *************************************************)


procedure SelectionSort;
var
i, j, jmin: Integer;
begin
Enter;
for i := 1 to n - 1 do
begin
jmin := i;
for j := i + 1 to n do
if k[j] < k[jmin] then jmin := j;
if jmin <> i then Swap(k[i], k[jmin]);
end;
PrintResult;
end;
(** BUBBLE SORT ****************************************************)
procedure BubbleSort;
var
i, j: Integer;
begin
Enter;
for i := 2 to n do
for j := n downto i do
if k[j - 1] > k[j] then Swap(k[j - 1], k[j]);
PrintResult;
end;
(** INSERTION SORT *************************************************)
procedure InsertionSort;
var
i, j, tmp: Integer;
begin
Enter;
for i := 2 to n do
begin
tmp := k[i]; j := i - 1;
while (j > 0) and (tmp < k[j]) do
begin

k[j + 1] := k[j];
Dec(j);
end;
k[j + 1] := tmp;
end;
PrintResult;
end;
(** INSERTION SORT WITH BINARY SEARCHING ***************************)
procedure AdvancedInsertionSort;
var
i, inf, sup, median, tmp: Integer;
begin
Enter;
for i := 2 to n do
begin
tmp := k[i];
inf := 1; sup := i - 1;
repeat
median := (inf + sup) shr 1;
if tmp < k[median] then sup := median - 1
else inf := median + 1;
until inf > sup;
Move(k[inf], k[inf + 1], (i - inf) * SizeOf(k[1]));
k[inf] := tmp;
end;
PrintResult;
end;
(** SHELL SORT *****************************************************)
procedure ShellSort;
var
tmp: Integer;
i, j, h: Integer;
begin
Enter;
h := n shr 1;
while h <> 0 do
begin
for i := h + 1 to n do
begin
tmp := k[i]; j := i - h;
while (j > 0) and (k[j] > tmp) do
begin
k[j + h] := k[j];
j := j - h;
end;
k[j + h] := tmp;
end;
h := h shr 1;
end;
PrintResult;
end;
(** QUICK SORT *****************************************************)
procedure QuickSort;
procedure Partition(L, H: Integer);
var
i, j: Integer;
key: Integer;
begin
if L >= H then Exit;
key := k[L + Random(H - L + 1)];

i := L; j := H;
repeat
while k[i] < key do Inc(i);
while k[j] > key do Dec(j);
if i <= j then
begin
if i < j then Swap(k[i], k[j]);
Inc(i); Dec(j);
end;
until i > j;
Partition(L, j); Partition(i, H);
end;
begin Enter;
Partition(1, n);
PrintResult;
end;
(** HEAP SORT ******************************************************)
procedure HeapSort;
var
r, i: Integer;
procedure Adjust(root, endnode: Integer);
var
key, c: Integer;
begin
key := k[root];
while root shl 1 <= endnode do
begin
c := root shl 1;
if (c < endnode) and (k[c] < k[c + 1]) then Inc(c);
if k[c] <= key then Break;
k[root] := k[c]; root := c;
end;
k[root] := key;
end;
begin
Enter;
for r := n shr 1 downto 1 do Adjust(r, n);
for i := n downto 2 do
begin
Swap(k[1], k[i]);
Adjust(1, i - 1);
end;
PrintResult;
end;
(** DISTRIBUTION COUNTING ******************************************)
procedure DistributionCounting;
var
x: TArr;
c: TCount;
i, V: Integer;
begin
Enter;
FillChar(c, SizeOf(c), 0);
for i := 1 to n do Inc(c[k[i]]);
for V := 1 to MaxV do c[V] := c[V - 1] + c[V];
for i := n downto 1 do
begin
V := k[i];

x[c[V]] := k[i];
Dec(c[V]);
end;
k := x;
PrintResult;
end;
(** EXCHANGE RADIX SORT ********************************************)
procedure RadixSort;
const
MaxBit = 13;
var
MaskBit: array[0..MaxBit] of Integer;
MaxValue, i: Integer;
procedure Partition(L, H, BIndex: Integer);
var
i, j, Mask: Integer;
begin
if L >= H then Exit;
i := L; j := H; Mask := MaskBit[BIndex];
repeat
while (i < j) and (k[i] and Mask = 0) do Inc(i);
while (i < j) and (k[j] and Mask <> 0) do Dec(j);
Swap(k[i], k[j]);
until i = j;
if k[j] and Mask = 0 then Inc(j);
if BIndex > 0 then
begin
Partition(L, j - 1, BIndex - 1); Partition(j, H, BIndex - 1);
end;
end;
begin
Enter;
for i := 0 to MaxBit do MaskBit[i] := 1 shl i;
maxValue := k[1];
for i := 2 to n do
if k[i] > MaxValue then maxValue := k[i];
i := 0;
while (i < MaxBit) and (MaskBit[i + 1] <= MaxValue) do Inc(i);
Partition(1, n, i);
PrintResult;
end;
(** STRAIGHT RADIX SORT ********************************************)
procedure StraightRadixSort;
const
Radix = 256;
nDigit = 2;
var
t: TArr;
p: Integer;
Flag: Boolean;
function GetDigit(key, p: Integer): Integer;
begin
if p = 0 then GetDigit := key and $FF
else GetDigit := key shr 8;
end;
procedure DCount(var x, y: TArr; p: Integer);
var
c: array[0..Radix - 1] of Integer;

i, d: Integer;
begin
FillChar(c, SizeOf(c), 0);
for i := 1 to n do
begin
d := GetDigit(x[i], p); Inc(c[d]);
end;
for d := 1 to Radix - 1 do c[d] := c[d - 1] + c[d];
for i := n downto 1 do
begin
d := GetDigit(x[i], p);
y[c[d]] := x[i];
Dec(c[d]);
end;
end;
begin
Enter;
Flag := True;
for p := 0 to nDigit - 1 do
begin
if Flag then DCount(k, t, p)
else DCount(t, k, p);
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
(** MERGE SORT *****************************************************)
procedure MergeSort;
var
t: TArr;
Flag: Boolean;
len: Integer;
procedure Merge(var Source, Dest: TArr; a, b, c: Integer);
var
i, j, p: Integer;
begin
p := a; i := a; j := b + 1;
while (i <= b) and (j <= c) do
begin
if Source[i] <= Source[j] then
begin
Dest[p] := Source[i]; Inc(i);
end
else
begin
Dest[p] := Source[j]; Inc(j);
end;
Inc(p);
end;
if i <= b then
Move(Source[i], Dest[p], (b - i + 1) * SizeOf(Source[1]))
else
Move(Source[j], Dest[p], (c - j + 1) * SizeOf(Source[1]));
end;
procedure MergeByLength(var Source, Dest: TArr; len: Integer);
var
a, b, c: Integer;
begin
a := 1; b := len; c := len shl 1;

while c <= n do
begin
Merge(Source, Dest, a, b, c);
a := a + len shl 1; b := b + len shl 1; c := c + len shl 1;
end;
if b < n then Merge(Source, Dest, a, b, n)
else
Move(Source[a], Dest[a], (n - a + 1) * SizeOf(Source[1]));
end;
begin
Enter;
len := 1; Flag := True;
FillChar(t, SizeOf(t), 0);
while len < n do
begin
if Flag then MergeByLength(k, t, len)
else MergeByLength(t, k, len);
len := len shl 1;
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
(*******************************************************************)
function MenuSelect: Integer;
var
ch: Integer;
begin
Clrscr;
WriteLn('Sorting Algorithms Demos; Input: SORT.INP; Output: SORT.OUT');
for ch := 0 to nMenu do WriteLn(SMenu[ch]);
Write('Enter your choice: '); ReadLn(ch);
MenuSelect := ch;
end;
begin
repeat
selected := MenuSelect;
WriteLn(SMenu[selected]);
case selected of
0: PrintInput;
1: SelectionSort;
2: BubbleSort;
3: InsertionSort;
4: AdvancedInsertionSort;
5: ShellSort;
6: QuickSort;
7: HeapSort;
8: DistributionCounting;
9: RadixSort;
10: StraightRadixSort;
11: MergeSort;
12: Halt;
end;
until False;
end.

Vic o thi gian thc thi ca tng thut ton sp xp l cn thit bi cc tnh ton l thuyt i khi
b lch so vi thc t v nhiu l do khc nhau. Trong Borland Pascal, c l nn t tt tt c ch
kim tra trn (phm vi, s hc) th cng bng hn, vi l l rng nu ta lp trnh khng phi vi

Borland Pascal m vi Assembler chng hn, th vic c kim tra trn hay khng l do mun ca
ta ch khng ai c th bt p c. Nhng him ai cha tng bit m li c th ci t trn tru
nhng thut ton trn, nn phi bt tt c cc ch kim tra t ti an ton cao nht khi
kim th.
Mt vn khc xy ra l nu tt tt c ch bin dch kim tra trn, th ngoi nhng thut ton
sp xp chn, ni bt, chn, rt kh c th o c tc trung bnh ca nhng thut ton sp xp
cn li khi m chng u chy khng ti mt nhp ng h thi gian thc (khng kp o thi gian).
Mt cch gii quyt l cho mi thut ton Quick Sort, Radix Sort, ... thc hin khong 1000 ln trn
cc b d liu ngu nhin ri ly thi gian tng chia cho 1000. Hay mt cch khc l tng kch
thc d liu, iu ny c th dn n vic phi sa li mt vi ch trong chng trnh.
Di y ta thc hin o tc vi d liu u vo l 15000 s t nhin ly ngu nhin trong on
[0, 15000]. Thi gian v tc thc thi ca cc thut ton o c c th nh sau (ta gi s rng
tc ca Bubble Sort l 1):
ch {$R-,Q-,S-}:
STT
1
2
3
4
5
6
7
8
9
10
11

Thut ton
Distribution Counting
Straight Radix Sort
Heap Sort
Shell Sort
Radix Sort
Quick Sort
Merge Sort
Insertion Sort with binary searching
Insertion Sort
Selection Sort
Bubble Sort

Thi gian (giy)


0.0033
0.0165
0.0280
0.0308
0.0341
0.0352
0.0483
0.7690
2.2519
2.6364
23.0687

Tc
7000.00
1400.00
823.53
750.00
677.42
656.25
477.27
30.00
10.24
8.75
1.00

Thi gian (giy)


0.0319
0.0643
0.1313
0.1346
0.2098
0.2296
0.2796
0.8239
35.7016
52.7834
95.4056

Tc
2994.83
1484.62
726.78
708.98
454.71
415.55
341.26
115.80
2.67
1.81
1.00

ch {$R+,Q+,S+}:
STT
1
2
3
4
5
6
7
8
9
10
11

Thut ton
Distribution Counting
Straight Radix Sort
Quick Sort
Radix Sort
Merge Sort
Heap Sort
Shell Sort
Insertion Sort with binary searching
Insertion Sort
Selection Sort
Bubble Sort

Nhng con s v thi gian v tc ny c o trn mt b d liu c th, vi mt my tnh c


th v mt cng c lp trnh c th, vi b d liu khc, my tnh v cng c lp trnh khc, kt qu
c th khc. Ti vit li chng trnh ny trn Borland Delphi 6 v th vi d liu 5000000 kho
s nguyn sinh ngu nhin [0, 5000000] c kt qu nh sau:

Hnh 16: Ci t cc thut ton sp xp vi d liu ln, cho php chy cc thut ton theo kiu song song
(Synchronous) hoc tun t (Asynchronous), Straight Radix Sort t ra nhanh nht

XIII. NHNG NHN XT CUI CNG


Cng mt mc ch sp xp nh nhau, nhng c nhiu phng php gii quyt khc nhau. Nu ch
da vo thi gian o c trong mt v d c th m nh gi thut ton ny tt hn thut ton kia
v mi mt l iu khng nn. Vic chn mt thut ton sp xp thch hp cho ph hp vi tng
yu cu, tng iu kin c th l k nng ca ngi lp trnh.
2
Nhng thut ton c phc tp O(n ) th ch nn p dng trong chng trnh c t ln sp xp v
vi kch thc n nh. V tc , Bubble Sort lun lun ng bt, nhng m lnh ca n li ht sc
n gin m ngi mi hc lp trnh no cng c th ci t c, tnh n nh ca Bubble Sort
2

cng rt ng ch . Trong nhng thut ton c phc tp O(n ), Insertion Sort t ra nhanh hn
nhng phng php cn li v cng c tnh n nh, m lnh cng tng i n gin, d nh.
Selection Sort th khng n nh nhng vi n nh, vic chn ra m phn t nh nht c th thc hin
d dng ch khng cn phi sp xp li ton b nh sp xp chn.
Thut ton m phn phi v thut ton sp xp bng c s nn c tn dng trong trng hp cc
kho sp xp l s t nhin (hay l mt kiu d liu c th quy ra thnh cc s t nhin) bi nhng
thut ton ny c tc rt cao. Thut ton sp xp bng c s cng c th sp xp dy kho c s
thc hay s m nhng ta phi bit c cch thc lu tr cc kiu d liu trn my tnh th mi
c th lm c.
Quick Sort, Heap Sort, Merge Sort v Shell Sort l nhng thut ton sp xp tng qut, dy kho
thuc kiu d liu c th t no cng c th p dng c ch khng nht thit phi l cc s.

Quick Sort gp nhc im trong trng hp suy bin nhng xc sut xy ra trng hp ny rt
nh. Heap Sort th m lnh hi phc tp v kh nh, nhng nu cn chn ra m phn t ln nht
trong dy kho th dng Heap Sort s khng phi sp xp li ton b dy. Merge Sort phi i hi
thm mt khng gian nh ph, nn p dng n trong trng hp sp xp trn file. Cn Shell Sort th
hi kh trong vic nh gi v thi gian thc thi, n l sa i ca thut ton sp xp chn nhng
li c tc tt, m lnh n gin v lng b nh cn huy ng rt t. Tuy nhin, nhng nhc
im ca bn phng php ny qu nh so vi u im chung ca chng l nhanh. Hn na,
chng c nh gi cao khng ch v tnh tng qut v tc nhanh, m cn l kt qu ca nhng
cch tip cn khoa hc i vi bi ton sp xp.
Nhng thut ton trn khng ch n thun l cho ta hiu thm v mt cch sp xp mi, m k
thut ci t chng (vi m lnh ti u) cng dy cho chng ta nhiu iu: K thut s dng s
ngu nhin, k thut "chia tr", k thut dng cc bin vi vai tr lun phin v.v...Vy nn nm
vng ni dung ca nhng thut ton , m cch thuc tt nht chnh l ci t chng vi ln vi
cc rng buc d liu khc nhau (nu c th th c trn hai ngn ng lp trnh th rt tt) v cng
ng qun k thut sp xp bng ch s.
Bi tp
1. Vit thut ton Quick Sort khng quy
2. Hy vit nhng thut ton sp xp nu trn vi danh sch nhng xu k t gm 3 ch ci thng,
sp xp chng theo th t t in.
3. Hy vit li tt c nhng thut ton nu trn vi phng php sp xp bng ch s trn mt dy
s cn sp khng tng (gim dn).
4. Vit chng trnh tm trung v ca mt dy s
5. Cho mt danh sch th sinh gm n ngi, mi ngi cho bit tn v im thi, hy chn ra m
ngi im cao nht.
6. Thut ton sp xp bng c s trc tip c n nh khng ? Ti sao ?
7. Ci t thut ton sp xp trn hai ng t nhin
8. Tm hiu php trn k ng v cc phng php sp xp ngoi (trn tp truy nhp tun t v tp
truy nhp ngu nhin)

8. TM KIM (SEARCHING)
I. BI TON TM KIM
Cng vi sp xp, tm kim l mt i hi rt thng xuyn trong cc ng dng tin hc. Bi ton
tm kim c th pht biu nh sau:
Cho mt dy gm n bn ghi r1, r2, ..., rn. Mi bn ghi ri (1 i n) tng ng vi mt kho ki. Hy
tm bn ghi c gi tr kho bng X cho trc.
X c gi l kho tm kim hay i tr tm kim (argument).
Cng vic tm kim s hon thnh nu nh c mt trong hai tnh hung sau xy ra:
Tm c bn ghi c kho tng ng bng X, lc php tm kim thnh cng (successful).
Khng tm c bn ghi no c kho tm kim bng X c, php tm kim tht bi
(unsuccessful).
Tng t nh sp xp, ta coi kho ca mt bn ghi l i din cho bn ghi . V trong mt s
thut ton s trnh by di y, ta coi kiu d liu cho mi kho cng c tn gi l TKey.
const
n = ...;
{S kho trong dy kho, c th khai di dng bin s nguyn tu bin hn}
type
TKey = ...;
{Kiu d liu mt kho}
TArray = array[1..n] of TKey;
var
k: TArray;
{Dy kho}

II. TM KIM TUN T (SEQUENTIAL SEARCH)


Tm kim tun t l mt k thut tm kim n gin. Ni dung ca n nh sau: Bt u t bn ghi
u tin, ln lt so snh kho tm kim vi kho tng ng ca cc bn ghi trong danh sch, cho
ti khi tm thy bn ghi mong mun hoc duyt ht danh sch m cha thy
{Tm kim tun t trn dy kho k1, k2, ..., kn; hm ny th tm xem trong dy c kho no = X khng, nu thy n tr v ch
s ca kho y, nu khng thy n tr v 0. C s dng mt kho ph kn+1 c gn gi tr = X}

function SequentialSearch(X: TKey): Integer;


var
i: Integer;
begin
i := 1;
while (i <= n) and (ki X) do i := i + 1;
if i = n + 1 then SequentialSearch := 0
else SequentialSearch := i;
end;

D thy rng phc tp ca thut ton tm kim tun t trong trng hp tt nht l O(1), trong
trng hp xu nht l O(n) v trong trng hp trung bnh cng l O(n).
III. TM KIM NH PHN (BINARY SEARCH)
Php tm kim nh phn c th p dng trn dy kho c th t: k1 k2 ... kn.
Gi s ta cn tm trong on kinf, kinf+1, ..., ksup vi kho tm kim l X, trc ht ta xt kho nm
gia dy kmedian vi median = (inf + sup) div 2;
Nu kmedian < X th c ngha l on t kinf ti kmedian ch cha ton kho < X, ta tin hnh tm
kim tip vi on t kmedian + 1 ti ksup.
Nu kmedian > X th c ngha l on t kmedian ti ksup ch cha ton kho > X, ta tin hnh tm
kim tip vi on t kinf ti kmedian - 1.
Nu kmedian = X th vic tm kim thnh cng (kt thc qu trnh tm kim).

Qu trnh tm kim s tht bi nu n mt bc no , on tm kim l rng (inf > sup).


{Tm kim nh phn trn dy kho k1 k2 ... kn; hm ny th tm xem trong dy c kho no = X khng, nu thy n tr v
ch s
ca kho y, nu khng thy n tr v 0}

function BinarySearch(X: TKey): Integer;


var
inf, sup, median: Integer;
begin
inf := 1; sup := n;
while inf sup do
begin
median := (inf + sup) div 2;
if kmedian = X then
begin
BinarySearch := median;
Exit;
end;
if kmedian < X then inf := median + 1
else sup := median - 1;
end;
BinarySearch := 0;
end;

Ngi ta chng minh c phc tp tnh ton ca thut ton tm kim nh phn trong trng
hp tt nht l O(1), trong trng hp xu nht l O(log2n) v trong trng hp trung bnh cng l
O(log2n). Tuy nhin, ta khng nn qun rng trc khi s dng tm kim nh phn, dy kho phi
c sp xp ri, tc l thi gian chi ph cho vic sp xp cng phi tnh n. Nu dy kho lun
lun bin ng bi php b sung hay loi bt i th lc chi ph cho sp xp li ni ln rt r lm
bc l nhc im ca phng php ny.
IV. CY NH PHN TM KIM (BINARY SEARCH TREE - BST)
Cho n kho k1, k2, ..., kn, trn cc kho c quan h th t ton phn. Cy nh phn tm kim ng vi
dy kho l mt cy nh phn m mi nt cha gi tr mt kho trong n kho cho, hai gi tr
cha trong hai nt bt k l khc nhau. i vi mi nt trn cy, tnh cht sau lun c tho mn:
Mi kho nm trong cy con tri ca nt u nh hn kho ng vi nt .
Mi kho nm trong cy con phi ca nt u ln hn kho ng vi nt
4

Hnh 17: Cy nh phn tm kim

Thut ton tm kim trn cy c th m t chung nh sau:


Trc ht, kho tm kim X c so snh vi kho gc cy, v 4 tnh hung c th xy ra:
Khng c gc (cy rng): X khng c trn cy, php tm kim tht bi
X trng vi kho gc: Php tm kim thnh cng
X nh hn kho gc, php tm kim c tip tc trong cy con tri ca gc vi cch lm
tng t

X ln hn kho gc, php tm kim c tip tc trong cy con phi ca gc vi cch lm


tng t
Gi s cu trc mt nt ca cy c m t nh sau:
type
PNode = ^TNode;
{Con tr cha lin kt ti mt nt}
TNode = record
{Cu trc nt}
Info: TKey;
{Trng cha kho}
Left, Right: PNode;
{con tr ti nt con tri v phi, tr ti nil nu khng c nt con tri (phi)}
end;
Gc ca cy c lu trong con tr Root. Cy rng th Root = nil

Thut ton tm kim trn cy nh phn tm kim c th vit nh sau:


{Hm tm kim trn BST, n tr v nt cha kho tm kim X nu tm thy, tr v nil nu khng
tm thy}

function BSTSearch(X: TKey): PNode;


var
p: PNode;
begin
p := Root;
{Bt u vi nt gc}
while p nil do
if X = p^.Info then Break;
else
if X < p^.Info then p := p^.Left
else p := p^.Right;
BSTSearch := p;
end;

Thut ton dng cy nh phn tm kim t dy kho k1, k2, ..., kn cng c lm gn ging qu trnh
tm kim. Ta chn ln lt cc kho vo cy, trc khi chn, ta tm xem kho c trong cy
hay cha, nu c ri th b qua, nu n cha c th ta thm nt mi cha kho cn chn v ni
nt vo cy nh phn tm kim.
{Th tc chn kho X vo BST}

procedure BSTInsert(X);
var
p, q: PNode;
begin
q := nil; p := Root;
{Bt u vi p = nt gc; q l con tr chy ui theo sau}
while p nil do
begin
q := p;
if X = p^.Info then Break;
else {X p^.Info th cho p chy sang nt con, q^ lun gi vai tr l cha ca p^}
if X < p^.Info then p := p^.Left
else p := p^.Right;
end;
if p = nil then {Kho X cha c trong BST}
begin
New(p);
{To nt mi}
p^.Info := X;
{a gi tr X vo nt mi to ra}
p^.Left := nil; p^.Right := nil;
{Nt mi khi chn vo BST s tr thnh nt
l} if Root = nil then Root := NewNode {BST ang rng, t Root l nt mi to}
else
{Mc NewNode^ vo nt cha q^}
if X < q^.Info then q^.Left := NewNode
else q^.Right := NewNode;
end;
end;

Php loi b trn cy nh phn tm kim khng n gin nh php b sung hay php tm kim.
Mun xo mt gi tr trong cy nh phn tm kim (Tc l dng li cy mi cha tt c nhng gi
tr cn li), trc ht ta tm xem gi tr cn xo nm nt D no, c ba kh nng xy ra:

Nt D l nt l, trng hp ny ta ch vic em mi ni c tr ti nt D (t nt cha ca D) thay


bi nil, v gii phng b nh cp cho nt D.
4

Nt D ch c mt nhnh con, khi ta em nt gc ca nhnh con th vo ch nt D, tc l


chnh li mi ni: T nt cha ca nt D khng ni ti nt D na m ni ti nhnh con duy nht
ca nt D. Cui cng, ta gii phng b nh cp cho nt D
4

Nt D c c hai nhnh con tri v phi, khi c hai cch lm u hp l c:


Hoc tm nt cha kho ln nht trong cy con tri, a gi tr cha trong sang nt D, ri
xo nt ny. Do tnh cht ca cy BST, nt cha kho ln nht trong cy con tri chnh l nt
cc phi ca cy con tri nn n khng th c hai con c, vic xo a v hai trng hp
trn
4

Hoc tm nt cha kho nh nht trong cy con phi, a gi tr cha trong sang nt D, ri
xo nt ny. Do tnh cht ca cy BST, nt cha kho nh nht trong cy con phi chnh l
nt cc tri ca cy con phi nn n khng th c hai con c, vic xo a v hai trng
hp trn.
5

4
2

7
6

7
3

Nh vy trong trng hp nt D c hai con, ta em gi tr cha mt nt khc chuyn sang cho


D ri xo nt thay cho D. Cng c th lm bng cch thay mt s mi ni, nhng lm nh th
ny n gin hn nhiu.
{Th tc xo kho X khi BST}

procedure BSTDelete(X: TKey);

var
p, q, Node, Child: PNode;
begin
p := Root; q := nil; {V sau, khi p tr sang nt khc, ta c gng gi cho q^ lun l cha ca p^}
while p nil do
{Tm xem trong cy c kho X khng?}
begin
if p^.Info = X then Break; {Tm thy}
q := p;
if X < p^.Info then p := p^.Left
else p := p^.Right;
end;
if p = nil then Exit; {X khng tn ti trong BST nn khng xo c}
if (p^.Left nil) and (p^.Right nil) then {p^ c c con tri v con phi}
begin
Node := p;
{Gi li nt cha kho X}
q := p; p := p^.Left;
{Chuyn sang nhnh con tri tm nt cc phi}
while p^.Right nil do
begin
q := p; p := p^.Right;
end;
Node^.Info := p^.Info;
{Chuyn gi tr t nt cc phi trong nhnh con tri ln Node^}
end;
{Nt b xo gi y l nt p^, n ch c nhiu nht mt con}
{Nu p^ c mt nt con th em Child tr ti nt con , nu khng c th Child = nil }

if p^.Left nil then Child := p^.Left


else Child := p^.Right;
if p = Root then Root := Child; {Nt p^ b xo l gc cy}
else {Nt b xo p^ khng phi gc cy th ly mi ni t cha ca n l q^ ni thng ti Child}
if q^.Left = p then q^.Left := Child
else q^.Right := Child;
Dispose(p);
end;

Trng hp trung bnh, th cc thao tc tm kim, chn, xo trn BST c phc tp l O(log2n).
Cn trong trng hp xu nht, cy nh phn tm kim b suy bin th cc thao tc u c
phc tp l O(n), vi n l s nt trn cy BST.
Nu ta m rng hn khi nim cy nh phn tm kim nh sau: Gi tr lu trong mt nt ln hn
hoc bng cc gi tr lu trong cy con tri v nh hn cc gi tr lu trong cy con phi. Th ch
cn sa i th tc BSTInsert mt cht, khi chn ln lt vo cy n gi tr, cy BST s c n nt (c
th c hai nt cha cng mt gi tr). Khi nu ta duyt cc nt ca cy theo kiu trung th t
(inorder traversal), ta s lit k c cc gi tr lu trong cy theo th t tng dn. Phng php sp
xp ny ngi ta gi l Tree Sort. phc tp tnh ton trung bnh ca Tree Sort l O(nlog2n).
Php tm kim trn cy BST s km hiu qu nu nh cy b suy bin, ngi ta c nhiu cch xoay
x trnh trng hp ny. l php quay cy dng cy nh phn cn i AVL, hay k thut
dng cy nh phn tm kim ti u. Nhng k thut ny ta c th tham kho trong cc ti liu khc
v cu trc d liu v gii thut.
V. PHP BM (HASH)
T tng ca php bm l da vo gi tr cc kho k1, k2, ..., kn, chia cc kho ra thnh cc
nhm. Nhng kho thuc cng mt nhm c mt c im chung v c im ny khng c
trong cc nhm khc. Khi c mt kho tm kim X, trc ht ta xc nh xem nu X thuc vo dy
kho cho th n phi thuc nhm no v tin hnh tm kim trn nhm .

Mt v d l trong cun t in, cc bn sinh vin thng dn vo 26 mnh giy nh vo cc trang


nh du trang no l trang khi u ca mt on cha cc t c cng ch ci u. khi tra t
ch cn tm trong cc trang cha nhng t c cng ch ci u vi t cn tm.
A B

Mt v d khc l trn dy cc kho s t nhin, ta c th chia n l lm m nhm, mi nhm gm


cc kho ng d theo m-un m.
C nhiu cch ci t php bm:
Cch th nht l chia dy kho lm cc on, mi on cha nhng kho thuc cng mt nhm
v ghi nhn li v tr cc on . khi c kho tm kim, c th xc nh c ngay cn phi
tm kho trong on no.
Cch th hai l chia dy kho lm m nhm, Mi nhm l mt danh sch ni n cha cc gi tr
kho v ghi nhn li cht ca mi danh sch ni n. Vi mt kho tm kim, ta xc nh c
phi tm kho trong danh sch ni n no v tin hnh tm kim tun t trn danh sch ni
n . Vi cch lu tr ny, vic b sung cng nh loi b mt gi tr khi tp hp kho d
dng hn rt nhiu phng php trn.
Cch th ba l nu chia dy kho lm m nhm, mi nhm c lu tr di dng cy nh phn
tm kim v ghi nhn li gc ca cc cy nh phn tm kim , phng php ny c th ni l
tt hn hai phng php trn, tuy nhin dy kho phi c quan h th t ton phn th mi lm
c.
VI. KHO S VI BI TON TM KIM
Mi d liu lu tr trong my tnh u c s ho, tc l u c lu tr bng cc n v Bit,
Byte, Word v.v... iu c ngha l mt gi tr kho bt k, ta hon ton c th bit c n c
m ho bng con s nh th no. V mt iu chc chn l hai kho khc nhau s c lu tr bng
hai s khc nhau.
i vi bi ton sp xp, ta khng th a vic sp xp mt dy kho bt k v vic sp xp trn
mt dy kho s l m ca cc kho. Bi quan h th t trn cc con s c th khc vi th t
cn sp ca cc kho.
Nhng i vi bi ton tm kim th khc, vi mt kho tm kim, Cu tr li hoc l "Khng tm
thy" hoc l "C tm thy v ch ..." nn ta hon ton c th thay cc kho bng cc m s ca
n m khng b sai lm, ch lu mt iu l: hai kho khc nhau phi m ho thnh hai s khc
nhau m thi.
Ni nh vy c ngha l vic nghin cu nhng thut ton tm kim trn cc dy kho s rt quan
trng, v di y ta s trnh by mt s phng php .
VII. CY TM KIM S HC (DIGITAL SEARCH TREE - DST)
Xt dy kho k1, k2, ..., kn l cc s t nhin, mi gi tr kho khi i ra h nh phn c z ch s nh
phn (bit), cc bit ny c nh s t 0 (l hng n v) ti z - 1 t phi sang tri.

V d:
11 =
1 0 1 1
Bit
3 2 1 0 (z = 4)
Cy tm kim s hc cha cc gi tr kho ny c th m t nh sau: Trc ht, n l mt cy nh
phn m mi nt cha mt gi tr kho. Nt gc c ti a hai cy con, ngoi gi tr kho cha nt
gc, tt c nhng gi tr kho c bt cao nht l 0 nm trong cy con tri, cn tt c nhng gi tr
kho c bt cao nht l 1 nm cy con phi. i vi hai nt con ca nt gc, vn tng t i
vi bt z - 2 (bt ng th nh t tri sang).
So snh cy tm kim s hc vi cy nh phn tm kim, chng ch khc nhau v cch chia hai cy
con tri/phi. i vi cy nh phn tm kim, vic chia ny c thc hin bng cch so snh vi
kho nm nt gc, cn i vi cy tm kim s hc, nu nt gc c mc l d th vic chia cy con
c thc hin theo bt th d tnh t tri sang (bt z - d) ca mi kho.
Ta nhn thy rng nhng kho bt u bng bt 0 chc chn nh hn nhng kho bt u bng bt 1,
l im tng ng gia cy nh phn tm kim v cy tm kim s hc: Vi mi nt nhnh: Mi
gi tr cha trong cy con tri u nh hn gi tr cha trong cy con phi.
0
5

0
4

1
8

0
7

10

12

1
11

6=0110
5=0101
2=0010
7=0111
8=1000
10=1010
12=1100
11=1011
4=0100

Hnh 18: Cy tm kim s hc

Gi s cu trc mt nt ca cy c m t nh sau:
type
PNode = ^TNode;
TNode = record
Info: TKey;

{Con tr cha lin kt ti mt nt}


{Cu trc nt}
{Trng cha
kho}

Left, Right: PNode;


{con tr ti nt con tri v phi, tr ti nil nu khng c nt con tri (phi)}
end;
Gc ca cy c lu trong con tr Root. Ban u nt Root = nil (cy rng)

Vi kho tm kim X, vic tm kim trn cy tm kim s hc c th m t nh sau: Ban u ng


nt gc, xt ln lt cc bt ca X t tri sang phi (t bt z - 1 ti bt 0), h gp bt bng 0 th r
sang nt con tri, nu gp bt bng 1 th r sang nt con phi. Qu trnh c tip tc nh vy cho ti
khi gp mt trong hai tnh hung sau:
i ti mt nt rng (do r theo mt lin kt nil), qu trnh tm kim tht bi do kho X khng c
trong cy.
i ti mt nt mang gi tr ng bng X, qu trnh tm kim thnh cng
{Hm tm kim trn cy tm kim s hc, n tr v nt cha kho tm kim X nu tm thy, tr v nil nu khng tm thy. z
l di dy bt biu din mt kho}

function DSTSearch(X: TKey): PNode;


var
b: Integer;
p: PNode;
begin
b := z; p := Root;
{Bt u vi nt gc}
while (p nil) and (p^.Info X) do{Cha gp phi mt trong 2 tnh hung trn}
begin

b := b - 1; {Xt bt b ca X}
if <Bt b ca X l 0> then p := p^.Left
else p := p^.Right;
end;
DSTSearch := p;
end;

{Gp 0 r tri}
{Gp 1 r phi}

Thut ton dng cy tm kim s hc t dy kho k1, k2, ..., kn cng c lm gn ging qu trnh
tm kim. Ta chn ln lt cc kho vo cy, trc khi chn, ta tm xem kho c trong cy
hay cha, nu c ri th b qua, nu n cha c th ta thm nt mi cha kho cn chn v ni
nt vo cy tm kim s hc ti mi ni rng va r sang khin qu trnh tm kim tht bi
{Th tc chn kho X vo cy tm kim s
hc} procedure DSTInsert(X:

TKey); var
b: Integer;
p, q: PNode;
begin
b := z;
p := Root;
while (p nil) and (p^.Info X) do
begin
b := b - 1;
{Xt bt b ca X}
q := p;
{Khi p chy xung nt con th q^ lun gi vai tr l nt cha ca p^}
if <Bt b ca X l 0> then p := p^.Left {Gp 0 r tri}
else p := p^.Right;
{Gp 1 r phi}
end;
if p = nil then
{Gi tr X cha c trong cy}
begin
New(p);
{To ra mt nt mi p^}
p^.Info := X;
{Nt mi to ra s cha kho X}
p^.Left := nil; p^.Right := nil; {Nt mi s tr thnh mt l ca cy}
if Root = nil then Root := p
{Cy ang l rng th nt mi thm tr thnh gc}
else
{Khng th mc p^ vo mi ni va r sang t q^}
if <Bt b ca X l 0> then q^.Left := p
else q^.Right := p;
end;
end;

Mun xo b mt gi tr khi cy tm kim s hc, trc ht ta xc nh nt cha gi tr cn xo l


nt D no, sau tm trong nhnh cy gc D ra mt nt l bt k, chuyn gi tr cha trong nt l
sang nt D ri xo nt l.
{Th tc xo kho X khi cy tm kim s
hc} procedure DSTDelete(X:

TKey); var
b: Integer;
p, q, Node: PNode;
begin

{Trc ht, tm kim gi tr X xem n nm nt no}

b := z;
p := Root;
while (p nil) and (p^.Info X) do
begin
b := b - 1;
q := p;
{Mi ln p chuyn sang nt con, ta lun m bo cho q^ l nt cha ca p^}
if <Bt b ca X l 0> then p := p^.Left
else p := p^.Right;
end;
if p = nil then Exit;
{X khng tn ti trong cy th khng xo c}
Node := p;
{Gi li nt cha kho cn xo}
while (p^.Left nil) or (p^.Right nil) do {chng no p^ cha phi l l}
begin

q := p;
{q chy ui theo p, cn p chuyn xung mt trong 2 nhnh con}
if p^.Left nil then p := p^.Left
else p := p^.Right;
end;
Node^.Info := p^.Info; {Chuyn gi tr t nt l p^ sang nt Node^}
if Root = p then Root := nil {Cy ch gm mt nt gc v by gi xo c gc}
else {Ct mi ni t q^ ti p^}
if q^.Left = p then q^.Left := nil
else q^.Right := nil;
Dispose(p);
end;

V mt trung bnh, cc thao tc tm kim, chn, xo trn cy tm kim s hc u c phc tp l


O(log2n) cn trong trng hp xu nht, phc tp ca cc thao tc l O(z), bi cy tm kim
s hc c chiu cao khng qu z + 1.
VIII. CY TM KIM C S (RADIX SEARCH TREE - RST)
Trong cy tm kim s hc, cng nh cy nh phn tm kim, php tm kim ti mi bc phi so
snh gi tr kho X vi gi tr lu trong mt nt ca cy. Trong trng hp cc kho c cu trc
ln, vic so snh ny c th mt nhiu thi gian.
Cy tm kim c s l mt phng php khc phc nhc im , ni dung ca n c th tm tt
nh sau:
Trong cy tm kim c s l mt cy nh phn, ch c nt l cha gi tr kho, cn gi tr cha trong
cc nt nhnh l v ngha. Cc nt l ca cy tm kim c s u nm mc z + 1.
i vi nt gc ca cy tm kim c s, n c ti a hai nhnh con, mi kho cha trong nt l ca
nhnh con tri u c bt cao nht l 0, mi kho cha trong nt l ca nhnh con phi u c bt
cao nht l 1.
i vi hai nhnh con ca nt gc, vn tng t vi bt th z - 2, v d vi nhnh con tri ca
nt gc, n li c ti a hai nhnh con, mi kho cha trong nt l ca nhnh con tri u c bt th
z - 2 l 0 (chng bt u bng hai bt 00), mi kho cha trong nt l ca nhnh con phi u c bt
th z - 2 l 1 (chng bt u bng hai bt 01)...
Tng qut vi nt mc d, n c ti a hai nhnh con, mi nt l ca nhnh con tri cha kho c
bt z - d l 0, mi nt l ca nhnh con phi cha kho c bt th z - d l 1.
0

5 = 0101

0
4

2 = 0010

7 = 0111
8 = 1000

10 = 1010
12 = 1100

0
7

0
10

1
11

11 = 1011

12

4 = 0100

Hnh 19: Cy tm kim c s

Khc vi cy nh phn tm kim hay cy tm kim s hc. Cy tm kim c s c khi to gm


c mt nt gc, v nt gc tn ti trong sut qu trnh s dng: n khng bao gi b xo i c.
tm kim mt gi tr X trong cy tm kim c s, ban u ta ng nt gc v duyt dy bt ca
X t tri qua phi (t bt z - 1 n bt 0), gp bt bng 0 th r sang nt con tri cn gp bt bng 1
th r sang nt con phi, c tip tc nh vy cho ti khi mt trong hai tnh hung sau xy ra:

Hoc i ti mt nt rng (do r theo lin kt nil) qu trnh tm kim tht bi do X khng c
trong RST
Hoc duyt ht dy bt ca X v ang ng mt nt l, qu trnh tm kim thnh cng v
chc chn nt l cha gi tr ng bng X.
{Hm tm kim trn cy tm kim c s, n tr v nt l cha kho tm kim X nu tm thy, tr v nil nu khng tm thy. z
l di dy bt biu din mt kho}

function RSTSearch(X: TKey): PNode;


var
b: Integer;
p: PNode;
begin
b := z; p := Root;
{Bt u vi nt gc, i vi RST th gc lun c sn}
repeat
b := b - 1; {Xt bt b ca X}
if <Bt b ca X l 0> then p := p^.Left
{Gp 0 r tri}
else p := p^.Right;
{Gp 1 r
phi} until (p = nil) or (b = 0);
RSTSearch := p;
end;

Thao tc chn mt gi tr X vo RST c thc hin nh sau: u tin, ta ng gc v duyt dy


bt ca X t tri qua phi (t bt z - 1 v bt 0), c gp 0 th r tri, gp 1 th r phi. Nu qu trnh
r theo mt lin kt nil (i ti nt rng) th lp tc to ra mt nt mi, v ni vo theo lin kt
c ng i tip. Sau khi duyt ht dy bt ca X, ta s dng li mt nt l ca RST, v cng vic
cui cng l t gi tr X vo nt l .
V d:
2=010
0

2=010

5=101

5=101

4=100
0

0
2

4=100

0
4

0
5

0
4

7=111

1
5

Hnh 20: Vi di dy bt z = 3, cy tm kim c s gm cc kho 2, 4, 5 v sau khi thm gi tr 7


{Th tc chn kho X vo cy tm kim c
s} procedure RSTInsert(X:

TKey); var
b: Integer;
p, q: PNode;
begin
b := z; p := Root;
{Bt u t nt gc, i vi RST th gc lun nil}
repeat
b := b - 1;
{Xt bt b ca X}
q := p;
{Khi p chy xung nt con th q^ lun gi vai tr l nt cha ca p^}
if <Bt b ca X l 0> then p := p^.Left {Gp 0 r tri}
else p := p^.Right;
{Gp 1 r
phi} if p = nil then
{Khng i c th t thm nt i
tip}

begin
New(p);
{To ra mt nt mi v em p tr ti nt }
p^.Left := nil; p^.Right := nil;
if <Bt b ca X l 0> then q^.Left := p
{Ni p^ vo bn tri q^}
else q^.Right := p;
{Ni p^ vo bn phi q^}
end;

until b = 0;
p^.Info := X;
end;

{p^ l nt l t X vo}

Vi cy tm kim c s, vic xo mt gi tr kho khng phi ch l xo ring mt nt l m cn


phi xo ton b nhnh c o i ti nt trnh lng ph b nh.
2=010

2=010
0

5=101

5=101

4=100

4=100

0
2

0
4

7=111

1
5

0
7

0
4

1
5

Hnh 21: RST cha cc kho 2, 4, 5, 7 v RST sau khi loi b gi tr 7

Ta lp li qu trnh tm kim gi tr kho X, qu trnh ny s i t gc xung l, ti mi bc i,


mi khi gp mt nt ng ba (nt c c con tri v con phi - nt cp hai), ta ghi nhn li ng ba
v hng r. Kt thc qu trnh tm kim ta gi li c ng ba i qua cui cng, t nt ti nt l
cha X l con ng c o (khng c ch r), ta tin hnh d b tt c cc nt trn on ng
c o khi cy tm kim c s. khng b gp li khi cy suy bin (khng c nt cp 2) ta coi
gc cng l nt ng ba
{Th tc xo kho X khi cy tm kim c
s} procedure RSTDelete(X:

TKey); var
b: Integer;
p, q, TurnNode, Child: PNode;
begin
{Trc ht, tm kim gi tr X xem n nm nt no}

b := z; p := Root;
repeat
b := b - 1;
q := p;
{Mi ln p chuyn sang nt con, ta lun m bo cho q^ l nt cha ca p^}
if <Bt b ca X l 0> then p := p^.Left
else p := p^.Right;
if (b = z - 1) or (q^.Left nil) and (q^.Right nil) then
{q^ l nt ng ba}
begin
TurnNode := q; Child := p;
{Ghi nhn li q^ v hng r}
end;
until (p = nil) or (b = 0);
if p = nil then Exit;
{X khng tn ti trong cy th khng xo c}
{Trc ht, ct nhnh c o ra khi cy}

if TurnNode^.Left = Child then TurnNode^.Left := nil


else TurnNode^.Right := nil
p := Child;
{Chuyn sang on ng c o, bt u xo}
repeat
q := p;
{Lu rng p^ ch c ti a mt nhnh con m thi, cho p tr sang nhnh con duy nht nu c}

if p^.Left nil then p := p^.Left


else p := p^.Right;
Dispose(q);
{Gii phng b nh cho nt q^}
until p = nil;
end;

Ta c mt nhn xt l: Hnh dng ca cy tm kim c s khng ph thuc vo th t chn cc kho


vo m ch ph thuc vo gi tr ca cc kho cha trong cy.

i vi cy tm kim c s, phc tp tnh ton cho cc thao tc tm kim, chn, xo trong trng
hp xu nht cng nh trung bnh u l O(z). Do khng phi so snh gi tr kho dc ng i, n
nhanh hn cy tm kim s hc nu nh gp cc kho cu trc ln. Tc nh vy c th ni l tt,
nhng vn b nh khin ta phi xem xt: Gi tr cha trong cc nt nhnh ca cy tm kim c
s l v ngha dn ti s lng ph b nh.
Mt gii php cho vn ny l: Duy tr hai dng nt trn cy tm kim c s: Dng nt nhnh ch
cha cc lin kt tri, phi v dng nt l ch cha gi tr kho. Ci t cy ny trn mt s ngn
ng nh kiu qu mnh i khi rt kh.
Gii php th hai l c t mt cy tng t nh RST, nhng sa i mt cht: nu c nt l cha
gi tr X c ni vi cy bng mt nhnh c o th ct b nhnh c o , v thay vo ch
nhnh ny ch mt nt cha gi tr X. Nh vy cc gi tr kho vn ch cha trong cc nt l nhng
cc nt l gi y khng ch nm trn mc z + 1 m cn nm trn nhng mc khc na. Phng
php ny khng nhng tit kim b nh hn m cn lm cho qu trnh tm kim nhanh hn. Gi
phi tr cho phng php ny l thao tc chn, xo kh phc tp. Tn ca cu trc d liu ny l
Trie (Trie ch khng phi Tree) tm kim c s.
0

5 = 0101

7 = 0111
8 = 1000

1
0

10 = 1010
12 = 1100

2 = 0010

0
7

10

11

11 = 1011

12

4 = 0100

a)
1

5=0101
2=0010

12

2
1

0
7

0
4

8=1000

10=1010

12=1100
0

7=0111

10

11=1011
11

4=0100

b)
Hnh 22: Cy tm kim c s a) v Trie tm kim c s b)

Tng t nh phng php sp xp bng c s, php tm kim bng c s khng nht thit phi
chn h c s 2. Ta c th chn h c s ln hn c tc nhanh hn (km theo s tn km b
nh), ch lu l cy tm kim s hc cng nh cy tm kim c s trong trng hp ny khng
cn l cy nh phn m l cy R_phn vi R l h c s c chn.
Trong cc phng php tm kim bng c s, thc ra cn mt phng php tinh tu v thng minh
nht, n c cu trc gn ging nh cy nhng khng c nt d tha, v qu trnh duyt bt ca kho
tm kim khng phi t tri qua phi m theo th t ca cc bt kim sot lu ti mi nt i qua.
Phng php c tn gi l Practical Algorithm To Retrieve Information Coded In Alphanumeric

(PATRICIA) do Morrison xut. Tuy nhin, vic ci t phng php ny kh phc tp (c bit
l thao tc xo gi tr kho), ta c th tham kho ni dung ca n trong cc ti liu khc.
IX. NHNG NHN XT CUI CNG
Tm kim thng l cng vic nhanh hn sp xp, nhng khng phi v th m coi thng hiu qu
ca nhng thao tc tm kim. Nu mi bc tm kim li c km theo mt thao tc mt nhiu thi
gian th qu trnh tm kim rt ngn c bc no hay bc y.
Trn y, ta trnh by php tm kim trong mt tp hp tm ra bn ghi mang kho ng bng
kho tm kim. Tuy nhin, ngi ta c th yu cu tm bn ghi mang kho ln hn hay nh hn
kho tm kim, tm bn ghi mang kho nh nht m ln hn kho tm kim, tm bn ghi mang kho
ln nht m nh hn kho tm kim v.v... ci t nhng thut ton nu trn cho nhng trng
hp ny cn c mt s mm do nht nh.
Cng tng t nh sp xp, ta khng nn nh gi gii thut tm kim ny tt hn gii thut tm
kim khc. S dng thut ton tm kim ph hp vi tng yu cu c th l k nng ca ngi lp
trnh, vic ci t cy nh phn tm kim hay cy tm kim c s ch tm kim trn vi chc bn
ghi ch khng nh c mt iu r rng: khng bit th no l gii thut v lp trnh.
Bi tp
1. Khng c cch g hiu nhanh mt thut ton v cu trc d liu bng cch ci t chng, tng
t nh bi ton sp xp, hy th vit mt chng trnh SearchDemo tng t nh vy
2. Vit thm vo chng trnh SortDemo bi trc th tc TreeSort v nh gi tc thc ca
n.
3. Tm hiu cc phng php tm kim ngoi, cu trc ca cc B_cy
4. Tm hiu cc phng php tm kim chui, thut ton BRUTE-FORCE, thut ton KNUTHMORRIS-PRATT, thut ton BOYER-MOORE v thut ton RABIN-KARP

Tuy gi l chuyn v "Cu trc d liu v gii thut" nhng thc ra, ta mi ch tm hiu qua v
hai dng cu trc d liu hay gp l danh sch v cy, cng vi mt s thut ton m "u cng
phi c" l tm kim v sp xp. Khng mt ti liu no c th cp ti mi cu trc d liu v
gii thut bi chng qu phong ph v lin tc c b sung. Nhng cu trc d liu v gii thut
khng "ph thng" lm nh l thuyt th, hnh hc, v.v... s c tch ra v s c ni k hn
trong mt chuyn khc.
Vic i su nghin cu nhng cu trc d liu v gii thut, d ch l mt phn nh hp cng ny
sinh rt nhiu vn hay v kh, nh cc vn l thuyt v phc tp tnh ton, vn NP_y
v.v... l cng vic ca nhng nh khoa hc my tnh. Nhng trc khi tr thnh mt nh
khoa hc my tnh th iu kin cn l phi bit lp trnh. Vy nn khi tm hiu bt c cu trc d
liu hay gii thut no, nht thit ta phi c gng ci t bng c. Mi tng hay s ch l b i
nu nh khng bin thnh hiu qu, thc t l nh vy.

Quy hoch ng

\ 1[

MC LC
1. CNG THC TRUY HI.................................................................................................................
2
I. V D...............................................................................................................................................................2
II. CI TIN TH
NHT..................................................................................................................................3
III. CI TIN TH HAI.....................................................................................................................................4
2. PHNG PHP QUY HOCH NG
.......................................................................................... 6
I. BI TON QUY HOCH..............................................................................................................................6
II. PHNG PHP QUY HOCH
NG.......................................................................................................6
3. MT S BI TON QUY HOCH NG
..................................................................................... 9
I. DY CON N IU TNG DI NHT...................................................................................................9
II. BI TON CI TI ....................................................................................................................................11
III. BIN I XU..........................................................................................................................................13
IV. DY CON C TNG CHIA HT CHO
K...............................................................................................16
V. PHP NHN T HP DY MA TRN
...................................................................................................17
VI. BI TP LUYN TP ..............................................................................................................................20

Quy hoch ng

\ 2[

1. CNG THC TRUY HI


I. V D
Cho s t nhin n 100. Hy cho bit c bao nhiu cch phn tch s n thnh tng ca dy cc
s nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l mt cch.
V d: n = 5 c 7 cch phn tch:
1.
2.
3.
4.
5.
6.
7.

5
5
5
5
5
5
5

=
=
=
=
=
=
=

1
1
1
1
1
2
5

+
+
+
+
+
+

1
1
1
2
4
3

+
+
+
+

1 + 1 + 1
1 + 2
3
2

(Lu : n = 0 vn coi l c 1 cch phn tch thnh tng cc s nguyn dng (0 l tng ca dy
rng))
gii bi ton ny, trong chuyn mc trc ta dng phng php lit k tt c cc cch phn
tch v m s cu hnh. By gi ta th ngh xem, c cch no tnh ngay ra s lng cc cch
phn tch m khng cn phi lit k hay khng ?. Bi v khi s cch phn tch tng i ln,
phng php lit k t ra kh chm. (n = 100 c 190569292 cch phn tch).
Nhn xt:
Nu gi F[m, v] l s cch phn tch s v thnh tng cc s nguyn dng m. Khi :
Cc cch phn tch s v thnh tng cc s nguyn dng m c th chia lm hai loi:
Loi 1: Khng cha s m trong php phn tch, khi s cch phn tch loi ny chnh l s
cch phn tch s v thnh tng cc s nguyn dng < m, tc l s cch phn tch s v thnh
tng cc s nguyn dng m - 1 v bng F[m - 1, v].
Loi 2: C cha t nht mt s m trong php phn tch. Khi nu trong cc cch phn tch loi
ny ta b i s m th ta s c cc cch phn tch s v - m thnh tng cc s nguyn dng
m (Lu : iu ny ch ng khi khng tnh lp li cc hon v ca mt cch). C ngha l v
mt s lng, s cc cch phn tch loi ny bng F[m, v - m]
Trong trng hp m > v th r rng ch c cc cch phn tch loi 1, cn trong trng hp m v th
s c c cc cch phn tch loi 1 v loi 2. V th:
F[m, v] = F[m - 1, v] nu m > v
F[m, v] = F[m - 1, v] + F[m, v - m] nu m v
Ta c cng thc xy dng F[m, v] t F[m - 1, v] v F[m, v - m]. Cng thc ny c tn gi l cng
thc truy hi a vic tnh F[m, v] v vic tnh cc F[m', v'] vi d liu nh hn. Tt nhin cui
cng ta s quan tm n F[n, n]: S cc cch phn tch n thnh tng cc s nguyn dng n.
V d vi n = 5, bng F s l:
F
0
1
2
3
4
5

0
1
1
1
1
1
1

1
0
1
1
1
1
1

2
0
1
2
2
2
2

3
0
1
2
3
3
3

4
0
1
3
4
5
5

5
0
1
3
5
6
7

Nhn vo bng F, ta thy rng F[m, v] c tnh bng tng ca:


Mt phn t hng trn: F[m - 1, v] v mt phn t cng hng, bn tri: F[m, v - m].

Quy hoch ng

\ 3[

V d F[5, 5] s c tnh bng F[4, 5] + F[5, 0], hay F[3, 5] s c tnh bng F[2, 5] + F[3, 2].
Chnh v vy tnh F[m, v] th F[m - 1, v] v F[m, v - m] phi c tnh trc. Suy ra th t hp
l tnh cc phn t trong bng F s phi l theo th t t trn xung v trn mi hng th tnh
theo th t t tri qua phi.
iu c ngha l ban u ta phi tnh hng 0 ca bng: F[0, v] = s dy c cc phn t 0 m
tng bng v, theo quy c bi th F[0, 0] = 1 cn F[0, v] vi mi v > 0 u l 0.
Vy gii thut dng rt n gin: Khi to dng 0 ca bng F: F[0, 0] = 1 cn F[0, v] vi mi v > 0
u bng 0, sau dng cng thc truy hi tnh ra tt c cc phn t ca bng F. Cui cng F[n, n]
l s cch phn tch cn tm
PROG01_1.PAS * m s cch phn tch s n
program Analyse1; {Bi ton phn tch s}
const
max = 100;
var
F: array[0..max, 0..max] of LongInt;
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(F[0], SizeOf(F[0]), 0);
{Khi to dng 0 ca bng F ton s 0}
F[0, 0] := 1;
{Duy ch c F[0, 0] = 1}
for m := 1 to n do
{Dng cng thc tnh cc dng theo th t t trn xung di}
for v := 0 to n do
{Cc phn t trn mt dng th tnh theo th t t tri qua phi}
if v < m then F[m, v] := F[m - 1, v]
else F[m, v] := F[m - 1, v] + F[m, v - m];
WriteLn(F[n, n], ' Analyses'); {Cui cng F[n, n] l s cch phn
tch}

end.

II. CI TIN TH NHT


Cch lm trn c th tm tt li nh sau: Khi to dng 0 ca bng, sau dng dng 0 tnh dng
1, dng dng 1 tnh dng 2 v.v... ti khi tnh c ht dng n. C th nhn thy rng khi tnh
xong dng th k th vic lu tr cc dng t dng 0 ti dng k - 1 l khng cn thit bi v vic tnh
dng k + 1 ch ph thuc cc gi tr lu tr trn dng k. Vy ta c th dng hai mng mt chiu:
Mng Current lu dng hin thi ang xt ca bng v mng Next lu dng k tip, u tin mng
Current c gn cc gi tr tng ng trn dng 0. Sau dng mng Current tnh mng Next,
mng Next sau khi tnh s mang cc gi tr tng ng trn dng 1. Ri li gn mng Current :=
Next v tip tc dng mng Current tnh mng Next, mng Next s gm cc gi tr tng ng trn
dng 2 v.v... Vy ta c ci t ci tin sau:
PROG01_2.PAS * m s cch phn tch s n
program Analyse2;
const
max = 100;
var
Current, Next: array[0..max] of LongInt;
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(Current, SizeOf(Current), 0);
Current[0] := 1;
{Khi to mng Current tng ng vi dng 0 ca bng F}
for m := 1 to n do
begin {Dng dng hin thi Current tnh dng k tip Next Dng dng m - 1 tnh dng m ca bng F}
for v := 0 to n do
if v < m then Next[v] := Current[v]
else Next[v] := Current[v] + Next[v - m];
Current := Next; {Gn Current := Next tc l Current by gi li lu cc phn t trn dng m ca bng F}

Quy hoch ng

\ 4[

end;
WriteLn(Current[n], ' Analyses');
end.

Cch lm trn tit kim c kh nhiu khng gian lu tr, nhng n hi chm hn phng
php u tin v php gn mng (Current := Next). C th ci tin thm cch lm ny nh sau:
PROG01_3.PAS * m s cch phn tch s n
program Analyse3;
const
max = 100;
var
B: array[1..2, 0..max] of LongInt;{Bng B ch gm 2 dng thay cho 2 dng lin tip ca bng phng
n}

n, m, v, x, y: Integer;
begin
Write('n = '); ReadLn(n);
{Trc ht, dng 1 ca bng B tng ng vi dng 0 ca bng phng n F, c in c s quy hoch ng}

FillChar(B[1], SizeOf(B[1]), 0);


B[1][0] := 1;
x := 1;
{Dng B[x] ng vai tr l dng hin thi trong bng
phng n} y := 2;
{Dng B[y] ng vai tr l dng k tip trong
bng phng n} for m := 1 to n do
begin
{Dng dng x tnh dng y Dng dng hin thi trong bng phng n tnh dng k tip}

for v := 0 to n do
if v < m then B[y][v] := B[x][v]
else B[y][v] := B[x][v] + B[y][v - m];
x := 3 - x; y := 3 - y; {o gi tr x v y, tnh xoay li}
end;
WriteLn(B[x][n], ' Analyses');
end.

III. CI TIN TH HAI


Ta vn cn cch tt hn na, ti mi bc, ta ch cn lu li mt dng ca bng F bng mt mng 1
chiu, sau dng mng tnh li chnh n sau khi tnh, mng mt chiu s lu cc gi tr ca
bng F trn dng k tip.
PROG01_4.PAS * m s cch phn tch s n
program Analyse4;
const
max = 100;
var
L: array[0..max] of LongInt; {Ch cn lu 1 dng}
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(L, SizeOf(L), 0);
L[0] := 1;
{Khi to mng 1 chiu L lu dng 0 ca bng}
for m := 1 to n do
{Dng L tnh li chnh n}
for v := m to n do
L[v] := L[v] + L[v - m];
WriteLn(L[n], ' Analyses');
end.

Bi tp:
1. Kt hp vi chng trnh phn tch s dng thut ton quay lui, kim tra tnh ng n ca cng
thc truy hi trn vi n 30.
2. Hy cho bit c bao nhiu cch phn tch s nguyn dng n 1000 thnh tng ca nhng s
nguyn dng khc nhau i mt, cc cch phn tch l hon v ca nhau ch tnh l mt cch.
3. Cng thc truy hi trn c th tnh bng hm quy nh trong chng trnh sau:

Quy hoch ng

\ 5[

program Analyse5;
var
n: Integer;
function
begin
if m =
if v
else
else
if m
else
end;

F(m, v: Integer): LongInt;


0 then
= 0 then F := 1
F := 0
> v then F := F(m - 1, v)
F := F(m - 1, v) + F(m, v - m);

begin
Write('n = '); ReadLn(n);
WriteLn(F(n, n), ' Analyses');
end.

Hy th vi nhng gi tr n 50 v gii thch ti sao phng php ny tuy c nhanh hn phng


php duyt m nhng cng khng th no hiu qu bng ba cch ci t trc. Nu gii thch c
th nhng iu ni sau y tr nn ht sc n gin.

Quy hoch ng

\ 6[

2. PHNG PHP QUY HOCH NG


I. BI TON QUY HOCH
Bi ton quy hoch l bi ton ti u: gm c mt hm f gi l hm mc tiu hay hm nh gi;
cc hm g1, g2, ..., gn cho gi tr logic gi l hm rng buc. Yu cu ca bi ton l tm mt cu
hnh x tho mn tt c cc rng buc g1, g2, ...gn: gi(x) = TRUE (i: 1 i n) v x l tt nht, theo
ngha khng tn ti mt cu hnh y no khc tho mn cc hm rng buc m f(y) tt hn f(x).
V d:
Tm (x, y)
Hm mc tiu : x + y max
2
2
Hm rng buc : x + y 1.
2
2
Xt trong mt phng to , nhng cp (x, y) tho mn x + y 1 l ta ca nhng im nm
trong hnh trn c tm O l gc to , bn knh 1. Vy nghim ca bi ton bt buc nm trong
hnh trn .
Nhng ng thng c phng trnh: x + y = C (C l mt hng s) l ng thng vung gc vi
ng phn gic gc phn t th nht. Ta phi tm s C ln nht m ng thng x + y = C vn c
im chng vi ng trn (O, 1). ng thng l mt tip tuyn ca ng trn: x + y = 2 .
Tip im (

1
2

1
2

) tng ng vi nghim ti u ca bi ton cho.


y
1

x=y=

1
2

x+y=

Cc dng bi ton quy hoch rt phong ph v a dng, ng dng nhiu trong thc t, nhng cng
cn bit rng, a s cc bi ton quy hoch l khng gii c, hoc cha gii c. Cho n nay,
ngi ta mi ch c thut ton n hnh gii bi ton quy hoch tuyn tnh li, v mt vi thut ton
khc p dng cho cc lp bi ton c th.
II. PHNG PHP QUY HOCH NG
Phng php quy hoch ng dng gii bi ton ti u c bn cht quy, tc l vic tm
phng n ti u cho bi ton c th a v tm phng n ti u ca mt s hu hn cc bi
ton con. i vi nhiu thut ton quy chng ta tm hiu, nguyn l chia tr (divide and
conquer) thng ng vai tr ch o trong vic thit k thut ton. gii quyt mt bi ton ln,
ta chia n lm nhiu bi ton con cng dng vi n c th gii quyt c lp. Trong phng php
quy hoch ng, nguyn l ny cng c th hin r: Khi khng bit cn phi gii quyt nhng bi
ton con no, ta s i gii quyt tt c cc bi ton con v lu tr nhng li gii hay p s ca
chng vi mc ch s dng li theo mt s phi hp no gii quyt nhng bi ton tng
qut hn. chnh l im khc nhau gia Quy hoch ng v php phn gii quy v cng l
ni dung phng php quy hoch ng:

Php phn gii quy bt u t bi ton ln phn r thnh nhiu bi ton con v i gii tng
bi ton con . Vic gii tng bi ton con li a v php phn r tip thnh nhiu bi ton
nh hn v li i gii tip bi ton nh hn bt k n c gii hay cha.
Quy hoch ng bt u t vic gii tt c cc bi ton nh nht ( bi ton c s) t
tng bc gii quyt nhng bi ton ln hn, cho ti khi gii c bi ton ln nht (bi ton
ban u).
Ta xt mt v d n gin:
V d: Dy Fibonacci l dy s nguyn dng c nh ngha nh sau:
F1 = F2 = 1;
i: 3 i: Fi = Fi-1 + Fi-2
Hy tnh F6
Xt hai cch ci t chng trnh:
Cch 1
program Fibo1;

Cch 2
program Fibo2;
var
F: array[1..6] of Integer;
i: Integer;

function F(i: Integer): Integer;


begin
if i < 3 then F := 1
else F := F(i - 1) + F(i - 2);
end;

begin
F[1] := 1; F[2] := 1;
for i := 3 to 6 do
F[i] := F[i - 1] + F[i - 2];
WriteLn(F[6]);
end.

begin
WriteLn(F(6));
end.

Trong cch 1, ta vit mt hm quy F(i) tnh s Fibonacci th i. Chng trnh chnh gi F(6),
n s gi tip F(5) v F(4) tnh ... Qu trnh tnh ton c th v nh cy di y. Ta nhn thy
tnh F(6) n phi tnh 1 ln F(5), hai ln F(4), ba ln F(3), nm ln F(2), ba ln F(1).
F(6)

F(5)

F(4)

F(4)

F(3)

F(2)

F(3)

F(3)

F(2)

F(2)

F(1)

F(2)

F(2)

F(1)

F(1)

Cch 2 th khng nh vy. Trc ht n tnh sn F[1] v F[2], t tnh tip F[3], li tnh tip c
F[4], F[5], F[6]. m bo rng mi gi tr Fibonacci ch phi tnh 1 ln.
(Cch 2 cn c th ci tin thm na, ch cn dng 3 gi tr tnh li ln nhau)
Trc khi p dng phng php quy hoch ng ta phi xt xem phng php c tho mn
nhng yu cu di y hay khng:
Bi ton ln phi phn r c thnh nhiu bi ton con, m s phi hp li gii ca cc bi
ton con cho ta li gii ca bi ton ln.
V quy hoch ng l i gii tt c cc bi ton con, nn nu khng khng gian vt l lu tr
li gii (b nh, a...) phi hp chng th phng php quy hoch ng cng khng th thc
hin c.

Qu trnh t bi ton c s tm ra li gii bi ton ban u phi qua hu hn bc.


Cc khi nim:
Bi ton gii theo phng php quy hoch ng gi l bi ton quy hoch ng
Cng thc phi hp nghim ca cc bi ton con c nghim ca bi ton ln gi l cng
thc truy hi ca quy hoch ng
Tp cc bi ton nh nht c ngay li gii t gii quyt cc bi ton ln hn gi l c s
quy hoch ng
Khng gian lu tr li gii cc bi ton con tm cch phi hp chng gi l bng phng n
ca quy hoch ng
Cc bc ci t mt chng trnh s dng quy hoch ng: (nh k)
Gii tt c cc bi ton c s (thng thng rt d), lu cc li gii vo bng phng n.
Dng cng thc truy hi phi hp nhng li gii ca nhng bi ton nh lu trong bng
phng n tm li gii ca nhng bi ton ln hn v lu chng vo bng phng n. Cho
ti khi bi ton ban u tm c li gii.
Da vo bng phng n, truy vt tm ra nghim ti u.
Cho n nay, vn cha c mt nh l no cho bit mt cch chnh xc nhng bi ton no c th
gii quyt hiu qu bng quy hoch ng. Tuy nhin bit c bi ton c th gii bng quy
hoch ng hay khng, ta c th t t cu hi: "Mt nghim ti u ca bi ton ln c phi l
s phi hp cc nghim ti u ca cc bi ton con hay khng ?" v Liu c th no lu tr
c nghim cc bi ton con di mt hnh thc no phi hp tm c nghim bi
ton ln"
Cui cng, trc khi kho st mt s bi ton quy hoch ng, ta nhc li: Phng php tt nht
gii quyt mi bi ton trong tin hc l bit s dng v phi hp uyn chuyn nhiu thut ton,
khng c lm dng hay coi thng bt c mt phng php no.

3. MT S BI TON QUY HOCH NG


I. DY CON N IU TNG DI NHT
Cho dy s nguyn A = a1, a2, ..., an. (n 10000, -10000 ai 10000). Mt dy con ca A l mt
n
cch chn ra trong A mt s phn t gi nguyn th t. Nh vy A c 2 dy con.
Yu cu: Tm dy con n iu tng ca A c di ln nht.
V d: A = (1, 2, 3, 4, 9, 10, 5, 6, 7, 8). Dy con n iu tng di nht l: (1, 2, 3, 4, 5, 6, 7, 8).
D liu (Input) vo t file vn bn INCSEQ.INP
Dng 1: Cha s n
Dng 2: Cha n s a1, a2, ..., an cch nhau t nht mt du cch
Kt qu (Output) ghi ra file vn bn INCSEQ.OUT
Dng 1: Ghi di dy con tm c
Cc dng tip: ghi dy con tm c v ch s nhng phn t c chn vo dy con .
INCSEQ.INP
11
1 2 3 8 9 4 5 6 20 9 10

INCSEQ.OUT
8
a[1] = 1
a[2] = 2
a[3] = 3
a[6] = 4
a[7] = 5
a[8] = 6
a[10] = 9
a[11] = 10

Cch gii:
B sung vo A hai phn t: a0 = - v an+1 = +. Khi dy con n iu tng di nht chc
chn s bt u t a0 v kt thc an+1.
Vi i: 0 i n + 1. Ta s tnh L[i] = di dy con n iu tng di nht bt u ti ai.
1. C s quy hoch ng (bi ton nh nht):
L[n + 1] = di dy con n iu tng di nht bt u ti an+1 = +. Dy con ny ch gm mi
mt phn t (+) nn L[n + 1] = 1.
2. Cng thc truy hi:
Gi s vi i t n n 0, ta cn tnh L[i]: di dy con tng di nht bt u ti ai. L[i] c tnh
trong iu kin L[i + 1], L[i + 2], ..., L[n + 1] bit:
Dy con n iu tng di nht bt u t ai s c thnh lp bng cch ly ai ghp vo u mt
trong s nhng dy con n iu tng di nht bt u ti v tr aj ng sau ai. Ta s chn dy no
ghp ai vo u? Tt nhin l ch c ghp ai vo u nhng dy con bt u ti aj no ln
hn ai ( m bo tnh tng) v d nhin ta s chn dy di nht ghp ai vo u ( m bo
tnh di nht). Vy L[i] c tnh nh sau: Xt tt c cc ch s j trong khong t i + 1 n n + 1
m aj > ai, chn ra ch s jmax c L[jmax] ln nht. t L[i] := L[jmax] + 1.
3. Truy vt
Ti bc xy dng dy L, mi khi tnh L[i] := L[jmax] + 1, ta t T[i] = jmax. lu li rng: Dy
con di nht bt u ti ai s c phn t th hai k tip l ajmax.
Sau khi tnh xong hay dy L v T, ta bt u t 0. T[0] l phn t u tin c chn,

T[T[0]] l phn t th hai c chn,


T[T[T[0]]] l phn t th ba c chn ...Qu trnh truy vt c th din t nh sau:
i := T[0];
while i <> n + 1 do {Chng no cha duyt n s an+1=+ cui}
begin
<Thng bo chn ai>
i := T[i];
end;

V d: vi A = (5, 2, 3, 4, 9, 10, 5, 6, 7, 8). Hai dy L v T sau khi tnh s l:


i

10

11

ai

-
9

10

+
1

11

10

11

L[i]
T[i]

Tracing

PROG03_1.PAS * Tm dy con n iu tng di nht


program LongestSubSequence;
const
max = 10000;
var
a, L, T: array[0..max + 1] of Integer;
n: Word;
procedure Enter;
{Nhp d liu t thit b nhp chun theo ng khun dng Input}
var
i: Word;
begin
ReadLn(n);
for i := 1 to n do Read(a[i]);
end;
procedure Optimize; {Quy hoch ng}
var
i, j, jmax: Word;
begin
a[0] := -32768; a[n + 1] := 32767; {Thm hai phn t canh hai u dy a}
L[n + 1] := 1;
{in c s quy hoach ng vo bng phng n}
for i := n downto 0 do
{Tnh bng phng n}
begin
{Chn trong cc ch s j ng sau i tho mn aj > ai ra ch s jmax c L[jmax] ln nht}

jmax := n + 1;
for j := i + 1 to n + 1 do
if (a[j] > a[i]) and (L[j] > L[jmax]) then jmax := j;
L[i] := L[jmax] + 1; {Lu di dy con tng di nht bt u ti ai}
T[i] := jmax;
{Lu vt: phn t ng lin sau ai trong dy con tng di nht l ajmax}
end;
WriteLn(L[0] - 2); {Chiu di dy con tng di nht}
i := T[0];
{Bt u truy vt tm nghim}
while i <> n + 1 do
begin
WriteLn('a[', i, '] = ', a[i]);
i := T[i];
end;
end;
begin
{nh ngha li thit b nhp/xut chun}

Assign(Input, 'INCSEQ.INP'); Reset(Input);


Assign(Output, 'INCSEQ.OUT'); Rewrite(Output);
Enter;
Optimize;
Close(Input); Close(Output);
end.

Nhn xt:
1. Ta c th lm cch khc: Gi L[i] l di dy con di nht kt thc ti a[i], T[i] l ch s ng
lin trc ai trong dy con di nht . Cch ny khi truy vt s cho th t cc ch s c chn
gim dn.
2. Dng mng T lu vt c chng trnh ngn gn ch thc ra khng cn c n vn c th d
li c nghim, ch cn dng mng L m thi.
Bi tp
1. Trong cch gii trn, u l bng phng n:
a) Mng L? b) mng T?
c) c mng L v mng T?
2. Vn gi nguyn gi thit v kch c d liu nh trn hy lp chng trnh tr li cu hi:
a) C bao nhiu dy con n iu tng di nht ?
b) Cho bit tt c nhng dy con n iu tng di nht
II. BI TON CI TI
Trong siu th c n gi hng (n 100), gi hng th i c trng lng l Wi 100 v tr gi Vi 100.
Mt tn trm t nhp vo siu th, tn trm mang theo mt ci ti c th mang c ti a trng
lng M ( M 100). Hi tn trm s ly i nhng gi hng no c tng gi tr ln nht.
Input: file vn bn BAG.INP
Dng 1: Cha hai s n, M cch nhau t nht mt du cch
n dng tip theo, dng th i cha hai s nguyn dng Wi, Vi cch nhau t nht mt du cch
Output: file vn bn BAG.OUT
Dng 1: Ghi gi tr ln nht tn trm c th ly
Dng 2: Ghi ch s nhng gi b ly
BAG.INP
5 11
3 3
4 4
5 4
9 10
4 4

BAG.OUT
11
5 2 1

Cch gii:
Nu gi F[i, j] l gi tr ln nht c th c bng cch chn trong cc gi {1, 2, ..., i} vi gii hn
trng lng j. Th gi tr ln nht khi c chn trong s n gi vi gii hn trng lng M chnh l
F[n, M].
1. Cng thc truy hi tnh F[i, j].
Vi gii hn trng lng j, vic chn ti u trong s cc gi {1, 2, ...,i - 1, i} c gi tr ln nht
s c hai kh nng:
Nu khng chn gi th i th F[i, j] l gi tr ln nht c th bng cch chn trong s cc gi {1,
2, ..., i - 1} vi gii hn trng lng l j. Tc l
F[i, j] = F[i - 1, j]

Nu c chn gi th i (tt nhin ch xt ti trng hp ny khi m Wi j) th F[i, j] bng gi tr


gi th i l Vi cng vi gi tr ln nht c th c c bng cch chn trong s cc gi {1, 2, ...,
i - 1} vi gii hn trng lng j - Wi. Tc l v mt gi tr thu c:
F[i, j] = Vi + F[i - 1, j - Wi]
V theo cch xy dng F[i, j] l gi tr ln nht c th, nn F[i, j] s l max trong 2 gi tr thu c
trn.
2. C s quy hoch ng:
D thy F[0, j] = gi tr ln nht c th bng cch chn trong s 0 gi = 0.
3. Tnh bng phng n:
Bng phng n F gm n + 1 dng, M + 1 ct, trc tin c in c s quy hoch ng: Dng 0
gm ton s 0. S dng cng thc truy hi, dng dng 0 tnh dng 1, dng dng 1 tnh dng 2,
v.v... n khi tnh ht dng n.

0
1
2
...
n

0
0

1
0

...
0

M
0

...

4. Truy vt:
Tnh xong bng phng n th ta quan tm n F[n, M] chnh l gi tr ln nht thu c khi
chn trong c n gi vi gii hn trng lng M. Nu F[n, M] = F[n - 1, M] th tc l khng chn
gi th n, ta truy tip F[n - 1, M]. Cn nu F[n, M] F[n - 1, M] th ta thng bo rng php chn ti
u c chn gi th n v truy tip F[n - 1, M - Wn]. C tip tc cho ti khi truy ln ti hng 0 ca
bng phng n.
PROG03_2.PAS * Bi ton ci ti
program The_Bag;
const
max = 100;
var
W, V: Array[1..max] of Integer;
F: array[0..max, 0..max] of Integer;
n, M: Integer;
procedure Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i: Integer;
begin
ReadLn(n, M);
for i := 1 to n do ReadLn(W[i], V[i]);
end;
procedure Optimize;
{Tnh bng phng n bng cng thc truy hi}
var
i, j: Integer;
begin
FillChar(F[0], SizeOf(F[0]), 0);
{in c s quy hoch ng}
for i := 1 to n do
for j := 0 to M do
begin
{Tnh F[i, j]}

F[i, j] := F[i - 1, j];

{Gi s khng chn gi th i th F[i, j] = F[i - 1, j]}


{Sau nh gi: nu chn gi th i s c li hn th t li F[i, j]}

end;

if (j >= W[i]) and


(F[i, j] < F[i - 1, j - W[i]] + V[i]) then
F[i, j] := F[i - 1, j - W[i]] + V[i];
end;

procedure Trace;
{Truy vt tm nghim ti u}
begin
WriteLn(F[n, M]); {In ra gi tr ln nht c th kim c}
while n <> 0 do
{Truy vt trn bng phng n t hng n ln hng 0}
begin
if F[n, M] <> F[n - 1, M] then
{Nu c chn gi th n}
begin
Write(n, ' ');
M := M - W[n]; { chn gi th n ri th ch c th mang thm c trng lng M - Wn na thi}
end;
Dec(n);
end;
end;
begin
{nh ngha li thit b nhp/xut chun}

Assign(Input, 'BAG.INP'); Reset(Input);


Assign(Output, 'BAG.OUT'); Rewrite(Output);
Enter;
Optimize;
Trace;
Close(Input); Close(Output);
end.

III. BIN I XU
Cho xu k t X, xt 3 php bin i:
a) Insert(i, C): i l s, C l k t: Php Insert chn k t C vo sau v tr i ca xu X.
b) Replace(i, C): i l s, C l k t: Php Replace thay k t ti v tr i ca xu X bi k t C.
c) Delete(i): i l s, Php Delete xo k t ti v tr i ca xu X.
Yu cu: Cho trc xu Y, hy tm mt s t nht cc php bin i trn bin xu X thnh xu Y.
Input: file vn bn STR.INP
Dng 1: Cha xu X ( di 100)
Dng 2: Cha xu Y ( di 100)
Output: file vn bn STR.OUT ghi cc php bin i cn thc hin v xu X ti mi php bin i.
STR.INP
PBBCEFATZ
QABCDABEFA

STR.OUT
7
PBBCEFATZ -> Delete(9) -> PBBCEFAT
PBBCEFAT -> Delete(8) -> PBBCEFA PBBCEFA
-> Insert(4, B) -> PBBCBEFA PBBCBEFA ->
Insert(4, A) -> PBBCABEFA PBBCABEFA ->
Insert(4, D) -> PBBCDABEFA PBBCDABEFA ->
Replace(2, A) -> PABCDABEFA PABCDABEFA ->
Replace(1, Q) -> QABCDABEFA

Cch gii:
i vi xu k t th vic xo, chn s lm cho cc phn t pha sau v tr bin i b nh ch s
li, gy kh khn cho vic qun l v tr. khc phc iu ny, ta s tm mt th t bin i tho
mn: Php bin i ti v tr i bt buc phi thc hin sau cc php bin i ti v tr i + 1, i + 2, ...

V d: X = 'ABCD';
Insert(0, E) sau Delete(4) cho ra X = 'EABD'. Cch ny khng tun th nguyn tc
Delete(3) sau Insert(0, E) cho ra X = 'EABD'. Cch ny tun th nguyn tc ra.
Ni tm li ta s tm mt dy bin i c v tr thc hin gim dn.
1. Cng thc truy hi
Gi s m l di xu X v n l di xu Y. Gi F[i, j] l s php bin i ti thiu bin xu
gm i k t u ca xu X: X1X2 ... Xi thnh xu gm j k t u ca xu Y: Y1Y2...Yj.
Ta nhn thy rng X = X1X2...Xm v Y = Y1Y2...Yn nn:
Nu Xm = Yn th ta ch cn bin on X1X2...Xm-1 thnh Y1Y2...Yn-1 tc l trong trng hp ny
F[m, n] = F[m - 1, n - 1].
Nu Xm Yn th ti v tr Xm ta c th s dng mt trong 3 php bin i:
a) Hoc chn vo sau v tr m ca X, mt k t ng bng Yn:
X =

X1X2...

Xm-1

Xm

Yn

Y =

Th khi F[m, n] s bng 1 php chn va ri cng vi s php bin i bin dy X1...Xm
thnh dy Y1...Yn-1: F[m, n] = 1 + F[m, n - 1]
b) Hoc thay v tr m ca X bng mt k t ng bng Yn
X =

X1X2...

Xm-1

Y =

Xm := Yn
Yn

Th khi F[m, n] s bng 1 php thay va ri cng vi s php bin i bin dy X1...Xm-1
thnh dy Y1...Yn-1: F[m, n] = 1 + F[m-1, n - 1]
c) Hoc xo v tr th m ca X
X =

X1X2...

Xm-1

Xm

Y =

Y1Y2...

Yn-1

Yn

Th khi F[m, n] s bng 1 php xo va ri cng vi s php bin i bin dy X1...Xm-1


thnh dy Y1...Yn: F[m, n] = 1 + F[m-1, n]
V F[m, n] phi l nh nht c th, nn trong trng hp Xm Yn th
F[m, n] = min(F[m, n - 1], F[m - 1, n - 1], F[m - 1, n]) + 1.
Ta xy dng xong cng thc truy hi.
2. C s quy hoch ng
F[0, j] l s php bin i bin xu rng thnh xu gm j k t u ca F. N cn ti thiu j
php chn: F[0, j] = j
F[i, 0] l s php bin i bin xu gm i k t u ca S thnh xu rng, n cn ti thiu i php
xo: F[i, 0] = i
Vy u tin bng phng n F (c[0..m, 0..n]) c khi to hng 0 v ct 0 l c s quy hoch
ng. T dng cng thc truy hi tnh ra tt c cc phn t bng B.
Sau khi tnh xong th F[m, n] cho ta bit s php bin i ti thiu.
Truy vt:
Nu Xm = Yn th ch vic xt tip F[m - 1, n - 1].
Nu khng, xt 3 trng hp:
Nu F[m, n] = F[m, n - 1] + 1 th php bin i u tin c s dng l: Insert(m, Yn)

Nu F[m, n] = F[m - 1, n - 1] + 1 th php bin i u tin c s dng l: Replace(m, Yn)


Nu F[m, n] = F[m - 1, n] + 1 th php bin i u tin c s dng l: Delete(m)
a v bi ton vi m, n nh hn truy vt tip cho ti khi v F[0, 0]
V d: X =' ABCD'; Y = 'EABD' bng phng n l:
0
1
2
3
4
1
2
3
4
0 0
1
1
2
3
1 1
2
3

2
3

2
3

2
3

1
2

2
2

Lu : khi truy vt, trnh truy nhp ra ngoi bng, nn to vin cho bng.
PROG03_3.PAS * Bin i xu
program StrOpt;
const
max = 100;
var
X, Y: String[2 * max];
F: array[-1..max, -1..max] of Integer;
m, n: Integer;
procedure Enter;
{Nhp d liu t thit b nhp chun}
begin
ReadLn(X); ReadLn(Y);
m := Length(X); n := Length(Y);
end;
function Min3(x, y, z: Integer): Integer; {Cho gi tr nh nht trong 3 gi tr x, y, z}
var
t: Integer;
begin
if x < y then t := x else t := y;
if z < t then t := z;
Min3 := t;
end;
procedure Optimize;
var
i, j: Integer;
begin
{Khi to vin cho bng phng n}

for i := 0 to m do F[i, -1] := max + 1;


for j := 0 to n do F[-1, j] := max + 1;
{Lu c s quy hoch ng}

for j := 0 to n do F[0, j] := j;
for i := 1 to m do F[i, 0] := i;
{Dng cng thc truy hi tnh ton bng phng n}

for i := 1 to m do
for j := 1 to n do
if X[i] = Y[j] then F[i, j] := F[i - 1, j - 1]
else F[i, j] := Min3(F[i, j - 1], F[i - 1, j - 1], F[i - 1, j]) + 1;
end;
procedure Trace;
{Truy vt}
begin
WriteLn(F[m, n]);
{F[m, n] chnh l s t nht cc php bin i cn thc hin}
while (m <> 0) or (n <> 0) do {Vng lp kt thc khi m = n = 0}
if X[m] = Y[n] then
{Hai k t cui ca 2 xu ging nhau}

begin
Dec(m); Dec(n); {Ch vic truy cho ln trn bng phng n}
end
else
{Ti y cn mt php bin i}
begin
Write(X, ' -> ');
{In ra xu X trc khi bin i}
if F[m, n] = F[m, n - 1] + 1 then
{Nu y l php chn}
begin
Write('Insert(', m, ', ', Y[n], ')');
Insert(Y[n], X, m + 1);
Dec(n);
{Truy sang phi}
end
else
if F[m, n] = F[m - 1, n - 1] + 1 then
{Nu y l php thay}
begin
Write('Replace(', m, ', ', Y[n], ')');
X[m] := Y[n];
Dec(m); Dec(n);
{Truy cho ln trn}
end
else
{Nu y l php xo}
begin
Write('Delete(', m, ')');
Delete(X, m, 1);
Dec(m);
{Truy ln trn}
end;
WriteLn(' -> ', X);
{In ra xu X sau php bin i}
end;

end;

begin
Assign(Input, 'STR.INP'); Reset(Input);
Assign(Output, 'STR.OUT'); Rewrite(Output);
Enter;
Optimize;
Trace;
Close(Input); Close(Output);
end.

Bi ny gii vi cc xu 100 k t, nu lu bng phng n di dng mng cp pht ng th c


th lm vi cc xu 255 k t. (Tt hn nn lu mi dng ca bng phng n l mt mng cp
pht ng 1 chiu). Hy t gii thch ti sao khi gii hn di d liu l 100, li phi khai bo X
v Y l String[200] ch khng phi l String[100] ?.
IV. DY CON C TNG CHIA HT CHO K
Cho mt dy gm n ( n 1000) s nguyn dng A1, A2, ..., An v s nguyn dng k (k 50).
Hy tm dy con gm nhiu phn t nht ca dy cho sao cho tng cc phn t ca dy con ny
chia ht cho k.
Cch gii:
bi yu cu chn ra mt s ti a cc phn t trong dy A c mt dy c tng chia ht cho
k, ta c th gii bi ton bng phng php duyt t hp bng quay lui c nh gi nhnh cn nhm
gim bt chi ph trong k thut vt cn. Di y ta trnh by phng php quy hoch ng:
Nhn xt 1: Khng nh hng n kt qu cui cng, ta c th t:
Ai := Ai mod k vi i: 1 i n
Nhn xt 2: Gi S l tng cc phn t trong mng A, ta c th thay i cch tip cn bi ton: thay
v tm xem phi chn ra mt s ti a nhng phn t c tng chia ht cho k, ta s chn ra mt s

ti thiu cc phn t c tng ng d vi S theo modul k. Khi ch cn loi b nhng phn t ny


th nhng phn t cn li s l kt qu.
Nhn xt 3: S phn t ti thiu cn loi b bao gi cng nh hn k
Tht vy, gi s s phn t t nht cn loi b l m v cc phn t cn loi b l Ai1, Ai2, ..., Aim.
Cc phn t ny c tng ng d vi S theo m-un k. Xt cc dy sau
Dy 0 := () = Dy rng (Tng 0 (mod k))
Dy 1 := (Ai1)
Dy 2 := (Ai1, Ai2)
Dy 3 := (Ai1, Ai2, Ai3)
... ...
Dy m := (Ai1, Ai2, ..., Aim)
Nh vy c m + 1 dy, nu m k th theo nguyn l Dirichlet s tn ti hai dy c tng ng d
theo m-un k. Gi s l hai dy:
Ai1 + Ai2 + ... + Aip Ai1 + Ai2 + ... + Aip + Aip+1 + ... + Aiq (mod k)
Suy ra Aip+1 + ... + Aiq chia ht cho k. Vy ta c th xo ht cc phn t ny trong dy chn m
vn c mt dy c tng ng d vi S theo modul k, mu thun vi gi thit l dy chn c s
phn t ti thiu.
Cng thc truy hi:
Nu ta gi F[i, t] l s phn t ti thiu phi chn trong dy A1, A2, ..., Ai c tng chia k d t.
Nu khng c phng n chn ta coi F[m, t] = + . Khi F[m, t] c tnh qua cng thc truy hi
sau:
Nu trong dy trn khng phi chn Am th F[m, t] = F[m - 1, t];
Nu trong dy trn phi chn Am th F[m, t] = 1 + F[m - 1, t - Am] (t - Am y hiu l php tr
trn cc lp ng d mod k. V d khi k = 7 th 1 - 3 = 5)
T trn suy ra F[m, t] = min (F[m - 1, t], 1 + F[m - 1, t - Am]).
Cn tt nhin, c s quy hoch ng: F(0, 0) = 0; F(0, i) = + (vi i: 1 i < k).
Bng phng n F c kch thc [0..n, 0.. k - 1] ti a l 1001x50 phn t kiu Byte.
n y th vn tr nn qu d, thit ngh cng khng cn ni thm m cng chng cn phi vit
chng trnh ra lm g na.
V. PHP NHN T HP DY MA TRN
Vi ma trn A kch thc pxq v ma trn B kch thc qxr. Ngi ta c php nhn hai ma trn
c ma trn C kch thc pxr. Mi phn t ca ma trn C c tnh theo cng thc:
q

C ij

= A ik .B kj

(i, j: 1 i p; 1 j r)

k=1

V d:
A l ma trn kch thc 3x4, B l ma trn kch thc 4x5 th C s l ma trn kch thc 3x5
1
5
9

2
6
10

3
7
11

4
8
12

1
0
3
1

0
1
0
1

2
0
1
1

4
5
6
1

0
1
1
1

14
34
54

6
14
22

9
25
41

36
100
164

9
21
33

thc hin php nhn hai ma trn A(mxn) v B(nxp) ta c th lm nh on chng trnh sau:
for i := 1 to p do
for j := 1 to r do

begin
cij := 0;
for k := 1 to q do cij := cij + aik * bkj;
end;

Ph tn thc hin php nhn ny c th nh gi qua s php nhn, nhn hai ma trn A(pxq)
v B(qxr) ta cn thc hin p.q.r php nhn s hc.
Php nhn ma trn khng c tnh cht giao hon nhng c tnh cht kt hp
(A * B) * C = A * (B * C)
Vy nu A l ma trn cp 3x4, B l ma trn cp 4x10 v C l ma trn cp 10x15 th:
tnh (A * B) * C, ta thc hin (A * B) trc, c ma trn X kch thc 3x10 sau 3.4.10 =
120 php nhn s. Sau ta thc hin X * C c ma trn kt qu kch thc 3x15 sau 3.10.15
= 450 php nhn s. Vy tng s php nhn s hc phi thc hin s l 570.
tnh A * (B * C), ta thc hin (B * C) trc, c ma trn Y kch thc 4x15 sau 4.10.15 =
600 php nhn s. Sau ta thc hin A * Y c ma trn kt qu kch thc 3x15 sau 3.4.15 =
180 php nhn s. Vy tng s php nhn s hc phi thc hin s l 780.
Vy th trnh t thc hin c nh hng ln ti chi ph. Vn t ra l tnh s ph tn t nht khi
thc hin php nhn mt dy cc ma trn:
M1 * M2 * ... * Mn
Vi :
M1 l ma trn kch thc a1 x a2
M2 l ma trn kch thc a2 x a3
...
Mn l ma trn kch thc an x an+1
Input: file vn bn MATRIXES.INP
Dng 1: Cha s nguyn dng n 100
Dng 2: Cha n + 1 s nguyn dng a1, a2, ..., an+1 (i: 1 ai 100) cch nhau t nht mt du
cch
Output: file vn bn MATRIXES.OUT
Dng 1: Ghi s php nhn s hc ti thiu cn thc hin
Dng 2: Ghi biu thc kt hp ti u ca php nhn dy ma trn
MATRIXES.INP
6
3 2 3 1 2 2 3

MATRIXES.OUT
31
((M[1] * (M[2] * M[3])) * ((M[4] * M[5]) * M[6]))

Trc ht, nu dy ch c mt ma trn th chi ph bng 0, tip theo ta nhn thy nhn mt cp ma
trn th khng c chuyn kt hp g y c, chi ph cho php nhn l tnh c ngay. Vy th
ph tn cho php nhn hai ma trn lin tip trong dy l hon ton c th ghi nhn li c. S dng
nhng thng tin ghi nhn ti u ho ph tn nhn nhng b ba ma trn lin tip ... C tip tc
nh vy cho ti khi ta tnh c ph tn nhn n ma trn lin tip.
1. Cng thc truy hi:
Gi F[i, j] l s php nhn ti thiu cn thc hin nhn on ma trn lin tip: Mi*Mi+1*...*Mj.
Th khi F[i, i] = 0 vi i.
tnh Mi * Mi+1 * ... * Mj, ta c th c nhiu cch kt hp:
Mi * Mi+1 * ... * Mj = (Mi * Mi+1 * ... * Mk) * (Mk+1 * Mk+2 * ... * Mj) (Vi i k < j)

Vi mt cch kt hp (ph thuc vo cch chn v tr k), chi ph ti thiu phi thc hin bng:
Chi ph thc hin php nhn Mi * Mi+1 * ... * Mk = F[i, k]
Cng vi chi ph thc hin php nhn Mk+1 * Mk+2 * ... * Mj = F[k + 1, j]
Cng vi chi ph thc hin php nhn hai ma trn cui cng: ma trn to thnh t php nhn (Mi
* Mi+1 * ... * Mk) c kch thc ai x ak+1 v ma trn to thnh t php nhn (Mk+1 * Mk+2 * ... *
Mj) c kch thc ak+1 x aj+1, vy chi ph ny l ai * ak+1 * aj+1.
T suy ra: do c nhiu cch kt hp, m ta cn chn cch kt hp c chi ph t nht nn ta s
cc tiu ho F[i, j] theo cng thc:
F[i, j] = min(F[i,
F[ + 1, j] + ai * a k + * aj+ 1)
1
k
k] +
i k< j
2. Tnh bng phng n
Bng phng n F l bng hai chiu, nhn vo cng thc truy hi, ta thy F[i, j] ch c tnh khi
m F[i, k] cng nh F[k + 1, j] u bit. Tc l ban u ta in c s quy hoch ng vo ng
cho chnh ca bng(F[i, i] = 0), t tnh cc gi tr thuc ng cho nm pha trn (Tnh cc
F[i, i + 1]), ri li tnh cc gi tr thuc ng cho nm pha trn na (F[i, i + 2]) ... n khi tnh
c F[1, n] th dng li
3. Tm cch kt hp ti u
Ti mi bc tnh F[i, j], ta ghi nhn li im k m cch tnh (Mi * Mi+1 * ... * Mk) * (Mk+1 * Mk+2 *
... * Mj) cho s php nhn s hc nh nht, chng hn ta t T[i, j] = k.
Khi , mun in ra php kt hp ti u nhn on Mi * Mi+1 * ... * Mk * Mk+1 * Mk+2 * ... * Mj,
ta s in ra cch kt hp ti u nhn on Mi * Mi+1 * ... * Mk v cch kt hp ti u nhn on
Mk+1 * Mk+2 * ... * Mj (c km theo du ng m ngoc) ng thi vit thm du "*" vo gia hai
biu thc .
PROG03_4.PAS * Nhn ti u dy ma trn
program MatrixesMultiplier;
const
max = 100;
MaxLong = 1000000000;
var
a: array[1..max + 1] of Integer;
F: array[1..max, 1..max] of LongInt;
T: array[1..max, 1..max] of Byte;
n: Integer;
procedure Enter;
{Nhp d liu t thit b nhp chun}
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n + 1 do Read(a[i]);
end;
procedure Optimize;
var
i, j, k, len: Integer;
x, p, q, r: LongInt;
begin
for i := 1 to n do
for j := i to n do
if i = j then F[i, j] := 0
else F[i, j] := MaxLong;
for len := 2 to n do

{Khi to bng phng n: ng cho chnh = 0, cc khc = +}


{Tm cch kt hp ti u nhn on gm len ma trn lin tip}

for i := 1 to n - len + 1 do
begin
j := i + len - 1;
for k := i to j - 1 do
begin

{Tnh F[i, j]}


{Xt mi v tr phn hoch k}

{Gi s ta tnh Mi * ... * Mj = (Mi * ... * Mk) * (Mk+1 * ... * Mj)}

p := a[i]; q := a[k + 1]; r := a[j + 1]; {Kch thc 2 ma trn s nhn cui cng}
x := F[i, k] + F[k + 1, j] + p * q * r;
{Chi ph nu phn hoch theo k}
if x < F[i, j] then
{Nu php phn hoch tt hn F[i, j] th ghi nhn li}
begin
F[i, j] := x;
T[i, j] := k;
end;
end;
end;

end;

procedure Trace(i, j: Integer);


{In ra php kt hp nhn on Mi * Mi+1 * ... * Mj}
var
k: Integer;
begin
if i = j then Write('M[', i, ']') {Nu on ch gm 1 ma trn th in lun}
else
{Nu on gm t 2 ma trn tr ln}
begin
Write('(');
{M ngoc}
k := T[i, j];
{Ly v tr phn hoch ti u on
Mi...Mj} Trace(i, k); {In ra php kt hp nhn on u}
Write(' * ');
{Du nhn}
Trace(k + 1, j); {In ra php kt hp nhn on sau}
Write(')');
{ng ngoc}
end;
end;
begin
Assign(Input, 'MATRIXES.INP'); Reset(Input);
Assign(Output, 'MATRIXES.OUT'); Rewrite(Output);
Enter;
Optimize;
WriteLn(F[1, n]);
{S php nhn cn thc
hin} Trace(1, n);
{Truy vt bng quy}
WriteLn;
Close(Input); Close(Output);
end.

VI. BI TP LUYN TP
Nhn xt: Nhiu v k, d, kh, di, ngn, to, nh c ht!
A. Bi tp c gi li gii
1. Nhp vo hai s nguyn dng n v k (n, k 100). Hy cho bit
a) C bao nhiu s nguyn dng c n ch s m tng cc ch s ng bng k. Nu c hn 1
t s th ch cn thng bo c nhiu hn 1 t.
b) Nhp vo mt s p 1 t. Cho bit nu em cc s tm c xp theo th t tng dn th s th
p l s no ?
Gi :
Cu a: Ta s m s cc s c ng n ch s m tng cc ch s (TCCS) bng k, ch c iu cc s
ca ta cho php c th bt u bng 0. V d: ta coi 0045 l s c 4 ch s m TCCS l 9. Gi F[n,
k] l s cc s c n ch s m TCCS bng k. Cc s c dng x1 x2 ...xn ; x1, x2, ...xn y l cc

ch s 0...9 v x1 + x2 + ... + xn = k. Nu c nh x1 = t th ta nhn thy x 2 ...x n lp thnh mt s c


n - 1 ch s m TCCS bng k - t. Suy ra do x1 c th nhn cc gi tr t 0 ti 9 nn v mt s lng:
F[n, k] =
0

F[n 1, k t ] . y l cng thc truy hi tnh F[n, k], thc ra ch xt nhng gi tr t t


t =0

ti 9 v t k m thi ( trnh trng hp k - t <0). Ch rng nu ti mt bc no tnh ra mt


9
9
phn t ca F > 10 th ta t li phn t l 10 + 1 trnh b trn s do cng hai s qu ln.
9
Kt thc qu trnh tnh ton, nu F[n, k] = 10 + 1 th ta ch cn thng bo chung chung l c > 1 t
s.
Cn c s quy hoch ng th c nhiu cch t: V d:
Cch 1: F[1, k] = s cc s c 1 ch s m TCCS bng k, nh vy nu k 10 th F[1, k] = 0 cn
nu 0 k 9 th F[1, k] = 1.
Cch 2: F[0, k] = s cc s c 0 ch s m TCCS bng k, th F[0, 0] = 1 (Dy X rng c tng =
0) v F[0, k] = 0 vi k > 0 (Bi dy X rng th khng th cho tng l s k dng c)
Cu b: Da vo bng phng n F[0..n, 0..k],
F[n - 1, k] = s cc s c n - 1 CS m TCCS bng k = s cc s c n CS, bt u l 0, TCCS bng k.
F[n - 1, k - 1] = s cc s c n - 1 CS m TCCS bng k - 1 = s cc s c n CS, bt u l 1, TCCS bng k.
F[n - 1, k - 2] = s cc s c n - 1 CS m TCCS bng k - 2 = s cc s c n CS, bt u l 2, TCCS bng k.
...
F[n - 1, k - 9] = s cc s c n - 1 CS m TCCS bng k - 9 = s cc s c n CS, bt u l 9, TCCS bng k.

T ta c th bit c s th p (theo th t tng dn) cn tm s c ch s u tin l ch s no,


tng t ta s tm c ch s th hai, th ba v.v... ca s .
2. Cho n gi ko (n 200), mi gi cha khng qu 200 vin ko, v mt s M 40000. Hy ch
ra mt cch ly ra mt s cc gi ko c tng s ko l M, hoc thng bo rng khng th
thc hin c vic .
Gi : Gi s s ko cha trong gi th i l Ai
Gi b[V] l s nguyn dng b nht tho mn: C th chn trong s cc gi ko t gi 1 n gi
b[V] ra mt s gi c tng s ko l V. Nu khng c phng n chn, ta coi b[V] = +.
Trc tin, khi to b[0] = 0 v cc b[V] = + vi mi V > 0. Ta s xy dng b[V] nh sau:
tin ni, ta t k = b[V]. V k l b nht c th, nn nu c cch chn trong s cc gi ko t gi
1 n gi k c s ko V th chc chn phi chn gi k. M chn gi k ri th trong s cc
gi ko t 1 n k - 1, phi chn ra c mt s gi c s ko l V - Ak. Tc l b[V - Ak]
k - 1 < k. Vy th b[V] s c tnh bng cch:
Xt tt c cc gi ko k c Ak V v tho mn b[V - Ak] < k, chn ra ch s k b nht, sau gn
b[V] := k. y chnh l cng thc truy hi tnh bng phng n.
Sau khi tnh b[1], b[2], ..., b[M]. Nu b[M] vn bng + th c ngha l khng c phng n
chn. Nu khng th s chn gi p1 = b[M], tip theo s chn gi p2 = b[M - Ap1], ri li chn gi p3
= b[M - Ap1 - Ap2]... n khi truy vt v ti b[0] th thi.
3. Cho n gi ko (n 200), mi gi cha khng qu 200 vin ko, hy chia cc gi ko ra lm
hai nhm sao cho s ko gia hai nhm chnh lch nhau t nht
Gi :
Gi S l tng s ko v M l na tng s ko, p dng cch gii nh bi 2. Sau
Tm s nguyn dng T tho mn:

T M
Tn ti mt cch chn ra mt s gi ko c tng s ko l T (b[T] +)
T ln nht c th
Sau chn ra mt s gi ko c T vin ko, cc gi ko c a vo mt nhm, s cn
li vo nhm th hai.
4. Cho mt bng A kch thc m x n, trn ghi cc s nguyn. Mt ngi xut pht ti no
ca ct 1, cn sang ct n (ti no cng c). Quy tc: T A[i, j] ch c quyn sang mt
trong 3 A[i, j + 1]; A[i - 1, j + 1]; A[i + 1, j + 1]. Hy tm v tr xut pht v hnh trnh i t
ct 1 sang ct n sao cho tng cc s ghi trn ng i l ln nht.
1
7
1
4

2
6
2
7

6
5
3
8

7
6
4
7

9
7
2
6

Gi :
Gi B[i, j] l s im ln nht c th c c khi ti A[i, j]. R rng i vi nhng ct 1 th
B[i, 1] = A[i, 1]:
A
1
7
1
4

2
6
2
7

6
5
3
8

7
6
4
7

B
1
7
1
4

9
7
2
6

Vi nhng (i, j) cc ct khc. V ch nhng (i, j - 1), (i - 1, j - 1), (i + 1, j - 1) l c th sang


c (i, j), v khi sang (i, j) th s im c cng thm A[i, j] na. Chng ta cn B[i, j] l s
im ln nht c th nn B[i, j] = max(B[i, j - 1], B[i - 1, j - 1], B[i + 1, j - 1]) + A[i, j]. Ta dng
cng thc truy hi ny tnh tt c cc B[i, j]. Cui cng chn ra B[i, n] l phn t ln nht trn ct n
ca bng B v t truy vt tm ra ng i nhiu im nht.
B. Bi tp t lm
1. Bi ton ci ti vi kch thc nh nu trn l khng thc t, chng c siu th no c 100 gi
hng c. Hy lp chng trnh gii bi ton ci ti vi n 10000; M 1000.
2. Xu k t S gi l xu con ca xu k t T nu c th xo bt mt s k t trong xu T c
xu S. Lp chng trnh nhp vo hai xu k t S 1, S2. Tm xu S3 c di ln nht l xu con ca
c S1 v S2. V d: S1 = 'abcdefghi123'; S2 = 'abc1def2ghi3' th S3 l 'abcdefghi3'.
3. Mt xu k t X gi l cha xu k t Y nu nh c th xo bt mt s k t trong xu X
c xu Y: V d: Xu '1a2b3c45d' cha xu '12345'. Mt xu k t gi l i xng nu n khng
thay i khi ta vit cc k t trong xu theo th t ngc li: V d: 'abcABADABAcba',
'MADAM' l cc xu i xng.
Nhp mt xu k t S c di khng qu 128, hy tm xu k t T tho mn c 3 iu kin:
1. i xng
2. Cha xu S
3. C t k t nht (c di ngn nht)
Nu c nhiu xu T tho mn ng thi 3 iu kin trn th ch cn cho bit mt. Chng hn vi S =
'a_101_b' th chn T = 'ab_101_ba' hay T = 'ba_101_ab' u ng.
V d:
S
MADAM

T
MADAM

edcbabcde

edbabcd
00_11_22_33_222_1_000
abcdefg_hh_gfe_1_d_2_c_3_ba

000_11_222_33_222_11_000
ab_3_c_2_d_1_efg_hh_gfe_1_d_2_c_3_ba

4. C n loi tin giy: T giy bc loi i c mnh gi l V[i] ( n 20, 1 V[i] 10000). Hi mun
mua mt mn hng gi l M th c bao nhiu cch tr s tin bng nhng loi giy bc cho
(Trng hp c > 1 t cch th ch cn thng bo c nhiu hn 1 t). Nu tn ti cch tr, cho bit
cch tr phi dng t t tin nht.
5. Cho n qun -mi-n xp dng ng theo hng ngang v c nh s t 1 n n. Qun -min th i c s ghi trn l a[i] v s ghi di l b[i]. Xem hnh v:
1
2
3
4
5
6
1
1
4
4
0
6
6
3
1
1
6
1
Bit rng 1 n 100 v 0 ai, bi 6 vi i: 1 i n. Cho php lt ngc cc qun -mi-n. Khi
mt qun -mi-n th i b lt, n s c s ghi trn l b[i] v s ghi di l a[i].
Vn t ra l hy tm cch lt cc qun -mi-n sao cho chnh lch gia tng cc s ghi
hng trn v tng cc s ghi hng dii l ti thiu. Nu c nhiu phng n lt tt nh nhau,
th ch ra phng n phi lt t qun nht.
Nh v d trn th s lt hai qun -mi-n th 5 v th 6. Khi :
Tng cc s hng trn = 1 + 1 + 4 + 4 + 6 + 1 = 17
Tng cc s hng di = 6 + 3 + 1 + 1 + 0 + 6 = 17
6. Xt bng H kch thc 4x4, cc hng v cc ct c nh ch s A, B, C, D. Trn 16 ca
bng, mi ghi 1 k t A hoc B hoc C hoc D.
A
B
C
D

A
A
C
B
B

B
A
D
C
D

C
B
A
B
D

D
B
B
A
D

Cho xu S gm n k t ch gm cc ch A, B, C, D.
Xt php co R(i): thay k t Si v Si+1 bi k t nm trn hng Si, ct Si+1 ca bng H.
V d: S = ABCD; p dng lin tip 3 ln R(1) s c
ABCD ACD BD B.
Yu cu: Cho trc mt k t X{A, B, C, D}, hy ch ra th t thc hin n - 1 php co k t
cn li cui cng trong S l X.
7. Cho N s t nhin A1, A2, ..., AN. Bit rng 1 N 200 v 0 Ai 200. Ban u cc s c t
lin tip theo ng th t cch nhau bi du "?": A1 ? A2 ? ... ? AN. Yu cu: Cho trc s nguyn
K, hy tm cch thay cc du "?" bng du cng hay du tr c mt biu thc s hc cho gi
tr l K. Bit rng 1 N 200 v 0 Ai 100.
V d: Ban u 1 ? 2 ? 3 ? 4 v K = 0 s cho kt qu 1 - 2 - 3 + 4.
8. Dy Catalant l mt dy s t nhin bt u l 0, kt thc l 0, hai phn t lin tip hn km nhau
1 n v. Hy lp chng trnh nhp vo s nguyn dng n l v mt s nguyn dng p. Cho bit
rng nu nh ta em tt c cc dy Catalant di n xp theo th t t in th dy th p l dy
no.
i vi phng php quy hoch ng, lng b nh dng lu bng phng n c th rt ln
nn ta tit kim c cng nhiu cng tt. Nu bng phng n c tnh di dng dng dng i
tnh dng i + 1 th r rng vic lu tr cc dng i - 1, i - 2... by gi l khng cn thit, ta c th

ci tin bng cch dng 2 mng trc, sau tng ng vi 2 dng i, i + 1 ca bng v c dng
chng tnh li ln nhau, thm ch ch cn dng 1 mng tng ng vi 1 dng v tnh li chnh n
nh v d u tin lm, nh vy c th tit kim c b nh chy cc d liu ln.
Mt bi ton quy hoch ng c th c nhiu cch tip cn khc nhau, chn cch no l tu theo
yu cu bi ton sao cho d dng ci t nht. Phng php ny thng khng kh khn trong vic
tnh bng phng n, khng kh khn trong vic tm c s quy hoch ng, m kh khn chnh l
nhn nhn ra bi ton quy hoch ng v tm ra cng thc truy hi gii n, cng vic ny i
hi s nhanh nhy, khn kho, m ch t kinh nghim v s rn luyn mi c ch chng c l
thuyt no cho ta mt phng php chung tht c th gii mi bi ton quy hoch ng c.

L thuyt th

\
1[

MC LC
0. M U .......................................................................................................................................... 3
1. CC KHI NIM C BN..............................................................................................................
4
I. NH NGHA TH (GRAPH)
..................................................................................................................4
II. CC KHI NIM..........................................................................................................................................5
2. BIU DIN TH TRN MY TNH............................................................................................
6
I. MA TRN LIN K (MA TRN K)
..........................................................................................................6
II. DANH SCH CNH.....................................................................................................................................7
III. DANH SCH K .........................................................................................................................................7
IV. NHN XT...................................................................................................................................................8
3. CC THUT TON TM KIM TRN TH .............................................................................
10
I. BI TON.....................................................................................................................................................10
II. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST
SEARCH)..........................................11
III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST
SEARCH)...............................16
IV. PHC TP TNH TON CA BFS V
DFS...................................................................................21
4. TNH LIN THNG CA TH .................................................................................................
22
I. NH
NGHA................................................................................................................................................22
II. TNH LIN THNG TRONG TH V
HNG................................................................................23
III. TH Y V THUT TON WARSHALL
..............................................................................23
IV. CC THNH PHN LIN THNG MNH ...........................................................................................26
5. VI NG DNG CA CC THUT TON TM KIM TRN TH
........................................ 36
I. XY DNG CY KHUNG CA TH
.................................................................................................36
II. TP CC CHU TRNH C BN CA
TH.......................................................................................38
III. NH CHIU TH V BI TON LIT K
CU...........................................................................39
IV. LIT K KHP..........................................................................................................................................44
I. BI TON 7 CI CU ................................................................................................................................47
II. NH
NGHA...............................................................................................................................................47
III. NH L.....................................................................................................................................................47
IV. THUT TON FLEURY TM CHU TRNH EULER
.............................................................................48
V. CI T......................................................................................................................................................48

L thuyt th

\
VI. THUT TON TT
HN.........................................................................................................................502 [

7. CHU TRNH HAMILTON, NG I HAMILTON, TH HAMILTON....................................


53
I. NH
NGHA................................................................................................................................................53
II. NH L
......................................................................................................................................................53
III. CI T.....................................................................................................................................................53
8. BI TON NG I NGN NHT...........................................................................................
57
I. TH C TRNG
S...............................................................................................................................57
II. BI TON NG I NGN
NHT......................................................................................................57
III. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD
BELLMAN...........58
IV. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON
DIJKSTRA.............60
V. THUT TON DIJKSTRA V CU TRC
HEAP.................................................................................63
VI. TRNG HP TH KHNG C CHU TRNH - TH T T P
................................................65

L thuyt th

\
3[
VII. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD
...................................68
VIII. NHN XT..............................................................................................................................................70
9. BI TON CY KHUNG NH NHT .......................................................................................... 72
I. BI TON CY KHUNG NH NHT......................................................................................................72
II. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956)
.......................................................................72
III. THUT TON PRIM (ROBERT PRIM 1957).......................................................................................76
10. BI TON LUNG CC I TRN MNG..............................................................................
80
I. BI TON.....................................................................................................................................................80
II. LT CT, NG TNG LUNG, NH L FORD FULKERSON.................................................80
III. CI T.....................................................................................................................................................82
IV. THUT TON FORD - FULKERSON (L.R.FORD & D.R.FULKERSON - 1962)
...............................85
11. BI TON TM B GHP CC I TRN TH HAI PHA.................................................
89
I. TH HAI PHA (BIPARTITE GRAPH)
.................................................................................................89
II. BI TON GHP I KHNG TRNG V CC KHI
NIM...........................................................89
III. THUT TON NG M
....................................................................................................................90
IV. CI T.....................................................................................................................................................90
12. BI TON TM B GHP CC I VI TRNG S CC TIU TRN TH HAI
PHA - THUT TON
HUNGARI.................................................................................................................... 95
I. BI TON PH N CNG ............................................................................................................................95
II. PHN TCH .................................................................................................................................................95
III. THUT TON ...........................................................................................................................................96
IV. CI T...................................................................................................................................................100
V. BI TON TM B GHP CC I VI TRNG S CC I TRN TH HAI
PHA..........105
VI. PHC TP TNH
TON..................................................................................................................106
13. BI TON TM B GHP CC I TRN TH ................................................................
111
I. CC KHI NIM .......................................................................................................................................111
II. THUT TON EDMONDS (1965)
..........................................................................................................112
III. PHNG PHP LAWLER
(1973)..........................................................................................................113
IV. CI T...................................................................................................................................................115
V. PHC TP TNH TON
...................................................................................................................119

L thuyt th

\
4[

0. M U
Trn thc t c nhiu bi ton lin quan ti mt tp cc i tng v nhng mi
lin h gia chng, i hi ton hc phi t ra mt m hnh biu din mt cch
cht ch v tng qut bng ngn ng k hiu, l th. Nhng tng c bn
ca n c a ra t th k th XVIII bi nh ton hc Thu S Leonhard Euler,
ng dng m hnh th gii bi ton v nhng cy cu Konigsberg ni
ting.
Mc d L thuyt th c khoa hc pht trin t rt lu nhng li c nhiu ng dng hin
i. c bit trong khong vi mi nm tr li y, cng vi s ra i ca my tnh in t v s
pht trin nhanh chng ca Tin hc, L thuyt th cng c quan tm n nhiu hn. c bit
l cc thut ton trn th c nhiu ng dng trong nhiu lnh vc khc nhau nh: Mng my
tnh, L thuyt m, Ti u ho, Kinh t hc v.v... Chng hn nh tr li cu hi: Hai my tnh trong
mng c th lin h c vi nhau hay khng ?; hay vn phn bit hai hp cht ho hc c cng
cng thc phn t nhng li khc nhau v cng thc cu to cng c gii quyt nh m hnh
th. Hin nay, mn hc ny l mt trong nhng kin thc c s ca b mn khoa hc my tnh.
Trong phm vi mt chuyn , khng th ni k v ni ht nhng vn ca l thuyt th. Tp
bi ging ny s xem xt l thuyt th di gc ngi lp trnh, tc l kho st nhng thut
ton c bn nht c th d dng ci t trn my tnh mt s ng dng ca n. Cc khi nim
tru tng v cc php chng minh s c din gii mt cch hnh thc cho n gin v d hiu
ch khng phi l nhng chng minh cht ch dnh cho ngi lm ton. Cng vic ca ngi lp
trnh l c hiu c tng c bn ca thut ton v ci t c chng trnh trong bi ton
tng qut cng nh trong trng hp c th. Thng thng sau qu trnh rn luyn, hu ht nhng
ngi lp trnh gn nh phi thuc lng cc m hnh ci t, khi p dng c th ci t ng
ngay v hiu qu, khng b mt thi gi vo cc cng vic g ri. Bi vic g ri mt thut ton tc
l phi d li tng bc tin hnh v t tr li cu hi: "Ti bc nu ng th phi nh th no
?", thc ra l tiu ph thi gian v ch chng minh li tnh ng n ca thut ton trong
trng hp c th, vi mt b d liu c th.
Trc khi tm hiu cc vn v l thuyt th, bn phi c k thut lp trnh kh tt, ngoi ra
nu c tm hiu trc v cc k thut vt cn, quay lui, mt s phng php ti u ho, cc bi
ton quy hoch ng th s gip ch nhiu cho vic c hiu cc bi ging ny.

L thuyt th

\
5[

1. CC KHI NIM C BN
I. NH NGHA TH (GRAPH)
L mt cu trc ri rc gm cc nh v cc cnh ni cc nh . c m t hnh thc:
G = (V, E)
V gi l tp cc nh (Vertices) v E gi l tp cc cnh (Edges). C th coi E l tp cc cp (u, v)
vi u v v l hai nh ca V.
Mt s hnh nh ca th:

S giao thng

Mng my tnh
Hnh 1: V d v m hnh th

C th phn loi th theo c tnh v s lng ca tp cc cnh E:


Cho th G = (V, E). nh ngha mt cch hnh thc
1. G c gi l n th nu gia hai nh u, v ca V c nhiu nht l 1 cnh trong E ni t u
ti v.
2. G c gi l a th nu gia hai nh u, v ca V c th c nhiu hn 1 cnh trong E ni t u
ti v (Hin nhin n th cng l a th).
3. G c gi l th v hng nu cc cnh trong E l khng nh hng, tc l cnh ni hai
nh u, v bt k cng l cnh ni hai nh v, u. Hay ni cch khc, tp E gm cc cp (u, v)
khng tnh th t. (u, v)(v, u)
4. G c gi l th c hng nu cc cnh trong E l c nh hng, c th c cnh ni t
nh u ti nh v nhng cha chc c cnh ni t nh v ti nh u. Hay ni cch khc, tp E
gm cc cp (u, v) c tnh th t: (u, v) (v, u). Trong th c hng, cc cnh c gi l
cc cung. th v hng cng c th coi l th c hng nu nh ta coi cnh ni hai nh
u, v bt k tng ng vi hai cung (u, v) v (v, u).
V d:

V hng

C hng

V hng

n th

C hng
a th

Hnh 2: Phn loi th

L thuyt th

\
6[

II. CC KHI NIM


Nh trn nh ngha th G = (V, E) l mt cu trc ri rc, tc l cc tp V v E hoc l tp
hu hn, hoc l tp m c, c ngha l ta c th nh s th t 1, 2, 3... cho cc phn t ca tp
V v E. Hn na, ng trn phng din ngi lp trnh cho my tnh th ta ch quan tm n cc
th hu hn (V v E l tp hu hn) m thi, chnh v vy t y v sau, nu khng ch thch g
thm th khi ni ti th, ta hiu rng l th hu hn.
Cnh lin thuc, nh k, bc
i vi th v hng G = (V, E). Xt mt cnh e E, nu e = (u, v) th ta ni hai nh u v v
l k nhau (adjacent) v cnh e ny lin thuc (incident) vi nh u v nh v.
Vi mt nh v trong th, ta nh ngha bc (degree) ca v, k hiu deg(v) l s cnh lin
thuc vi v. D thy rng trn n th th s cnh lin thuc vi v cng l s nh k vi v.
nh l: Gi s G = (V, E) l th v hng vi m cnh, khi tng tt c cc bc nh trong V
s bng 2m:
deg(v) 2m
vV

Chng minh: Khi ly tng tt c cc bc nh tc l mi cnh e = (u, v) bt k s c tnh mt ln


trong deg(u) v mt ln trong deg(v). T suy ra kt qu.
H qu: Trong th v hng, s nh bc l l s chn
i vi th c hng G = (V, E). Xt mt cung e E, nu e = (u, v) th ta ni u ni ti v v
v ni t u, cung e l i ra khi nh u v i vo nh v. nh u khi c gi l nh u,
nh v c gi l nh cui ca cung e.
+
Vi mi nh v trong th c hng, ta nh ngha: Bn bc ra ca v k hiu deg (v) l s
cung i ra khi n; bn bc vo k hiu deg (v) l s cung i vo nh
nh l: Gi s G = (V, E) l th c hng vi m cung, khi tng tt c cc bn bc ra ca cc
nh bng tng tt c cc bn bc vo v bng m:

deg

(v) deg (v)

m
vV

vV

Chng minh: Khi ly tng tt c cc bn bc ra hay bn bc vo, mi cung (u, v) bt k s c


+
tnh ng 1 ln trong deg (u) v cng c tnh ng 1 ln trong deg (v). T suy ra kt qu
Mt s tnh cht ca th c hng khng ph thuc vo hng ca cc cung. Do tin trnh
by, trong mt s trng hp ta c th khng quan tm n hng ca cc cung v coi cc cung
l cc cnh ca th v hng. V th v hng c gi l th v hng nn ca th
c hng ban u.

2. BIU DIN TH TRN MY TNH


I. MA TRN LIN K (MA TRN K)
Gi s G = (V, E) l mt n th c s nh (k hiu V ) l n, Khng mt tnh tng qut c
th coi cc nh c nh s 1, 2, ..., n. Khi ta c th biu din th bng mt ma trn vung
A = [aij] cp n. Trong :
aij = 1 nu (i, j) E
aij = 0 nu (i, j) E
Quy c aii = 0 vi i;
i vi a th th vic biu din cng tng t trn, ch c iu nu nh (i, j) l cnh th khng
phi ta ghi s 1 vo v tr aij m l ghi s cnh ni gia nh i v nh j
V d:
1 2
3 4 5
1
0
1
1
0
1 0
5
2
0
0
1
1
2 0
0
0
0
1
3 1
1
0
0
0
4 1
4
3
1
1
0
0
5 0

1
2
3
4
5

1
0
0
0
1
0

2
0
0
0
0
1

3
1
0
0
0
0

4
0
1
0
0
0

5
0
0
1
0
0

1
5

Cc tnh cht ca ma trn lin k:


1. i vi th v hng G, th ma trn lin k tng ng l ma trn i xng (aij = aji), iu ny
khng ng vi th c hng.
2. Nu G l th v hng v A l ma trn lin k tng ng th trn ma trn A:
Tng cc s trn hng i = Tng cc s trn ct i = Bc ca nh i = deg(i)
3. Nu G l th c hng v A l ma trn lin k tng ng th trn ma trn A:
+

Tng cc s trn hng i = Bn bc ra ca nh i = deg (i)


-

Tng cc s trn ct i = Bn bc vo ca nh i = deg (i)


Trong trng hp G l n th, ta c th biu din ma trn lin k A tng ng l cc phn t
logic. aij = TRUE nu (i, j) E v aij = FALSE nu (i, j) E
u im ca ma trn lin k:
n gin, trc quan, d ci t trn my tnh
kim tra xem hai nh (u, v) ca th c k nhau hay khng, ta ch vic kim tra bng mt
php so snh: auv 0.
Nhc im ca ma trn lin k:

Bt k s cnh ca th l nhiu hay t, ma trn lin k lun lun i hi n nh lu cc


phn t ma trn, iu gy lng ph b nh dn ti vic khng th biu din c th vi s
nh ln.
Vi mt nh u bt k ca th, nhiu khi ta phi xt tt c cc nh v khc k vi n, hoc xt tt
c cc cnh lin thuc vi n. Trn ma trn lin k vic c thc hin bng cch xt tt c cc
nh v v kim tra iu kin auv 0. Nh vy, ngay c khi nh u l nh c lp (khng k vi nh
no) hoc nh treo (ch k vi 1 nh) ta cng buc phi xt tt c cc nh v kim tra iu kin
trn dn ti lng ph thi gian
II. DANH SCH CNH
Trong trng hp th c n nh, m cnh, ta c th biu din th di dng danh sch cnh,
trong cch biu din ny, ngi ta lit k tt c cc cnh ca th trong mt danh sch, mi phn
t ca danh sch l mt cp (u, v) tng ng vi mt cnh ca th. (Trong trng hp th c
hng th mi cp (u, v) tng ng vi mt cung, u l nh u v v l nh cui ca cung). Danh
sch c lu trong b nh di dng mng hoc danh sch mc ni. V d vi th di y:
1
5

Ci t trn mng:
1
(1, 3)

2
(2, 4)

3
(3, 5)

4
(4, 1)

5
(5, 2)

Ci t trn danh sch mc ni:


1

2
nil

u im ca danh sch cnh:


Trong trng hp th tha (c s cnh tng i nh: chng hn m < 6n), cch biu din
bng danh sch cnh s tit kim c khng gian lu tr, bi n ch cn 2m nh lu danh
sch cnh.
Trong mt s trng hp, ta phi xt tt c cc cnh ca th th ci t trn danh sch cnh
lm cho vic duyt cc cnh d dng hn. (Thut ton Kruskal chng hn)
Nhc im ca danh sch cnh:
Nhc im c bn ca danh sch cnh l khi ta cn duyt tt c cc nh k vi nh v no
ca th, th chng c cch no khc l phi duyt tt c cc cnh, lc ra nhng cnh c cha
nh v v xt nh cn li. iu kh tn thi gian trong trng hp th dy (nhiu cnh).
III. DANH SCH K
khc phc nhc im ca cc phng php ma trn k v danh sch cnh, ngi ta xut
phng php biu din th bng danh sch k. Trong cch biu din ny, vi mi nh v ca
th, ta cho tng ng vi n mt danh sch cc nh k vi v.
Vi th G = (V, E). V gm n nh v E gm m cnh. C hai cch ci t danh sch k ph bin:

Cch 1: (Forward Star) Dng mt mng cc nh, mng chia lm n on, on th i trong mng
lu danh sch cc nh k vi nh i: V d vi th sau, danh sch k s l mt mng A gm 12
phn t:
1

10

11

12

3 5 1 3 1 2 4 3
5
1
4
on 1
on 2
on 3
on 4
on 5
bit mt on nm t ch s no n ch s no, ta c mt mng lu v tr ring. Ta gi mng lu
v tr l mng Head. Head[i] s bng ch s ng lin trc on th i. Quy c Head[n + 1] s
bng m. Vi th bn th mng VT[1..6] s l: (0, 3, 5, 8, 10, 12)
Nh vy on t v tr Head[i] + 1 n Head[i + 1] trong mng A s cha cc nh k vi nh i.
Lu rng vi th c hng gm m cung th cu trc Forward Star cn phi cha m phn t,
vi th v hng m cnh th cu trc Forward Star cn phi cha 2m phn t
Cch 2: Dng cc danh sch mc ni: Vi mi nh i ca th, ta cho tng ng vi n mt danh
sch mc ni cc nh k vi i, c ngha l tng ng vi mt nh i, ta phi lu li List[i] l cht
ca mt danh sch mc ni. V d vi th trn, danh sch mc ni s l:
List[1]

List[2]

List[3]

List[4]

Nil

List[5]

Nil

Nil

Nil

Nil

u im ca danh sch k:
i vi danh sch k, vic duyt tt c cc nh k vi mt nh v cho trc l ht sc d dng,
ci tn "danh sch k" cho thy r iu ny. Vic duyt tt c cc cnh cng n gin v mt
cnh thc ra l ni mt nh vi mt nh khc k n.
Nhc im ca danh sch k
V l thuyt, so vi hai phng php biu din trn, danh sch k tt hn hn. Ch c iu,
trong trng hp c th m ma trn k hay danh sch cnh khng th hin nhc im th ta
nn dng ma trn k (hay danh sch cnh) bi ci t danh sch k c phn di dng hn.
IV. NHN XT
Trn y l nu cc cch biu din th trong b nh ca my tnh, cn nhp d liu cho th th
c nhiu cch khc nhau, dng cch no th tu. Chng hn nu biu din bng ma trn k m cho
nhp d liu c ma trn cp n x n (n l s nh) th khi nhp t bn phm s rt mt thi gian, ta cho
nhp kiu danh sch cnh cho nhanh. Chng hn mng A (nxn) l ma trn k ca mt th v
hng th ta c th khi to ban u mng A gm ton s 0, sau cho ngi s dng nhp cc
cnh bng cch nhp cc cp (i, j); chng trnh s tng A[i, j] v A[j, i] ln 1. Vic nhp c th cho
kt thc khi ngi s dng nhp gi tr i = 0. V d:
program Nhap_Do_Thi;

var
A: array[1..100, 1..100] of Integer; {Ma trn k ca th}
n, i, j: Integer;
begin
Write('Number of vertices'); ReadLn(n);
FillChar(A, SizeOf(A), 0);
repeat
Write('Enter edge (i, j) (i = 0 to exit) ');
ReadLn(i, j);
{Nhp mt cp (i, j) tng nh l nhp danh sch
cnh} if i <> 0 then
begin
{nhng lu tr trong b nh li theo kiu ma trn k}
Inc(A[i, j]);
Inc(A[j, i]);
end;
until i = 0;
{Nu ngi s dng nhp gi tr i = 0 th dng qu trnh nhp, nu khng th tip tc}
end.

Trong nhiu trng hp khng gian lu tr, vic chuyn i t cch biu din no sang cch
biu din khc khng c g kh khn. Nhng i vi thut ton ny th lm trn ma trn k ngn
gn hn, i vi thut ton kia c th lm trn danh sch cnh d dng hn v.v... Do , vi mc
ch d hiu, cc chng trnh sau ny s la chn phng php biu din sao cho vic ci t n
gin nht nhm nu bt c bn cht thut ton. Cn trong trng hp c th bt buc phi dng
mt cch biu din no khc, th vic sa i chng trnh cng khng tn qu nhiu thi gian.

3. CC THUT TON TM KIM TRN TH


I. BI TON
Cho th G = (V, E). u v v l hai nh ca G. Mt ng i (path) di l t nh u n nh v
l dy (u = x0, x1, ..., xl = v) tho mn (xi, xi+1) E vi i: (0 i < l).
ng i ni trn cn c th biu din bi dy cc cnh: (u = x0, x1), (x1, x2), ..., (xl-1, xl = v)
nh u c gi l nh u, nh v c gi l nh cui ca ng i. ng i c nh u trng
vi nh cui gi l chu trnh (Circuit), ng i khng c cnh no i qua hn 1 ln gi l ng
i n, tng t ta c khi nim chu trnh n.
V d: Xt mt th v hng v mt th c hng di y:
2

Trn c hai th, (1, 2, 3, 4) l ng i n di 3 t nh 1 ti nh 4. Bi (1, 2) (2, 3) v (3,


4) u l cc cnh (hay cung). (1, 6, 5, 4) khng phi ng i bi (6, 5) khng phi l cnh (hay
cung).
Mt bi ton quan trng trong l thuyt th l bi ton duyt tt c cc nh c th n c t
mt nh xut pht no . Vn ny a v mt bi ton lit k m yu cu ca n l khng c
b st hay lp li bt k nh no. Chnh v vy m ta phi xy dng nhng thut ton cho php
duyt mt cch h thng cc nh, nhng thut ton nh vy gi l nhng thut ton tm kim
trn th v y ta quan tm n hai thut ton c bn nht: thut ton tm kim theo chiu
su v thut ton tm kim theo chiu rng cng vi mt s ng dng ca chng.
Lu :
1. Nhng ci t di y l cho n th v hng, mun lm vi th c hng hay a th
cng khng phi sa i g nhiu.
2. D liu v th s c nhp t file vn bn GRAPH.INP. Trong :
Dng 1 cha s nh n ( 100), s cnh m ca th, nh xut pht S, nh kt thc F cch
nhau mt du cch.
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau mt du cch, th
hin c cnh ni nh u v nh v trong th.
3. Kt qu ghi ra file vn bn GRAPH.OUT
Dng 1: Ghi danh sch cc nh c th n c t S
Dng 2: ng i t S ti F c in ngc theo chiu t F v S

4
6

7
8
3

GRAPH.INP
8 7 1 5
1 2
1 3
2 3
2 4
3 5
4 6
7 8

GRAPH.OUT
1, 2, 3, 5, 4, 6,
5<-3<-2<-1

II. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH)


1. Ci t quy
T tng ca thut ton c th trnh by nh sau: Trc ht, mi nh x k vi S tt nhin s n
c t S. Vi mi nh x k vi S th tt nhin nhng nh y k vi x cng n c t S...
iu gi cho ta vit mt th tc quy DFS(u) m t vic duyt t nh u bng cch thng
bo thm nh u v tip tc qu trnh duyt DFS(v) vi v l mt nh cha thm k vi u.

khng mt nh no b lit k ti hai ln, ta s dng k thut nh du, mi ln thm mt


nh, ta nh du nh li cc bc duyt quy k tip khng duyt li nh na

lu li ng i t nh xut pht S, trong th tc DFS(u), trc khi gi quy DFS(v)


vi v l mt nh k vi u m cha nh du, ta lu li vt ng i t u ti v bng cch t
TRACE[v] := u, tc l TRACE[v] lu li nh lin trc v trong ng i t S ti v. Khi qu
trnh tm kim theo chiu su kt thc, ng i t S ti F s l:
F p1 = Trace[F] p2 = Trace[p1] ... S.
procedure DFS(uV);
begin
< 1. Thng bo ti c u >;
< 2. nh du u l thm (c th ti c t S)>;
< 3. Xt mi nh v k vi u m cha thm, vi mi nh v >;
begin
Trace[v] := u;
{Lu vt ng i, nh m t ti v l u}
DFS(v);
{Gi quy duyt tng t i vi v}
end;
end;
begin {Chng trnh chnh}
< Nhp d liu: th, nh xut pht S, nh ch F >;
< Khi to: Tt c cc nh u cha b nh du >;
DFS(S);
< Nu F cha b nh du th khng th c ng i t S ti F >;
< Nu F b nh du th truy theo vt tm ng i t S ti F >;
end.
PROG03_1.PAS * Thut ton tm kim theo chiu su
program Depth_First_Search_1;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
{Ma trn k ca th}
Free: array[1..max] of Boolean;
{Free[v] = True v cha c thm n}
Trace: array[1..max] of Integer;
{Trace[v] = nh lin trc v trn ng i t S ti v}
n, S, F: Integer;

procedure Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
{Khi to th cha c cnh no}
ReadLn(n, m, S, F);
{c dng 1 ra 4 s n, m, S v F}
for i := 1 to m do
{c m dng tip ra danh sch
cnh}

begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure DFS(u: Integer);
var
v: Integer;
begin
Write(u, ', ');
u} Free[u] := False;
thm} for v := 1 to n do
if Free[v] and a[u, v] then
begin
Trace[v] := u;
DFS(v);
end;
end;

{Thut ton tm kim theo chiu su bt u t nh u}

{Thng bo ti c
{nh du u
{Vi mi nh v cha thm k vi u}
{Lu vt ng i: nh lin trc v trong ng i t S ti v l u}
{Tip tc tm kim theo chiu su bt u t v}

procedure Result;
{In ng i t S ti F}
begin
WriteLn;
{Vo dng th hai ca Output file}
if Free[F] then
{Nu F cha nh du thm tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt ng i, bt u t F}
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
{nh ngha li thit b nhp/xut chun thnh Input/Output file}

Assign(Input, 'GRAPH.INP'); Reset(Input);


Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
FillChar(Free, n, True);
DFS(S);
Result;
{ng Input/Output file, thc ra khng cn v BP t ng ng thit b nhp xut chun trc khi kt thc chng trnh}

Close(Input);
Close(Output);
end.

Ch :
a)
V c k thut nh du, nn th tc DFS s c gi n ln (n l s nh)
b)
ng i t S ti F c th c nhiu, trn ch l mt trong s cc ng i. C th l ng
i c th t t in nh nht.

c)

C th chng cn dng mng nh du Free, ta khi to mng lu vt Trace ban u ton 0,


mi ln t nh u thm nh v, ta c thao tc gn vt Trace[v] := u, khi Trace[v] s khc 0.
Vy vic kim tra mt nh v l cha c thm ta c th kim tra Trace[v] = 0. Ch : ban
u khi to Trace[S] := -1 (Ch l cho khc 0 thi).

procedure DFS(u: Integer); {Ci tin}


var
v: Integer;
begin
Write(u, ', ');
for v := 1 to n do
if (Trace[v] = 0) and A[u, v] then {Trace[v] = 0 thay v Free[v] = True}
begin
Trace[v] := u; {Lu vt cng l nh du lun}
DFS(v);
end;
end;

V d: Vi th sau y, nh xut pht S = 1: qu trnh duyt quy c th v trn cy tm kim


DFS sau (Mi tn uv ch thao tc quy: DFS(u) gi DFS(v)).
2

4
6

7
8
3

2nd

5th

4
6

1st
1

6th

7
8

3rd

4th

Hnh 3: Cy DFS
Hi: nh 2 v 3 u k vi nh 1, nhng ti sao DFS(1) ch gi quy ti DFS(2) m khng gi
DFS(3) ?.
Tr li: ng l c 2 v 3 u k vi 1, nhng DFS(1) s tm thy 2 trc v gi DFS(2). Trong DFS(2) s xt tt c cc
nh k vi 2 m cha nh du th d nhin trc ht n tm thy 3 v gi DFS(3), khi 3 b nh du nn khi kt
thc qu trnh quy gi DFS(2), li v DFS(1) th nh 3 c thm ( b nh du) nn DFS(1) s khng gi DFS(3)
na.
Hi: Nu F = 5 th ng i t 1 ti 5 trong chng trnh trn s in ra
th no ?.
Tr li: DFS(5) do DFS(3) gi nn Trace[5] = 3. DFS(3) do DFS(2) gi nn Trace[3] = 2. DFS(2) do DFS(1) gi nn
Trace[2] = 1. Vy
ng i l: 5 3 2 1.

Vi cy th hin qu trnh quy DFS trn, ta thy nu dy chuyn quy l: DFS(S) DFS
(u1) DFS(u2) ... Th th tc DFS no gi cui dy chuyn s c thot ra u tin, th tc
DFS(S) gi u dy chuyn s c thot cui cng. Vy nn chng, ta c th m t dy chuyn
quy bng mt ngn xp (Stack).
2. Ci t khng quy
Khi m t qu trnh quy bng mt ngn xp, ta lun lun cho ngn xp lu li dy chuyn
duyt su t nt gc (nh xut pht S).
<Thm S, nh du S thm>;
<y S vo ngn xp>;
{Dy chuyn quy ban u ch c mt nh S}
repeat
<Ly u khi ngn xp>;
{ang ng nh u}
if <u c nh k cha thm> then
begin
<Ch chn ly 1 nh v, l nh u tin k u m cha c thm>;
<Thng bo thm v>;
<y u tr li ngn xp>;
{Gi li a ch quay lui}
<y tip v vo ngn xp>;
{Dy chuyn duyt su c "ni" thm v na}
end;
{Cn nu u khng c nh k cha thm th ngn xp s ngn li, tng ng vi qu trnh li v ca dy chuyn
DFS}

until <Ngn xp rng>;

PROG03_2.PAS * Thut ton tm kim theo chiu su khng quy


program Depth_First_Search_2;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer;
Stack: array[1..max] of Integer;
n, S, F, Last: Integer;
procedure Enter;
{Nhp d liu (t thit b nhp chun)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m, S, F);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init; {Khi to}
begin
FillChar(Free, n, True);
Last := 0;
end;

{Cc nh u cha nh du}


{Ngn xp rng}

procedure Push(V: Integer); {y mt nh V vo ngn xp}


begin Inc(Last);
Stack[Last] := V;
end;
function Pop: Integer;
begin
Pop := Stack[Last];
Dec(Last);
end;

{Ly mt nh khi ngn xp, tr v trong kt qu hm}

procedure DFS;
var
u, v: Integer;
begin
Write(S, ', '); Free[S] := False;
Push(S);
su} repeat

{Thm S, nh du S thm}
{Khi ng dy chuyn duyt

{Dy chuyn duyt su ang l S...u}

u := Pop;
{u l im cui ca dy chuyn duyt su hin ti}
for v := 1 to n do
if Free[v] and a[u, v] then
{Chn v l nh u tin cha thm k vi u, nu c:}
begin
Write(v, ', '); Free[v] := False; {Thm v, nh du v thm}
Trace[v] := u;
{Lu vt ng i}
Push(u); Push(v);
{Dy chuyn duyt su by gi l S...uv}
Break;
end;
until Last = 0; {Ngn xp rng}
end;

procedure Result;
{In ng i t S ti F}
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
DFS; Result;
Close(Input);
Close(Output);
end.

V d: Vi th di y (S = 1), Ta th theo di qu trnh thc hin th tc tm kim theo chiu


su dng ngn xp v i snh th t cc nh c thm vi th t t 1st n 6th trong cy tm
kim ca th tc DFS dng quy.
4

2
1

Trc ht ta thm nh 1 v y n vo ngn xp.


Bc lp
1
2
3
4
5
6
7
8
9
10
11

Ngn xp
(1)
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)

1
2
3
5
3
2
4
6
4
2
1

2
3
5
Khng c
Khng c
4
6
Khng c
Khng c
Khng c
Khng c

Ngn xp sau mi bc
(1, 2)
(1, 2, 3)
(1, 2, 3, 5)
(1, 2, 3)
(1, 2)
(1, 2, 4)
(1, 2, 4, 6)
(1, 2, 4)
(1, 2)
(1)

Gii thch
Tin su xung thm 2
Tin su xung thm 3
Tin su xung thm 5
Li li
Li li
Tin su xung thm 4
Tin su xung thm 6
Li li
Li li
Li li
Li ht dy chuyn, Xong

Trn y l phng php da vo tnh cht ca th tc quy tm ra phng php m phng n.


Tuy nhin, trn m hnh th th ta c th c mt cch vit khc tt hn cng khng quy: Th
nhn li cch thm nh ca DFS: T mt nh u, chn ly mt nh v k n m cha thm ri tin
su xung thm v. Cn nu mi nh k u u thm th li li mt bc v lp li qu trnh tng

t, vic li li ny c th thc hin d dng m khng cn dng Stack no c, bi vi mi nh u


c mt nhn Trace[u] (l nh m t m ta ti thm u), khi quay lui t u s li v .
Vy nu ta ang ng nh u, th nh k tip phi thm ti s c tm nh trong hm FindNext
di y:
function FindNext(uV): V;

{Tm nh s thm sau nh u, tr v 0 nu mi nh ti c t S u

thm}

begin
repeat
for (v K(u)) do
if <v cha thm> then

{Nu u c nh k cha thm th chn nh k u tin cha thm thm

tip}

begin
Trace[v] := u; {Lu vt}
FindNext := v;
Exit;
end;
u := Trace[u]; {Nu khng, li v mt bc. Lu l Trace[S] c gn bng n + 1}
until u = n + 1;
FindNext := 0; { trn khng Exit c tc l mi nh ti c t S duyt xong}
end;
begin

{Thut ton duyt theo chiu

su}

Trace[S] := n + 1;
u := S;
repeat
<Thng bo thm u, nh du u thm>;
u := FindNext(u);
until u = 0;
end;

III. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH)
1. Ci t bng hng i
C s ca phng php ci t ny l "lp lch" duyt cc nh. Vic thm mt nh s ln lch
duyt cc nh k n sao cho th t duyt l u tin chiu rng (nh no gn S hn s c duyt
trc). V d: Bt u ta thm nh S. Vic thm nh S s pht sinh th t duyt nhng nh (x1,
x2, ..., xp) k vi S (nhng nh gn S nht). Khi thm nh x1 s li pht sinh yu cu duyt nhng
nh (u1, u2 ..., uq) k vi x1. Nhng r rng cc nh u ny "xa" S hn nhng nh x nn chng ch
c duyt khi tt c nhng nh x duyt xong. Tc l th t duyt nh sau khi thm x1 s l:
(x2, x3..., xp, u1, u2, ..., uq).
S

x1

u1

u2

x2

...

...

uq

xp

Phi duyt sau xp

Hnh 4: Cy BFS

Gi s ta c mt danh sch cha nhng nh ang "ch" thm. Ti mi bc, ta thm mt nh u


danh sch v cho nhng nh cha "xp hng" k vi n xp hng thm vo cui danh sch. Chnh
v nguyn tc nn danh sch cha nhng nh ang ch s c t chc di dng hng i
(Queue)
Ta s dng gii thut nh sau:
Bc 1: Khi to:

Cc nh u trng thi cha nh du, ngoi tr nh xut pht S l nh du


Mt hng i (Queue), ban u ch c mt phn t l S. Hng i dng cha cc nh s
c duyt theo th t u tin chiu rng
Bc 2: Lp cc bc sau n khi hng i rng:
Ly u khi hng i, thng bo thm u (Bt u vic duyt nh u)
Xt tt c nhng nh v k vi u m cha c nh du, vi mi nh v :
1. nh du v.
2. Ghi nhn vt ng i t u ti v (C th lm chung vi vic nh du)
3. y v vo hng i (v s ch c duyt ti nhng bc sau)
Bc 3: Truy vt tm ng i.
PROG03_3.PAS * Thut ton tm kim theo chiu rng dng hng i
program Breadth_First_Search_1;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean; {Free[v] v cha c xp vo hng i ch
thm}

Trace: array[1..max] of Integer;


Queue: array[1..max] of Integer;
n, S, F, First, Last: Integer;
procedure Enter;
{Nhp d liu}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m, S, F);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
{Khi to}
begin
FillChar(Free, n, True);

{Cc nh u cha nh

du}

Free[S] := False;

{Ngoi tr nh

S}

Queue[1] := S;

{Hng i ch gm c mt nh

S}

Last := 1;
First := 1;
end;
procedure Push(V: Integer); {y mt nh V vo hng i}
begin Inc(Last);
Queue[Last] := V;
end;
function Pop: Integer;
begin
Pop := Queue[First];
Inc(First);
end;
procedure BFS;
var

{Ly mt nh khi hng i, tr v trong kt qu hm}

{Thut ton tm kim theo chiu rng}

u, v: Integer;
begin
repeat
u := Pop;
{Ly mt nh u khi hng i}
Write(u, ', ');
{Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then
{Xt nhng nh v cha nh du k
u}

begin
Push(v);
{a v vo hng i ch thm}
Free[v] := False;
{nh du v}
Trace[v] := u;
{Lu vt ng i: nh lin trc v trong ng i t S l u}
end;
until First > Last;
{Cho ti khi hng i rng}
end;
procedure Result;
{In ng i t S ti F}
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.

V d: Xt th di y, nh xut pht S = 1.
4

2
1

Hng i
(1)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6)

nh u
(ly ra t hng i)
1
2
3
4
5
6

Hng i
(sau khi ly u ra)

(3)
(4)
(5)
(6)

8
5

Cc nh v k u m
cha ln lch

Hng i sau khi y


nhng nh v vo

2, 3
4
5
6
Khng c
Khng c

(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6)

th t cc phn t ly ra khi hng i, ta thy trc ht l 1; sau n 2, 3; ri mi ti 4, 5;


cui cng l 6. R rng l nh gn S hn s c duyt trc. V nh vy, ta c nhn xt: nu kt
hp lu vt tm ng i th ng i t S ti F s l ng i ngn nht (theo ngha qua t cnh
nht)
2. Ci t bng thut ton loang
Cch ci t ny s dng hai tp hp, mt tp "c" cha nhng nh "ang xt", mt tp "mi"
cha nhng nh "s xt". Ban u tp "c" ch gm mi nh xut pht, ti mi bc ta s dng tp
"c" tnh tp "mi", tp "mi" s gm nhng nh cha c thm m k vi mt nh no ca
tp "c". Lp li cng vic trn (sau khi gn tp "c" bng tp "mi") cho ti khi tp c l rng:
4

1
3

Hnh 5: Thut ton loang

Gii thut loang c th dng nh sau:


Bc 1: Khi to
Cc nh khc S u cha b nh du, nh S b nh du, tp "c" Old := {S}
Bc 2: Lp cc bc sau n khi Old =
t tp "mi" New = , sau dng tp "c" tnh tp "mi" nh sau:
Xt cc nh u Old, vi mi nh u :
Thng bo thm u
Xt tt c nhng nh v k vi u m cha b nh du, vi mi nh v :
nh du v
Lu vt ng i, nh lin trc v trong ng i Sv l u
a v vo tp New
Gn tp "c" Old := tp "mi" New v lp li (c th lun phin vai tr hai tp ny)
Bc 3: Truy vt tm ng i.
PROG03_4.PAS * Thut ton tm kim theo chiu rng dng phng php loang
program Breadth_First_Search_2;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer;
Old, New: set of Byte;
n, S, F: Byte;
procedure Enter;
{Nhp d liu}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m, S, F);

for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
begin
FillChar(Free, n, True);
Free[S] := False; {Cc nh u cha nh du, ngoi tr nh S nh du}
Old := [S];
{Tp "c" khi to ban u ch c mi S}
end;
procedure BFS; {Thut ton loang}
var
u, v: Byte;
begin
repeat {Lp: dng Old tnh New}
New := [];
for u := 1 to n do
if u in Old then {Xt nhng nh u trong tp Old, vi mi nh u :}
begin
Write(u, ', '); {Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then {Qut tt c nhng nh v cha b nh du m k vi u}
begin
Free[v] := False; {nh du v v lu vt ng i}
Trace[v] := u;
New := New + [v]; {a v vo tp New}
end;
end;
Old := New;
{Gn tp "c" := tp "mi" v lp li}
until Old = []; {Cho ti khi khng loang c na}
end;
procedure Result;
begin
WriteLn;
if Free[F] then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init;
BFS;
Result;
Close(Input);
Close(Output);
end.

IV. PHC TP TNH TON CA BFS V DFS


Qu trnh tm kim trn th bt u t mt nh c th thm tt c cc nh cn li, khi cch
biu din th c nh hng ln ti chi ph v thi gian thc hin gii thut:
Trong trng hp ta biu din th bng danh sch k, c hai thut ton BFS v DFS u c
phc tp tnh ton l O(n + m) = O(max(n, m)). y l cch ci t tt nht.
Nu ta biu din th bng ma trn k nh trn th phc tp tnh ton trong trng hp
2
2
ny l O(n + n ) = O(n ).
Nu ta biu din th bng danh sch cnh, thao tc duyt nhng nh k vi nh u s dn ti
vic phi duyt qua ton b danh sch cnh, y l ci t ti nht, n c phc tp tnh ton
l O(n.m).

4. TNH LIN THNG CA TH


I. NH NGHA
1. i vi th v hng G = (V, E)
G gi l lin thng (connected) nu lun tn ti ng i gia mi cp nh phn bit ca th.
*
Nu G khng lin thng th chc chn n s l hp ca hai hay nhiu th con lin thng, cc
th con ny i mt khng c nh chung. Cc th con lin thng ri nhau nh vy c gi l
cc thnh phn lin thng ca th ang xt (Xem v d).
G2

G1
G3

Hnh 6: th G v cc thnh phn lin thng G1, G2, G3 ca n

i khi, vic xo i mt nh v tt c cc cnh lin thuc vi n s to ra mt th con mi c


nhiu thnh phn lin thng hn th ban u, cc nh nh th gi l nh ct hay im khp.
Hon ton tng t, nhng cnh m khi ta b n i s to ra mt th c nhiu thnh phn lin
thng hn so vi th ban u c gi l mt cnh ct hay mt cu.

Hnh 7: Khp v cu

2. i vi th c hng G = (V, E)
C hai khi nim v tnh lin thng ca th c hng tu theo chng ta c quan tm ti hng
ca cc cung khng.
G gi l lin thng mnh (Strongly connected) nu lun tn ti ng i (theo cc cung nh
hng) gia hai nh bt k ca th, g gi l lin thng yu (weakly connected) nu th v
hng nn ca n l lin thng

Hnh 8: Lin thng mnh v Lin thng yu

th G = (V, E) l con ca th G' = (V', E') nu G l th c VV' v E E'

II. TNH LIN THNG TRONG TH V HNG


Mt bi ton quan trng trong l thuyt th l bi ton kim tra tnh lin thng ca th v
hng hay tng qut hn: Bi ton lit k cc thnh phn lin thng ca th v hng.
Gi s th v hng G = (V, E) c n nh nh s 1, 2, ..., n.
lit k cc thnh phn lin thng ca G phng php c bn nht l:
nh du nh 1 v nhng nh c th n t 1, thng bo nhng nh thuc thnh phn lin
thng th nht.
Nu tt c cc nh u b nh du th G l th lin thng, nu khng th s tn ti mt
nh v no cha b nh du, ta s nh du v v cc nh c th n c t v, thng bo
nhng nh thuc thnh phn lin thng th hai.
V c tip tc nh vy cho ti khi tt c cc nh u b nh du
procedure Duyt(u)
begin
<Dng BFS hoc DFS lit k v nh du nhng nh c th n c t u>
end;
begin
for v V do <khi to v cha nh du>;
Count := 0;
for u := 1 to n do
if <u cha nh du> then
begin
Count := Count + 1;
WriteLn('Thnh phn lin thng th ', Count, ' gm cc nh : ');
Duyt(u);
end;
end.

Vi thut ton lit k cc thnh phn lin thng nh th ny, th phc tp tnh ton ca n ng
bng phc tp tnh ton ca thut ton tm kim trn th trong th tc Duyt.
III. TH Y V THUT TON WARSHALL
1. nh ngha:
th y vi n nh, k hiu Kn, l mt n th v hng m gia hai nh bt k ca n
u c cnh ni.
n.(n 1)
2
cnh v bc ca mi nh u bng n - 1.
th y Kn c ng: C n
2

K3

K4

K5

Hnh 9: th y

2. Bao ng th:
Vi th G = (V, E), ngi ta xy dng th G' = (V, E') cng gm nhng nh ca G cn cc
cnh xy dng nh sau: ( y quy c gia u v u lun c ng i)
Gia nh u v v ca G' c cnh ni Gia nh u v v ca G c ng i
th G' xy dng nh vy c gi l bao ng ca th G.

T nh ngha ca th y , ta d dng suy ra mt th y bao gi cng lin thng v t


nh ngha th lin thng, ta cng d dng suy ra c:

Mt n th v hngl lin thng nu v ch nu bao ng ca n l th y

Mt n th v hng c k thnh phn lin thng nu v ch nu bao ng ca n c k


thnh phn lin thng y .

Hnh 10: n th v hng v bao ng ca n

Bi vic kim tra mt th c phi th y hay khng c th thc hin kh d dng (m s


cnh chng hn) nn ngi ta ny ra tng c th kim tra tnh lin thng ca th thng qua
vic kim tra tnh y ca bao ng. Vn t ra l phi c thut ton xy dng bao ng ca
mt th cho trc v mt trong nhng thut ton l:
3. Thut ton Warshall
Thut ton Warshall - gi theo tn ca Stephen Warshall, ngi m t thut ton ny vo nm
1960, i khi cn c gi l thut ton Roy-Warshall v Roy cng m t thut ton ny vo
nm 1959. Thut ton c th m t rt gn:
T ma trn k A ca n th v hng G (aij = True nu (i, j) l cnh ca G) ta s sa i A
n tr thnh ma trn k ca bao ng bng cch: Vi mi nh k xt theo th t t 1 ti n, ta xt
tt c cc cp nh (u, v): nu c cnh ni (u, k) (auk = True) v c cnh ni (k, v) (akv = True)
th ta t ni thm cnh (u, v) nu n cha c (t auv := True). T tng ny da trn mt quan
st n gin nh sau: Nu t u c ng i ti k v t k li c ng i ti v th tt nhin t u s c
ng i ti v.
Vi n l s nh ca th, ta c th vit thut ton Warshall nh sau:
for k := 1 to n do
for u := 1 to n do
if a[u, k] then
for v := 1 to n do
if a[k, v] then a[u, v] := True;

hoc
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];

Vic chng minh tnh ng n ca thut ton i hi phi lt li cc l thuyt v bao ng bc cu


v quan h lin thng, ta s khng trnh by y. C nhn xt rng tuy thut ton Warshall rt d
3
ci t nhng phc tp tnh ton ca thut ton ny kh ln (O(n )).
Di y, ta s th ci t thut ton Warshall tm bao ng ca n th v hng sau m s
thnh phn lin thng ca th:
Vic ci t thut ton s qua nhng bc sau:
1. Nhp ma trn k A ca th (Lu y A[v, v] lun c coi l True vi v)
2. Dng thut ton Warshall tm bao ng, khi A l ma trn k ca bao ng th

3. Da vo ma trn k A, nh 1 v nhng nh k vi n s thuc thnh phn lin thng th nht;


vi nh u no khng k vi nh 1, th u cng vi nhng nh k n s thuc thnh phn lin
thng th hai; vi nh v no khng k vi c nh 1 v nh u, th v cng vi nhng nh k
n s thuc thnh phn lin thng th ba v.v...
u

Input: file vn bn GRAPH.INP


Dng 1: Cha s nh n ( 100) v s cnh m ca th cch nhau t nht mt du cch
m dng tip theo, mi dng cha mt cp s u v v cch nhau t nht mt du cch tng trng
cho mt cnh (u, v)
Output: file vn bn GRAPH.OUT
Lit k cc thnh phn lin thng

1
3
2
5
4

12

10

11

GRAPH.INP
12 9
1 3
1 4
1 5
2 4
6 7
6 8
9 10
9 11
11 12

GRAPH.OUT
Connected Component 1:
1, 2, 3, 4, 5,
Connected Component 2:
6, 7, 8,
Connected Component 3:
9, 10, 11, 12,

PROG04_1.PAS * Thut ton Warshall lit k cc thnh phn lin thng


program Connectivity;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th}
Free: array[1..max] of Boolean;
{Free[v] = True v cha c lit k vo thnh phn lin thng
no}

k, u, v, n: Integer;
Count: Integer;
procedure Enter;
{Nhp th}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for v := 1 to n do a[v, v] := True; {D nhin t v c ng i n chnh v}
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;

end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
{Thut ton Warshall}

for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];
Count := 0;
FillChar(Free, n, True); {Mi nh u cha c lit k vo thnh phn lin thng no}
for u := 1 to n do
if Free[u] then
{Vi mt nh u cha c lit k vo thnh phn lin thng no}
begin
Inc(Count);
WriteLn('Connected Component ', Count, ': ');
for v := 1 to n do
if a[u, v] then
{Xt nhng nh k u (trn bao
ng)}

begin
Write(v, ', ');
Free[v] := False;
end;
WriteLn;
end;
Close(Input);
Close(Output);
end.

{Lit k nh vo thnh phn lin thng cha u}


{Lit k nh no nh du nh }

IV. CC THNH PHN LIN THNG MNH


i vi th c hng, ngi ta quan tm n bi ton kim tra tnh lin thng mnh, hay tng
qut hn: Bi ton lit k cc thnh phn lin thng mnh ca th c hng. i vi bi ton
ta c mt phng php kh hu hiu da trn thut ton tm kim theo chiu su Depth First
Search.
1. Phn tch
Thm vo th mt nh x v ni x vi tt c cc nh cn li ca th bng cc cung nh
hng. Khi qu trnh tm kim theo chiu su bt u t x c th coi nh mt qu trnh xy dng
cy tm kim theo chiu su (cy DFS) gc x.
procedure Visit(uV);
begin
<Thm u vo cy tm kim DFS>;
for (v: (u, v)E) do
if <v khng thuc cy DFS> then Visit(v);
end;
begin
<Thm vo th nh x v cc cung nh hng (x, v) vi mi v>;
<Khi to cy tm kim DFS := >;
Visit(x);
end.

th tc thm nh quy Visit(u). Th tc ny xt tt c nhng nh v ni t u, nu v cha


c thm th i theo cung thm v, tc l b sung cung (u, v) vo cy tm kim DFS. Nu v
thm th c ba kh nng xy ra i vi v tr ca u v v trong cy tm kim DFS:

1.

v l tin bi (ancestor - t tin) ca u, tc l v c thm trc u v th tc Visit(u) do dy


chuyn quy t th tc Visit(v) gi ti. Cung (u, v) khi c gi l cung ngc (Back
edge)
2.
v l hu du (descendant - con chu) ca u, tc l u c thm trc v, nhng th tc Visit(u)
sau khi tin quy theo mt hng khc gi Visit(v) ri. Nn khi dy chuyn quy li li
v th tc Visit(u) s thy v l thm nn khng thm li na. Cung (u, v) khi gi l
cung xui (Forward edge).
3.
v thuc mt nhnh ca cy DFS duyt trc , tc l s c mt nh w c thm trc
c u v v. Th tc Visit(w) gi trc s r theo mt nhnh no thm v trc, ri khi li li,
r sang mt nhnh khc thm u. Cung (u, v) khi gi l cung cho (Cross edge)
(Rt tic l t in thut ng tin hc Anh-Vit qu ngho nn nn khng th tm ra nhng t tng
ng vi cc thut ng trn. Ta c th hiu qua cc v d)
1st

1st
5th

5th
2nd

1st

2nd

5th

2nd

6th

3rd
u
4th

TH1: v l tin bi ca u
(u, v) l cung ngc

6th

3rd

6th

3rd

7th

7th

v
4th

TH2: v l hu du ca u
(u, v) l cung xui

7th

4th

TH3: v nm nhnh DFS duyt


trc u
(u, v l cung cho)

Hnh 11: Ba dng cung ngoi cy DFS

Ta nhn thy mt c im ca thut ton tm kim theo chiu su, thut ton khng ch duyt qua
cc nh, n cn duyt qua tt c nhng cung na. Ngoi nhng cung nm trn cy tm kim, nhng
cung cn li c th chia lm ba loi: cung ngc, cung xui, cung cho.
2. Cy tm kim DFS v cc thnh phn lin thng mnh
nh l 1:
Nu a, b l hai nh thuc thnh phn lin thng mnh C th vi mi ng i t a ti b cng
nh t b ti a. Tt c nh trung gian trn ng i u phi thuc C.
Chng minh
Nu a v b l hai nh thuc C th tc l c mt ng i t a ti b v mt ng i khc t b ti a.
Suy ra vi mt nh v nm trn ng i t a ti b th a ti c v, v ti c b, m b c ng ti
a nn v cng ti c a. Vy v nm trong thnh phn lin thng mnh cha a tc l vC. Tng
t vi mt nh nm trn ng i t b ti a.
nh l 2:
Vi mt thnh phn lin thng mnh C bt k, s tn ti mt nh r C sao cho mi nh ca
C u thuc nhnh DFS gc r.
Chng minh:

Trc ht, nhc li mt thnh phn lin thng mnh l mt th con lin thng mnh ca th
ban u tho mn tnh cht ti i tc l vic thm vo thnh phn mt tp hp nh khc s lm
mt i tnh lin thng mnh.
Trong s cc nh ca C, chn r l nh c thm u tin theo thut ton tm kim theo chiu
su. Ta s chng minh C nm trong nhnh DFS gc r. Tht vy: vi mt nh v bt k ca C, do C
lin thng mnh nn phi tn ti mt ng i t r ti v:
(r = x0, x1, ..., xk = v)
T nh l 1, tt c cc nh x1, x2, ..., xk u thuc C nn chng s phi thm sau nh r. Khi th
tc Visit(r) c gi th tt c cc nh x1, x2..., xk=v u cha thm; v th tc Visit(r) s lit k tt
c nhng nh cha thm n c t r bng cch xy dng nhnh gc r ca cy DFS, nn cc nh
x1, x2, ..., xk = v s thuc nhnh gc r ca cy DFS. Bi chn v l nh bt k trong C nn ta c iu
phi chng minh.
nh r trong chng minh nh l - nh thm trc tt c cc nh khc trong C - gi l cht ca
thnh phn C. Mi thnh phn lin thng mnh c duy nht mt cht. Xt v v tr trong cy tm
kim DFS, cht ca mt thnh phn lin thng l nh nm cao nht so vi cc nh khc thuc
thnh phn , hay ni cch khc: l tin bi ca tt c cc nh thuc thnh phn .
nh l 3:
Lun tm c nh cht a tho mn: Qu trnh tm kim theo chiu su bt u t a khng
thm c bt k mt cht no khc. (Tc l nhnh DFS gc a khng cha mt cht no ngoi a)
chng hn ta chn a l cht c thm sau cng trong mt dy chuyn quy hoc chn a l cht
thm sau tt c cc cht khc. Vi cht a nh vy th cc nh thuc nhnh DFS gc a chnh l
thnh phn lin thng mnh cha a.
Chng minh:
Vi mi nh v nm trong nhnh DFS gc a, xt b l cht ca thnh phn lin thng mnh cha v.
Ta s chng minh a b. Tht vy, theo nh l 2, v phi nm trong nhnh DFS gc b. Vy v nm
trong c nhnh DFS gc a v nhnh DFS gc b. Gi s phn chng rng ab th s c hai kh nng
xy ra:
b

a
...

...
...
a

b
...
...

...

Kh nng 1: a b v

...

v
...

...
...

...

v
...

Kh nng 1: b a v

Kh nng 1: Nhnh DFS gc a cha nhnh DFS gc b, c ngha l th tc Visit(b) s do th


tc Visit(a) gi ti, iu ny mu thun vi gi thit rng a l cht m qu trnh tm kim theo
chiu su bt u t a khng thm mt cht no khc.
Kh nng 2: Nhnh DFS gc a nm trong nhnh DFS gc b, c ngha l a nm trn mt
ng i t b ti v. Do b v v thuc cng mt thnh phn lin thng mnh nn theo nh l 1,
a cng phi thuc thnh phn lin thng mnh . Vy th thnh phn lin thng mnh ny c
hai cht a v b. iu ny v l.

Theo nh l 2, ta c thnh phn lin thng mnh cha a nm trong nhnh DFS gc a, theo
chng minh trn ta li c: Mi nh trong nhnh DFS gc a nm trong thnh phn lin thng
mnh cha a. Kt hp li c: Nhnh DFS gc a chnh l thnh phn lin thng mnh cha a.
3. Thut ton Tarjan (R.E.Tarjan - 1972)
Chn u l cht m t qu trnh tm kim theo chiu su khng thm thm bt k mt cht no
khc, chn ly thnh phn lin thng mnh th nht l nhnh DFS gc u. Sau loi b nhnh DFS
gc u ra khi cy DFS, li tm thy mt nh cht v khc m nhnh DFS gc v khng cha cht no
khc, li chn ly thnh phn lin thng mnh th hai l nhnh DFS gc v. Tng t nh vy cho
thnh phn lin thng mnh th ba, th t, v.v... C th hnh dung thut ton Tarjan "b" cy DFS
ti v tr cc cht c cc nhnh ri rc, mi nhnh l mt thnh phn lin thng mnh.
1

2
8

3
4

4
9

10

10

6
11
7

11
7

Hnh 12: Thut ton Tarjan "b" cy DFS

Trnh by di dng nh vy, nhng iu quan trng nht by gi mi ni ti: Lm th no kim


tra mt nh v no c phi l cht hay khng ?
Hy nhnh DFS gc nh r no .
Nhn xt 1:
Nu nh t cc nh thuc nhnh gc r ny khng c cung ngc hay cung cho no i ra khi
nhnh th r l cht. iu ny d hiu bi nh vy c ngha l t r, i theo cc cung ca th
th ch n c nhng nh thuc nhnh m thi. Vy:
Thnh phn lin thng mnh cha r Tp cc nh c th n t r = Nhnh DFS gc r
nn r l cht.
Nhn xt 2:
Nu t mt nh v no ca nhnh DFS gc r c mt cung ngc ti mt nh w l tin bi
ca r, th r khng l cht. Tht vy: do c chu trnh (wrvw) nn w, r, v thuc cng mt
thnh phn lin thng mnh. M w c thm trc r, iu ny mu thun vi cch xc nh cht
(Xem li nh l 2)
Nhn xt 3:
Vn phc tp gp phi y l nu t mt nh v ca nhnh DFS gc r, c mt cung cho i ti
mt nhnh khc. Ta s thit lp gii thut lit k thnh phn lin thng mnh ngay trong th tc
Visit(u), khi m nh u duyt xong, tc l khi cc nh khc ca nhnh DFS gc u u
thm v qu trnh thm quy li li v Visit(u). Nu nh u l cht, ta thng bo nhnh DFS gc u
l thnh phn lin thng mnh cha u v loi ngay cc nh thuc thnh phn khi th cng
nh khi cy DFS. C th chng minh c tnh ng n ca phng php ny, bi nu nhnh
DFS gc u cha mt cht u' khc th u' phi duyt xong trc u v c nhnh DFS gc u' b loi

b ri. Hn na cn c th chng minh c rng, khi thut ton tin hnh nh trn th nu nh t
mt nh v ca mt nhnh DFS gc r c mt cung cho i ti mt nhnh khc th r khng l
cht.
chng t iu ny, ta da vo tnh cht ca cy DFS: cung cho s ni t mt nhnh ti nhnh
thm trc , ch khng bao gi c cung cho i ti nhnh thm sau. Gi s c cung cho (v, v')
i t v nhnh DFS gc r ti v' nhnh DFS gc r, gi r' l cht ca thnh phn lin thng cha
v'. Theo tnh cht trn, v' phi thm trc r, suy ra r' cng phi thm trc r. C hai kh nng xy
ra:

Nu r' thuc nhnh DFS duyt trc r th r' s c duyt xong trc khi thm r, tc l khi
thm r v c sau ny khi thm v th nhnh DFS gc r' b hu, cung cho (v, v') s khng
c tnh n na.

Nu r' l tin bi ca r th ta c r' n c r, v nm trong nhnh DFS gc r nn r n c


v, v n c v' v (v, v') l cung, v' li n c r' bi r' l cht ca thnh phn lin thng
mnh cha v'. Ta thit lp c chu trnh (r'rvv'r'), suy ra r' v r thuc cng mt
thnh phn lin thng mnh, r' l cht nn r khng th l cht na.
T ba nhn xt v cch ci t chng trnh nh trong nhn xt 3, Ta c: nh r l cht nu v ch
nu khng tn ti cung ngc hoc cung cho ni mt nh thuc nhnh DFS gc r vi mt nh
ngoi nhnh , hay ni cch khc: r l cht nu v ch nu khng tn ti cung ni t mt nh
thuc nhnh DFS gc r ti mt nh thm trc r.
Di y l mt ci t ht sc thng minh, ch cn sa i mt cht th tc Visit trn l ta c
ngay phng php ny. Ni dung ca n l nh s th t cc nh t nh c thm u tin n
nh thm sau cng. nh ngha Numbering[u] l s th t ca nh u theo cch nh s . Ta tnh
thm Low[u] l gi tr Numbering nh nht trong cc nh c th n c t mt nh v no
ca nhnh DFS gc u bng mt cung (vi gi thit rng u c mt cung gi ni vi chnh u).
C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u v khi gn
Low[u] := Numbering[u] (u c cung ti chnh u)
Xt tt c nhng nh v ni t u:

Nu v thm th ta cc tiu ho Low[u] theo cng thc:


Low[u]mi := min(Low[u]c, Numbering[v]).

Nu v cha thm th ta gi quy i thm v, sau cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Low[v])
D dng chng minh c tnh ng n ca cng thc tnh.
Khi duyt xong mt nh u (chun b thot khi th tc Visit(u). Ta so snh Low[u] v
Numbering[u]. Nu nh Low[u] = Numbering[u] th u l cht, bi khng c cung ni t mt nh
thuc nhnh DFS gc u ti mt nh thm trc u. Khi ch vic lit k cc nh thuc thnh phn
lin thng mnh cha u l nhnh DFS gc u.
cng vic d dng hn na, ta nh ngha mt danh sch L c t chc di dng ngn xp v
dng ngn xp ny ly ra cc nh thuc mt nhnh no . Khi thm ti mt nh u, ta y ngay
nh u vo ngn xp, th khi duyt xong nh u, mi nh thuc nhnh DFS gc u s c y
vo ngn xp L ngay sau u. Nu u l cht, ta ch vic ly cc nh ra khi ngn xp L cho ti khi ly
ti nh u l s c nhnh DFS gc u cng chnh l thnh phn lin thng mnh cha u.
procedure Visit(uV);
begin

Count := Count + 1; Numbering[u] := Count; {Trc ht nh s u}


Low[u] := Numbering[u];
<a u vo cy DFS>;
<y u vo ngn xp L>;
for (v: (u, v)E) do
if <v thm> then
Low[u] := min(Low[u], Numbering[v])
else
begin
Visit(v);
Low[u] := min(Low[u], Low[v]);
end;
if Numbering[u] = Low[u] then {Nu u l cht}
begin
<Thng bo thnh phn lin thng mnh vi cht u gm c cc nh:>;
repeat
<Ly t ngn xp L ra mt nh v>;
<Output v>;
<Xo nh v khi th>;
until v = u;
end;
end;
begin
<Thm vo
<Khi to
<Khi to
<Khi to
Visit(x)
end.

th mt nh x v cc cung (x, v) vi mi v>;


mt bin m Count := 0>;
mt ngn xp L := >;
cy tm kim DFS := >;

Bi thut ton Tarjan ch l sa i mt cht thut ton DFS, cc thao tc vo/ra ngn xp c
thc hin khng qu n ln. Vy nn nu th c n nh v m cung th phc tp tnh ton ca
2

thut ton Tarjan vn l O(n + m) trong trng hp biu din th bng danh sch k, l O(n )
trong trng hp biu din bng ma trn k v l O(n.m) trong trng hp biu din bng danh
sch cnh.
Mi th sn sng, di y l ton b chng trnh. Trong chng trnh ny, ta s dng:

Ma trn k A biu din th.

Mng Free kiu Boolean, Free[u] = True nu u cha b lit k vo thnh phn lin thng no,
tc l u cha b loi khi th.

Mng Numbering v Low vi cng dng nh trn, quy c Numbering[u] = 0 nu nh u


cha c thm.

Mng Stack, th tc Push, hm Pop m t cu trc ngn xp.


Input: file vn bn GRAPH.INP:

Dng u: Ghi s nh n ( 100) v s cung m ca th cch nhau mt du cch

m dng tip theo, mi dng ghi hai s nguyn u, v cch nhau mt du cch th hin c cung
(u, v) trong th
Output: file vn bn GRAPH.OUT
Lit k cc thnh phn lin thng mnh

2
8
3
4
9

10

6
11
7

GRAPH.INP
11 15
1 2
1 8
2 3
3 4
4 2
4 5
5 6
6 7
7 5
8 9
9 4
9 10
10 8
10 11
11 8

GRAPH.OUT
Component 1:
7, 6, 5,
Component 2:
4, 3, 2,
Component 3:
11, 10, 9, 8,
Component 4:
1,

PROG04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh
program Strong_connectivity;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Numbering, Low, Stack: array[1..max] of Integer;
n, Count, ComponentCount, Last: Integer;
procedure Enter;
{Nhp d liu (t thit b nhp chun)}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
end;
end;
procedure Init;
{Khi to}
begin
FillChar(Numbering, SizeOf(Numbering), 0);
thm} FillChar(Free, SizeOf(Free), True);
Last := 0;
Count := 0;
ComponentCount := 0;
end;

{Mi nh u cha
{Cha nh no b loi}
{Ngn xp rng}
{Bin nh s th t thm}
{Bin nh s cc thnh phn lin thng}

procedure Push(v: Integer);


begin Inc(Last);
Stack[Last] := v;
end;

{y mt nh v vo ngn xp}

function Pop: Integer;


begin
Pop := Stack[Last];
Dec(Last);
end;

{Ly mt nh khi ngn xp, tr v trong kt qu hm}

function Min(x, y: Integer): Integer;


begin
if x < y then Min := x else Min := y;
end;
procedure Visit(u: Integer);

{Thut ton tm kim theo chiu su bt u

t u}

var
v: Integer;
begin
Inc(Count); Numbering[u] := Count; {Trc ht nh s cho u}
Low[u] := Numbering[u]; {Coi u c cung ti u, nn c th khi gn Low[u] th ny ri sau cc tiu ho dn}
Push(u);
{y u vo ngn xp}
for v := 1 to n do
if Free[v] and a[u, v] then {Xt nhng nh v k u}
if Numbering[v] <> 0 then {Nu v thm}
Low[u] := Min(Low[u], Numbering[v]) {Cc tiu ho Low[u] theo cng thc ny}
else
{Nu v cha thm}
begin
Visit(v);
{Tip tc tm kim theo chiu su bt u t v}
Low[u] := Min(Low[u], Low[v]);
{Ri cc tiu ho Low[u] theo cng thc
end;

ny}

{n y th nh u c duyt xong, tc l cc nh thuc nhnh DFS gc u u thm}


if Numbering[u] = Low[u] then {Nu u l cht}
begin
{Lit k thnh phn lin thng mnh c cht u}

Inc(ComponentCount);
WriteLn('Component ', ComponentCount, ': ');
repeat
v := Pop;
{Ly dn cc nh ra khi ngn xp}
Write(v, ', ');
{Lit k cc nh }
Free[v] := False; {Ri loi lun khi
th} until v = u;
{Cho ti khi ly ti nh
u} WriteLn;
end;

end;
procedure Solve;
var
u: Integer;
begin
{Thay v thm mt nh gi x v cc cung (x, v) vi mi nh v ri gi Visit(x), ta c th lm th ny cho nhanh}
{sau ny phi hu b thnh phn lin thng gm mi mt nh gi }

for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
Enter;
Init; Solve;
Close(Input);
Close(Output);
end.

Bi tp:
1. Phng php ci t nh trn c th ni l rt hay v hiu qu, i hi ta phi hiu r bn cht
thut ton, nu khng th rt d nhm. Trn thc t, cn c mt phng php khc d hiu hn, tuy
tnh hiu qu c km hn mt cht. Hy vit chng trnh m t phng php sau:
Vn dng thut ton tm kim theo chiu su vi th tc Visit ni u mc, nh s li cc nh t
1 ti n theo th t duyt xong, sau o chiu tt c cc cung ca th. Xt ln lt cc nh

theo th t t nh duyt xong sau cng ti nh duyt xong u tin, vi mi nh , ta li dng


thut ton tm kim trn th (BFS hay DFS) lit k nhng nh no n c t nh ang xt,
chnh l mt thnh phn lin thng mnh. Lu l khi lit k xong thnh phn no, ta loi ngay cc
nh ca thnh phn khi th.
Tnh ng n ca phng php c th hnh dung khng my kh khn:
Trc ht ta thm vo th nh x v cc cung (x, v) vi mi v, sau gi Visit(x) xy dng
cy DFS gc x. Hin nhin x l cht ca thnh phn lin thng ch gm mi x. Sau b nh x
khi cy DFS, cy s phn r thnh cc cy con.
nh r duyt xong sau cng chc chn l gc ca mt cy con (bi khi duyt xong n chc chn s
li v x) suy ra r l cht. Hn th na, nu mt nh u no ti c r th u cng phi thuc cy
con gc r. Bi nu gi s phn chng rng u thuc cy con khc th u phi c thm trc r (do
cy con gc r c thm ti sau cng), c ngha l khi Visit(u) th r cha thm. Vy nn r s thuc
nhnh DFS gc u, mu thun vi lp lun r l gc. T suy ra nu u ti c r th r ti c u, tc
l khi o chiu cc cung, nu r ti c nh no th nh thuc thnh phn lin thng cht r.
Loi b thnh phn lin thng vi cht r khi th. Cy con gc r li phn r thnh nhiu cy con.
Lp lun tng t nh trn vi v' l nh duyt xong sau cng.
V d:
11

10

8
6

9
2

9
10

1
11

nh s li, o chiu cc cung v duyt BFS vi cch chn cc nh xut pht ngc li vi th t duyt xong
(Th t 11, 10... 3, 2, 1)

2. Thut ton Warshall c th p dng tm bao ng ca th c hng, vy hy kim tra tnh lin
thng mnh ca mt th c hng bng hai cch: Dng cc thut ton tm kim trn th v
thut ton Warshall, sau so snh u, nhc im ca mi phng php
3. M cung hnh ch nht kch thc m x n gm cc vung n v. Trn mi k t:
O: Nu an ton
X: Nu c cm by
E: Nu l c mt nh thm him ang ng.
Duy nht ch c 1 ghi ch E. Nh thm him c th t mt i sang mt trong s cc chung
cnh vi ang ng. Mt cch i thot khi m cung l mt hnh trnh i qua cc an ton ra mt
bin. Hy ch gip cho nh thm him mt hnh trnh thot ra khi m cung

4. Trn mt phng vi h to Decattes vung gc cho n ng trn, mi ng trn xc nh bi


b 3 s thc (X, Y, R) y (X, Y) l to tm v R l bn knh. Hai ng trn gi l thng
nhau nu chng c im chung. Hy chia cc ng trn thnh mt s ti thiu cc nhm sao cho
hai ng trn bt k trong mt nhm bt k c th i c sang nhau sau mt s hu hn cc bc
di chuyn gia hai ng trn thng nhau.

5. VI NG DNG CA CC THUT TON TM KIM TRN TH


I. XY DNG CY KHUNG CA TH
Cy l th v hng, lin thng, khng c chu trnh n. th v hng khng c chu trnh
n gi l rng (hp ca nhiu cy). Nh vy mi thnh phn lin thng ca rng l mt cy.
Khi nim cy c s dng rng ri trong nhiu lnh vc khc nhau: Nghin cu cu trc cc phn
t hu c, xy dng cc thut ton t chc th mc, cc thut ton tm kim, lu tr v nn d
liu...
1. nh l (Daisy Chain Theorem)
Gi s T = (V, E) l th v hng vi n nh. Khi cc mnh sau l tng ng:
1. T l cy
2. T khng cha chu trnh n v c n - 1 cnh
3. T lin thng v mi cnh ca n u l cu
4. Gia hai nh bt k ca T u tn ti ng mt ng i n
5. T khng cha chu trnh n nhng h c thm vo mt cnh ta thu c mt chu trnh n.
6. T lin thng v c n - 1 cnh
Chng minh:
12: "T l cy" "T khng cha chu trnh n v c n - 1 cnh"
T T l cy, theo nh ngha T khng cha chu trnh n. Ta s chng minh cy T c n nh th
phi c n - 1 cnh bng quy np theo s nh n. R rng khi n = 1 th cy c 1 nh s ch a 0 cnh.
Nu n > 1 th do th hu hn nn s cc ng i n trong T cng hu hn, gi P = (v1, v2, ...,
vk) l mt ng i di nht (qua nhiu cnh nht) trong T. nh v1 khng th c cnh ni vi nh
no trong s cc nh v3, v4, ..., vk. Bi nu c cnh (v1, vp) (3 p k) th ta s thit lp c chu
trnh n (v1, v2, ..., vp, v1). Mt khc, nh v1 cng khng th c cnh ni vi nh no khc ngoi
cc nh trn P trn bi nu c cnh (v1, v0) (v0P) th ta thit lp c ng i (v0, v1, v2, ..., vk)
di hn ng i P. Vy nh v1 ch c ng mt cnh ni vi v2 hay v1 l nh treo. Loi b v1 v
cnh (v1, v2) khi T ta c th mi cng l cy v c n - 1 nh, cy ny theo gi thit quy np
c n - 2 cnh. Vy cy T c n - 1 cnh.
23: "T khng cha chu trnh n v c n - 1 cnh""T lin thng v mi cnh ca n u
l cu"
Gi s T c k thnh phn lin thng T1, T2, ..., Tk. V T khng cha chu trnh n nn cc thnh
phn lin thng ca T cng khng cha chu trnh n, tc l cc T1, T2, ..., Tk u l cy. Gi n1, n2,
..., nk ln lt l s nh ca T1, T2, ..., Tk th cy T1 c n1 - 1 cnh, cy T2 c n2 - 1 cnh..., cy Tk
c nk - 1 cnh. Cng li ta c s cnh ca T l n1 + n2 + ... + nk - k = n - k cnh. Theo gi thit, cy
T c n - 1 cnh, suy ra k = 1, th ch c mt thnh phn lin thng l th lin thng.
By gi khi T lin thng, nu b i mt cnh ca T th T s cn n - 2 cnh v s khng lin
thng bi nu T vn lin thng th do T khng c chu trnh nn T s l cy v c n - 1 cnh. iu
chng t mi cnh ca T u l cu.
34: "T lin thng v mi cnh ca n u l cu""Gia hai nh bt k ca T c ng
mt ng i n"
Gi x v y l 2 nh bt k trong T, v T lin thng nn s c mt ng i n t x ti y. Nu tn
ti mt ng i n khc t x ti y th nu ta b i mt cnh (u, v) nm trn ng i th nht
nhng khng nm trn ng i th hai th t u vn c th n c v bng cch: i t u i theo

chiu ti x theo cc cnh thuc ng th nht, sau i t x ti y theo ng th hai, ri li i t


y ti v theo cc cnh thuc ng i th nht. iu ny mu thun vi gi thit (u, v) l cu.
45: "Gia hai nh bt k ca T c ng mt ng i n""T khng cha chu trnh
n nhng h c thm vo mt cnh ta thu c mt chu trnh n"
Th nht T khng cha chu trnh n v nu T cha chu trnh n th chu trnh qua t nht hai
nh u, v. R rng dc theo cc cnh trn chu trnh th t u c hai ng i n ti v. V l.
Gia hai nh u, v bt k ca T c mt ng i n ni u vi v, vy khi thm cnh (u, v) vo
ng i ny th s to thnh chu trnh.
56: "T khng cha chu trnh n nhng h c thm vo mt cnh ta thu c mt chu
trnh n""T lin thng v c n - 1 cnh"
Gi u v v l hai nh bt k trong T, thm vo T mt cnh (u, v) na th theo gi thit s to thnh
mt chu trnh cha cnh (u, v). Loi b cnh ny i th phn cn li ca chu trnh s l mt ng
i t u ti v. Mi cp nh ca T u c mt ng i ni chng tc l T lin thng, theo gi thit T
khng cha chu trnh n nn T l cy v c n - 1 cnh.
61: "T lin thng v c n - 1 cnh""T l cy"
Gi s T khng l cy th T c chu trnh, hu b mt cnh trn chu trnh ny th T vn lin thng,
nu th mi nhn c vn c chu trnh th li hu mt cnh trong chu trnh mi. C nh th cho
ti khi ta nhn c mt th lin thng khng c chu trnh. th ny l cy nhng li c < n - 1
cnh (v l). Vy T l cy
2. nh ngha
Gi s G = (V, E) l th v hng. Cy T = (V, F) vi FE gi l cy khung ca th G. Tc l
nu nh loi b mt s cnh ca G c mt cy th cy gi l cy khung (hay cy bao trm
ca th).
D thy rng vi mt th v hng lin thng c th c nhiu cy khung.

T1
T2
Hnh 13: th G v mt s v d cy khung T1, T2, T3 ca n

T3

iu kin cn v mt th v hng c cy khung l th phi lin thng


n-2

S cy khung ca th y Kn l n .
3. Thut ton xy dng cy khung
Xt th v hng lin thng G = (V, E) c n nh, c nhiu thut ton xy dng cy khung ca G
a) Xy dng cy khung bng thut ton hp nht
Trc ht, t T = (V, ); T khng cha cnh no th c th coi T gm n cy ri rc, mi cy ch c
1 nh. Sau xt ln lt cc cnh ca G, nu cnh ang xt ni hai cy khc nhau trong T th
thm cnh vo T, ng thi hp nht hai cy li thnh mt cy. C lm nh vy cho ti khi
kt np n - 1 cnh vo T th ta c T l cy khung ca th. Cc phng php kim tra cnh

c ni hai cy khc nhau hay khng cng nh k thut hp nht hai cy s c bn k hn trong
thut ton Kruskal 9.
b) Xy dng cy khung bng cc thut ton tm kim trn th.
p dng thut ton BFS hay DFS bt u t nh S, ti mi bc t nh u ti thm nh v, ta thm
vo thao tc ghi nhn lun cnh (u, v) vo cy khung. Do th lin thng nn thut ton s xut
pht t S v ti thm tt c cc nh cn li, mi nh ng mt ln, tc l qu trnh duyt s ghi
nhn c ng n - 1 cnh. Tt c nhng cnh khng to thnh chu trnh n bi thut ton
khng thm li nhng nh thm. Theo mnh tng ng th hai, ta c nhng cnh ghi nhn
c to thnh mt cy khung ca th.
1

10

11

10

11

Hnh 14: Cy khung DFS v cy khung BFS (Mi tn ch chiu i thm cc nh)

II. TP CC CHU TRNH C BN CA TH


Xt mt th v hng lin thng G = (V, E); gi T = (V, F) l mt cy khung ca n. Cc cnh
ca cy khung c gi l cc cnh trong, cn cc cnh khc l cc cnh ngoi.
Nu thm mt cnh ngoi eE \ F vo cy khung T, th ta c ng mt chu trnh n trong T, k
hiu chu trnh ny l Ce. Tp cc chu trnh:
= {Ce eE \ F}
c gi l tp cc chu trnh c s ca th G.
Cc tnh cht quan trng ca tp cc chu trnh c s:
1. Tp cc chu trnh c s l ph thuc vo cy khung, hai cy khung khc nhau c th cho hai
tp chu trnh c s khc nhau.
2. Nu th lin thng c n nh v m cnh, th trong cy khung c n - 1 cnh, cn li m - n + 1
cnh ngoi. Tng ng vi mi cnh ngoi c mt chu trnh c s, vy s chu trnh c s ca
th lin thng l m - n + 1.
3. Tp cc chu trnh c s l tp nhiu nht cc chu trnh tho mn: Mi chu trnh c ng mt
cnh ring, cnh khng nm trong bt c mt chu trnh no khc. Bi nu c mt tp gm t
chu trnh tho mn iu th vic loi b cnh ring ca mt chu trnh s khng lm mt tnh
lin thng ca th, ng thi khng nh hng ti s tn ti ca cc chu trnh khc. Nh vy
nu loi b tt c cc cnh ring th th vn lin thng v cn m - t cnh. th lin thng th
khng th c t hn n - 1 cnh nn ta c m - t n - 1 hay t m - n + 1.
4. Mi cnh trong mt chu trnh n bt k u phi thuc mt chu trnh c s. Bi nu c
mt cnh (u, v) khng thuc mt chu trnh c s no, th khi ta b cnh i th vn lin
thng v khng nh hng ti s tn ti ca cc chu trnh c s. Li b tip nhng cnh ngoi

ca cc chu trnh c s th th vn lin thng v cn li m - (m - n + 1) - 1 = n - 2 cnh. iu


ny v l.
5. i vi th G = (V, E) c n nh v m cnh, c k thnh phn lin thng, ta c th xt cc
thnh phn lin thng v xt rng cc cy khung ca cc thnh phn . Khi c th m rng
khi nim tp cc chu trnh c s cho th v hng tng qut: Mi khi thm mt cnh khng
nm trong cc cy khung vo rng, ta c ng mt chu trnh n, tp cc chu trnh n to
thnh bng cch ghp cc cnh ngoi nh vy gi l tp cc chu trnh c s ca th G. S cc
chu trnh c s l m - n + k.
III. NH CHIU TH V BI TON LIT K CU
Bi ton t ra l cho mt th v hng lin thng G = (V, E), hy thay mi cnh ca th bng
mt cung nh hng c mt th c hng lin thng mnh. Nu c phng n nh chiu
nh vy th G c gi l th nh chiu c. Bi ton nh chiu th c ng dng r nht
trong s giao thng ng b. Chng hn nh tr li cu hi: Trong mt h thng ng ph,
liu c th quy nh cc ng ph thnh ng mt chiu m vn m bo s i li gia hai
nt giao thng bt k hay khng.
1. Php nh chiu DFS
Xt m hnh duyt th bng thut ton tm kim theo chiu su bt u t nh 1. V th l v
hng lin thng nn qu trnh tm kim s thm c ht cc nh.
procedure Visit(u V);
begin
<Thng bo thm u v nh du u thm>;
for (v: (u, v) E) do
if <v cha thm> then Visit(v);
end;
begin
<nh du mi nh u cha thm>;
Visit(1);
end;

Coi mt cnh ca th tng ng vi hai cung c hng ngc chiu nhau. Thut ton tm
kim theo chiu su theo m hnh trn s duyt qua ht cc nh ca th v tt c cc cung na.
Qu trnh duyt cho ta mt cy tm kim DFS. Ta c cc nhn xt sau:
Nhn xt 1:
Qu trnh duyt s khng c cung cho (cung i t mt nhnh DFS thm sau ti nhnh DFS thm
trc). Tht vy, nu qu trnh duyt xt ti mt cung (u, v):
Nu u thm trc v c ngha l khi Visit(u) c gi th v cha thm, v th tc Visit(u) s xy
dng nhnh DFS gc u gm nhng nh cha thm n c t u, suy ra v nm trong nhnh
DFS gc u v l hu du ca u, hay (u, v) l cung DFS hoc cung xui.
Nu u thm sau v (v thm trc u), tng t trn, ta suy ra u nm trong nhnh DFS gc v, v l
tin bi ca u (u, v) l cung ngc.
Nhn xt 2:
Trong qu trnh duyt th theo chiu su, nu c duyt qua cung (u, v) no th ta b i cung (v,
u). (Tc l h duyt qua cung (u, v) th ta nh chiu lun cnh (u, v) theo chiu t u ti v), ta c
mt php nh chiu th gi l php nh chiu DFS.

2
3

10

10

Hnh 15: Php nh chiu DFS

Nhn xt 3:
Vi php nh chiu nh trn, th s ch cn cc cung trn cy DFS v cung ngc, khng cn li
cung xui. Bi trn th v hng ban u, nu ta coi mt cnh l hai cung c hng ngc chiu
nhau th vi mt cung xui ta c cung ngc chiu vi n l cung ngc. Do tnh cht DFS, cung
ngc c duyt trc cung xui tng ng, nn khi nh chiu cnh theo cung ngc th cung
xui s b hu v khng b xt ti na.
Nhn xt 4:
Trong th v hng ban u, cnh b nh hng thnh cung ngc chnh l cnh ngoi ca cy
khung DFS. Chnh v vy, mi chu trnh c s trong th v hng ban u vn s l chu
trnh trong th c hng to ra. (y l mt phng php hiu qu lit k cc chu trnh c s
ca cy khung DFS: Va duyt DFS va nh chiu, nu duyt phi cung ngc (u, v) th truy vt
ng i ca DFS tm ng t v n u, sau ni thm cung ngc (u, v) c mt chu
trnh c s).
nh l: iu kin cn v mt th v hng lin thng c th nh chiu c l mi
cnh ca th nm trn t nht mt chu trnh n (Hay ni cch khc mi cnh ca th u
khng phi l cu).
Chng minh:
Gi G = (V, E) l mt th v hng lin thng.
""
Nu G l nh chiu c th sau khi nh hng s c th lin thng mnh G'. Vi mt cnh
c nh chiu thnh cung (u, v) th s tn ti mt ng i n trong G' theo cc cnh nh
hng t v v u. ng i ni thm cung (u, v) s thnh mt chu trnh n c hng trong G'.
Tc l trn th ban u, cnh (u, v) nm trn mt chu trnh n.
""
Nu mi cnh ca G u nm trn mt chu trnh n, ta s chng minh rng: php nh chiu DFS
s to ra th G' lin thng mnh.
Trc ht ta chng minh rng nu (u, v) l cnh ca G th s c mt ng i t u ti v trong
G'. Tht vy, v (u, v) nm trong mt chu trnh n, m mi cnh ca mt chu trnh n u
phi thuc mt chu trnh c s no , nn s c mt chu trnh c s cha c u v v. Chu trnh

c s qua php nh chiu DFS vn l chu trnh trong G' nn i theo cc cnh nh hng ca
chu trnh , ta c th i t u ti v v ngc li.
Nu u v v l 2 nh bt k ca G th do G lin thng, tn ti mt ng i (u=x0, x1, ..., xn=v).
V (xi, xi + 1) l cnh ca G nn trong G', t xi c th n c xi+1. Suy ra t u cng c th n
c v bng cc cnh nh hng ca G'.
2. Ci t
Vi nhng kt qu chng minh trn, ta cn suy ra c: Nu th lin thng v mi cnh ca
n nm trn t nht mt chu trnh n th php nh chiu DFS s cho mt th lin thng mnh.
Cn nu khng, th php nh chiu DFS s cho mt th nh hng c t thnh phn lin thng
mnh nht, mt cnh khng nm trn mt chu trnh n no (cu) ca th ban u s c nh
hng thnh cung ni gia hai thnh phn lin thng mnh.
Ta s ci t mt thut ton vi mt th v hng: lit k cc cu v nh chiu cc cnh
c mt th mi c t thnh phn lin thng mnh nht:
nh s cc nh theo th t thm DFS, gi Numbering[u] l s th t ca nh u theo cch nh
s . Trong qu trnh tm kim DFS, duyt qua cnh no nh chiu lun cnh . nh ngha
thm Low[u] l gi tr Numbering nh nht ca nhng nh n c t nhnh DFS gc u bng mt
cung ngc. Tc l nu nhnh DFS gc u c nhiu cung ngc hng ln trn pha gc cy th ta
ghi nhn li cung ngc hng ln cao nht. Nu nhnh DFS gc u khng cha cung ngc th ta
cho Low[u] = +. C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u (Numbering[u]) v khi gn
Low[u] = +.
Sau , xt tt c nhng nh v k u, nh chiu cnh (u, v) thnh cung (u, v). C hai kh nng
xy ra:
v cha thm th ta gi Visit(v) thm v v cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Low[v])
v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]c, Numbering[v])
D thy cch tnh nh vy l ng n bi nu v cha thm th nhnh DFS gc v nm trong
nhnh DFS gc u v nhng cung ngc trong nhnh DFS gc v cng l cung ngc trong nhnh
DFS gc u. Cn nu v thm th (u, v) s l cung ngc.
1 1

1
1

2
1

3
4
4

3 8

5
4

9
10 3

8
6
9

10

th v hng

7 5

th nh chiu, Gi tr Numbering[u] ghi trong vng trn,


Gi tr Low[u] ghi bn cnh
Hnh 16: Php nh s v ghi nhn cung ngc ln cao nht

Nu t nh u ti thm nh v, (u, v) l cung DFS. Khi nh v c duyt xong, li v th tc


Visit(u), ta so snh Low[v] v Numbering[u]. Nu Low[v] > Numbering[u] th tc l nhnh DFS
gc v khng c cung ngc thot ln pha trn v. Tc l cnh (u, v) khng thuc mt chu trnh c
s no c, tc cnh l cu.
{ th G = (V, E)}
procedure Visit(uV);
begin
<nh s th t thm cho nh u (Numbering[u]); Khi gn Low[u] := +>;
for (v: (u, v)E) do
begin
<nh chiu cnh (u, v) thnh cung (u, v) Loi b cung (v, u)>;
if <v cha thm> then
begin
Visit(v);
if Low[v] > Numbering[u] then <In ra cu (u, v)>;
Low[u] := Min(Low[u], Low[v]);
{Cc tiu ho Low[u] theo Low[v]}
end
else {v thm}
Low[u] := Min(Low[u], Numbering[v]);
{Cc tiu ho Low[u] theo Numbering[v]}
end;
end;
begin
for (uV) do
if <u cha thm> then Visit(u);
<In ra cch nh chiu>;
end.

Input: file vn bn GRAPH.INP


Dng 1 ghi s nh n (n 100) v s cnh m ca th cch nhau t nht mt du cch
m dng tip theo, mi dng ghi hai s nguyn dng u, v cch nhau t nht mt du cch, cho
bit th c cnh ni nh u vi nh v
Output: file vn bn GRAPH.OUT
Thng bo cc cu v php nh chiu c t thnh phn lin thng mnh nht

1
3

2
4

10

11

GRAPH.INP
11 14
1 2
1 3
2 3
2 4
4 5
4 6
4 9
5 7
5 10
6 8
7 10
7 11
8 9
10 11

GRAPH.OUT
Bridges:
(4, 5)
(2, 4)
Directed Edges:
1 -> 2
2 -> 3
2 -> 4
3 -> 1
4 -> 5
4 -> 6
5 -> 7
6 -> 8
7 -> 10
8 -> 9
9 -> 4
10 -> 5
10 -> 11
11 -> 7

PROG05_1.PAS * Php nh chiu DFS v lit k cu


program Directivity_and_Bridges;

const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
{Ma trn k ca th}
Numbering, Low: array[1..max] of Integer;
n, Count: Integer;
procedure Enter;
var
f: Text;
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
Assign(f, 'GRAPH.INP'); Reset(f);
ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
procedure Init;
begin
FillChar(Numbering, SizeOf(Numbering), 0); {Numbering[u] = 0 u cha thm}
Count := 0;
end;
procedure Visit(u: Integer);
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; {nh s th t thm cho nh u, u tr thnh thm}
Low[u] := n + 1;
{Khi gn Low[u] bng mt gi tr ln hn tt c
Numbering} for v := 1 to n do
if a[u, v] then {Xt mi nh v k u}
begin
a[v, u] := False;
{nh chiu cnh (u, v) thnh cung (u, v)}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Visit(v);
{i thm v}
if Low[v] > Numbering[u] then {(u, v) l cu}
WriteLn('(', u, ', ', v, ')');
if Low[u] > Low[v] then Low[u] := Low[v];
{Cc tiu ho Low[u] }
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
end;
end;
procedure Solve;
var
u, v: Integer;
begin
WriteLn('Bridges: ');
{Dng DFS nh chiu th v lit k cu}
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
WriteLn('Directed Edges: ');
{Qut li ma trn k in ra cc cnh nh hng}
for u := 1 to n do
for v := 1 to n do
if a[u, v] then WriteLn(u, ' -> ', v);

end;
begin
Enter;
Init;
Solve;
end.

IV. LIT K KHP


Trong th v hng, Mt nh C c gi l khp, nu nh ta b i nh C v cc cnh lin
thuc vi n th s lm tng s thnh phn lin thng ca th. Bi ton t ra l phi lit k ht
cc khp ca th.
R rng theo cch nh ngha trn, cc nh treo v nh c lp s khng phi l khp. th lin
thng c 3 nh, khng c khp (cho d b i nh no th vn lin thng) c gi l th
song lin thng. Gia hai nh phn bit ca th song lin thng, tn ti t nht 2 ng i khng
c nh trung gian no chung.
Coi mi cnh ca th ban u l hai cung c hng ngc chiu nhau v dng php duyt th
theo chiu su:
{ th G = (V, E)}
procedure Visit(u V): V;
begin
<Thng bo thm u v nh du u thm>;
for (v: (u, v) E) do
if <v cha thm> then Visit(v);
end;
begin
<nh du mi nh u cha thm>;
for (uV) do
if <u cha thm> then Visit(u);
end;

Qu trnh duyt cho mt rng cc cy DFS. Cc cung duyt qua c ba loi: cung DFS, cung ngc
v cung xui, khng b ri hnh, ta ch u tin v cung DFS hoc cung ngc:

11

2
3
12
4

13

10

17

14

15

16

Hnh 17: Duyt DFS, xc nh cy DFS v cc cung ngc

Hy nhnh DFS gc nh r no
Nu mi nhnh con ca nhnh DFS gc r u c mt cung ngc ln ti mt tin bi ca r th r
khng l khp. Bi nu trong th ban u, ta b r i th t mi nh bt k ca nhnh con, ta

vn c th i ln mt tin bi ca r, ri i sang nhnh con khc hoc i sang tt c nhng nh


cn li ca cy. S thnh phn lin thng ca th khng thay i.
Nu r khng phi l gc ca mt cy DFS, v tn ti mt nhnh con ca nhnh DFS gc r
khng c cung ngc ln mt tin bi ca r th r l khp. Bi khi , tt c nhng cung xut
pht t nhnh con ch i ti nhng nh ni b trong nhnh DFS gc r m thi, trn th
ban u, khng tn ti cnh ni t nhng nh thuc nhnh con ti mt tin bi ca r. Vy t
nhnh mun i ln mt tin bi ca r, tt phi i qua r. Hu r khi th s lm mt tt c
cc ng i , tc l lm tng s thnh phn lin thng ca th.
Nu r l gc ca mt cy DFS, th r l khp khi v ch khi r c t nht hai nhnh con. Bi khi r
c 2 nhnh con th ng i gia hai nh thuc hai nhnh con tt phi i qua r.
Vy th thut ton lit k khp li l nhng k thut quen thuc, duyt DFS, nh s, ghi nhn
cnh ngc ln cao nht t mt nhnh con, ch thm vo mt thao tc nh: Nu t nh u gi
quy thm nh v ((u, v) l cung DFS) th sau khi duyt xong nh v, li v th tc Visit(u), ta
so snh Low[v] v Numbering[u] kim tra xem t nhnh con gc v c cnh ngc no ln
tin bi ca u hay khng, nu khng c th tm thi nh du u l khp. Cui cng phi kim
tra li iu kin: nu u l gc cy DFS th n l khp khi v ch khi n c t nht 2 nhnh con,
nu khng tho mn iu kin th nh du li u khng l khp.
Input: file vn bn GRAPH.INP vi khun dng nh bi ton lit k cu
Output: Danh sch cc khp ca th
2
1

5
4
10

9
8

13

7
11

12

GRAPH.INP
13 15
1 3
2 4
2 5
3 6
3 7
4 8
4 11
5 9
5 10
6 7
8 11
8 12
9 10
9 13
11 12

GRAPH.OUT
Cut vertices:
2, 3, 4, 5, 9,

PROG05_2.PAS * Lit k cc khp ca th


program CutVertices;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
{Ma trn k ca th}
Numbering, Low, nC: array[1..max] of Integer; {nC[u]: S nhnh con ca nhnh DFS gc u}
Mark: array[1..max] of Boolean;
{Mark[u] = True u l khp}
n, Count: Integer;
procedure LoadGraph;
{Nhp th (t thit b nhp chun Input)}
var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);

ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True; a[v, u] := True;
end;
end;
procedure Visit(u: Integer);
{Tm kim theo chiu su bt u t u}
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; Low[u] := n + 1; nC[u] := 0;
Mark[u] := False;
for v := 1 to n do
if a[u, v] then
{Xt mi v k u}
if Numbering[v] = 0 then
{Nu v cha thm}
begin
Inc(nc[u]);
{Tng bin m s con ca u ln 1}
Visit(v);
{Thm v}

{Nu nhnh DFS gc v khng c cung ngc ln mt tin bi ca u tc l Low[v] Numbering[u]}


Mark[u] := Mark[u] or (Low[v] >= Numbering[u]);
{Tm nh du u l khp}
if Low[u] > Low[v] then Low[u] := Low[v];
{Cc tiu ho Low[u] }

end;

end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }

procedure Solve;
var
u: Integer;
begin
FillChar(Numbering, SizeOf(Numbering), 0);
{nh s = 0 nh cha thm}
FillChar(Mark, SizeOf(Mark), False);
{Mng nh du khp cha c g}
Count := 0;
for u := 1 to n do
if Numbering[u] = 0 then
{Xt mi nh u cha thm}
begin
Visit(u);
{Thm u, xy dng cy DFS gc u}
if nC[u] < 2 then
{Nu u c t hn 2 con}
Mark[u] := False;
{Th u khng phi l
khp}

end;
end;
procedure Result;
{Da vo mng nh du lit k cc khp}
var
i: Integer;
begin
WriteLn('Cut vertices:');
for i := 1 to n do
if Mark[i] then Write(i, ', ');
end;
begin
Assign(Input, 'GRAPH.INP'); Reset(Input);
Assign(Output, 'GRAPH.OUT'); Rewrite(Output);
LoadGraph;
Solve;
Result;
Close(Input);
Close(Output);
end.

6. CHU TRNH EULER, NG I EULER, TH EULER

I. BI TON 7 CI CU
Thnh ph Konigsberg thuc Ph (nay l Kaliningrad thuc Cng ho Nga), c chia lm 4 vng
bng cc nhnh sng Pregel. Cc vng ny gm 2 vng bn b sng (B, C), o Kneiphof (A) v
mt min nm gia hai nhnh sng Pregel (D). Vo th k XVIII, ngi ta xy 7 chic cu ni
nhng vng ny vi nhau. Ngi dn y t hi: Liu c cch no xut pht ti mt a im
trong thnh ph, i qua 7 chic cu, mi chic ng 1 ln ri quay tr v ni xut pht khng ?
Nh ton hc Thy s Leonhard Euler gii bi ton ny v c th coi y l ng dng u tin
ca L thuyt th, ng m hnh ho s 7 ci cu bng mt a th, bn vng c biu
din bng 4 nh, cc cu l cc cnh. Bi ton tm ng qua 7 cu, mi cu ng mt ln c th
tng qut ho bng bi ton: C tn ti chu trnh n trong a th cha tt c cc cnh ?.
C

B
B

Hnh 18: M hnh th ca bi ton by ci cu

II. NH NGHA
1. Chu trnh n cha tt c cc cnh ca th c gi l chu trnh Euler
2. ng i n cha tt c cc cnh ca th c gi l ng i Euler
3. Mt th c chu trnh Euler c gi l th Euler
4. Mt th c ng i Euler c gi l th na Euler.
R rng mt th Euler th phi l na Euler nhng iu ngc li th khng phi lun ng
III. NH L
1. Mt th v hng lin thng G = (V, E) c chu trnh Euler khi v ch khi mi nh ca n
u c bc chn: deg(v) 0 (mod 2) (vV)
2. Mt th v hng lin thng c ng i Euler nhng khng c chu trnh Euler khi v
ch khi n c ng 2 nh bc l
3. Mt thi c hng lin thng yu G = (V, E) c chu trnh Euler th mi nh ca n c bn
+

bc ra bng bn bc vo: deg (v) = deg (v) (vV); Ngc li, nu G lin thng yu v mi
nh ca n c bn bc ra bng bn bc vo th G c chu trnh Euler, hay G s l lin thng
mnh.
4. Mt th c hng lin thng yu G = (V, E) c ng i Euler nhng khng c chu trnh
+

Euler nu tn ti ng hai nh u, v V sao cho deg (u) - deg (u) = deg (v) - deg (v) = 1, cn
tt c nhng nh khc u v v u c bn bc ra bng bn bc vo.

IV. THUT TON FLEURY TM CHU TRNH EULER


1. i vi th v hng lin thng, mi nh u c bc chn.
Xut pht t mt nh, ta chn mt cnh lin thuc vi n i tip theo hai nguyn tc sau:
Xo b cnh i qua
Ch i qua cu khi khng cn cnh no khc chn
V ta c chn cnh i mt cch thoi mi nh vy cho ti khi khng i tip c na, ng i tm
c l chu trnh Euler.
V d: Vi th sau:
5

2
7

7
1

8
3

8
3

Nu xut pht t nh 1, c hai cch i tip: hoc sang 2 hoc sang 3, gi s ta s sang 2 v xo
cnh (1, 2) va i qua. T 2 ch c cch duy nht l sang 4, nn cho d (2, 4) l cu ta cng phi i
sau xo lun cnh (2, 4). n y, cc cnh cn li ca th c th v nh trn bng nt lin,
cc cnh b xo c v bng nt t.
By gi ang ng nh 4 th ta c 3 cch i tip: sang 3, sang 5 hoc sang 6. V (4, 3) l cu nn
ta s khng i theo cnh (4, 3) m s i (4, 5) hoc (4, 6). Nu i theo (4, 5) v c tip tc i nh
vy, ta s c chu trnh Euler l (1, 2, 4, 5, 7, 8, 6, 4, 3, 1). Cn i theo (4, 6) s tm c chu trnh
Euler l: (1, 2, 4, 6, 8, 7, 5, 4, 3, 1).
2. i vi th c hng lin thng yu, mi nh u c bn bc ra bng bn bc vo.
Bng cch "lm dng thut ng", ta c th m t c thut ton tm chu trnh Euler cho c th
c hng cng nh v hng:
Th nht, di y nu ta ni cnh (u, v) th hiu l cnh ni nh u v nh v trn th v
hng, hiu l cung ni t nh u ti nh v trn th c hng.
Th hai, ta gi cnh (u, v) l "mt i khng tr li" nu nh t u ta i ti v theo cnh , sau
xo cnh i th khng c cch no t v quay li u.
Vy th thut ton Fleury tm chu trnh Euler c th m t nh sau:
Xut pht t mt nh, ta i mt cch tu theo cc cnh tun theo hai nguyn tc: Xo b cnh
va i qua v ch chn cnh "mt i khng tr li" nu nh khng cn cnh no khc chn.
V. CI T
Ta s ci t thut ton Fleury trn mt a th v hng. n gin, ta coi th ny c chu
trnh Euler, cng vic ca ta l tm ra chu trnh thi. Bi vic kim tra tnh lin thng cng nh
kim tra mi nh u c bc chn n gi c th coi l chuyn nh.
Input: file vn bn EULER.INP
Dng 1: Cha s nh n ca th (n 100)
Cc dng tip theo, mi dng cha 3 s nguyn dng cch nhau t nht 1 du cch c dng: u
v k cho bit gia nh u v nh v c k cnh ni
Output: file vn bn EULER.OUT ghi chu trnh EULER

EULER.INP
4
1 2 1
1 3 2
1 4 1
2 3 1
3 4 1

EULER.OUT
1
2

PROG06_1.PAS * Thut ton Fleury tm chu trnh Euler


program Euler_Circuit;
const
max = 100;
var
a: array[1..max, 1..max] of Integer;
n: Integer;
procedure Enter;
{Nhp d liu t thit b nhp chun Input}
var
u, v, k: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n);
while not SeekEof do
begin
ReadLn(u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
end;
{Th tc ny kim tra nu xo mt cnh ni (x, y) th y c cn quay li c x hay khng}

function CanGoBack(x, y: Integer): Boolean;


var
Queue: array[1..max] of Integer; {Hng i dng cho Breadth First Search}
First, Last: Integer; {First: Ch s u hng i, Last: Ch s cui hng i}
u, v: Integer;
Free: array[1..max] of Boolean; {Mng nh du}
begin
Dec(a[x, y]); Dec(a[y, x]);
{Th xo mt cnh (x, y) S cnh ni (x, y) gim 1}
FillChar(Free, n, True);
{sau p dng BFS xem t y c quay li x c
khng ?} Free[y] := False;
First := 1; Last := 1;
Queue[1] := y;
repeat
u := Queue[First]; Inc(First);
for v := 1 to n do
if Free[v] and (a[u, v] > 0) then
begin
Inc(Last);
Queue[Last] := v;
Free[v] := False;
if Free[x] then Break;
end;
until First > Last;
CanGoBack := not Free[x];
Inc(a[x, y]); Inc(a[y, x]); { trn th xo cnh th gi phi phc hi}
end;
procedure FindEulerCircuit; {Thut ton Fleury}
var
Current, Next, v, count: Integer;

begin
Current := 1;
Write(1:5); {Bt u t nh Current = 1}
count := 1;
repeat
Next := 0;
for v := 1 to n do
if a[Current, v] > 0 then
begin
Next := v;
if CanGoBack(Current, Next) then Break;
end;
if Next <> 0 then
begin
Dec(a[Current, Next]);
Dec(a[Next, Current]);
{Xo b cnh va i
qua} Write(Next:5);
{In kt qu i ti Next}
Inc(count);
if count mod 16 = 0 then WriteLn; {In ra ti a 16 nh trn mt dng}
Current := Next;
{Li tip tc vi nh ang ng l Next}
end;
until Next = 0; {Cho ti khi khng i tip c na}
WriteLn;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
end.

VI. THUT TON TT HN


Trong trng hp th Euler c s cnh nh, ta c th s dng phng php sau tm chu
trnh Euler trong th v hng: Bt u t mt chu trnh n C bt k, chu trnh ny tm c
bng cch xut pht t mt nh, i tu theo cc cnh cho ti khi quay v nh xut pht, lu l
i qua cnh no xo lun cnh . Nu nh chu trnh C tm c cha tt c cc cnh ca th th
l chu trnh Euler. Nu khng, xt cc nh dc theo chu trnh C, nu cn c cnh cha xo lin
thuc vi mt nh u no th li t u, ta i tu theo cc cnh cng theo nguyn tc trn cho ti
khi quay tr v u, c mt chu trnh n khc qua u. Loi b v tr u khi chu trnh C v chn
vo C chu trnh mi tm c ti ng v tr ca u va xo, ta c mt chu trnh n C' mi ln
hn chu trnh C. C lm nh vy cho ti khi c chu trnh Euler. Vic chng minh tnh ng n
ca thut ton cng l chng minh nh l v iu kin cn v mt th v hng lin thng
c chu trnh Euler.
M hnh thut ton c th vit nh sau:
<Khi to mt ngn xp Stack ban u ch gm mi nh 1>;
<M t cc phng thc Push (y vo) v Pop(ly ra) mt nh t ngn xp Stack,
phng thc Get cho bit phn t nm nh Stack. Khc vi Pop, phng thc Get
ch cho bit phn t nh Stack ch khng ly phn t ra>;
while Stack do
begin
x := Get;
if <Tn ti nh y m (x, y)E> then {T x cn i hng khc c}
begin
Push(y);

<Loi b cnh (x, y) khi th>;


end
else {T x khng i tip c ti u na}
begin
x := Pop;
<In ra nh x trn ng i Euler>;
end;
end;

Thut ton trn c th dng tm chu trnh Euler trong th c hng lin thng yu, mi nh
c bn bc ra bng bn bc vo. Tuy nhin th t cc nh in ra b ngc so vi cc cung nh
hng, ta c th o ngc hng cc cung trc khi thc hin thut ton c th t ng.
Thut ton hot ng vi hiu qu cao, d ci t, nhng trng hp xu nht th Stack s phi cha
ton b danh sch nh trn chu trnh Euler chnh v vy m khi a th c s cnh qu ln th s
khng khng gian nh m t Stack (Ta c th vi th ch gm 2 nh nhng gia hai nh
6
c ti 10 cnh ni s thy ngay). L do thut ton ch c th p dng trong trng hp s cnh c
gii hn bit trc nh l nh vy.
PROG06_2.PAS * Thut ton hiu qu tm chu trnh Euler
program Euler_Circuit;
const
max = 100;
maxE = 20000;
{S cnh ti a}
var
a: array[1..max, 1..max] of Integer;
stack: array[1..maxE] of Integer;
n, last: Integer;
procedure Enter;
{Nhp d liu}
var
u, v, k: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n);
while not SeekEof do
begin
ReadLn(u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
end;
procedure Push(v: Integer); {y mt nh v vo ngn xp}
begin Inc(last);
Stack[last] := v;
end;
function Pop: Integer;
begin
Pop := Stack[last];
Dec(last);
end;

{Ly mt nh khi ngn xp, tr v trong kt qu hm}

function Get: Integer;


begin
Get := Stack[last];
end;

{Tr v phn t nh (Top) ngn xp}

procedure FindEulerCircuit;
var

u, v, count: Integer;
begin
Stack[1] := 1;
{Khi to ngn xp ban u ch gm nh 1}
last := 1;
count := 0;
while last <> 0 do {Chng no ngn xp cha rng}
begin
u := Get;
{Xc nh u l phn t nh ngn xp}
for v := 1 to n do
if a[u, v] > 0 then {Xt tt c cc cnh lin thuc vi u, nu thy}
begin
Dec(a[u, v]); Dec(a[v, u]);
{Xo cnh khi th}
Push(v);
{y nh tip theo vo ngn
xp} Break;
end;
if u = Get then
{Nu phn t nh ngn xp vn l u vng lp trn khng tm thy nh no k vi u}
begin
Inc(count);
Write(Pop:5, ' ');
{In ra phn t nh ngn xp}
if count mod 16 = 0 then WriteLn; {Output khng qu 16 s trn mt dng}
end;
end;
end;
begin
Assign(Input, 'EULER.INP'); Reset(Input);
Assign(Output, 'EULER.OUT'); Rewrite(Output);
Enter;
FindEulerCircuit;
Close(Input);
Close(Output);
end.

Bi tp:
Trn mt phng cho n hnh ch nht c cc cnh song song vi cc trc to . Hy ch ra mt chu
trnh:
Ch i trn cnh ca cc hnh ch nht
Trn cnh ca mi hnh ch nht, ngoi tr nhng giao im vi cnh ca hnh ch nht khc
c th qua nhiu ln, nhng im cn li ch c qua ng mt ln.
C

M D A B C M F G N L I J K N H E M

7. CHU TRNH HAMILTON, NG I HAMILTON, TH HAMILTON


I. NH NGHA
Cho th G = (V, E) c n nh
1. Chu trnh (x1, x2, ..., xn, x1) c gi l chu trnh Hamilton nu xi xj vi 1 i < j n
2. ng i (x1, x2, ..., xn) c gi l ng i Hamilton nu xi xj vi 1 i < j n
C th pht biu mt cch hnh thc: Chu trnh Hamilton l chu trnh xut pht t 1 nh, i thm
tt c nhng nh cn li mi nh ng 1 ln, cui cng quay tr li nh xut pht. ng i
Hamilton l ng i qua tt c cc nh ca th, mi nh ng 1 ln. Khc vi khi nim chu
trnh Euler v ng i Euler, mt chu trnh Hamilton khng phi l ng i Hamilton bi c nh
xut pht c thm ti 2 ln.
V d: Xt 3 n th G1, G2, G3 sau:
b

G1

G2

G3

th G1 c chu trnh Hamilton (a, b, c, d, e, a). G2 khng c chu trnh Hamilton v deg(a) = 1
nhng c ng i Hamilton (a, b, c, d). G3 khng c c chu trnh Hamilton ln ng i Hamilton
II. NH L
1.

2.

3.

th v hng G, trong tn ti k nh sao cho nu xo i k nh ny cng vi nhng


cnh lin thuc ca chng th th nhn c s c nhiu hn k thnh phn lin thng. Th
khng nh l G khng c chu trnh Hamilton. Mnh phn o ca nh l ny cho ta iu
kin cn mt th c chu trnh Hamilton
nh l Dirac (1952): th v hng G c n nh (n 3). Khi nu mi nh v ca G u
c deg(v) n/2 th G c chu trnh Hamilton. y l mt iu kin mt th c chu
trnh Hamilton.
+
th c hng G lin thng mnh v c n nh. Nu deg (v) n / 2 v deg (v) n / 2 vi
mi nh v th G c chu trnh Hamilton

III. CI T
Di y ta s ci t mt chng trnh lit k tt c cc chu trnh Hamilton xut pht t nh 1, cc
chu trnh Hamilton khc c th c c bng cch hon v vng quanh. Lu rng cho ti nay,
ngi ta vn cha tm ra mt phng php no thc s hiu qu hn phng php quay lui tm
d ch mt chu trnh Hamilton cng nh ng i Hamilton trong trng hp th tng qut.
Input: file vn bn HAMILTON.INP
Dng 1 ghi s nh n ( 100) v s cnh m ca th cch nhau 1 du cch
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau 1 du cch, th hin u,
v l hai nh k nhau trong th
Output: file vn bn HAMILTON.OUT lit k cc chu trnh Hamilton

1
5

HAMILTON.INP
5 6
1 2
1 3
2 4
3 5
4 1
5 2

PROG07_1.PAS * Thut ton quay


program All_of_Hamilton_Circuits;
const
max = 100;
var
f: Text;
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
X: array[1..max] of Integer;
n: Integer;

HAMILTON.OUT
1 3 5 2 4 1
1 4 2 5 3 1

lui lit k chu trnh Hamilton

{Ma trn k ca th: a[u, v] = True (u, v) l cnh}


{Mng nh du Free[v] = True nu cha i qua nh v}
{Chu trnh Hamilton s tm l; 1=X[1]X[2] ... X[n] X[1]=1}

procedure Enter;
{Nhp d liu t thit b nhp chun Input}
var
i, u, v, m: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure PrintResult; {In kt qu nu tm thy chu trnh Hamilton}
var
i: Integer;
begin
for i := 1 to n do Write(X[i], ' ');
WriteLn(X[1]);
end;
procedure Try(i: Integer); {Th cc cch chn nh th i trong hnh trnh}
var
j: Integer;
begin
for j := 1 to n do
{nh th i (X[i]) c th chn trong nhng nh}
if Free[j] and a[x[i - 1], j] then {k vi X[i - 1] v cha b i qua }
begin
x[i] := j;
{Th mt cch chn X[i]}
if i < n then
{Nu cha th chn n X[n]}
begin
Free[j] := False; {nh du nh j l i qua}
Try(i + 1);
{ cc bc th k tip khng chn phi nh j na}
Free[j] := True;
{S th phng n khc cho X[i] nn s b nh du nh va th}
end
else {Nu th chn n X[n]}
if a[j, X[1]] then PrintResult; {v nu X[n] li k vi X[1] th ta c chu trnh Hamilton}
end;
end;

begin
{nh hng thit b nhp/xut chun}

Assign(Input, 'HAMILTON.INP'); Reset(Input);


Assign(Output, 'HAMILTON.OUT'); Rewrite(Output);
Enter;
FillChar(Free, n, True);
{Khi to: Cc nh u cha i qua}
x[1] := 1; Free[1] := False;
{Bt u t nh 1}
Try(2);
{Th cc cch chn nh k tip}
Close(Input);
Close(Output);
end.

Bi tp:
1. Lp chng trnh nhp vo mt th v ch ra ng mt chu trnh Hamilton nu c.
2. Lp chng trnh nhp vo mt th v ch ra ng mt ng i Hamilton nu c.
3. Trong m ci ca Pc-xy v An-r-nt c 2n hip s. Mi hip s c khng qu n - 1 k
th. Hy gip Ca-xi--b, m ca An-r-nt xp 2n hip s ngi quanh mt bn trn sao cho
khng c hip s no phi ngi cnh k th ca mnh. Mi hip s s cho bit nhng k th ca
mnh khi h n sn rng.
n
100 000
4. Gray code: Mt hnh trn c chia thnh 2 hnh qut ng tm. Hy xp
001
tt c cc xu nh phn di n vo cc hnh qut, mi xu vo mt hnh 101
111
011
qut sao cho bt c hai xu no hai hnh qut cnh nhau u ch khc
nhau ng 1 bt. V d vi n = 3 hnh v bn
110 010
*
5. Thch : Bi ton m i tun: Trn bn c tng qut kch thc n x n
vung (n chn v 6 n 20). Trn mt no c t mt qun m. Qun m ang (X1,
Y1) c th di chuyn sang (X2, Y2) nu X1-X2 . Y1-Y2 = 2 (Xem hnh v).
Hy tm mt hnh trnh ca qun m t xut pht, i qua tt c cc ca bn c, mi
ng 1 ln.
V d:
45
2
43
16
47
30
61
14

18
97
72
41
16
79
36
39
14
11

Vi n = 8;
42
3
17
44
46
1
31
48
60
37
15
64
56
13
29
62

71
42
17
96
83
40
15
12
33
38

xut pht (3, 3).


18
35
20
5
41
4
7
34
36
19
50
9
59
40
33
22
32
49
58
39
57
38
25
52
28
63
54
11
55
12
27
24

Vi n = 10;
100
43
19
70
98
95
73
84
80
93
35
82
78
75
37
34
10
59
13
32

8
21
6
51
10
23
26
53

xut pht (6, 5)


20
69
86
45
99
44
21
24
68
85
88
63
81
94
67
90
74
89
64
49
1
76
91
66
92
65
2
61
77
60
57
52
56
31
8
5
9
58
55
30

22
87
26
47
62
51
28
3
54
7

25
46
23
50
27
48
53
6
29
4

Gi : Nu coi cc ca bn c l cc nh ca th v cc cnh l ni gia hai nh tng ng


vi hai m giao chn th d thy rng hnh trnh ca qun m cn tm s l mt ng i
Hamilton. Ta c th xy dng hnh trnh bng thut ton quay lui kt hp vi phng php duyt
u tin Warnsdorff: Nu gi deg(x, y) l s k vi (x, y) v cha i qua (k y theo ngha

nh k ch khng phi l k cnh) th t mt ta s khng th xt ln lt cc hng i c


th, m ta s u tin th hng i ti c deg nh nht trc. Trong trng hp c tn ti
ng i, phng php ny hot ng vi tc tuyt vi: Vi mi n chn trong khong t 6 ti
18, vi mi v tr xut pht, trung bnh thi gian tnh t lc bt u ti lc tm ra mt nghim < 1
giy. Tuy nhin trong trng hp n l, c lc khng tn ti ng i, do phi duyt ht mi kh
nng nn thi gian thc thi li ht sc ti t. (C xt u tin nh trn hay xt th t nh trc kia
th cng vy thi. Khng tin c th vi n l: 5, 7, 9 ... v xut pht (1, 2), sau ngi xem my
tnh tot m hi).

8. BI TON NG I NGN NHT


I. TH C TRNG S
th m mi cnh ca n c gn cho tng ng vi mt s (nguyn hoc thc) c gi l
th c trng s. S gn cho mi cnh ca th c gi l trng s ca cnh. Tng t nh th
khng trng s, c nhiu cch biu din th c trng s trong my tnh. i vi n th th
cch d dng nht l s dng ma trn trng s:
Gi s th G = (V, E) c n nh. Ta s dng ma trn vung C kch thc n x n. y:
Nu (u, v) E th C[u, v] = trng s ca cnh (u, v)
Nu (u, v) E th tu theo trng hp c th, C[u, v] c gn mt gi tr no c th
nhn bit c (u, v) khng phi l cnh (Chng hn c th gn bng +, hay bng 0, bng -
v.v...)
Quy c c[v, v] = 0 vi mi nh v.
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 phi tnh bng s cnh i qua, m c tnh
bng tng trng s ca cc cnh i qua.
II. BI TON NG I NGN NHT
Trong cc ng dng thc t, chng hn trong mng li giao thng ng b, ng thu hoc
ng khng. 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 chi ph). Khi
pht sinh yu cu tm ng i ngn nht gia hai nh ca th. Bi ton pht biu di dng
tng qut nh sau: Cho th c trng s G = (V, E), hy tm mt ng i ngn nht t nh xut
pht S V n nh ch F V. di ca ng i ny ta s k hiu l d[S, F] v gi l khong
cch t S n F. Nu nh khng tn ti ng i t S ti F th ta s t khong cch = +.
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 c bn (ng i khng c
nh lp li) ngn nht. Vn l mt vn ht sc phc tp m ta s khng bn ti y.
Nu nh th khng c chu trnh m th ta c th chng minh c rng mt trong nhng
ng i ngn nht l ng i c bn. V nu nh bit c khong cch t S ti tt c nhng
nh khc th ng i ngn nht t S ti F c th tm c mt cch d dng qua thut ton
sau:
Gi c[u, v] l trng s ca cnh [u, v]. Qui c c[v, v] = 0 vi mi v V v c[u, v] = + nu nh
(u, v) E. t d[S, v] l khong cch t S ti v. tm ng i t S ti F, ta c th nhn thy
rng lun tn ti nh F1 F sao cho:
d[S, F] = d[S, F1] + c[F1, F]
( di ng i ngn nht S->F = di ng i ngn nht S->F1 + Chi ph i t F1 ti F)
nh F1 l nh lin trc F trong ng i ngn nht t S ti F. Nu F1S th ng i ngn
nht l ng i trc tip theo cung (S, F). Nu khng th vn tr thnh tm ng i ngn nht
t S ti F1. V ta li tm c mt nh F2 khc F v F1 :
d[S, F1] = d[S, F2] + c[F2, F1]

C tip tc nh vy, sau mt s hu hn bc, ta suy ra rng dy F, F1, F2, ... khng cha nh lp
li v kt thc S. Lt ngc th t dy cho ta ng i ngn nht t S ti F.
...

F1

F2

Tuy nhin, trong a s trng hp, ngi ta khng s dng phng php ny m s kt hp lu vt
ng i ngay trong qu trnh tm kim.
Di y ta s xt mt s thut ton tm ng i ngn nht t nh S ti nh F trn n th c
hng G = (V, E) c n nh v m cung. Trong trng hp n th v hng vi trng s khng
m, bi ton tm ng i ngn nht c th dn v bi ton trn th c hng bng cch thay mi
cnh ca n bng hai cung c hng ngc chiu nhau. Lu rng cc thut ton di y s lun
lun tm c ng i ngn nht l ng i c bn.
Input: file vn bn MINPATH.INP
Dng 1: Cha s nh n ( 100), s cung m ca th, nh xut pht S, nh ch F cch nhau
t nht 1 du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht 1 du cch, th hin (u,
v) l mt cung E v trng s ca cung l c[u,v] (c[u, v] l s nguyn c gi tr tuyt i
100)
Output: file vn bn MINPATH.OUT ghi ng i ngn nht t S ti F v di ng i
1

20

20
6

MINPATH.INP
6 7 1 4
1 2 1
1 6 20
2 3 2
3 4 20
3 6 3
5 4 5
6 5 4

MINPATH.OUT
Distance from 1 to 4: 15
4<-5<-6<-3<-2<-1

III. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD


BELLMAN
Thut ton Ford-Bellman c th pht biu rt n gin:
Vi nh xut pht S. Gi d[v] l khong cch t S ti v.
Ban u d[v] c khi gn bng c[S, v]
Sau ta ti u ho dn cc d[v] nh sau: Xt mi cp nh u, v ca th, nu c mt cp nh
u, v m d[v] > d[u]+ c[u, v] th ta t li d[v] := d[u] + c[u, v]. Tc l nu di ng i t S ti
v li ln hn tng di ng i t S ti u cng vi chi ph i t u ti v th ta s hu b ng i
t S ti v ang c v coi ng i t S ti v chnh l ng i t S ti u sau i tip t u ti v.
Ch rng ta t c[u, v] = + nu (u, v) khng l cung. Thut ton s kt thc khi khng th ti u
thm bt k mt nhn d[v] no na.
Tnh dng ca thut ton:
Ti bc lp 1: Bc khi to d[v] = c[S, v]: th dy d[v] chnh l di ngn nht ca ng
i t S ti v qua khng qu 1 cnh.
Gi s ti bc lp th i (i 1), d[v] bng di ng i ngn nht t S ti v qua khng qu i
cnh, th do tnh cht: ng i t S ti v qua khng qu i + 1 cnh s phi thnh lp bng cch:

ly mt ng i t S ti mt nh u no qua khng qu i cnh, ri i tip ti v bng cung (u,


v). Nn di ng i ngn nht t S ti v qua khng qu i + 1 cnh s c tnh bng gi tr
nh nht trong cc gi tr: (Nguyn l ti u Bellman)
di ng i ngn nht t S ti v qua khng qu i cnh
di ng i ngn nht t S ti u qua khng qu i cnh cng vi trng s cnh (u, v)
(u)
V vy, sau bc lp ti u cc d[v] bng cng thc
d[v]bc i+1 = min(d[v]bc i, d[u]bc i+ c[u, v]) (u)
th cc d[v] s bng di ng i ngn nht t S ti v qua khng qu i + 1 cnh.
Sau bc lp ti u th n - 2, ta c d[v] = di ng i ngn nht t S ti v qua khng qu n - 1
cnh. V th khng c chu trnh m nn s c mt ng i ngn nht t S ti v l ng i c
bn (qua khng qu n - 1 cnh). Tc l d[v] s l di ng i ngn nht t S ti v.
Vy th s bc lp ti u ho s khng qu n - 2 bc.
Trong khi ci t chng trnh, nu mi bc ta m t di dng:
for u := 1 to n do
for v := 1 to n do
d[v] := min(d[v], d[u] + c[u, v]);

Th do s ti u bc cu (dng d[u] ti u d[v] ri li c th dng d[v] ti u d[w] na...) nn ch


lm tc ti u nhn d[v] tng nhanh ln ch khng th gim i c.
PROG08_1.PAS * Thut ton Ford-Bellman
program Shortest_Path_by_Ford_Bellman;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
n, S, F: Integer;
procedure LoadGraph;

{Nhp th t thit b nhp chun (Input), th khng c c chu

trnh m}

var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
{Nhng cnh khng c trong th c gn trng s +}

for u := 1
for v :=
if u =
for i := 1
end;

to n do
1 to n do
v then c[u, v] := 0 else c[u, v] := maxC;
to m do ReadLn(u, v, c[u, v]);

procedure Init;
{Khi to}
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
{ di ng i ngn nht t S ti i = c(S, i)}
Trace[i] := S;
end;
end;
procedure Ford_Bellman;
Bellman}

{Thut

ton

Ford-

var
Stop: Boolean;
u, v, CountLoop: Integer;
begin
CountLoop := 0;
{Bin m s ln lp}
repeat
Stop := True;
for u := 1 to n do
for v := 1 to n do
if d[v] > d[u] + c[u, v] then
{Nu u, v tho mn d[v] > d[u] + c[u, v] th ti u li d[v]}
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
{Lu vt ng i}
Stop := False;
end;
Inc(CountLoop);
until Stop or (CountLoop >= n - 2);
{Thut ton kt thc khi khng sa nhn cc d[v] c na hoc lp n-2 ln }

end;
procedure PrintResult; {In ng i t S ti
F}

begin
if d[F] = maxC then
{Nu d[F] vn l + th tc l khng c ng}
WriteLn('Path from ', S, ' to ', F, ' not found')
else
{Truy vt tm ng i}
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Ford_Bellman;
PrintResult;
Close(Input);
Close(Output);
end.

IV. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON


DIJKSTRA
Trong trng hp trng s trn cc cung khng m, thut ton do Dijkstra xut di y hot
ng hiu qu hn nhiu so vi thut ton Ford-Bellman. Ta hy xem trong trng hp ny, thut
ton Ford-Bellman thiu hiu qu ch no:
Vi nh v V, Gi d[v] l di ng i ngn nht t S ti v. Thut ton Ford-Bellman khi to
d[v] = c[S, v]. Sau ti u ho dn cc nhn d[v] bng cch sa nhn theo cng thc: d[v] :=
min(d[v], d[u] + c[u, v]) vi u, v V. Nh vy nu nh ta dng nh u sa nhn nh v, sau
nu ta li ti u c d[u] thm na th ta cng phi sa li nhn d[v] dn ti vic d[v] c th phi
chnh i chnh li rt nhiu ln. Vy nn chng, ti mi bc khng phi ta xt mi cp nh (u,

v) dng nh u sa nhn nh v m s chn nh u l nh m khng th ti u nhn d[u]


thm c na.
Thut ton Dijkstra (E.Dijkstra - 1959) c th m t nh sau:
Bc 1: Khi to
Vi nh v V, gi nhn d[v] l di ng i ngn nht t S ti v. Ta s tnh cc d[v]. Ban u
d[v] c khi gn bng c[S, v]. Nhn ca mi nh c hai trng thi t do hay c nh, nhn t do
c ngha l c th cn ti u hn c na v nhn c nh tc l d[v] bng di ng i
ngn nht t S ti v nn khng th ti u thm. lm iu ny ta c th s dng k thut nh
du: Free[v] = TRUE hay FALSE tu theo d[v] t do hay c nh. Ban u cc nhn u t do.
Bc 2: Lp
Bc lp gm c hai thao tc:
1. C nh nhn: Chn trong cc nh c nhn t do, ly ra nh u l nh c d[u] nh
nht, v c nh nhn nh u.
2. Sa nhn: Dng nh u, xt tt c nhng nh v v sa li cc d[v] theo cng thc:
d[v] := min(d[v], d[u] + c[u, v])
Bc lp s kt thc khi m nh ch F c c nh nhn (tm c ng i ngn nht t
S ti F); hoc ti thao tc c nh nhn, tt c cc nh t do u c nhn l + (khng tn ti
ng i).
C th t cu hi, thao tc 1, ti sao nh u nh vy c c nh nhn, gi s d[u] cn c th ti
u thm c na th tt phi c mt nh t mang nhn t do sao cho d[u] > d[t] + c[t, u]. Do trng
s c[t, u] khng m nn d[u] > d[t], tri vi cch chn d[u] l nh nht. Tt nhin trong ln lp u
tin th S l nh c c nh nhn do d[S] = 0.
Bc 3: 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 (d[F] = +).
PROG08_2.PAS * Thut ton Dijkstra
program Shortest_Path_by_Dijkstra;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean;
n, S, F: Integer;
procedure LoadGraph;

{Nhp th, trng s cc cung phi l s khng

m}

var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
end;
procedure Init;
t do}

var
i: Integer;
begin

{Khi to cc nhn d[v], cc nh u c coi l

for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
FillChar(Free, SizeOf(Free), True);
end;
procedure Dijkstra;
var
i, u, v: Integer;
min: Integer;
begin
repeat

{Thut ton Dijkstra}

{Tm trong cc nh c nhn t do ra nh u c d[u] nh nht}

u := 0; min := maxC;
for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
{Thut ton s kt thc khi cc nh t do u c nhn + hoc chn n nh F}

if (u = 0) or (u = F) then Break;
{C nh nhn nh u}

Free[u] := False;
{Dng nh u ti u nhn nhng nh t do k vi u}

for v := 1 to n do
if Free[v] and (d[v] > d[u] + c[u, v]) then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end;
until False;
end;
procedure PrintResult;
{In ng i t S ti F}
begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Init;
Dijkstra;
PrintResult;
Close(Input);
Close(Output);
end.

V. THUT TON DIJKSTRA V CU TRC HEAP


Nu th c nhiu nh, t cnh, ta c th s dng danh sch k km trng s biu din th,
tuy nhin tc ca thut ton DIJKSTRA vn kh chm v trong trng hp xu nht, n cn n
ln c nh nhn v mi ln tm nh c nh nhn s mt mt on chng trnh vi phc tp
O(n). tng tc , ngi ta thng s dng cu trc d liu Heap lu cc nh cha c nh
nhn. Heap y l mt cy nh phn hon chnh tho mn: Nu u l nh lu nt cha v v l
nh lu nt con th d[u] d[v]. (nh r lu gc Heap l nh c d[r] nh nht).
Ti mi bc lp ca thut ton Dijkstra c hai thao tc: Tm nh c nh nhn v Sa nhn.
Thao tc tm nh c nh nhn s ly nh lu gc Heap, c nh nhn, a phn t cui
Heap vo th ch v thc hin vic vun ng (Adjust)
Thao tc sa nhn, s duyt danh sch k ca nh va c nh nhn v sa nhn nhng nh t
do k vi nh ny, mi ln sa nhn mt nh no , ta xc nh nh ny nm u trong
Heap v thc hin vic chuyn nh ln (UpHeap) pha gc Heap nu cn bo ton cu
trc Heap.
Ci t di y c Input/Output ging nh trn nhng c th thc hin trn th 5000 nh,
10000 cnh, trng s mi cnh 10000.
PROG08_3.PAS * Thut ton Dijkstra v cu trc Heap
program Shortest_Path_by_Dijkstra_and_Heap;
const
max = 5000;
maxE = 10000;
maxC = 1000000000;
type
TAdj = array[1..maxE] of Integer;
TAdjCost = array[1..maxE] of LongInt;
THeader = array[1..max + 1] of Integer;
var
adj: ^TAdj;
{Danh sch k dng Forward Star}
adjCost: ^TAdjCost;
{Km trng s}
head: ^THeader;
{Mng nh du cc on ca Forward Star}
d: array[1..max] of LongInt;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean;
heap, Pos: array[1..max] of Integer;
n, S, F, nHeap: Integer;
procedure

LoadGraph;

{Nhp d

liu}

var
i, m: Integer;
u, v, c: Integer;
inp: Text;
begin
{c file ln 1, xc nh cc on}

Assign(inp, 'MINPATH.INP'); Reset(inp);


ReadLn(inp, n, m, S, F);
New(head);
New(adj); New(adjCost);
{Php m phn phi (Distribution Counting)}

FillChar(head^, SizeOf(head^), 0);


for i := 1 to m do
begin
ReadLn(inp, u);
Inc(head^[u]);
end;
for i := 2 to n do head^[i] := head^[i - 1] + head^[i];

Close(inp);
{n y, ta xc nh c head[u] l v tr cui ca danh sch k nh u trong adj^}
Reset(inp);
{c file ln 2, vo cu trc Forward Start}
ReadLn(inp);
{B qua dng u tin Input file}

for i := 1 to m do
begin
ReadLn(inp, u, v, c);
adj^[head^[u]] := v;
adjCost^[head^[u]] := c;
Dec(head^[u]);
end;
head^[n + 1] := m;
Close(inp);
end;

{in v v c vo v tr ng trong danh sch k ca u}

procedure Init;
{Khi to d[i] = di ng i ngn nht t S ti i qua 0 cnh, Heap rng}
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[S] := 0;
FillChar(Free, SizeOf(Free), True);
FillChar(Pos, SizeOf(Pos), 0);
nHeap := 0;
end;
procedure Update(v: Integer);
{nh v va c sa nhn, cn phi chnh li Heap}
var
parent, child: Integer;
begin
child := Pos[v];
{child l v tr ca v trong Heap}
if child = 0 then {Nu v cha c trong Heap th Heap phi b sung thm 1 phn t v coi child = nt l cui
Heap}

begin
Inc(nHeap); child := nHeap;
end;
parent := child div 2; {parent l nt cha ca child}
while (parent > 0) and (d[heap[parent]] > d[v]) do
begin
{Nu nh lu nt parent u tin km hn v th nh s b y xung nt
con child} heap[child] := heap[parent]; {y nh lu trong nt cha
xung nt con} Pos[heap[child]] := child;
{Ghi nhn li v tr mi ca
nh }

child := parent;
parent := child div 2;
end;

{Tip tc xt ln pha nt gc}

{Thao tc "ko xung" trn to ra mt "khong trng" ti nt child ca Heap, nh v s c t vo y}

heap[child] := v;
Pos[v] := child;
end;
function Pop: Integer;
var
r, c, v: Integer;
begin
Pop := heap[1];
{Nt gc Heap cha nh c nhn t do nh nht}
v := heap[nHeap]; {v l nh nt l cui Heap, s c o ln u v vun ng}
Dec(nHeap);
r := 1;
{Bt u t nt gc}
while r * 2 <= nHeap do {Chng no r cha phi l l}
begin
{Chn c l nt cha nh u tin hn trong hai nt con}

c := r * 2;
if (c < nHeap) and (d[heap[c + 1]] < d[heap[c]]) then Inc(c);
{Nu v u tin hn c nh cha trong C, th thot ngay}

if d[v] <= d[heap[c]] then Break;


heap[r] := heap[c]; {Chuyn nh lu nt con c ln nt cha r}

Pos[heap[r]] := r; {Ghi nhn li v tr mi trong Heap ca nh }


r := c;
{Gn nt cha := nt con v lp li}
end;
heap[r] := v; {nh v s c t vo nt r bo ton cu trc Heap}
Pos[v] := r;
end;
procedure Dijkstra;
var
i, u, iv, v: Integer;
min: Integer;
begin
Update(1);
repeat
u := Pop;
{Chn nh t do c nhn nh
nht} if u = F then Break; {Nu nh l F th dng
ngay} Free[u] := False; {C nh nhn nh }
for iv := head^[u] + 1 to head^[u + 1] do {Xt danh sch k}
begin
v := adj^[iv];
if Free[v] and (d[v] > d[u] + adjCost^[iv]) then
begin
d[v] := d[u] + adjCost^[iv];
{Ti u ho nhn ca cc nh t do k vi u}
Trace[v] := u;
{Lu vt ng i}
Update(v);
{T chc li Heap}
end;
end;
until nHeap = 0;
{Khng cn nh no mang nhn t do}
end;
procedure PrintResult;
var
out: Text;
begin
Assign(out, 'MINPATH.OUT'); Rewrite(out);
if d[F] = maxC then
WriteLn(out, 'Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn(out, 'Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(out, F, '<-');
F := Trace[F];
end;
WriteLn(out, S);
end;
Close(out);
end;
begin
LoadGraph;
Init;
Dijkstra;
PrintResult;
end.

VI. TRNG HP TH KHNG C CHU TRNH - TH T T P


Ta c nh l sau: Gi s G = (V, E) l th khng c chu trnh (c hng - tt nhin). Khi cc
nh ca n c th nh s sao cho mi cung ca n ch ni t nh c ch s nh hn n nh c
ch s ln hn.

2
4

2
5

4
5
6

6
3

Hnh 19: Php nh li ch s theo th t tp

Thut ton nh s li cc nh ca th c th m t nh sau:


Trc ht ta chn mt nh khng c cung i vo v nh ch s 1 cho nh . Sau xo b nh
ny cng vi tt c nhng cung t u i ra, ta c mt th mi cng khng c chu trnh, v li
nh ch s 2 cho mt nh v no khng c cung i vo, ri li xo nh v cng vi cc cung t v
i ra ... Thut ton s kt thc nu nh hoc ta nh ch s c ht cc nh, hoc tt c cc
nh cn li u c cung i vo. Trong trng hp tt c cc nh cn li u c cung i vo th s
tn ti chu trnh trong th v khng nh thut ton tm ng i ngn nht trong mc ny khng
p dng c. (Thut ton nh s ny c th ci tin bng cch dng mt hng i v cho nhng
nh khng c cung i vo ng ch ln lt trong hng i , ln lt rt cc nh khi hng i
v nh s cho n, ng thi hu nhng cung i ra khi nh va nh s, lu sau mi ln loi b
cung (u, v), nu thy bn bc vo ca v = 0 th y v vo ch trong hng i, nh vy mt cng
duyt tm nhng nh c bn bc vo = 0)
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 m t rt n gin:
Gi d[v] l di ng i ngn nht t S ti v. Khi to d[v] = c[S, v]. Ta s tnh cc d[v] nh
sau:
for u := 1 to n - 1 do
for v := u + 1 to n do
d[v] := min(d[v], d[u] + c[u, v]);

(Gi thit rng c[u, v] = + nu nh (u, v) khng l cung).


Tc l dng nh u, ti u nhn d[v] ca nhng nh v ni t u, vi u c xt ln lt t 1 ti n 1. C th lm tt hn na bng cch ch cn cho u chy t nh xut pht S ti nh kt thc F. Bi
h u chy ti u th nhn d[u] l khng th cc tiu ho thm na.
PROG08_4.PAS * ng i ngn nht trn th khng c chu trnh
program Critical_Path;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
List, d, Trace: array[1..max] of Integer; {List l danh sch cc nh theo cch nh s mi}
n, S, F, count: Integer;
procedure LoadGraph; {Nhp d liu, th khng c c chu
trnh}

var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
end;

procedure Number;
{Thut ton nh s cc nh}
var
deg: array[1..max] of Integer;
u, v: Integer;
front: Integer;
begin
-

{Trc ht, tnh bn bc vo ca cc nh (deg )}

FillChar(deg, SizeOf(deg), 0);


for u := 1 to n do
for v := 1 to n do
if (v <> u) and (c[v, u] < maxC) then Inc(deg[u]);
{a nhng nh c bn bc vo = 0 vo danh sch List}

count := 0;
for u := 1 to n do
if deg[u] = 0 then
begin
Inc(count); List[count] := u;
end;
{front: Ch s phn t ang xt, count: S phn t trong danh sch}

front := 1;
while front <= count do
begin

{Chng no cha xt ht cc phn t trong danh sch}

{Xt phn t th front trong danh sch, y con tr front sang phn t k tip}

u := List[front]; Inc(front);
for v := 1 to n do
if c[u, v] <> maxC then {Xt nhng cung (u, v) v "loi" khi th deg (v) gim 1}
begin
Dec(deg[v]);
if deg[v] = 0 then
{Nu v tr thnh nh khng c cung i vo}
begin
{a tip v vo danh sch List}
Inc(count);
List[count] := v;
end;
end;
end;
end;
procedure Init;
var
i: Integer;
begin
for i := 1 to n do
begin
d[i] := c[S, i];
Trace[i] := S;
end;
end;
procedure FindPath;
{Thut ton quy hoch ng tm ng i ngn nht trn th khng chu trnh}
var
i, j, u, v: Integer;
begin
for i := 1 to n - 1 do
for j := i + 1 to n do
begin
u := List[i]; v := List[j];
{Dng List[i] ti u nhn List[j] vi i < j}
if d[v] > d[u] + c[u, v] then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end
end;
end;

procedure PrintResult;

{In ng i t S ti

F}

begin
if d[F] = maxC then
WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', d[F]);
while F <> S do
begin
Write(F, '<-');
F := Trace[F];
end;
WriteLn(S);
end;
end;
begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Number;
if Count < n then
WriteLn('Error: Circuit Exist')
else
begin
Init;
FindPath;
PrintResult;
end;
Close(Input);
Close(Output);
end.

VII. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD


Cho n th c hng, c trng s G = (V, E) vi n nh v m cnh. Bi ton t ra l hy tnh
tt c cc d(u, v) l khong cch t u ti v. R rng l ta c th p dng thut ton tm ng i
ngn nht xut pht t mt nh vi n kh nng chn nh xut pht. Nhng ta c cch lm gn hn
nhiu, cch lm ny rt ging vi thut ton Warshall m ta bit: T ma trn trng s c, thut
ton Floyd tnh li cc c[u, v] thnh di ng i ngn nht t u ti v:
Vi mi nh k ca th c xt theo th t t 1 ti n, xt mi cp nh u, v. Cc tiu ho c[u, v]
theo cng thc:
c[u, v] := min(c[u, v], c[u, k] + c[k, v])
Tc l nu nh ng i t u ti v ang c li di hn ng i t u ti k cng vi ng i t k
ti v th ta hu b ng i t u ti v hin thi v coi ng i t u ti v s l ni ca hai ng i
t u ti k ri t k ti v (Ch rng ta cn c vic lu li vt):
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
c[u, v] := min(c[u, v], c[u, k] + c[k, v]);

Tnh ng ca thut ton:


k
Gi c [u, v] l di ng i ngn nht t u ti v m ch i qua cc nh trung gian thuc tp {1,
0
2, ..., k}. R rng khi k = 0 th c [u, v] = c[u, v] (ng i ngn nht l ng i trc tip).
k-1
k
Gi s ta tnh c cc c [u, v] th c [u, v] s c xy dng nh sau:
Nu ng i ngn nht t u ti v m ch qua cc nh trung gian thuc tp {1, 2, ..., k} li:
Khng i qua nh k th tc l ch qua cc nh trung gian thuc tp {1, 2, ..., k - 1} th

k-1

c [u, v] = c [u, v]
C i qua nh k th ng i s l ni ca mt ng i t u ti k v mt ng i t k ti
v, hai ng i ny ch i qua cc nh trung gian thuc tp {1, 2, ..., k - 1}.
k
k-1
k-1
c [u, v] = c [u, k] + c [k, v].
k
k
k-1
k-1
k-1
V ta mun c [u, v] l cc tiu nn suy ra: c [u, v] = min(c [u, v], c [u, k] + c [k, v]).
n
V cui cng, ta quan tm ti c [u, v]: di ng i ngn nht t u ti v m ch i qua cc nh
trung gian thuc tp {1, 2, ..., n}.
k
Khi ci t, th ta s khng c cc khi nim c [u, v] m s thao tc trc tip trn cc trng s c[u,
v]. c[u, v] ti bc ti u th k s c tnh ton ti u qua cc gi tr c[u, v]; c[u, k] v c[k, v]
ti bc th k - 1. V nu ci t di dng ba vng lp for lng nh trn, do c s ti u bc cu
ti mi bc, tc ti u c[u, v] ch tng ln ch khng th gim i c.
PROG08_5.PAS * Thut ton Floyd
program Shortest_Path_by_Floyd;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
Trace: array[1..max, 1..max] of Integer; {Trace[u, v] = nh lin sau u trn ng i t u ti v}
n, S, F: Integer;
procedure LoadGraph;

{Nhp d liu, th khng c c chu trnh

m}

var
i, m: Integer;
u, v: Integer;
begin
ReadLn(n, m, S, F);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(u, v, c[u, v]);
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; {Gi s ng i ngn nht gia mi cp nh l ng
trc tip}
{Thut ton Floyd}

for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
if c[u, v] > c[u, k] + c[k, v] then

{ng i t qua k tt

hn}

end;

begin
c[u, v] := c[u, k] + c[k, v];
Trace[u, v] := Trace[u, k];
end;

{Ghi nhn ng i thay cho ng c}


{Lu vt ng i}

procedure PrintResult; {In ng i t S ti F}


begin
if c[S, F] = maxC
then WriteLn('Path from ', S, ' to ', F, ' not found')
else
begin
WriteLn('Distance from ', S, ' to ', F, ': ', c[S, F]);
repeat

Write(S, '->');
S := Trace[S, F];
until S = F;
WriteLn(F);
end;

{Nhc li rng Trace[S, F] l nh lin sau S trn ng i ti F}

end;

begin
Assign(Input, 'MINPATH.INP'); Reset(Input);
Assign(Output, 'MINPATH.OUT'); Rewrite(Output);
LoadGraph;
Floyd;
PrintResult;
Close(Input);
Close(Output);
end.

Khc bit r rng ca thut ton Floyd l khi cn tm ng i ngn nht gia mt cp nh khc,
chng trnh ch vic in kt qu ch khng phi thc hin li thut ton Floyd na.
VIII. NHN XT
Bi ton ng i di nht trn th trong mt s trng hp c th gii quyt bng cch i du
trng s tt c cc cung ri tm ng i ngn nht, nhng hy cn thn, c th xy ra trng hp
c chu trnh m.
Trong tt c cc ci t trn, v s dng ma trn trng s ch khng s dng danh sch cnh hay
danh sch k c trng s, nn ta u a v th y v em trng s + gn cho nhng
cnh khng c trong th ban u. Trn my tnh th khng c khi nim tru tng + nn ta
s phi chn mt s dng ln thay. Nh th no l ln? s phi ln hn tt c
trng s ca cc ng i c bn cho d ng i tht c ti t n u vn tt hn ng i
trc tip theo cnh tng tng ra . Vy nn nu th cho s nh cng nh trng s cc cnh
vo c 300 chng hn th gi tr khng th chn trong phm vi Integer hay Word. Ma trn c
s phi khai bo l ma trn LongInt v gi tr hng s maxC trong cc chng trnh trn phi i
li l 300 * 299 + 1 - iu c th gy ra nhiu phin toi, chng hn nh vn lng ph b nh.
khc phc, ngi ta c th ci t bng danh sch k km trng s hoc s dng nhng k thut
nh du kho lo trong tng trng hp c th. Tuy nhin c mt iu chc chn: khi th cho s
nh cng nh trng s cc cnh vo khong 300 th cc trng s c[u, v] trong thut ton Floyd
v cc nhn d[v] trong ba thut ton cn li chc chn khng th khai bo l Integer c.
3
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l O(n ),
2
2
thut ton Dijkstra l O(n ), thut ton ti u nhn theo th t tp l O(n ) cn thut ton Floyd l
3

O(n ). Tuy nhin nu s dng danh sch k, thut ton ti u nhn theo th t tp s c phc
tp tnh ton l O(m). Thut ton Dijkstra kt hp vi cu trc d liu Heap c phc tp
O(max(n, m).logn).
Khc vi mt bi ton i s hay hnh hc c nhiu cch gii th ch cn nm vng mt cch cng
c th coi l t yu cu, 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 yu cu trc tin l 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 trng hp c th. Nhng
bi tp sau y cho ta thy r iu .
Bi tp

1. Gii thch ti sao i vi th sau, cn tm ng i di nht t nh 1 ti nh 4 li khng th


dng thut ton Dijkstra c, c th p dng thut ton Dijkstra theo tng bc xem sao:
2

2
1

3
2

2. Trn mt phng cho n ng trn (n 2000), ng trn th i c cho bi b ba s thc (Xi,


Yi, Ri), (Xi, Yi) l to tm v Ri l bn knh. Chi ph di chuyn trn mi ng trn bng 0. Chi
ph di chuyn gia hai ng trn bng khong cch gia chng. Hy tm phng n di chuyn
gia hai ng trn S, F cho trc vi chi ph t nht.
3. Cho mt dy n s nguyn A[1], A[2], ..., A[n] (n 10000; 1 A[i] 10000). 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.
4. Mt cng trnh ln c chia lm n cng on nh s 1, 2, ..., n. Cng on i phi thc hin mt
thi gian t[i]. Quan h gia cc cng on c cho bi bng a[i, j]: a[i, j] = TRUE cng on j
ch c bt u khi m cng vic i xong. 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 .
5. Cho mt bng cc s t nhin kch thc mxn (1 m, n 100). T mt c th di chuyn sang
mt k cnh vi n. Hy tm mt cch i t (x, y) ra mt bin sao cho tng cc s ghi trn cc
i qua l cc tiu.

9. BI TON CY KHUNG NH NHT


I. BI TON CY KHUNG NH NHT
Cho G = (V, E) l th v hng lin thng c trng s, vi mt cy khung T ca G, ta gi trng
s ca cy T l tng trng s cc cnh trong T. Bi ton t ra l trong s cc cy khung ca G, ch
ra cy khung c trng s nh nht, cy khung nh vy c gi l cy khung nh nht ca th,
v bi ton gi l bi ton cy khung nh nht. 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.
Input: file vn bn MINTREE.INP:

Dng 1: Ghi hai s s nh n ( 100) v s cnh m ca th cch nhau t nht 1 du cch

m dng tip theo, mi dng c dng 3 s u, v, c[u, v] cch nhau t nht 1 du cch th hin
th c cnh (u, v) v trng s cnh l c[u, v]. (c[u, v] l s nguyn c gi tr tuyt i khng
qu 100).
Output: file vn bn MINTREE.OUT ghi cc cnh thuc cy khung v trng s cy khung
6

1
2

5
1

2
1

MINTREE.INP
6 9
1 2 1
1 3 1
2 4 1
2 3 2
2 5 1
3 5 1
3 6 1
4 5 2
5 6 2

MINTREE.OUT
Minimal spanning tree:
(2, 4) = 1
(3, 6) = 1
(2, 5) = 1
(1, 3) = 1
(1, 2) = 1
Weight = 5

II. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956)


Thut ton Kruskal da trn m hnh xy dng cy khung bng thut ton hp nht (5), ch c
iu thut ton khng phi xt cc cnh vi th t tu m xt cc cnh theo th t sp xp: Vi
th v hng G = (V, E) c n nh. Khi to cy T ban u khng c cnh no. Xt tt c cc
cnh ca th t cnh c trng s nh n cnh c trng s ln, nu vic thm cnh vo T
khng to thnh chu trnh n trong T th kt np thm cnh vo T. C lm nh vy cho ti
khi:

Hoc kt np c n - 1 cnh vo trong T th ta c T l cy khung nh nht

Hoc cha kt np n - 1 cnh nhng h c kt np thm mt cnh bt k trong s cc cnh


cn li th s to thnh chu trnh n. Trong trng hp ny th G l khng lin thng, vic
tm kim cy khung tht bi.
Nh vy c hai vn quan trng khi ci t thut ton Kruskal:
Th nht, lm th no xt c cc cnh t cnh c trng s nh ti cnh c trng s ln. Ta c
th thc hin bng cch sp xp danh sch cnh theo th t khng gim ca trng s, sau duyt
t u ti cui danh sch cnh. Nn s dng cc thut ton sp xp hiu qu t c tc
nhanh trong trng hp s cnh ln. Trong trng hp tng qut, thut ton HeapSort l hiu qu
nht bi n cho php chn ln lt cc cnh t cnh trng nh nht ti cnh trng s ln nht ra
khi Heap v c th x l (b qua hay thm vo cy) lun.

Th hai, lm th no kim tra xem vic thm mt cnh c to thnh chu trnh n trong T hay
khng. rng cc cnh trong T cc bc s to thnh mt rng ( th khng c chu trnh
n). Mun thm mt cnh (u, v) vo T m khng to thnh chu trnh n th (u, v) phi ni hai cy
khc nhau ca rng T, bi nu u, v thuc cng mt cy th s to thnh chu trnh n trong cy .
Ban u, ta khi to rng T gm n cy, mi cy ch gm ng mt nh, sau , mi khi xt n
cnh ni hai cy khc nhau ca rng T th ta kt np cnh vo T, ng thi hp nht hai cy
li thnh mt cy.
Nu cho mi nh v trn cy mt nhn Lab[v] l s hiu nh cha ca nh v trong cy, trong trng
hp v l gc ca mt cy th Lab[v] c gn mt gi tr m. Khi ta hon ton c th xc nh
c gc ca cy cha nh v bng hm GetRoot nh sau:
function GetRoot(vV): V;
begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;

Vy kim tra mt cnh (u, v) c ni hai cy khc nhau ca rng T hay khng? ta c th kim tra
GetRoot(u) c khc GetRoot(v) hay khng, bi mi cy ch c duy nht mt gc.
hp nht cy gc r1 v cy gc r2 thnh mt cy, ta lu rng mi cy y ch dng ghi
nhn mt tp hp nh thuc cy ch cu trc cnh trn cy th no th khng quan trng. Vy
hp nht cy gc r1 v cy gc r2, ta ch vic coi r1 l nt cha ca r2 trong cy bng cch t:
Lab[r2] := r1.
r1

r1
r2

r2
u

Hai cy gc r1 v r2 v cy mi khi hp nht chng

Tuy nhin, thut ton lm vic hiu qu, trnh trng hp cy to thnh b suy bin khin cho
hm GetRoot hot ng chm, ngi ta thng nh gi: hp hai cy li thnh mt, th gc cy
no t nt hn s b coi l con ca gc cy kia.
Thut ton hp nht cy gc r1 v cy gc r2 c th vit nh sau:
{Count[k] l s nh ca cy gc k}

procedure Union(r1, r2 V);


begin
if Count[r1] < Count[r2] then
{Hp nht thnh cy gc r2}
begin
Count[r2] := Count[r1] + Count[r2];
Lab[r1] := r2;
end
else
{Hp nht thnh cy gc r1}
begin
Count[r1] := Count[r1] + Count[r2];
Lab[r2] := r1;
end;
end;

Khi ci t, ta c th tn dng ngay nhn Lab[r] lu s nh ca cy gc r, bi nh gii thch


trn, Lab[r] ch cn mang mt gi tr m l , vy ta c th coi Lab[r] = -Count[r] vi r l gc
ca mt cy no .
procedure Union(r1, r2 V);

{Hp nht cy gc r1 vi cy gc

r2 }

begin
x := Lab[r1] + Lab[r2];
{-x l tng s nt ca c hai cy}
if Lab[r1] > Lab[r2] then
{Cy gc r1 t nt hn cy gc r2, hp nht thnh cy gc r2}
begin
Lab[r1] := r2; {r2 l cha ca r1}
Lab[r2] := x; {r2 l gc cy mi, -Lab[r2] gi y l s nt trong cy mi}
end
else
{Hp nht thnh cy gc r1}
begin
Lab[r1] := x; {r1 l gc cy mi, -Lab[r1] gi y l s nt trong cy mi}
Lab[r2] := r1; {cha ca r2 s l r1}
end;
end;

M hnh thut ton Kruskal:


for kV do Lab[k] := -1;
for (u, v)E (theo th t t cnh trng s nh ti cnh trng s ln) do
begin
r1 := GetRoot(u); r2 := GetRoot(v);
if r1 r2 then {(u, v) ni hai cy khc nhau}
begin
<Kt np (u, v) vo cy, nu n - 1 cnh th thut ton dng>
Union(r1, r2); {Hp nht hai cy li thnh mt
end;

cy}

end;
PROG09_1.PAS * Thut ton Kruskal
program Minimal_Spanning_Tree_by_Kruskal;
const
maxV = 100;
maxE = (maxV - 1) * maxV div 2;
type
TEdge = record
{Cu trc mt cnh}
u, v, c: Integer;
{Hai nh v trng s}
Mark: Boolean;
{nh du c c kt np vo cy khung hay khng}
end;
var
e: array[1..maxE] of TEdge;
{Danh sch cnh}
Lab: array[1..maxV] of Integer; {Lab[v] l nh cha ca v, nu v l gc th Lab[v] = - s con cy gc v}
n, m: Integer;
Connected: Boolean;
procedure LoadGraph;
{Nhp th t thit b nhp chun (Input)}
var
i: Integer;
begin
ReadLn(n, m);
for i := 1 to m do
with e[i] do
ReadLn(u, v, c);
end;
procedure Init;
var
i: Integer;
begin
for i := 1 to n do Lab[i] := -1;
{Rng ban u, mi nh l gc ca cy gm ng mt nt}
for i := 1 to m do e[i].Mark := False;
end;

function GetRoot(v: Integer): Integer;


begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;

{Ly gc ca cy cha v}

procedure Union(r1, r2: Integer);


var
x: Integer;
begin
x := Lab[r1] + Lab[r2];
if Lab[r1] > Lab[r2] then
begin
Lab[r1] := r2;
Lab[r2] := x;
end
else
begin
Lab[r1] := x;
Lab[r2] := r1;
end;
end;

{Hp nht hai cy li thnh mt cy}

procedure AdjustHeap(root, last: Integer);


{Vun thnh ng, dng cho HeapSort}
var
Key: TEdge;
child: Integer;
begin
Key := e[root];
while root * 2 <= Last do
begin
child := root * 2;
if (child < Last) and (e[child + 1].c < e[child].c)
then Inc(child);
if Key.c <= e[child].c then Break;
e[root] := e[child];
root := child;
end;
e[root] := Key;
end;
procedure Kruskal;
var
i, r1, r2, Count, a: Integer;
tmp: TEdge;
begin
Count := 0;
Connected := False;
for i := m div 2 downto 1 do AdjustHeap(i, m);
for i := m - 1 downto 1 do
begin
tmp := e[1]; e[1] := e[i + 1]; e[i + 1] := tmp;
AdjustHeap(1, i);
r1 := GetRoot(e[i + 1].u); r2 := GetRoot(e[i + 1].v);
if r1 <> r2 then
{Cnh e[i + 1] ni hai cy khc nhau}
begin
e[i + 1].Mark := True;
{Kt np cnh vo cy}
Inc(Count);
{m s cnh}
if Count = n - 1 then
{Nu s th thnh
cng}

begin
Connected := True;
Exit;
end;

Union(r1, r2);
end;

{Hp nht hai cy thnh mt cy}

end;

end;

procedure PrintResult;
var
i, Count, W: Integer;
begin
if not Connected then
WriteLn('Error: Graph is not connected')
else
begin
WriteLn('Minimal spanning tree: ');
Count := 0;
W := 0;
for i := 1 to m do
{Duyt danh sch cnh}
with e[i] do
begin
if Mark then
{Lc ra nhng cnh kt np vo cy khung}
begin
WriteLn('(', u, ', ', v, ') = ', c);
Inc(Count);
W := W + c;
end;
if Count = n - 1 then Break;
{Cho ti khi n - 1 cnh}
end;
WriteLn('Weight = ', W);
end;
end;
begin
Assign(Input, 'MINTREE.INP'); Reset(Input);
Assign(Output, 'MINTREE.OUT'); Rewrite(Output);
LoadGraph;
Init; Kruskal;
PrintResult;
Close(Input);
Close(Output);
end.

Xt v phc tp tnh ton, ta c th chng minh c rng thao tc GetRoot c phc tp l


O(log2n), cn thao tc Union l O(1). Gi s ta c danh sch cnh sp xp ri th xt vng lp
dng cy khung, n duyt qua danh sch cnh v vi mi cnh n gi 2 ln thao tc GetRoot, vy
th phc tp l O(mlog2n), nu th c cy khung th m n-1 nn ta thy chi ph thi gian ch
yu s nm thao tc sp xp danh sch cnh bi phc tp ca HeapSort l O(mlog2m). Vy
phc tp tnh ton ca thut ton l O(mlog2m) trong trng hp xu nht. Tuy nhin, phi lu
rng xy dng cy khung th t khi thut ton phi duyt ton b danh sch cnh m ch mt
phn ca danh sch cnh m thi.
III. THUT TON PRIM (ROBERT PRIM - 1957)
Thut ton Kruskal hot ng chm trong trng hp th dy (c nhiu cnh). Trong trng hp
ngi ta thng s dng phng php ln cn gn nht ca Prim. Thut ton c th pht biu
hnh thc nh sau:
n th v hng G = (V, E) c n nh c cho bi ma trn trong s C. Qui c c[u, v] = +
nu (u, v) khng l cnh. Xt cy T trong G v mt nh v, gi khong cch t v ti T l trng s
nh nht trong s cc cnh ni v vi mt nh no trong T:

d[v] = min{c[u, v] uT}


Ban u khi to cy T ch gm c mi nh {1}. Sau c chn trong s cc nh ngoi T ra mt
nh gn T nht, kt np nh vo T ng thi kt np lun c cnh to ra khong cch gn nht
. C lm nh vy cho ti khi:

Hoc kt np c tt c n nh th ta c T l cy khung nh nht

Hoc cha kt np c ht n nh nhng mi nh ngoi T u c khong cch ti T l +.


Khi th cho khng lin thng, ta thng bo vic tm cy khung tht bi.
V mt k thut ci t, ta c th lm nh sau:
S dng mng nh du Free. Free[v] = TRUE nu nh nh v cha b kt np vo T.
Gi d[v] l khong cch t v ti T. Ban u khi to d[1] = 0 cn d[2] = d[3] = ... = d[n] = +. Ti
mi bc chn nh a vo T, ta s chn nh u no ngoi T v c d[u] nh nht. Khi kt np u
vo T ri th r rng cc nhn d[v] s thay i: d[v]mi := min(d[v]c, c[u, v]). Vn ch c vy
(chng trnh rt ging thut ton Dijkstra, ch khc cng thc ti u nhn).
PROG09_2.PAS * Thut ton Prim
program Minimal_Spanning_Tree_by_Prim;
const
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer; {Vt, Trace[v] l nh cha ca v trong cy khung nh nht}
n, m: Integer;
Connected: Boolean;
procedure LoadGraph;

{Nhp

th}

var
i, u, v: Integer;
begin
ReadLn(n, m);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC; {Khi to ma trn trng s}
for i := 1 to m do
begin
ReadLn(u, v, c[u, v]);
c[v, u] := c[u, v];
end;
end;
procedure Init;
var
v: Integer;
begin
d[1] := 0;
{nh 1 c nhn khong cch l 0}
for v := 2 to n do d[v] := maxC;
{Cc nh khc c nhn khong cch +}
FillChar(Free, SizeOf(Free), True); {Cy T ban u l rng}
end;
procedure Prim;
var
k, i, u, v, min: Integer;
begin
Connected := True;
for k := 1 to n do
begin

u := 0; min := maxC; {Chn nh u cha b kt np c d[u] nh nht}


for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
if u = 0 then {Nu khng chn c u no c d[u] < + th th khng lin thng}
begin
Connected := False;
Break;
end;
Free[u] := False; {Nu chn c th nh du u b kt np, lp ln 1 th d nhin u = 1 bi d[1] = 0}
for v := 1 to n do
if Free[v] and (d[v] > c[u, v]) then {Tnh li cc nhn khong cch d[v] (v cha kt np)}
begin
d[v] := c[u, v];
{Ti u nhn d[v] theo cng thc}
Trace[v] := u;
{Lu vt, nh ni vi v cho khong cch ngn nht l u}
end;
end;

end;

procedure PrintResult;
var
v, W: Integer;
begin
if not Connected then {Nu th khng lin thng th tht bi}
WriteLn('Error: Graph is not connected')
else
begin
WriteLn('Minimal spanning tree: ');
W := 0;
for v := 2 to n do {Cy khung nh nht gm nhng cnh (v, Trace[v])}
begin
WriteLn('(', Trace[v], ', ', v, ') = ', c[Trace[v], v]);
W := W + c[Trace[v], v];
end;
WriteLn('Weight = ', W);
end;
end;
begin
Assign(Input, 'MINTREE.INP'); Reset(Input);
Assign(Output, 'MINTREE.OUT'); Rewrite(Output);
LoadGraph;
Init; Prim;
PrintResult;
Close(Input);
Close(Output);
end.

Xt v phc tp tnh ton, thut ton Prim c phc tp l O(n ). Tng t thut ton Dijkstra,
nu kt hp thut ton Prim vi cu trc Heap s c mt thut ton vi phc tp
O((m+n)logn).
Bi tp
1. Vit chng trnh to th vi s nh 100, trng s cc cnh l cc s c sinh ngu nhin.
Ghi vo file d liu MINTREE.INP ng theo khun dng quy nh. So snh kt qu lm vic ca
thut ton Kruskal v thut ton Prim v tnh ng n v v tc .
2. Trn mt nn phng vi h to Decattes vung gc t n my tnh, my tnh th i c t
to (Xi, Yi). 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.
3. Tng t nh bi 2, nhng ban u c sn mt s cp my ni ri, cn cho bit cch ni thm
t chi ph nht.
4. H thng in trong thnh ph c cho bi n trm bin th v cc ng dy in ni gia cc
cp trm bin th. Mi ng dy in e c an ton l p(e). y 0 < p(e) 1. an ton ca c
li in l tch an ton trn cc ng dy. V d nh c mt ng dy nguy him: p(e) = 1%
th cho d cc ng dy khc l tuyt i an ton ( an ton = 100%) th an ton ca mng
cng rt thp (1%). 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.
5. Hy th ci t thut ton Prim vi cu trc d liu Heap cha cc nh ngoi cy, tng t nh
i vi thut ton Dijkstra.

10. BI TON LUNG CC I TRN MNG


Ta gi mng l mt th c hng G = (V, E), trong c duy nht mt nh A khng c cung i
vo gi l im pht, duy nht mt nh B khng c cung i ra gi l nh thu v mi cung e = (u,
v) E c gn vi mt s khng m c(e) = c[u, v] gi l kh nng thng qua ca cung .
thun tin cho vic trnh by, ta qui c rng nu khng c cung (u, v) th kh nng thng qua c[u,
v] ca n c gn bng 0.
Nu c mng G = (V, E). Ta gi lung f trong mng G l mt php gn cho mi cung e = (u, v) E
mt s thc khng m f(e) = f[u, v] gi l lung trn cung e, tho mn cc iu kin sau:

Lung trn mi cung khng vt qu kh nng thng qua ca n: 0 f[u, v] c[u, v] ( (u,
v)
E)

Vi mi nh v khng trng vi nh pht A v nh thu B, tng lung trn cc cung i vo v


bng tng lung trn cc cung i ra khi v:

f [u, v] f [v, w] . Trong :

w ( v )

(v) = {uV (u, v) E}

u ( v )

(v) = {wV (v, w) E}


Gi tr ca mt lung l tng lung trn cc cung i ra khi nh pht = tng lung trn cc cung
i vo nh thu.
2

5
6

1
0

6
5

1
5

1
5

Hnh 20: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7

I. BI TON
Cho mng G = (V, E). Hy tm lung f* trong mng vi gi tr lung ln nht. Lung nh vy gi
l lung cc i trong mng v bi ton ny gi l bi ton tm lung cc i trn mng.
II. LT CT, NG TNG LUNG, NH L FORD - FULKERSON
1. nh ngha:
Ta gi lt ct (X, Y) l mt cch phn hoch tp nh V ca mng thnh hai tp ri nhau X v Y,
trong X cha nh pht v Y cha nh thu. Kh nng thng qua ca lt ct (X, Y) l tng tt c
cc kh nng thng qua ca cc cung (u, v) c u X v v Y. Lt ct vi kh nng thng qua nh
nht gi l lt ct hp nht.
2. nh l Ford-Fulkerson:
Gi tr lung cc i trn mng ng bng kh nng thng qua ca lt ct hp nht. Vic chng
minh nh l Ford- Fulkerson xy dng c mt thut ton tm lung cc i trn mng:
Gi s f l mt lung trong mng G = (V, E). T mng G = (V, E) ta xy dng th c trng s Gf
= (V, Ef) nh sau:
Xt nhng cnh e = (u, v) E (c[u, v] > 0):

Nu f[u, v] < c[u, v] th ta thm cung (u, v) vo Ef vi trng s c[u, v] - f[u, v], cung gi l
cung thun. V ngha, trng s cung ny cho bit cn c th tng lung f trn cung (u, v)
mt lng khng qu trng s .

Xt tip nu nh f[u, v] > 0 th ta thm cung (v, u) vo Ef vi trng s f[u, v], cung gi l
cung nghch. V ngha, trng s cung ny cho bit cn c th gim lung f trn cung (u, v)
mt lng khng qu trng s .
th Gf c gi l th tng lung.
5
6;5

6;6

5;5
3;0

3;1

3
6

6;1

5,2
3

1;1

Hnh 21: Mng v lung trn cc cung (1 pht, 6 thu) v th tng lung tng ng

Gi s P l mt ng i c bn t nh pht A ti nh thu B. Gi l gi tr nh nht ca cc


trng s ca cc cung trn ng i P. Ta s tng gi tr ca lung f bng cch t:

f[u, v] := f[u, v] + , nu (u, v) l cung trong ng P v l cung thun

f[v, u] := f[v, u] - , nu (u, v) l cung trong ng P v l cung nghch

Cn lung trn nhng cung khc gi nguyn


C th kim tra lung f mi xy dng vn l lung trong mng v gi tr ca lung f mi c tng
thm so vi gi tr lung f c. Ta gi thao tc bin i lung nh vy l tng lung dc ng P,
ng i c bn P t A ti B c gi l ng tng lung.
V d: vi th tng lung Gf nh trn, gi s chn ng i (1, 3, 4, 2, 5, 6). Gi tr nh nht ca
trng s trn cc cung l 2, vy th ta s tng cc gi tr f[1, 3]), f[3, 4], f[2, 5], f[5, 6] ln 2, (do cc
cung l cung thun) v gim gi tr f[2, 4] i 2 (do cung (4, 2) l cung nghch). c lung mi
mang gi tr 9.
6;5
2
5;5
3;0

6;3
4

2
6;6

5;5
3;2

3;1
6

1
6;1

5,2
5

6;6

3;3
6

1
6;3

5,4
3

1;1

5
1;1

Hnh 22: Mng G trc v sau khi tng lung

n y ta c th hnh dung ra c thut ton tm lung cc i trn mng: khi to mt lung bt


k, sau c tng lung dc theo ng tng lung, cho ti khi khng tm c ng tng
lung na
Vy cc bc ca thut ton tm lung cc i trn mng c th m t nh sau:
Bc 1: Khi to:
Mt lung bt k trn mng, chng hn nh lung 0 (lung trn cc cung u bng 0), sau :

Bc 2: Lp hai bc sau:

Tm ng tng lung P i vi lung hin c Tm ng i c bn t A ti B trn th


tng lung, nu khng tm c ng tng lung th bc lp kt thc.

Tng lung dc theo ng P


Bc 3: Thng bo gi tr lung cc i tm c.
III. CI T
Input: file vn bn MAXFLOW.INP. Trong :

Dng 1: Cha s nh n ( 100), s cnh m ca th, nh pht A, nh thu B theo ng th


t cch nhau t nht mt du cch

m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht mt du cch th hin
c cung (u, v) trong mng v kh nng thng qua ca cung l c[u, v] (c[u, v] l s nguyn
dng khng qu 100)
Output: file vn bn MAXFLOW.OUT ghi lung trn cc cung v gi tr lung cc i tm c
6

2
5

1
5

6
3

MAXFLOW.INP
6 8 1 6
1 2 5
1 3 5
2 4 6
2 5 3
3 4 3
3 5 1
4 6 6
5 6 6

MAXFLOW.OUT
f(1, 2) = 5
f(1, 3) = 4
f(2, 4) = 3
f(2, 5) = 2
f(3, 4) = 3
f(3, 5) = 1
f(4, 6) = 6
f(5, 6) = 3
Max Flow: 9

Ch rng ti mi bc c nhiu phng n chn ng tng lung, hai cch chn khc nhau c
th cho hai lung cc i khc nhau, tuy nhin v mt gi tr th tt c cc lung xy dng c
theo cch trn s c cng gi tr cc i.
Ci t chng trnh tm lung cc i di y rt chn phng, t ma trn nhng kh nng thng
qua c v lung f hin c (khi to f l lung 0), n xy dng th tng lung Gf bng cch xy
dng ma trn cf nh sau:
cf[u, v] = trng s cung (u, v) trn th Gf nu nh (u, v) l cung thun
cf[u, v] = - trng s cung (u, v) trn th Gf nu nh (u, v) l cung nghch
cf[u, v] = + nu nh (u, v) khng phi cung ca Gf
cf gn ging nh ma trn trng s ca Gf, ch c iu ta i du trng s nu nh gp cung nghch.
Cu hi t ra l nu nh mng cho c nhng ng hai chiu (c c cung (u, v) v cung (v, u) iu ny xy ra rt nhiu trong mng li giao thng) th th tng lung rt c th l a th
(gia u, v c th c nhiu cung t u ti v). Ma trn cf cng gp nhc im nh ma trn trng s:
khng th biu din c a th, tc l nu nh c nhiu cung ni t u ti v trong th tng
lung th ta nh chp nhn b bt m ch gi li mt cung. Rt may cho chng ta l iu
khng lm sai lch i mc ch xy dng th tng lung: ch l tm mt ng i t nh pht A
ti nh thu B m thi, cn ng no th khng quan trng.
Sau chng trnh tm ng i t nh pht A ti nh thu B trn th tng lung bng thut
ton tm kim theo chiu rng, nu tm c ng i th s tng lung dc theo ng tng
lung...

PROG10_1.PAS * Thut ton tm lung cc i trn mng


program Max_Flow;
const
max = 100;
maxC = 10000;
var
c, f, cf: array[1..max, 1..max] of Integer; {c: kh nng thng, f: Lung}
Trace: array[1..max] of Integer;
n, A, B: Integer;
procedure Enter;
{Nhp mng}
var
m, i, u, v: Integer;
begin
FillChar(c, SizeOf(c), 0);
ReadLn(n, m, A, B);
for i := 1 to m do
ReadLn(u, v, c[u, v]);
end;
procedure CreateGf; {Tm th tng lung, tc l xy dng cf t c v f}
var
u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do cf[u, v] := maxC;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then {Nu u, v l cung trong
mng}

end;

begin
if f[u, v] < c[u, v] then cf[u, v] := c[u, v] - f[u, v]; {t cung thun}
if f[u, v] > 0 then cf[v, u] := -f[u, v]; {t cung nghch}
end;

{Th tc ny tm mt ng i t A ti B bng BFS, tr v TRUE nu c ng, FALSE nu khng c ng}

function FindPath: Boolean;


var
Queue: array[1..max] of Integer; {Hng i dng cho BFS}
Free: array[1..max] of Boolean;
u, v, First, Last: Integer;
begin
FillChar(Free, SizeOf(Free), True);
First := 1; Last := 1; Queue[1] := A; {Queue ch gm mt nh pht A}
Free[A] := False;
{nh du A}
repeat
u := Queue[First]; Inc(First);
{Ly u khi Queue}
for v := 1 to n do
if Free[v] and (cf[u, v] <> maxC) then {Xt v cha nh du k vi u}
begin
Trace[v] := u;
{Lu vt ng i A ... u v}
if v = B then
{v = B th ta c ng i t A ti B, thot th tc}
begin
FindPath := True; Exit;
end;
Free[v] := False; {nh du v}
Inc(Last);
Queue[Last] := v; {Queue v}
end;
until First > Last;
{Queue rng}
FindPath := False;
{ trn khng Exit c th tc l khng c ng}
end;

{Th tc tng lung dc theo ng tng lung tm c trong


FindPath}

procedure IncFlow;
var
u, v, IncValue: Integer;
begin
{Trc ht d ng theo vt tm trng s nh nht ca cc cung trn ng}

IncValue := maxC;
v := B;
while v <> A do
begin
u := Trace[v]; { rng cf[u, v] l trng s ca cung (u, v) trn th tng lung}
if Abs(cf[u, v]) < IncValue then IncValue := Abs(cf[u, v]);
v:= u;
end;
{D li ng ln th hai, ln ny tng lung}

v := B;
while v <> A do
begin
u := Trace[v];
if cf[u, v] > 0 then f[u, v] := f[u, v] + IncValue {Nu (u, v) l cung thun trn Gf}
else f[v, u] := f[v, u] - IncValue; {Nu (u, v) l cung nghch trn Gf}
v := u;
end;
end;
procedure PrintResult; {In lung cc i tm
c}

var
u, v, m: Integer;
begin
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then {Nu c cung (u, v) trn mng th in ra gi tr lung f gn cho cung }
begin
WriteLn('f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v]; {Gi tr lung cc i = tng lung pht ra t A}
end;
WriteLn('Max Flow: ', m);
end;
begin
Assign(Input, 'MAXFLOW.INP'); Reset(Input);
Assign(Output, 'MAXFLOW.OUT'); Rewrite(Output);
Enter;
{Nhp d liu}
FillChar(f, SizeOf(f), 0); {Khi to lung 0}
repeat
{Bc lp}
CreateGf;
{Dng th tng lung}
if not FindPath then Break; {Nu khng tm c ng tng lung th thot ngay}
IncFlow;
{Tng lung dc ng tng lung}
until False;
PrintResult;
Close(Input);
Close(Output);
end.

By gi ta th xem cch lm trn c ch no v cha hay ch no ?


Trc ht, thut ton tm ng bng Breadth First Search l kh tt, ngi ta chng minh rng
nu nh ng tng lung c tm bng BFS s lm gim ng k s bc lp tng lung so vi
DFS.
Nhng c th thy rng vic xy dng tng minh c th Gf thng qua vic xy dng ma trn
cf ch lm mi mt vic tm ng l lng ph, ch cn da vo ma trn kh nng thng qua c v
lung f hin c l ta c th bit c (u, v) c phi l cung trn th tng lung Gf hay khng.

Th hai, ti bc tng lung, ta phi d li hai ln ng i, mt ln tm trng s nh nht ca


cc cung trn ng, mt ln tng lung. Trong khi vic tm trng s nh nht ca cc cung trn
ng c th kt hp lm ngay trong th tc tm ng bng cch sau:
t Delta[v] l trng s nh nht ca cc cung trn ng i t A ti v, khi to Delta[A] = +.
Ti mi bc t nh u thm nh v trong BFS, th Delta[v] c th c tnh bng gi tr nh
nht trong hai gi tr Delta[u] v trng s cung (u, v) trn th tng lung. Khi tm c ng
i t A ti B th Delta[B] cho ta trng s nh nht ca cc cung trn ng tng lung.
Th ba, ngay trong bc tm ng tng lung, ta c th xc nh ngay cung no l cung thun,
cung no l cung nghch. V vy khi t nh u thm nh v trong BFS, ta c th vn lu vt ng
i Trace[v] := u, nhng sau s i du Trace[v] nu nh (u, v) l cung nghch.
Nhng ci tin cho ta mt cch ci t hiu qu hn, l:
IV. THUT TON FORD - FULKERSON (L.R.FORD & D.R.FULKERSON - 1962)
Mi nh v c gn nhn (Trace[v], Delta[v]). Trong Trace[v]

l nh lin trc v trong

ng i t A ti v, Trace[v] m hay dng tu theo ( Trace[v] , v) l cung nghch hay cung


thun trn th tng lung, Delta[v] l trng s nh nht ca cc cung trn ng i t A ti v trn
th tng lung.
Bc lp s tm ng i t A ti B trn th tng lung ng thi tnh lun cc nhn (Trace[v],
Delta[v]). Sau tng lung dc theo ng tng lung nu tm thy.
PROG10_2.PAS * Thut ton Ford-Fulkerson
program Max_Flow_by_Ford_Fulkerson;
const
max = 100;
maxC = 10000;
var
c, f: array[1..max, 1..max] of Integer;
Trace: array[1..max] of Integer;
Delta: array[1..max] of Integer;
n, A, B: Integer;
procedure Enter;

{Nhp

liu}

var
m, i, u, v: Integer;
begin
FillChar(c, SizeOf(c), 0);
ReadLn(n, m, A, B);
for i := 1 to m do
ReadLn(u, v, c[u, v]);
end;
function Min(X, Y: Integer): Integer;
begin
if X < Y then Min := X else Min := Y;
end;
function FindPath: Boolean;
var
u, v: Integer;
Queue: array[1..max] of Integer;
First, Last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[v] = 0 ng ngha vi v cha nh du}
First := 1; Last := 1; Queue[1] := A;
Trace[A] := n + 1;
{Ch cn n khc 0 nh du m thi, s dng no cng c c}

Delta[A] := maxC;
{Khi to nhn}
repeat
u := Queue[First]; Inc(First);
for v := 1 to n do
if Trace[v] = 0 then

{Ly u khi Queue}


{Xt nhng nh v cha nh du

thm}

begin
if f[u, v] < c[u, v] then
{Nu (u, v) l cung thun trn Gf v c trng s l c[u, v] - f[u, v]}
begin
Trace[v] := u;
{Lu vt, Trace[v] mang du dng}
Delta[v] := min(Delta[u], c[u, v] - f[u, v]);
end
else
if f[v, u] > 0 then
{Nu (u, v) l cung nghch trn Gf v c trng s l f[v, u]}
begin
Trace[v] := -u;
{Lu vt, Trace[v] mang du m}
Delta[v] := min(Delta[u], f[v, u]);
end;
if Trace[v] <> 0 then
{Trace[v] khc 0 tc l t u c th thm
v}

begin
if v = B then
{C ng tng lung t A ti B}
begin
FindPath := True; Exit;
end;
Inc(Last); Queue[Last] := v; {a v vo Queue}
end;
end;
until First > Last;
FindPath := False;
end;

{Hng i Queue rng}


{ trn khng Exit c tc l khng c ng}

procedure IncFlow; {Tng lung dc ng tng lung}


var
IncValue, u, v: Integer;
begin
IncValue := Delta[B];
{Nhn Delta[B] chnh l trng s nh nht trn cc cung ca ng tng lung}
v := B;
{Truy vt ng i, tng lung dc theo ng i}
repeat
u := Trace[v];
{Xt cung ( u , v) trn ng tng lung}
if u > 0 then f[u, v] := f[u, v] + IncValue
{(|u|, v) l cung thun th tng f[u, v]}
else
begin
u := -u;
f[v, u] := f[v, u] - IncValue;
{(|u|, v) l cung nghch th gim f[v, |u|]}
end;
v := u;
until v = A;
end;
procedure PrintResult;
{In kt qu}
var
u, v, m: Integer;
begin
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then
begin
WriteLn('f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v];
end;
WriteLn('Max Flow: ', m);
end;
begin

Assign(Input, 'MAXFLOW.INP'); Reset(Input);


Assign(Output, 'MAXFLOW.OUT'); Rewrite(Output);
Enter;
FillChar(f, SizeOf(f), 0);
repeat
if not FindPath then Break;
IncFlow;
until False;
PrintResult;
Close(Input);
Close(Output);
end.

nh l v lung cc i trong mng v lt ct hp nht:


Lung cc i trong mng bng kh nng thng qua ca lt ct hp nht. Khi tm c lung cc
i th theo thut ton trn s khng c ng i t A ti B trn th tng lung. Nu t tp X
gm nhng nh n c t nh pht A trn th tng lung (tt nhin AX) v tp Y gm
nhng nh cn li (tt nhin BY) th (X, Y) l lt ct hp nht . C th c nhiu lt ct hp
nht, v d nu t tp Y gm nhng nh n c nh thu B trn th tng lung (tt nhin B
Y) v tp X gm nhng nh cn li th (X, Y) cng l mt lt ct hp nht.
nh l v tnh nguyn:
Nu tt c cc kh nng thng qua l s nguyn th thut ton trn lun tm c lung cc i vi
lung trn cung l cc s nguyn. iu ny c th chng minh rt d bi ban u khi to lung 0
th tc cc lung trn cung l nguyn. Mi ln tng lung ln mt lng bng trng s nh nht trn
cc cung ca ng tng lung cng l s nguyn nn cui cng lung cc i tt s phi c lung
trn cc cung l nguyn.
nh l v chi ph thi gian thc hin gii thut:
Trong phng php Ford-Fulkerson, nu dng ng i ngn nht (qua t cnh nht) t nh pht
ti nh thu trn th tng lung th cn t hn n.m ln chn ng i tm ra lung cc i.
Edmonds v Karp chng minh tnh cht ny v ngh mt phng php ci tin: Ti mi bc,
ta nn tm ng tng lung sao cho gi tr tng lung c gia tng nhiu nht.
Ni chung i vi thut ton Ford-Fulkerson, cc nh gi l thuyt b lch rt nhiu so vi thc t,
mc d vi s phn tch trong trng hp xu, chi ph thi gian thc hin ca thut ton l kh ln.
Nhng trn thc t th thut ton ny hot ng rt nhanh v hiu qu.
Bi tp:
1. Mng vi nhiu im pht v nhiu im thu: Cho mt mng gm n nh vi p im pht A1,
A2, ..., Ap v q im thu B1, B2, ..., Bq. Mi cung ca mng c gn kh nng thng qua l s
nguyn. Cc nh pht ch c cung i ra v cc nh thu ch c cung i vo. Mt lung trn mng
ny l mt php gn cho mi cung mt s thc gi l lung trn cung khng vt qu kh nng
thng qua v tho mn vi mi nh khng phi nh pht hay nh thu th tng lung i vo bng
tng lung i ra. Gi tr lung bng tng lung i ra t cc nh pht = tng lung i vo cc nh
thu. Hy tm lung cc i trn mng.
2. Mng vi kh nng thng qua ca cc nh v cc cung: Cho mt mng vi nh pht A v
nh thu B. Mi cung (u, v) c gn kh nng thng qua c[u, v]. Mi nh v khc vi A v B c
gn kh nng thng qua d[v]. Mt lung trn mng c nh ngha nh trc v thm iu kin:
tng lung i vo nh v khng c vt qu kh nng thng qua d[v] ca nh . Hy tm lung
cc i trn mng.

3. Lt ct hp nht: Cho mt th lin thng gm n nh v m cnh, hy tm cch b i mt s t


nht cc cnh lm cho th mt i tnh lin thng
4. Tp i din: Mt lp hc c n bn nam, n bn n. Cho m mn qu lu nim, (n m). Mi bn
c s thch v mt s mn qu no . Hy tm cch phn cho mi bn nam tng mt mn qu cho
mt bn n tho mn:
Mi bn nam ch tng qu cho ng mt bn n
Mi bn n ch nhn qu ca ng mt bn nam
Bn nam no cng i tng qu v bn n no cng c nhn qu, mn qu phi hp s
thch ca c hai ngi.
Mn qu no c mt bn nam chn th bn nam khc khng c chn na.

11. BI TON TM B GHP CC I TRN TH HAI PHA


I. TH HAI PHA (BIPARTITE GRAPH)
Cc tn gi th hai pha, th lng phn, th phn i, th
i snh hai phn v.v... l ch chung mt dng n th v
hng G = (V, E) m tp nh ca n c th chia lm hai tp con X,
Y
Y ri nhau sao cho bt k cnh no ca th cng ni mt nh ca
X
X vi mt nh thuc Y. Khi ngi ta cn k hiu G l (XY, E)
v gi mt tp (chng hn tp X) l tp cc nh tri v tp cn li
l tp cc nh phi ca th hai pha G. Cc nh thuc X cn
gi l cc X_nh, cc nh thuc Y gi l cc Y_nh.
kim tra mt th lin thng c phi l th hai pha hay khng, ta c th p dng thut ton
sau:
Vi mt nh v bt k:
X := {v}; Y := ;
repeat
Y := Y K(X);
X := X K(Y);
until (XY ) or (X v Y l ti i - khng b sung c na);
if XY then < Khng phi th hai pha >
else <y l th hai pha, X l tp cc nh tri: cc nh n c t v qua
mt s chn cnh, Y l tp cc nh phi: cc nh n c t v qua mt s l
cnh>;

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...
II. BI TON GHP I KHNG TRNG V CC KHI NIM
Cho mt th hai pha G = (XY, E) y X l tp cc nh tri v Y l tp cc nh phi ca G
Mt b ghp (matching) ca G l mt tp hp cc cnh ca G i mt khng c nh chung.
Bi ton ghp i (matching problem) l tm mt b ghp ln nht (ngha l c s cnh ln nht)
ca G
Xt mt b ghp M ca G.
Cc nh trong M gi l cc nh ghp (matched vertices), cc nh khc l cha ghp.
Cc cnh trong M gi l cc cnh ghp, cc cnh khc l cha ghp
Nu nh hng li cc cnh ca th thnh cung, nhng cnh cha ghp c nh hng t X
sang Y, nhng cnh ghp nh hng t Y v X. Trn th nh hng : Mt ng i xut
pht t mt X_nh cha ghp gi l ng pha, mt ng i t mt X_nh cha ghp ti mt
Y_nh cha ghp gi l ng m.
Mt cch d hiu, c th quan nim nh sau:
Mt ng pha (alternating path) l mt ng i n trong G bt u bng mt X_nh cha
ghp, i theo mt cnh cha ghp sang Y, ri n mt cnh ghp v X, ri li n mt cnh
cha ghp sang Y... c xen k nhau nh vy.
Mt ng m (augmenting path) l mt ng pha. Bt u t mt X_nh cha ghp kt
thc bng mt Y_nh cha ghp.

V d: vi th hai pha nh hnh bn, v b ghp


M = {(X1, Y1), (X2, Y2)}
X3 v Y3 l nhng nh cha ghp, cc nh khc l ghp
ng (X3, Y2, X2, Y1) l ng pha
ng (X3, Y2, X2, Y1, X1, Y3) l ng m.
III. THUT TON NG M

X1

Y1

X2

Y2

X3

Y3

Thut ton ng m tm mt b ghp ln nht pht biu nh


X
Y
sau:
Bt u t mt b ghp bt k M (thng thng b ghp c
khi gn bng b ghp rng hay c tm bng cc thut ton tham lam)
Sau i tm mt ng m, nu tm c th m rng b ghp M nh sau: Trn ng m,
loi b nhng cnh ghp khi M v thm vo M nhng cnh cha ghp. Nu khng tm c
ng m th b ghp hin thi l ln nht.
<Khi to
while <C
<Dc
cha

mt b ghp M>;
ng m xut pht t x ti mt nh y cha ghp Y> do
trn ng m, xo b khi M cc cnh ghp v thm vo M nhng cnh
ghp, nh x v y tr thnh ghp, s cnh ghp tng ln 1>;

Nh v d trn, vi b ghp hai cnh M = {(X1, Y1), (X2, Y2)} v ng m tm c gm cc


cnh:
1. (X3, Y2) M
2. (Y2, X2) M
3. (X2, Y1) M
4. (Y1, X1) M
5. (X1, Y3) M
Vy th ta s loi i cc cnh (Y2, X2) v (Y1, X1) trong b ghp c v thm vo cc cnh (X3,
Y2), (X2, Y1), (X1, Y3) c b ghp 3 cnh.
IV. CI T
1. Biu din th hai pha
Gi s th hai pha G = (XY, E) c cc X_nh k hiu l X[1], X[2], ..., X[m] v cc Y_nh
k hiu l Y[1], Y[2], ..., Y[n]. Ta s biu din th hai pha ny bng ma trn A c mxn. Trong
:
A[i, j] = TRUE c cnh ni nh X[i] vi nh Y[j].
2. Biu din b ghp
biu din b ghp, ta s dng hai mng: matchX[1..m] v matchY[1..n].
matchX[i] l nh thuc tp Y ghp vi nh X[i]
matchY[j] l nh thuc tp X ghp vi nh Y[j].
Tc l nu nh cnh (X[i], Y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c rng:
Nu nh X[i] cha ghp vi nh no ca tp Y th matchX[i] = 0
Nu nh Y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.
thm mt cnh (X[i], Y[j]) vo b ghp th ta ch vic t matchX[i] := j v matchY[j] := i;
loi mt cnh (X[i], Y[j]) khi b ghp th ta ch vic t matchX[i] := 0 v matchY[j] := 0;

3. Tm ng m nh th no.
V ng m bt u t mt X_nh cha ghp, i theo mt cnh cha ghp sang tp Y, ri theo
mt ghp v tp X, ri li mt cnh cha ghp sang tp Y ... cui cng l cnh cha ghp ti
mt Y_nh cha ghp. Nn c th thy ngay rng di ng m l l v trn ng m s cnh
M t hn s cnh M l 1 cnh. V cng d thy rng gii thut tm ng m nn s dng thut
ton tm kim theo chiu rng ng m tm c l ng i ngn nht, gim bt cng vic
cho bc tng cp ghp.
Ta khi to mt hng i (Queue) ban u cha tt c cc X_nh cha ghp. Thut ton tm kim
theo chiu rng lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue nhng ni t
v cha c thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm ng m kt thc
Y_nh cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh j Y ghp,
da vo s kin: t j ch c th ti c matchY[j] theo duy nht mt cnh ghp nh hng
ngc t Y v X, nn ta c th nh du thm j, thm lun c matchY[j], v y vo Queue
phn t matchY[j] X (Thm lin 2 bc).
Input: file vn bn MATCH.INP
Dng 1: cha hai s m, n (m, n 100) theo th t l s X_nh v s Y_nh cch nhau t nht
mt du cch
Cc dng tip theo, mi dng ghi hai s i, j cch nhau t nht mt du cch th hin c cnh ni
hai nh (X[i], Y[j]) .
Output: file vn bn MATCH.OUT cha b ghp cc i tm c

2
5

MATCH.INP
4 5
1 1
1 4
2 1
2 2
2 4
3 2
3 3
4 2
4 3

MATCH.OUT
Match:
1) X[1] 2) X[2] 3) X[3] 4) X[4] -

Y[1]
Y[4]
Y[3]
Y[2]

PROG11_1.PAS * Thut ton ng m tm b ghp cc i


program MatchingProblem;
const
max = 100;
var
m, n: Integer;
a: array[1..max, 1..max] of Boolean;
matchX, matchY: array[1..max] of Integer;
Trace: array[1..max] of Integer;
procedure Enter;
{c d liu, (t thit b nhp chun)}
var
i, j: Integer;
begin
FillChar(a, SizeOf(a), False);
ReadLn(m, n);

while not SeekEof do


begin
ReadLn(i, j);
a[i, j] := True;
end;
end;
procedure Init;
{Khi to b ghp rng}
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
end;
{Tm ng m, nu thy tr v mt Y_nh cha ghp l nh kt thc ng m, nu khng thy tr v 0}

function FindAugmentingPath: Integer;


var
Queue: array[1..max] of Integer;
i, j, first, last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[j] = X_nh lin trc Y[j] trn ng m}
last := 0;
{Khi to hng i rng}
for i := 1 to m do
{y tt c nhng X_nh cha ghp vo hng i}
if matchX[i] = 0 then
begin
Inc(last);
Queue[last] := i;
end;
{Thut ton tm kim theo chiu rng}

first := 1;
while first <= last do
begin
i := Queue[first]; Inc(first);
for j := 1 to n do

{Ly mt X_nh ra khi Queue (X[i])}


{Xt nhng Y_nh cha thm k vi X[i] qua mt cnh cha

ghp}

if (Trace[j] = 0) and a[i, j] and (matchX[i] <> j) then


begin {lnh if trn hi tha k matchX[i] <> j, iu kin Trace[j] = 0 bao hm lun iu kin ny ri}
Trace[j] := i;
{Lu vt ng i}
if matchY[j] = 0 then {Nu j cha ghp th ghi nhn ng m v thot ngay}
begin
FindAugmentingPath := j;
Exit;
end;
Inc(last);
{y lun matchY[j] vo hng i}
Queue[last] := matchY[j];
end;

end;
FindAugmentingPath := 0;
end;

{ trn khng Exit c tc l khng cn ng m}

{Ni rng b ghp bng ng m kt thc fY}

procedure Enlarge(f: Integer);


var
x, next: Integer;
begin
repeat
x := Trace[f];
next := matchX[x];
matchX[x] := f;
matchY[f] := x;
f := next;
until f = 0;
end;
procedure Solve;
var

{Thut ton ng m}

next
... ...

next
... ...

finish: Integer;
begin
repeat
finish := FindAugmentingPath; {u tin th tm mt ng m}
if finish <> 0 then Enlarge(finish);
{Nu thy th tng cp v lp li}
until finish = 0;
{Nu khng thy th dng}
end;
procedure PrintResult;
{In kt qu}
var
i, Count: Integer;
begin
WriteLn('Match: ');
Count := 0;
for i := 1 to m do
if matchX[i] <> 0 then
begin
Inc(Count);
WriteLn(Count, ') X[', i, '] - Y[', matchX[i], ']');
end;
end;
begin
Assign(Input, 'MATCH.INP'); Reset(Input);
Assign(Output, 'MATCH.OUT'); Rewrite(Output);
Enter;
Init; Solve;
PrintResult;
Close(Input);
Close(Output);
end.

Kho st tnh ng n ca thut ton cho ta mt kt qu kh th v:


Nu ta thm mt nh A v cho thm m cung
t A ti tt c nhng nh ca tp X, thm
mt nh B v ni thm n cung t tt c cc
nh ca Y ti B. Ta c mt mng vi nh A
B
pht A v nh thu B. Nu t kh nng thng
qua ca cc cung u l 1 sau tm lung
cc i trn mng bng thut ton FordX
Y
Fulkerson th theo nh l v tnh nguyn,
lung tm c trn cc cung u phi l s nguyn (tc l bng 1 hoc 0). Khi d thy rng
nhng cung c lung 1 t tp X ti tp Y s cho ta mt b ghp ln nht. chng minh thut ton
ng m tm c b ghp ln nht sau hu hn bc, ta s chng minh rng s b ghp tm c
bng thut ton ng m s bng gi tr lung cc i ni trn, iu cng rt d bi v nu
k mt cht th ng m chng qua l ng tng lung trn th tng lung m thi, ngay ci
tn augmenting path cho ta bit iu ny. V vy thut ton ng m trng hp ny l mt
cch ci t hiu qu trn mt dng th c bit, n lm cho chng trnh sng sa hn nhiu
so vi phng php tm b ghp da trn bi ton lung v thut ton Ford-Fulkerson thun ty.
Ngi ta chng minh c chi ph thi gian thc hin gii thut ny trong trng hp xu nht
3
s l O(n ) i vi th dy v O(n(n + m)logn) i vi th tha. Tuy nhin, cng ging nh
thut ton Ford-Fulkerson, trn thc t phng php ny hot ng rt nhanh.
Bi tp

1. C n th v n cng vic (n 100), mi th thc hin c t nht mt vic. Nh vy mt th c


th lm c nhiu vic, v mt vic c th c nhiu th lm c. Hy phn cng n th thc hin
n vic sao cho mi th phi lm ng 1 vic hoc thng bo rng khng c cch phn cng no
tho mn iu trn.
2. C n th v m cng vic (n, m 100). Mi th cho bit mnh c th lm c nhng vic no,
hy phn cng cc th lm cc cng vic sao cho mi th phi lm t nht 2 vic v s vic thc
hin c l nhiu nht.
3. C n th v m cng vic (n, m 100). Mi th cho bit mnh c th lm c nhng vic no,
hy phn cng thc hin cc cng vic sao cho s cng vic phn cho ngi th lm nhiu nht
thc hin l cc tiu.

12. BI TON TM B GHP CC I VI TRNG S CC TIU TRN


TH HAI PHA - THUT TON HUNGARI
I. BI TON PHN CNG

y l mt dng bi ton pht biu nh sau: C m ngi (nh s 1, 2, ..., m) v n cng vic
(nh s 1, 2, ..., n), mi ngi c kh nng thc hin mt s cng vic no . giao cho
ngi i thc hin cng vic j cn mt chi ph l c[i, j] 0. Cn phn cho mi th mt vic v
mi vic ch do mt th thc hin sao cho s cng vic c th thc hin c l nhiu nht v
nu c 2 phng n u thc hin c nhiu cng vic nht th ch ra phng n chi ph t
nht.
Dng th hai pha G = (XY, E) vi X l tp m ngi, Y l tp n vic v (u, v) E vi
trng s c[u, v] nu nh ngi u lm c cng vic v. Bi ton a v tm b ghp nhiu
cnh nht ca G c trng s nh nht.
Gi k = max(m, n). B sung vo tp X v Y mt s nh gi X = Y = k.

Gi M l mt s dng ln hn chi ph ca mi php phn cng c th. Vi mi cp nh

(u, v): u X v v Y. Nu (u, v) E th ta b sung cnh (u, v) vo E vi trng s l M.

Khi ta c G l mt th hai pha y ( th hai pha m gia mt nh bt k ca


X v mt nh bt k ca Y u c cnh ni). V nu nh ta tm c b ghp y k
cnh mang trng s nh nht th ta ch cn loi b khi b ghp nhng cnh mang
trng s M va thm vo th s c k hoch phn cng 1 ngi 1 vic cn tm. iu
ny d hiu bi b ghp y mang trng s nh nht tc l phi t cnh trng s M nht,
tc l s php phn cng l nhiu nht, v tt nhin trong s cc phng n ghp t cnh trng
s M nht th y l phng n trng s nh nht, tc l tng chi ph trn cc php phn cng
l t nht.

II. PHN TCH

Vo: th hai pha y G = (XY, E); X = Y = k. c cho bi ma trn vung C c

kxk, c[i, j] = trng s cnh ni nh Xi vi Yj. Gi thit c[i, j] 0. vi mi i, j.

Ra: B ghp y trng s nh nht.


Hai nh l sau y tuy rt n gin nhng l nhng nh l quan trng to c s cho thut ton s
trnh by:
nh l 1: Loi b khi G nhng cnh trng s > 0. Nu nhng cnh trng s 0 cn li to ra b
ghp k cnh trong G th y l b ghp cn tm.
Chng minh: Theo gi thit, cc cnh ca G mang trng s khng m nn bt k b ghp no trong
G cng c trng s khng m, m b ghp trn mang trng s 0, nn tt nhin l b ghp y
trng s nh nht.
nh l 2: Vi nh Xi, nu ta cng thm mt s (dng hay m) vo tt c nhng cnh lin
thuc vi Xi (tng ng vi vic cng thm vo tt c cc phn t thuc hng i ca ma trn
C) th khng nh hng ti b ghp y trng s nh nht.
Chng minh: Vi mt b ghp y bt k th c mt v ch mt cnh ghp vi X[i]. Nn vic
cng thm vo tt c cc cnh lin thuc vi X[i] s lm tng trng s b ghp ln . V vy

nu nh ban u, M l b ghp y trng s nh nht th sau thao tc trn, M vn l b ghp y


trng s nh nht.
H qu: Vi nh Y[j], nu ta cng thm mt s (dng hay m) vo tt c nhng cnh lin thuc
vi Y[j] (tng ng vi vic cng thm vo tt c cc phn t thuc ct j ca ma trn C) th
khng nh hng ti b ghp y trng s nh nht.
T y c th nhn ra t tng ca thut ton: T th G, ta tm chin lc cng / tr mt
cch hp l trng s ca cc cnh lin thuc vi mt nh no c mt th mi vn c
cc cnh trng s khng m, m cc cnh trng s 0 ca th mi cha mt b ghp y
k cnh.
V d: Bin i ma trn trng s ca th hai pha 3 nh tri, 3 nh phi:
0 0 0
0 1 7
0 8 9

-1
-1

1 0 0
0 0 6
0 7 8

X[1] - Y[3]
X[2] - Y[2]
X[3] - Y[1]

+1

III. THUT TON


1. Cc khi nim:
cho gn, ta gi nhng cnh trng s 0 ca G l nhng 0_cnh.
Xt mt b ghp M ch gm nhng 0_cnh.

Nhng nh M gi l nhng nh ghp, nhng nh cn li gi l nhng nh cha ghp.

Nhng 0_cnh M gi l nhng 0_cnh ghp, nhng 0_cnh cn li l nhng 0_cnh


cha ghp.
Nu ta nh hng li cc 0_cnh nh sau: Nhng 0_cnh cha ghp cho hng t tp X sang tp
Y, nhng 0_cnh ghp cho hng t tp Y v tp X. Khi :

ng pha (Alternating Path) l mt ng i c bn xut pht t mt X_nh cha ghp i


theo cc 0_cnh nh hng trn. Nh vy dc trn ng pha, cc 0_cnh cha ghp v
nhng 0_cnh ghp xen k nhau. V ng pha ch l ng i c bn trn th nh
hng nn vic xc nh nhng nh no c th n c t x X bng mt ng pha c
th s dng cc thut ton tm kim trn th (BFS hoc DFS). Nhng nh v nhng cnh
c duyt qua to thnh mt cy pha gc x

Mt ng m (Augmenting Path) l mt ng pha i t mt X_nh cha ghp ti mt


Y_nh cha ghp. Nh vy:
ng i trc tip t mt X_nh cha ghp ti mt Y_nh cha ghp qua mt 0_cnh
cha ghp cng l mt ng m.
Dc trn ng m, s 0_cnh cha ghp nhiu hn s 0_cnh ghp ng 1 cnh.
2. Thut ton Hungari
Bc 1: Khi to:

Mt b ghp M :=
*

Bc 2: Vi mi nh x X, ta tm cch ghp x nh sau.

Bt u t nh x cha ghp, th tm ng m bt u x bng thut ton tm kim trn th


(BFS hoc DFS - thng thng nn dng BFS tm ng qua t cnh nht) c hai kh nng xy
ra:

Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v


thm vo M nhng cnh cha ghp, ta c mt b ghp mi nhiu hn b ghp c 1 cnh
*

v nh x tr thnh ghp.
Hoc khng tm c ng m th do ta s dng thut ton tm kim trn th nn c th
xc nh c hai tp:

VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}

VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}

Gi l trng s nh nht ca cc cnh ni gia mt nh thuc VisitedX vi mt nh


khng thuc VisitedY. D thy > 0 bi nu = 0 th tn ti mt 0_cnh (x, y) vi
*
xVisitedX v yVisitedY. V x n c x bng mt ng pha v (x, y) l mt
*

0_cnh nn x cng n c y bng mt ng pha, dn ti y VisitedY, iu ny v


l.

Bin i th G nh sau: Vi x VisitedX, tr vo trng s nhng cnh lin


thuc vi x, Vi y VisitedY, cng vo trng s nhng cnh lin thuc vi y.
*

Lp li th tc tm kim trn th th tm ng m xut pht x cho ti khi tm ra


ng m.
Bc 3: Sau bc 2 th mi X_nh u c ghp, in kt qu v b ghp tm c.
M hnh ci t ca thut ton c th vit nh sau:
<Khi to: M := ...>;
for (x*X) do
begin
repeat
<Tm ng m xut pht x*>;
if <Khng tm thy ng m> then <Bin i th G: Chn := ...>;
until <Tm thy ng m>;
<Dc theo ng m, loi b nhng cnh ghp khi M
v thm vo M nhng cnh cha ghp>;
end;
<Kt qu>;

V d minh ho:
khng b ri hnh, ta hiu nhng cnh khng ghi trng s l nhng 0_cnh, nhng cnh khng
v mang trng s rt ln trong trng hp ny khng cn thit phi tnh n. Nhng cnh nt m
l nhng cnh ghp, nhng cnh nt thanh l nhng cnh cha ghp.

X1

Y1

X2

Y2

x = X1

X1

Y1

Tm c ng m:
2
1
X3

X4

X1

X1 Y1

X2

Y2
2
1

Tng cp
Y3

X3

Y4

X4

Y1

x = X2

Y3

X1

Y4

Y1

Tm c ng m:
X2

Y2
2
1

X3

X4

X1

X2 Y1 X1 Y2

X2

Y2
2
1

Tng cp
Y3

X3

Y4

X4

Y1

x = X3

Y3

X1

Y4

Y1

Tm c ng m:
X2

Y2
2
1

X3

X4

1
X3

Y4

X4

X2

Y2
2
1=
Y3

Y2
2

Y3

Y1

X4

X2

Tng cp

X1

X3

X3 Y3

Y4

x = X4
Khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha: {X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha: {Y3}
Gi tr xoay = 1 (Cnh X3-Y2)
Tr tt c trng s nhng cnh lin
thuc vi {X3, X4} i 1
Cng tt c trng s nhng cnh lin
thuc vi Y3 ln 1

Y3

X1

Y4

Y1

X2

Y2
2
0

X3

X4

Y3

Y4

X1

Y1

X2

Y2
2=

X3

Y3

X4

Y4

X1

Y1

x = X4
Vn khng tm c ng m:
Tp nhng X_nh n c t X4
bng mt ng pha:
{X1, X2, X3, X4}
Tp nhng Y_nh n c t X4
bng mt ng pha:
{Y1, Y2, Y3}
Gi tr xoay = 2 (Cnh X2-Y4)
Tr tt c trng s nhng cnh lin
thuc vi {X1, X2, X3, X4} i 2
Cng tt c trng s nhng cnh lin
thuc vi {Y1, Y2, Y3} ln 2

x = X4

X1

Y1

X2

Y2
0

X3

X4

Y3

Y4

X1

Y1

X2

Y2

X3

Y3

Tm c ng m:
X2

Y2
0

X3

Y3

X4 Y3 X3 Y2 X1 Y1
X2 Y4
Tng cp
Xong

X4

Y4

X4

Y4

rng nu nh khng tm thy ng m xut pht x th qu trnh tm kim trn th s cho


*

ta mt cy pha gc x . Gi tr xoay thc cht l trng s nh nht ca cnh ni mt X_nh trong


cy pha vi mt Y_nh ngoi cy pha (cnh ngoi). Vic tr vo nhng cnh lin thuc vi
X_nh trong cy pha v cng vo nhng cnh lin thuc vi Y_nh trong cy pha s lm cho
cnh ngoi ni trn tr thnh 0_cnh, cc cnh khc vn c trng s 0. Nhng quan trng hn l
tt c nhng cnh trong cy pha vn c l 0_cnh. iu m bo cho qu trnh tm kim trn
th ln sau s xy dng c cy pha mi ln hn cy pha c (Th hin ch: tp VisitedY s
rng hn trc t nht 1 phn t). V tp cc Y_ nh ghp l hu hn nn sau khng qu k
bc, s c mt Y_nh cha ghp VisitedY, tc l tm ra ng m
Trn thc t, chng trnh hot ng nhanh hn, trong bc khi to, ngi ta c th thm mt
thao tc:
Vi mi nh x X, xc nh trng s nh nht ca cc cnh lin thuc vi x, sau tr tt c
trng s cc cnh lin thuc vi x i trng s nh nht . Lm tng t nh vy vi cc Y_nh.
iu ny tng ng vi vic tr tt c cc phn t trn mi hng ca ma trn C i gi tr nh
nht trn hng , ri li tr tt c cc phn t trn mi ct ca ma trn C i phn t nh nht trn
ct . Khi s 0_cnh ca th l kh nhiu, c th cha ngay b ghp y hoc ch cn qua
t bc bin i l s cha b ghp y k cnh.
tng nh hai nh ton hc Knig v Egervary, nhng ngi t c s l thuyt u tin cho
phng php, ngi ta ly tn ca t nc sinh ra hai nh ton hc ny t tn cho thut

ton. Mc d sau ny c mt s ci tin nhng tn gi Thut ton Hungari (Hungarian Algorithm)


vn c dng ph bin.
IV. CI T
1. Phng php i ngu Kuhn-Munkres (Khng lm bin i ma trn C ban u)
Phng php Kuhn-Munkres i tm hai dy s Fx[1..k] v Fy[1..k] tho mn:

c[i, j] - Fx[i] - Fy[j] 0

Tp cc cnh (X[i], Y[j]) tho mn c[i, j] - Fx[i] - Fy[j] = 0 cha trn mt b ghp y k
cnh, y chnh l b ghp cn tm.
Chng minh:
Nu tm c hai dy s tho mn trn th ta ch vic thc hin hai thao tc:
Vi mi nh X[i], tr tt c trng s ca nhng cnh lin thuc vi X[i] i Fx[i]
Vi mi nh Y[j], tr tt c trng s ca nhng cnh lin thuc vi Y[j] i Fy[j]
(Hai thao tc ny tng ng vi vic tr tt c trng s ca cc cnh (X[i], Y[j]) i mt lng
Fx[i] + Fy[j] tc l c[i, j] := c[i, j] - Fx[i] - Fy[j])
Th d thy th mi to thnh s gm c cc cnh trng s khng m v nhng 0_cnh ca
th cha trn mt b ghp y .
1
2
3
4
0
0
M
M
1
Fx[1] = 2
0
M
M
2
2
Fx[2] = 2
M
1
0
M
3
Fx[3] = 3
M
M
0
9
4
Fx[4] = 3
Fy[1] = -2 Fy[2] = -2 Fy[3] = -3 Fy[4] = 0
(C nhiu phng n khc: Fx = (0, 0, 1, 1); Fy = (0, 0, -1, 2) cng ng)

Vy phng php Kuhn-Munkres a vic bin i th G (bin i ma trn C) v vic bin i


hay dy s Fx v Fy. Vic tr vo trng s tt c nhng cnh lin thuc vi X[i] tng ng vi
vic tng Fx[i] ln . Vic cng vo trng s tt c nhng cnh lin thuc vi Y[j] tng ng
vi gim Fy[j] i . Khi cn bit trng s cnh (X[i], Y[j]) l bao nhiu sau cc bc bin i, thay
v vit c[i, j], ta vit c[i, j] - Fx[i] - Fy[j].
V d: Th tc tm ng m trong thut ton Hungari i hi phi xc nh c cnh no l
0_cnh, khi ci t bng phng php Kuhn-Munkres, vic xc nh cnh no l 0_cnh c th
kim tra bng ng thc: c[i, j] - Fx[i] - Fy[j] = 0 hay c[i, j] = Fx[i] + Fy[j].
S ci t phng php Kuhn-Munkres c th vit nh sau:
Bc 1: Khi to:
M := ;
Vic khi to cc Fx, Fy c th c nhiu cch chng hn Fx[i] := 0; Fy[j] := 0 vi i, j.
Hoc: Fx[i] := min(c[i, j]) vi i. Sau t Fy[j] := min(c[i, j] Fx[i]) vi j.
1 jk

1ik

(Min sao c[i, j] - Fx[i] - Fy[j] 0)


*

Bc 2: Vi mi nh x X, ta tm cch ghp x nh sau:

Bt u t nh x , th tm ng m bt u x bng thut ton tm kim trn th (BFS hoc


DFS). Lu rng 0_cnh l cnh tho mn c[i, j] = Fx[i] + Fy[j]. C hai kh nng xy ra:

Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v


thm vo M nhng cnh cha ghp.

Hoc khng tm c ng m th xc nh c hai tp:

VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}

VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}

t := min{c[i, j] - Fx[i] - Fy[j] X[i] VisitedX; Y[j] VisitedY}

Vi X[i] VisitedX: Fx[i] := Fx[i] + ;

Vi Y[j] VisitedY: Fy[j] := Fy[j] - ;


*

Lp li th tc tm ng m xut pht ti x cho ti khi tm ra ng m.


ng lu phng php Kuhn-Munkres l n khng lm thay i ma trn C ban u. iu
thc s hu ch trong trng hp trng s ca cnh (X[i], Y[j]) khng c cho mt cch tng
minh bng gi tr C[i, j] m li cho bng hm c(i, j): trong trng hp ny, vic tr hng/cng ct
trc tip trn ma trn chi ph C l khng th thc hin c.
2. Di y ta s ci t chng trnh gii bi ton phn cng bng thut ton Hungari vi
phng php i ngu Kuhn-Munkres:
a) Biu din b ghp
biu din b ghp, ta s dng hai mng: matchX[1..k] v matchY[1..k].

matchX[i] l nh thuc tp Y ghp vi nh X[i]

matchY[j] l nh thuc tp X ghp vi nh Y[j].


Tc l nu nh cnh (X[i], Y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c rng:

Nu nh X[i] cha ghp vi nh no ca tp Y th matchX[i] = 0

Nu nh Y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.

thm mt cnh (X[i], Y[j]) vo b ghp th ch vic t matchX[i] := j v matchY[j] := i;

loi mt cnh (X[i], Y[j]) khi b ghp th ch vic t matchX[i] := 0 v matchY[j] := 0;


b) Tm ng m nh th no
Ta s tm ng m v xy dng hai tp VisitedX v VisitedY bng thut ton tm kim theo chiu
rng ch xt ti nhng nh v nhng 0_cnh nh hng nh ni trong phn u:
*
Khi to mt hng i (Queue) ban u ch c mt nh x . Thut ton tm kim theo chiu rng
lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue nhng ni t v cha c
thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm ng m kt thc Y_nh
cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh y Y ghp, da vo
s kin: t y ch c th ti c matchY[y] theo duy nht mt 0_cnh nh hng, nn ta c th
nh du thm y, thm lun c matchY[y], v y vo Queue phn t matchY[y] X.
3. Nhp d liu t file vn bn ASSIGN.INP
Dng 1: Ghi hai s m, n theo th t l s th v s vic cch nhau 1 du cch (m, n 100)
Cc dng tip theo, mi dng ghi ba s i, j, c[i, j] cch nhau 1 du cch th hin th i lm c
vic j v chi ph lm l c[i, j] (1 i m; 1 j n; 0 c[i, j] 100).

Y
6

ASSIGN.INP
5 6
1 1 0
1 2 0
2 1 0
2 4 2
3 2 1
3 3 0
4 3 0
4 4 9
5 4 9

ASSIGN.OUT
Optimal assignment:
1) X[1] - Y[1]
2) X[2] - Y[4]
3) X[3] - Y[2]
4) X[4] - Y[3]
Cost: 3

0
2
1
0

19
5

PROG12_1.PAS * Thut ton Hungari


program AssignmentProblemSolve;
const
max = 100;
maxC = 10001;
var
c: array[1..max, 1..max] of Integer;
Fx, Fy, matchX, matchY, Trace: array[1..max] of Integer;
m, n, k, start, finish: Integer;
{ng m s bt u t startX v kt thc finishY}
procedure Enter;
{Nhp d liu t thit b nhp chun (Input)}
var
i, j: Integer;
begin
ReadLn(m, n);
if m > n then k := m else k := n;
for i := 1 to k do
for j := 1 to k do c[i, j] := maxC;
while not SeekEof do ReadLn(i, j, c[i, j]);
end;
procedure Init;
var
i, j: Integer;
begin

{Khi to}

{B ghp rng}

FillChar(matchX, SizeOf(matchX), 0);


FillChar(matchY, SizeOf(matchY), 0);
{Fx[i] := Trng s nh nht ca cc cnh lin thuc vi X[i]}

for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
end;
{Fy[j] := Trng s nh nht ca cc cnh lin thuc vi Y[j]}

for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do {Lu l trng s cnh (x[i], y[j]) by gi l c[i, j] - Fx[i] ch khng cn l c[i, j] na}
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
{Vic khi to cc Fx v Fy nh th ny ch n gin l cho s 0_cnh tr nn cng nhiu cng tt m thi}
{Ta hon ton c th khi gn cc Fx v Fy bng gi tr 0}

end;
{Hm cho bit trng s cnh (X[i], Y[j]) }

function GetC(i, j: Integer): Integer;


begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure FindAugmentingPath; {Tm ng m bt u start}
var
Queue: array[1..max] of Integer;
i, j, first, last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0);
{Trace[j] = X_nh lin trc Y[j] trn ng m}
{Thut ton BFS}

Queue[1] := start;
{y start vo hng i}
first := 1; last := 1;
repeat
i := Queue[first]; Inc(first); {Ly mt nh X[i] khi hng i}
for j := 1 to k do
{Duyt nhng Y_nh cha thm k vi X[i] qua mt 0_cnh cha
ghp}

if (Trace[j] = 0) and (GetC(i, j) = 0) then


begin
Trace[j] := i;
{Lu vt ng i, cng vi vic nh du (0) lun}
if matchY[j] = 0 then
{Nu j cha ghp th ghi nhn ni kt thc ng m v thot
lun}

begin
finish := j;
Exit;
end;
Inc(last); Queue[last] := matchY[j]; {y lun matchY[j] vo Queue}
end;
until first > last;
{Hng i rng}
end;
procedure SubX_AddY;
{Xoay cc trng s cnh}
var
i, j, t, Delta: Integer;
VisitedX, VisitedY: set of Byte;
begin
(* rng:
VisitedY = {y | Trace[y] 0}
VisitedX = {start} match(VisitedY) = {start} {matchY[y] | Trace[y] 0}
*)

VisitedX := [start];
VisitedY := [];
for j := 1 to k do
if Trace[j] <> 0 then
begin
Include(VisitedX, matchY[j]);
Include(VisitedY, j);
end;

{Sau khi xc nh c VisitedX v VisitedY, ta tm l trng s nh nht ca cnh ni t VisitedX ra Y\VisitedY}

Delta := maxC;
for i := 1 to k do
if i in VisitedX then
for j := 1 to k do
if not (j in VisitedY) and (GetC(i, j) < Delta) then
Delta := GetC(i, j);
{Xoay trng s cnh}

for t := 1 to k do
begin
{Tr trng s nhng cnh lin thuc vi VisitedX i Delta}

if t in VisitedX then Fx[t] := Fx[t] + Delta;


{Cng trng s nhng cnh lin thuc vi VisitedY ln Delta}

if t in VisitedY then Fy[t] := Fy[t] - Delta;


end;

end;
{Ni rng b ghp bi ng m tm
c}

procedure Enlarge;
var
x, next: Integer;
begin
repeat
x := Trace[finish];
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;

finish

finish

next

next

... ...

start

... ...

start

procedure Solve;
{Thut ton Hungari}
var
x, y: Integer;
begin
for x := 1 to k do
begin
start := x; finish := 0; {Khi gn ni xut pht ng m, finish = 0 ngha l cha tm thy ng
m}

repeat
FindAugmentingPath;
{Th tm ng m}
if finish = 0 then SubX_AddY; {Nu khng thy th xoay cc trng s cnh v lp li}
until finish <> 0;
{Cho ti khi tm thy ng m}
Enlarge;
{Tng cp da trn ng m tm c}
end;

end;

procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do {In ra php phn cng th ch cn xt n m, khng cn xt n k}
begin
y := matchX[x];
{Nhng cnh c trng s maxC tng ng vi mt th khng c giao vic v mt vic khng c phn cng}

if c[x, y] < maxC then


begin
Inc(Count);
WriteLn(Count:5, ') X[', x, '] - Y[', y, ']
W := W + c[x, y];
end;
end;
WriteLn('Cost: ', W);
end;

', c[x, y]);

begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.

Nhn xt:
1.
Nu ci t nh trn th cho d th c cnh mang trng s m, chng trnh vn tm c
b ghp cc i vi trng s cc tiu. L do: Ban u, ta tr tt c cc phn t trn mi hng

2.
3.

ca ma trn C i gi tr nh nht trn hng , ri li tr tt c cc phn t trn mi ct ca


ma trn C i gi tr nh nht trn ct (Php tr y lm gin tip qua cc Fx, Fy ch
khng phi tr trc tip trn ma trn C). Nn sau bc ny, tt c cc cnh ca th s c
trng s khng m bi phn t nh nht trn mi ct ca C chc chn l 0.
Sau khi kt thc thut ton, tng tt c cc phn t hai dy Fx, Fy bng trng s cc tiu ca
b ghp y tm c trn th ban u.
Mt vn na phi ht sc cn thn trong vic c lng ln ca cc phn t Fx v Fy.
Nu nh gi thit cho cc trng s khng qu 500 th ta khng th da vo bt ng thc
Fx(x) + Fy(y) c(x, y) m khng nh cc phn t trong Fx v Fy cng 500. Hy t tm v
d hiu r hn bn cht thut ton.

V. BI TON TM B GHP CC I VI TRNG S CC I TRN TH


HAI PHA
Bi ton tm b ghp cc i vi trng s cc i cng c th gii nh phng php Hungari bng
cch i du tt c cc phn t ma trn chi ph (Nh nhn xt 1).
Khi ci t, ta c th sa li i cht trong chng trnh trn gii bi ton tm b ghp cc i
vi trng s cc i m khng cn i du trng s. C th nh sau:
Bc 1: Khi to:

M := ;

Khi to hai dy Fx v Fy tho mn: i, j: Fx[i] + Fy[j] c[i, j]; Chng hn ta c th t


Fx[i] := Phn t ln nht trn dng i ca ma trn C v t cc Fy[j] := 0.
*

Bc 2: Vi mi nh x X, ta tm cch ghp x nh sau:


*

Vi cch hiu 0_cnh l cnh tho mn c[i, j] = Fx[i] + Fy[j]. Bt u t nh x , th tm ng m


*
bt u x . C hai kh nng xy ra:

Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v


thm vo M nhng cnh cha ghp.

Hoc khng tm c ng m th xc nh c hai tp:

VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}

VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}

t := min{Fx[i] + Fy[j] - c[i, j] X[i] VisitedX; Y[j] VisitedY}

Vi X[i] VisitedX: Fx[i] := Fx[i] - ;

Vi Y[j] VisitedY: Fy[j] := Fy[j] + ;


*

Lp li th tc tm ng m xut pht ti x cho ti khi tm ra ng m.


Bc 3: Sau bc 2 th mi X_nh u ghp, ta c mt b ghp y k cnh vi trng s
ln nht.
D dng chng minh c tnh ng n ca phng php, bi nu ta t:
c'[i, j] = - c[i, j]; F'x[i] := - Fx[i]; F'y[j] = - Fy[j].
Th bi ton tr thnh tm cp ghp y trng s cc tiu trn th hai pha vi ma trn trng s
c'[1..k, 1..k]. Bi ton ny c gii quyt bng cch tnh hai dy i ngu F'x v F'y. T bng
nhng bin i i s c bn, ta c th kim chng c tnh tng ng gia cc bc ca
phng php nu trn vi cc bc ca phng php Kuhn-Munkres mc trc.

VI. PHC TP TNH TON


Da vo m hnh ci t thut ton Kuhn-Munkres trn, ta c th nh gi v phc tp tnh
ton l thuyt ca cch ci t ny:
2
Thut ton tm kim theo chiu rng c s dng tm ng m c phc tp O(k ), mi ln
2
xoay trng s cnh mt mt chi ph thi gian c O(k ). Vy mi ln tng cp, cn ti a k ln d
3
ng v k ln xoay trng s cnh, mt mt chi ph thi gian c O(k ). Thut ton cn k ln tng
4
cp nn phc tp tnh ton trn l thuyt ca phng php ny c O(k ).
3
C th ci tin m hnh ci t c mt thut ton vi phc tp O(k ) da trn nhng nhn
xt sau:
Nhn xt 1:
*
*
Qu trnh tm kim theo chiu rng bt u t mt nh x cha ghp cho ta mt cy pha gc x .
Nu tm c ng m th dng li v tng cp ngay, nu khng th xoay trng s cnh v bt u
tm kim li c mt cy pha mi ln hn cy pha c:
x*

x*

y1 +

x1

y2

x2

y3

x3 -

y1

y2

x1

x2

y4 +

y5 +

y7

y3

y4

y5

y7

X4 -

X5 -

X7

x3

X4

X5

X7

y6

y6
Augmenting path found

Hnh 23: Cy pha "mc" ln hn sau mi ln xoay trng s cnh v tm ng

Nhn xt 2:
Vic xc nh trng s nh nht ca cnh ni mt X_nh trong cy pha vi mt Y_nh ngoi cy
pha c th kt hp ngay trong bc dng cy pha m khng lm tng cp phc tp tnh ton.
thc hin iu ny, ta s dng k thut nh trong thut ton Prim:
*
Vi mi yY, gi d[y] := khong cch t y n cy pha gc x . Ban u d[y] c khi to bng
*
*
*
*
trng s cnh (x , y) = c[x , y] - Fx[x ] - Fy[y] (cy pha ban u ch c ng mt nh x ).
Trong bc tm ng bng BFS, mi ln rt mt nh x ra khi Queue, ta xt nhng nh yY
cha thm v t li d[y]mi := min(d[y]c, trng s cnh (x, y)) sau mi kim tra xem (x, y) c
phi l 0_cnh hay khng tip tc cc thao tc nh trc. Nu qu trnh BFS khng tm ra ng
m th gi tr xoay chnh l gi tr nh nht trong cc d[y] dng. Ta bt c mt on chng
2

trnh tm gi tr xoay c phc tp O(k ). Cng vic ti mi bc xoay ch l tm gi tr nh nht


trong cc d[y] dng v thc hin php cng, tr trn hai dy i ngu Fx v Fy, n c phc tp
tnh ton O(k), ti a c k ln xoay tm ng m nn tng chi ph thi gian thc hin cc ln
2

xoay cho ti khi tm ra ng m c O(k ). Lu rng th ang xt l th hai pha y nn


sau khi xoay cc trng s cnh bng gi tr xoay , tt c cc cnh ni t X_nh trong cy pha ti

Y_nh ngoi cy pha u b gim trng s i , chnh v vy ta phi tr tt c cc d[y] > 0 i


gi c tnh hp l ca cc d[y].
Nhn xt 3:
Ta c th tn dng kt qu ca qu trnh tm kim theo chiu rng bc trc ni rng cy pha
*
cho bc sau (grow alternating tree) m khng phi tm li t u (BFS li bt u t x ).
Khi khng tm thy ng m, qu trnh tm kim theo chiu rng s nh du c nhng nh
thm (thuc cy pha) v hng i cc X_nh trong qu trnh tm kim tr thnh rng. Tip theo l
phi xc nh c = trng s nh nht ca cnh ni mt X_nh thm vi mt Y_nh cha
thm v xoay cc trng s cnh nhng cnh ny tr thnh 0_cnh. Ti y ta s dng k thut
sau: Thm lun nhng nh yY cha thm to vi mt X_nh thm mt 0_cnh (nhng
Y_nh cha thm c d[y] = 0), nu tm thy ng m th dng ngay, nu khng thy th y tip
nhng nh matchY[y] vo hng i v lp li thut ton tm kim theo chiu rng bt u t nhng
nh ny. Vy nu xt tng th, mi ln tng cp ta ch thc hin mt ln dng cy pha, tc l tng
chi ph thi gian ca nhng ln thc hin gii thut tm kim trn th sau mi ln tng cp ch
2
cn l O(k ).
Nhn xt 4:
Th tc tng cp da trn ng m (Enlarge) c phc tp O(k)
T 3 nhn xt trn, phng php i ngu Kuhn-Munkres c th ci t bng mt chng trnh c
3
2
phc tp tnh ton O(k ) bi n cn k ln tng cp v chi ph cho mi ln l O(k ).
PROG12_2.PAS * Ci t phng php Kuhn-Munkres O(n3)
program AssignmentProblemSolve;
const
max = 100;
maxC = 10001;
var
c: array[1..max, 1..max] of Integer;
Fx, Fy, matchX, matchY: array[1..max] of Integer;
Trace, Queue, d, arg: array[1..max] of Integer;
first, last: Integer;
start, finish: Integer;
m, n, k: Integer;
procedure Enter;

{Nhp

liu}

var
i, j: Integer;
begin
ReadLn(m, n);
if m > n then k := m else k := n;
for i := 1 to k do
for j := 1 to k do c[i, j] := maxC;
while not SeekEof do ReadLn(i, j, c[i, j]);
end;
procedure Init;
Fy}

{Khi to b ghp rng v hai dy i ngu Fx,

var
i, j: Integer;
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];

end;
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
end;
function GetC(i, j: Integer): Integer;
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure InitBFS;
var
y: Integer;
begin

{Hm tr v trng s cnh (X[i], Y[j])}

{Th tc khi to trc khi tm cch ghp startX}

{Hng i ch gm mi mt nh Start cy pha khi to ch c 1 nh start}

first := 1; last := 1;
Queue[1] := start;

{Khi to cc Y_nh u cha thm Trace[y] = 0, y}

FillChar(Trace, SizeOf(Trace), 0);


{Khi to cc d[y]}

for y := 1 to k do
begin
d[y] := GetC(start, y);
arg[y] := start;
end;
finish := 0;
end;
procedure Push(v: Integer);
begin
Inc(last); Queue[last] := v;
end;

{d[y] l khong cch t y ti cy pha gc start}


{arg[y] l X_nh thuc cy pha to ra khong cch }

{y mt nh vX vo hng i}

function Pop: Integer;


{Rt mt X_nh khi hng i, tr v trong kt qu hm}
begin
Pop := Queue[first]; Inc(first);
end;
procedure FindAugmentingPath;
{Th tc tm ng m}
var
i, j, w: Integer;
begin
repeat
i := Pop;
{Rt mt nh X[i] khi hng i}
for j := 1 to k do
{Qut nhng Y_nh cha thm}
if Trace[j] = 0 then
begin
w := GetC(i, j);
{xt cnh (X[i], Y[j])}
if w = 0 then
{Nu l 0_cnh}
begin
Trace[j] := i;
{Lu vt ng i}
if matchY[j] = 0 then
{Nu j cha ghp th ghi nhn ni kt thc ng m v thot}
begin
finish := j;
Exit;
end;
Push(matchY[j]);
{Nu j ghp th y tip matchY[j] vo hng i}
end;
if d[j] > w then {Cp nht li khong cch d[j] nu thy cnh (X[i], Y[j]) ngn hn khong cch
ny}

begin

d[j] := w;
arg[j] := i;
end;

end;
until first > last;
end;
{Xoay cc trng s cnh}

procedure SubX_AddY;
var
Delta: Integer;
x, y: Integer;
begin

{Trc ht tnh = gi tr nh nht trng s cc d[y], vi yY cha thm (y khng thuc cy pha)}

Delta := maxC;
for y := 1 to k do
if (Trace[y] = 0) and (d[y] < Delta) then Delta := d[y];
{Tr trng s nhng cnh lin thuc vi startX i }

Fx[start] := Fx[start] + Delta;


for y := 1 to k do
{Xt cc nh yY}
if Trace[y] <> 0 then
{Nu y thuc cy pha}
begin
x := matchY[y];
{Th x = matchY[y] cng phi thuc cy pha}
Fy[y] := Fy[y] - Delta;
{Cng trng s nhng cnh lin thuc vi y ln }
Fx[x] := Fx[x] + Delta;
{Tr trng s nhng cnh lin thuc vi x i }
end
else
d[y] := d[y] - Delta; {Nu y cy pha th sau bc xoay, khong cch t y n cy pha s gim }
{Chun b tip tcBFS}

for y := 1 to k do
if (Trace[y] = 0) and (d[y] = 0) then {Thm lun nhng nh yY to vi cy pha mt 0_cnh}
begin
Trace[y] := arg[y];
{Lu vt ng i}
if matchY[y] = 0 then
{Nu y cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
finish := y;
Exit;
end;
Push(matchY[y]);
{Nu y ghp th y lun matchY[y] vo hng i ch loang tip}
end;
end;
procedure Enlarge;
{Ni rng b ghp bng ng m kt thc finish}
var
x
finish
x, next: Integer;
begin
next
repeat
x := Trace[finish];
... ...
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;

start

procedure Solve;
var
x, y: Integer;
begin
for x := 1 to k do
{Vi mi X_nh: }
begin
start := x;
{t ni khi u ng m}
InitBFS;
{Khi to cy pha}
repeat

finish
next
... ...

start

FindAugmentingPath;
{Tm ng m}
if finish = 0 then SubX_AddY;
{Nu khng thy th xoay cc trng s cnh ...}
until finish <> 0;
{Cho ti khi tm ra ng m}
Enlarge;
{Ni rng b ghp bi ng m tm c}
end;

end;

procedure Result;
var
x, y, Count, W: Integer;
begin
WriteLn('Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do
{Vi mi X_nh, xt cp ghp tng ng}
begin
y := matchX[x];
if c[x, y] < maxC then
{Ch quan tm n nhng cp ghp c trng s < maxC}
begin
Inc(Count);
WriteLn(Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]);
W := W + c[x, y];
end;
end;
WriteLn('Cost: ', W);
end;
begin
Assign(Input, 'ASSIGN.INP'); Reset(Input);
Assign(Output, 'ASSIGN.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.

13. BI TON TM B GHP CC I TRN TH


I. CC KHI NIM
Xt th G = (V, E), mt b ghp trn th G l mt tp cc cnh i mt khng c nh chung.
Bi ton tm b ghp cc i trn th tng qut pht biu nh sau:
Cho mt th G, phi tm mt b ghp cc i trn G (b ghp c nhiu cnh nht).
Vi mt b ghp M ca th G, ta gi:
Nhng cnh thuc M c gi l cnh ghp hay cnh m
Nhng cnh khng thuc M c gi l cnh cha ghp hay cnh nht
Nhng nh u mt ca cc cnh m c gi l nh ghp, nhng nh cn li gi l
nh cha ghp
Mt ng i c bn (ng i khng c nh lp li) c gi l ng pha nu n bt u
bng mt cnh nht v tip theo l cc cnh m, nht nm ni tip xen k nhau.
Mt chu trnh c bn (chu trnh khng c nh trong lp li) c gi l mt Blossom nu n i
qua t nht 3 nh, bt u v kt thc bng cnh nht v dc trn chu trnh, cc cnh m, nht
nm ni tip xen k nhau. nh xut pht ca chu trnh (cng l nh kt thc) c gi l nh
c s (base) ca Blossom.
ng m l mt ng pha bt u mt nh cha ghp v kt thc mt nh cha ghp.
V d: Vi th G v b ghp M di y:

matched edge
unmatched edge

Hnh 24: th G v mt b ghp M

ng (8, 1, 2, 5, 6, 4) l mt ng pha
Chu trnh (2, 3, 4, 6, 5, 2) l mt Blossom
ng (8, 1, 2, 3, 4, 6, 5, 7) l mt ng m
ng (8, 1, 2, 3, 4, 6, 5, 2, 1, 9) tuy c cc cnh m/nht xen k nhng khng phi ng pha
(v tt nhin khng phi ng m) v y khng phi l ng i c bn.
Ta d dng suy ra c cc tnh cht sau
ng m cng nh Blossom u l ng i di l vi s cnh nht nhiu hn s cnh m
ng 1 cnh.
Trong mi Blossom, nhng nh khng phi nh c s u l nh ghp v nh ghp vi
nh cng phi thuc Blossom.
V Blossom l mt chu trnh nn trong mi Blossom, nhng nh khng phi nh c s u tn
ti hai ng pha t nh c s i n n, mt ng kt thc bng cnh m v mt ng kt
thc bng cnh nht, hai ng pha ny c hnh thnh bng cch i dc theo chu trnh theo
hai hng ngc nhau. Nh v d trn, nh 4 c hai ng pha i nh c s 2 i ti: (2, 3, 4)
l ng pha kt thc bng cnh m v (2, 5, 6, 4) l ng pha kt thc bng cnh nht

II. THUT TON EDMONDS (1965)


C s ca thut ton l nh l (C.Berge): Mt b ghp M ca th G l cc i khi v ch khi
khng tn ti ng m i vi M.
Thut ton Edmonds:
M := ;
for ( nh u cha ghp) do
if <Tm ng m xut pht t u> then
<
Dc trn ng m:
Loi b nhng cnh m khi M;
Thm vo M nhng cnh nht;
>
Result: M l b ghp cc i trn G

iu kh nht trong thut ton Edmonds l phi xy dng thut ton tm ng m xut pht t
mt nh cha ghp. Thut ton c xy dng bng cch kt hp mt thut ton tm kim trn
th vi php chp Blossom.
Xt nhng ng pha xut pht t mt nh x cha ghp. Nhng nh c th n c t x bng
mt ng pha kt thc l cnh nht c gn nhn "nht", nhng nh c th n c t x bng
mt ng pha kt thc l cnh m c gn nhn "m".
Vi mt Blossom, ta nh ngha php chp (shrink) l php thay th cc nh trong Blossom bng
mt nh duy nht. Nhng cnh ni gia mt nh thuc Blossom ti mt nh v no khng
thuc Blossom c thay th bng cnh ni gia nh chp ny vi v v gi nguyn tnh m/nht.
D thy rng sau mi php chp, cc cnh m vn c m bo l b ghp trn th mi:
*

Shrink

Shrink

blossom

blossom

Hnh 25: Php chp Blossom

Thut ton tm ng m c th pht biu nh sau.


Trc ht nh xut pht x c gn nhn m.
Tip theo l thut ton tm kim trn th bt u t x, theo nguyn tc: t nh m ch c
php i tip theo cnh nht v t nh nht ch c i tip theo cnh m. Mi khi thm ti
mt nh, ta gn nhn m/nht cho nh v tip tc thao tc tm kim trn th nh bnh
thng. Cng trong qu trnh tm kim, mi khi pht hin thy mt cnh nht ni hai nh m,
ta dng li ngay v nu gn nhn tip s gp tnh trng mt nh c c hai nhn m/nht, trong
trng hp ny, Blossom c pht hin (xem tnh cht ca Blossom) v b chp thnh mt

nh, thut ton c bt u li vi th mi cho ti khi tr li c cu hi: "c tn ti


ng m xut pht t x hay khng?"
Nu ng m tm c khng i qua nh chp no th ta ch vic tng cp dc theo ng
m. Nu ng m c i qua mt nh chp th ta li n nh chp ra thnh Blossom thay
nh chp ny trn ng m bng mt on ng xuyn qua Blossom:
*

expand

expand

blossom

blossom

Hnh 26: N Blossom d ng xuyn qua Blossom

Lu rng khng phi Blossom no cng b chp, ch nhng Blossom nh hng ti qu trnh tm
ng m mi phi chp m bo rng ng m tm c l ng i c bn. Tuy nhin vic
ci t trc tip cc php chp Blossom v n nh kh rc ri, i hi mt chng trnh vi
4

phc tp O(n ).
3
Di y ta s trnh by mt phng php ci t hiu qu hn vi phc tp O(n ), phng php
ny ci t khng phc tp, nhng yu cu phi hiu rt r bn cht thut ton.
III. PHNG PHP LAWLER (1973)
Trong phng php Edmonds, sau khi chp mi Blossom thnh mt nh th nh hon ton li
c th nm trn mt Blossom mi v b chp tip. Phng php Lawler ch quan tm n nh chp
cui cng, i din cho Blossom ngoi nht (Outermost Blossom), nh chp cui cng ny c
nh danh (nh s) bng nh c s ca Blossom ngoi nht.
Cng chnh v thao tc chp/n ni trn m ta cn m rng khi nim Blossom, c th coi mt
Blossom l mt tp nh n ra t mt nh chp ch khng n thun ch l mt chu trnh pha
c bn na.
Xt mt Blossom B c nh c s l nh r. Vi vB, v r, ta lu li hai ng pha t r ti v,
mt ng kt thc bng cnh m v mt ng kt thc bng cnh nht, nh vy c hai loi vt
gn cho mi nh v:
S[v] l nh lin trc v trn ng pha kt thc bng cnh m, nu khng tn ti ng pha
loi ny th S[v] = 0.
T[v] l nh lin trc v trn ng pha kt thc bng cnh nht, nu khng tn ti ng pha
loi ny th T[v] = 0.
Bn cnh hai nhn S v T, mi nh v cn c thm
Nhn b[v] l nh c s ca Blossom cha v. Hai nh u v v thuc cng mt Blossom b[u]
= b[v].
Nhn match[v] l nh ghp vi nh v. Nu v cha ghp th match[v] = 0.

Khi thut ton tm ng m bt u t nh x cha ghp c th pht biu nh sau:


Bc 1: (Init)
Hng i Queue dng cha nhng nh m ch duyt, ban u ch gm mt nh m x.
Vi mi nh u, khi gn b[u] = u v match[u] = 0 vi u.
Gn S[x] 0; Vi ux, gn S[u] = 0;Vi v: gn T[v] = 0
Bc 2: (BFS)
Lp li cc bc sau cho ti khi hng i rng:
Vi mi nh m u ly ra t Queue, xt nhng cnh nht (u, v):
Nu v cha thm:
Nu v l nh cha ghp Tm thy ng m kt thc v, dng
Nu v l nh ghp thm v thm lun match[v] v y match[v] vo Queue.
Sau mi ln thm, ch vic lu vt (hai nhn S v T)
Nu v thm
Nu v l nh nht hoc b[v] = b[u] b qua
Nu v l nh m v b[v] b[u] ta pht hin c blossom mi cha u v v, khi :
Pht hin nh c s: Truy vt ng i ngc t hai nh m u v v theo hai ng
pha v nt gc, chn ly nh a l nh m chung gp u tin trong qu trnh truy vt
ngc. Khi Blossom mi pht hin s c nh c s l a.
Gn li vt: Gi (a = i1, i2, ..., ip = u) v (a = j1, j2, ..., jq = v) ln lt l hai ng pha
dn t a ti u v v. Khi (a = i1, i2, ..., ip = u, jq = v, jq-1, ..., j1 = a) l mt chu trnh pha i
t a ti u v v ri quay tr v a. Bng cch i dc theo chu trnh ny theo hai hng ngc
nhau, ta c th gn li tt c cc nhn S v T ca nhng nh trn chu trnh. Lu rng
khng c gn li nhn S v T cho nhng nh k m b[k] = a, v vi nhng nh k c
b[k] a th bt buc phi gn li nhn S v T theo chu trnh ny bt k S[k] v T[k]
trc c hay cha.
Chp Blossom: Xt nhng nh v m b[v]{b[i1], b[i2], ..., b[ip], b[j1], b[j2], ..., b[jq]},
gn li b[v] = a. Nu v l nh m (c nhn S[v] 0) m cha c duyt ti (cha bao
gi
c y vo Queue) th y v vo Queue ch duyt tip ti nhng bc sau.
Nu qu trnh ny ch thot khi hng i rng th tc l khng tn ti ng m bt u t x.
Sau y l mt s v d v cc trng hp t nh m u xt cnh nht (u, v):
Trng hp 1: v cha thm v cha ghp:
S:2
u=3

v=4

T:1

T:3

u=3

v=4

2
T:1

Tm thy ng m

Trng hp 2: v cha thm v ghp

S:2

S:2
u=3

v=4

S:2

T:3

S:4

u=3

v=4

T:1

2
T:1

Thm c v ln match[v], gn nhn T[v] v S[match[v]]

Trng hp 3: v thm, l nh m thuc cng blossom vi u

T:1

S:2

T:3
S:5

T:7
S:4

u=4

v=7

T:3
S:7

T:5
S:6

b=3

Khng xt, b qua

Trng hp 4: v thm, l nh m v b[u] b[v]


T:3

S:4

T:3
S:5

T:7
S:4

u=5

u=5

v=7

T:3
S:7

T:5
S:6

a
x

T:1

S:2

v=7

T:3

S:6

T:1

S:2

b=3

Tm nh c s a = 3, gn li nhn S v T dc chu trnh pha, chp Blossom.


y hai nh m mi 4, 6 vo hng i, Ti nhng bc sau,
khi duyt ti nh 6, s tm thy ng m kt thc 8,
truy vt theo nhn S v T tm c ng (1, 2, 3, 4, 5, 7, 6, 8)

T tng chnh ca phng php Lawler l dng cc nhn b[v] thay cho thao tc chp trc tip
Blossom, dng cc nhn S v T truy vt tm ng m, trnh thao tc n Blossom. Phng php
ny da trn mt nhn xt: Mi khi tm ra ng m, nu ng m xuyn qua mt Blossom
ngoi nht th chc chn n phi i vo Blossom ny t nt c s v thot ra khi Blossom bng
mt cnh nht.
IV. CI T
Ta s ci t phng php Lawler vi khun dng Input/Output nh sau:
Input: file vn bn GMATCH.INP
Dng 1: Cha hai s n, m ln lt l s cnh v s nh ca th cch nhau t nht mt du
cch (n 100)
m dng tip theo, mi dng cha hai s u, v tng trng cho mt cnh (u, v) ca th

Output: file vn bn GMATCH.OUT cha b ghp cc i tm c


7

10

GMATCH.INP
10 11
1 2
1 6
2 4
2 8
3 4
3 6
5 6
5 9
5 10
7 8
7 9

GMATCH.OUT
1 6
2 8
3 4
5 10
7 9
Number of matched edges: 5

Chng trnh ny sa i mt cht m hnh ci t trn da vo nhn xt:


v l mt nh m v = x hoc match[v] l mt nh nht
Nu v l nh m th S[v] = match[v]
Vy th ta khng cn phi s dng ring mt mng nhn S[v], ti mi bc sa vt, ta ch cn sa
nhn vt T[v] m thi. kim tra mt nh v x c phi nh m hay khng, ta c th kim tra
bng iu kin: match[v] c l nh nht hay khng, hay T[match[v]] c khc 0 hay khng.
Chng trnh s dng cc bin vi vai tr nh sau:
match[v] l nh ghp vi nh v
b[v] l nh c s ca Blossom cha v
T[v] l nh lin trc v trn ng pha t nh xut pht ti v kt thc bng cnh nht, T[v] =
0 nu qu trnh BFS cha xt ti nh nht v.
InQueue[v] l bin Boolean, InQueue[v] = True v l nh m c y vo Queue
ch duyt.
start v finish: Ni bt u v kt thc ng m.
PROG13_1.PAS * Phng php Lawler p dng cho thut ton Edmonds
program MatchingInGeneralGraph;
const
max = 100;
var
a: array[1..max, 1..max] of Boolean;
match, Queue, b, T: array[1..max] of Integer;
InQueue: array[1..max] of Boolean;
n, first, last, start, finish: Integer;
procedure Enter;

{Nhp d liu, t thit b nhp chun

(Input)}

var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), 0);
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init;
rng}

{Khi to b ghp

begin
FillChar(match, SizeOf(match), 0);
end;
procedure InitBFS; {Th tc ny c gi khi to trc khi tm ng m xut pht t start}
var
i: Integer;
begin
{Hng i ch gm mt nh m start}

first := 1; last := 1;
Queue[1] := start;
FillChar(InQueue, SizeOf(InQueue), False);
InQueue[start] := True;
{Cc nhn T c khi gn = 0}

FillChar(T, SizeOF(T), 0);


{Nt c s ca outermost blossom cha i chnh l i}

for i := 1 to n do b[i] := i;
finish := 0; {finish = 0 ngha l cha tm thy ng m}
end;
procedure Push(v: Integer);
begin Inc(last);
Queue[last] := v;
InQueue[v] := True;
end;

{y mt nh m v vo hng i}

function Pop: Integer;


begin
Pop := Queue[first];
Inc(first);
end;

{Ly mt nh m khi hng i, tr v trong kt qu hm}

{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht nt hai nh m p, q}

procedure BlossomShrink(p, q: Integer);


var
i, NewBase: Integer;
Mark: array[1..max] of Boolean;
{Th tc tm nt c s bng cch truy vt ngc theo ng pha t p v q}

function FindCommonAncestor(p, q: Integer): Integer;


var
InPath: array[1..max] of Boolean;
begin
FillChar(InPath, SizeOf(Inpath), False);
repeat
{Truy vt t p}
p := b[p];
{Nhy ti nt c s ca Blossom cha p, php nhy ny tng tc truy
vt}

Inpath[p] := True;
{nh du nt }
if p = start then Break; {Nu truy v n ni xut pht th dng}
p := T[match[p]];
{Nu cha v n start th truy li tip hai bc, theo cnh m ri theo cnh
nht}

until False;
repeat
{Truy vt t q, tng t nh i vi p}
q := b[q];
if InPath[q] then Break; {Tuy nhin nu chm vo ng pha ca p th dng ngay}
q := T[match[q]];
until False;
FindCommonAncestor := q;
{Ghi nhn nh c s mi}
end;
procedure ResetTrace(x: Integer); {Gn li nhn vt dc trn ng pha t start ti x}
var
u, v: Integer;
begin
v := x;

while b[v] <> NewBase do


{Truy vt ng pha t start ti nh m x}
begin
u := match[v];
Mark[b[v]] := True;
{nh du nhn blossom ca cc nh trn ng i}
Mark[b[u]] := True;
v := T[u];
if b[v] <> NewBase then T[v] := u; {Ch t li vt T[v] nu b[v] khng phi nt c s mi}
end;
end;
begin
{BlossomShrink}
FillChar(Mark, SizeOf(Mark), False);
NewBase := FindCommonAncestor(p, q);

{Tt c cc nhn b[v] u cha b nh du}


{xc nh nt c s}

{Gn li nhn}

ResetTrace(p); ResetTrace(q);
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;

{Chp blossom gn li cc nhn b[i] nu blossom b[i] b nh du}

for i := 1 to n do
if Mark[b[i]] then b[i] := NewBase;

{Xt nhng nh m i cha c a vo Queue nm trong Blossom mi, y i v Queue ch duyt tip ti cc bc
sau}

for i := 1 to n do
if not InQueue[i] and (b[i] = NewBase) then
Push(i);
end;
{Th tc tm ng m}

procedure FindAugmentingPath;
var
u, v: Integer;
begin
InitBFS; {Khi to}
repeat
{BFS}
u := Pop;
{Xt nhng nh v cha duyt, k vi u, khng nm cng Blossom vi u, d nhin T[v] = 0 th (u, v) l cnh nht ri}

for v := 1 to n do
if (T[v] = 0) and (a[u, v]) and (b[u] <> b[v]) then
begin
if match[v] = 0 then
{Nu v cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
T[v] := u;
finish := v;
Exit;
end;
{Nu v l nh m th gn li vt, chp Blossom ...}

if (v = start) or (T[match[v]] <> 0) then


BlossomShrink(u, v)
else
{Nu khng th ghi vt ng i, thm v, thm lun c match[v] v y tip match[v] vo
Queue}

begin
T[v] := u;
Push(match[v]);
end;
end;
until first > last;
end;
procedure Enlarge;
{Ni rng b ghp bi ng m bt u t start, kt thc finish}
var
v, next: Integer;
begin
repeat
v := T[finish];
next := match[v];
match[v] := finish;

match[finish] := v;
finish := next;
until finish = 0;
end;
procedure Solve;
{Thut ton Edmonds}
var
u: Integer;
begin
for u := 1 to n do
if match[u] = 0 then
begin
start := u;
{Vi mi nh cha ghp start}
FindAugmentingPath; {Tm ng m bt u t start}
if finish <> 0 then Enlarge; {Nu thy th ni rng b ghp theo ng m ny}
end;
end;
procedure Result;
{In b ghp tm c}
var
u, count: Integer;
begin
count := 0;
for u := 1 to n do
if match[u] > u then {Va trnh s trng lp (u, v) v (v, u), va loi nhng nh khng ghp c
(match=0)}

begin
Inc(count);
WriteLn(u, ' ', match[u]);
end;
WriteLn('Number of matched edges: ', count);
end;
begin
Assign(Input, 'GMATCH.INP'); Reset(Input);
Assign(Output, 'GMATCH.OUT'); Rewrite(Output);
Enter;
Init;
Solve;
Result;
Close(Input);
Close(Output);
end.

V. PHC TP TNH TON


Th tc BlossomShrink c phc tp O(n).
Th tc FindAugmentingPath cn khng qu n ln gi th tc BlossomShrink, cng thm chi
2
ph ca thut ton tm kim theo chiu rng, c phc tp O(n )
Phng php Lawler cn khng qu n ln gi th tc FindAugmentingPath nn c phc tp
3

tnh ton l O(n )

You might also like