Professional Documents
Culture Documents
Bi ging chuyn
MC LC
PHN 1. BI TON LIT K ......................................................................... 1
1. NHC LI MT S KIN THC I S T HP ................................................................2
1.1. CHNH HP LP ....................................................................................................................................... 2
1.2. CHNH HP KHNG LP........................................................................................................................ 2
1.3. HON V .................................................................................................................................................... 2
1.4. T HP....................................................................................................................................................... 3
ii
6. CY (TREE).................................................................................................................................. 70
6.1. NH NGHA............................................................................................................................................70
6.2. CY NH PHN (BINARY TREE) .........................................................................................................71
6.3. BIU DIN CY NH PHN ..................................................................................................................73
6.4. PHP DUYT CY NH PHN ..............................................................................................................74
6.5. CY K_PHN ..........................................................................................................................................76
6.6. CY TNG QUT...................................................................................................................................77
8. SP XP (SORTING) .................................................................................................................. 87
8.1. BI TON SP XP................................................................................................................................87
8.2. THUT TON SP XP KIU CHN (SELECTIONSORT) ...............................................................89
8.3. THUT TON SP XP NI BT (BUBBLESORT)...........................................................................90
8.4. THUT TON SP XP KIU CHN...................................................................................................90
8.5. SHELLSORT.............................................................................................................................................92
8.6. THUT TON SP XP KIU PHN ON (QUICKSORT) ............................................................93
8.7. THUT TON SP XP KIU VUN NG (HEAPSORT) ................................................................99
8.8. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)......................................102
8.9. TNH N NH CA THUT TON SP XP (STABILITY) .........................................................103
8.10. THUT TON SP XP BNG C S (RADIX SORT) .................................................................104
8.11. THUT TON SP XP TRN (MERGESORT)..............................................................................109
8.12. CI T ...............................................................................................................................................112
8.13. NH GI, NHN XT......................................................................................................................119
iii
9.5. PHP BM (HASH)............................................................................................................................... 130
9.6. KHO S VI BI TON TM KIM ................................................................................................ 130
9.7. CY TM KIM S HC (DIGITAL SEARCH TREE - DST)............................................................ 131
9.8. CY TM KIM C S (RADIX SEARCH TREE - RST) .................................................................. 134
9.9. NHNG NHN XT CUI CNG ...................................................................................................... 139
iv
4.3. TH Y V THUT TON WARSHALL ...........................................................................192
4.4. CC THNH PHN LIN THNG MNH ........................................................................................195
vi
HNH V
Hnh 1: Cy tm kim quay lui trong bi ton lit k dy nh phn .......................................................................13
Hnh 2: Xp 8 qun hu trn bn c 8x8 ...............................................................................................................19
Hnh 3: ng cho B-TN mang ch s 10 v ng cho N-TB mang ch s 0............................................19
Hnh 4: Lu thut gii (Flowchart)...................................................................................................................36
Hnh 5: K php ln, ln v ln ................................................................................................................41
Hnh 6: Thp H Ni .............................................................................................................................................54
Hnh 7: Cu trc nt ca danh sch ni n ..........................................................................................................59
Hnh 8: Danh sch ni n ....................................................................................................................................59
Hnh 9: Cu trc nt ca danh sch ni kp ..........................................................................................................61
Hnh 10: Danh sch ni kp...................................................................................................................................61
Hnh 11: Danh sch ni vng mt hng ..............................................................................................................61
Hnh 12: Danh sch ni vng hai hng ...............................................................................................................62
Hnh 13: Dng danh sch vng m t Queue ........................................................................................................67
Hnh 14: Di chuyn toa tu....................................................................................................................................69
Hnh 15: Di chuyn toa tu (2) ..............................................................................................................................69
Hnh 16: Cy..........................................................................................................................................................70
Hnh 17: Mc ca cc nt trn cy ........................................................................................................................71
Hnh 18: Cy biu din biu thc ..........................................................................................................................71
Hnh 19: Cc dng cy nh phn suy bin..............................................................................................................72
Hnh 20: Cy nh phn hon chnh v cy nh phn y ...................................................................................72
Hnh 21: nh s cc nt ca cy nh phn y biu din bng mng ........................................................73
Hnh 22: Nhc im ca phng php biu din cy bng mng .......................................................................73
Hnh 23: Cu trc nt ca cy nh phn.................................................................................................................74
Hnh 24: Biu din cy bng cu trc lin kt .......................................................................................................74
Hnh 25: nh s cc nt ca cy 3_phn biu din bng mng ......................................................................76
Hnh 26: Biu din cy tng qut bng mng........................................................................................................77
Hnh 27: Cu trc nt ca cy tng qut................................................................................................................78
Hnh 28: Biu thc di dng cy nh phn ..........................................................................................................79
Hnh 29: Vng lp trong ca QuickSort ................................................................................................................94
Hnh 30: Trng thi trc khi gi quy ..............................................................................................................95
Hnh 31: Heap......................................................................................................................................................100
Hnh 32: Vun ng ..............................................................................................................................................100
Hnh 33: o gi tr k[1] cho k[n] v xt phn cn li ........................................................................................101
Hnh 34: Vun phn cn li thnh ng ri li o tr k[1] cho k[n-1] .................................................................101
Hnh 35: nh s cc bit .....................................................................................................................................104
Hnh 36: Thut ton sp xp trn.........................................................................................................................109
Hnh 37: Ci t cc thut ton sp xp vi d liu ln ......................................................................................121
vii
Hnh 38: Cy nh phn tm kim ......................................................................................................................... 126
Hnh 39: Xa nt l cy BST ........................................................................................................................... 127
Hnh 40. Xa nt ch c mt nhnh con trn cy BST ........................................................................................ 128
Hnh 41: Xa nt c c hai nhnh con trn cy BST thay bng nt cc phi ca cy con tri............................ 128
Hnh 42: Xa nt c c hai nhnh con trn cy BST thay bng nt cc tri ca cy con phi............................ 128
Hnh 43: nh s cc bit ..................................................................................................................................... 131
Hnh 44: Cy tm kim s hc............................................................................................................................. 131
Hnh 45: Cy tm kim c s............................................................................................................................... 134
Hnh 46: Vi di dy bit z = 3, cy tm kim c s gm cc kho 2, 4, 5 v sau khi thm gi tr 7............... 135
Hnh 47: RST cha cc kho 2, 4, 5, 7 v RST sau khi loi b gi tr 7 ............................................................. 136
Hnh 48: Cy tm kim c s a) v Trie tm kim c s b).................................................................................. 138
Hnh 49: Hm quy tnh s Fibonacci .............................................................................................................. 149
Hnh 50: Tnh ton v truy vt ............................................................................................................................ 152
Hnh 51: Truy vt ................................................................................................................................................ 160
Hnh 52: V d v m hnh th........................................................................................................................ 176
Hnh 53: Phn loi th..................................................................................................................................... 177
Hnh 54................................................................................................................................................................ 180
Hnh 55................................................................................................................................................................ 181
Hnh 56: th v ng i................................................................................................................................ 184
Hnh 57: Cy DFS ............................................................................................................................................... 187
Hnh 58: Cy BFS ............................................................................................................................................... 190
Hnh 59: th G v cc thnh phn lin thng G1, G2, G3 ca n .................................................................. 191
Hnh 60: Khp v cu.......................................................................................................................................... 191
Hnh 61: Lin thng mnh v lin thng yu ...................................................................................................... 192
Hnh 62: th y ........................................................................................................................................ 193
Hnh 63: n th v hng v bao ng ca n............................................................................................. 193
Hnh 64: Ba dng cung ngoi cy DFS ............................................................................................................... 197
Hnh 65: Thut ton Tarjan "b" cy DFS........................................................................................................... 199
Hnh 66: 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)........................................................................................................... 204
Hnh 67: th G v mt s v d cy khung T1, T2, T3 ca n ....................................................................... 208
Hnh 68: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh) ................................ 208
Hnh 69: Php nh chiu DFS............................................................................................................................ 211
Hnh 70: Php nh s v ghi nhn cung ngc ln cao nht ............................................................................. 213
Hnh 71: M hnh th ca bi ton by ci cu ............................................................................................... 216
Hnh 72................................................................................................................................................................ 217
Hnh 73................................................................................................................................................................ 217
Hnh 74................................................................................................................................................................ 223
Hnh 75: Php nh li ch s theo th t tp ................................................................................................... 238
Hnh 76: Hai cy gc r1 v r2 v cy mi khi hp nht chng............................................................................. 249
viii
Hnh 77: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7............................257
Hnh 78: Mng G v mng thng d Gf tng ng (k hiu f[u,v]:c[u,v] ch lung f[u, v] v kh nng thng qua
c[u, v] trn cung (u, v)) ..............................................................................................................................261
Hnh 79: Mng thng d v ng tng lung ....................................................................................................262
Hnh 80: Lung trn mng G trc v sau khi tng.............................................................................................262
Hnh 81: Mng gi ca mng c nhiu im pht v nhiu im thu..................................................................273
Hnh 82: Thay mt nh u bng hai nh uin, uout .................................................................................................274
Hnh 83: Mng gi ca mng c kh nng thng qua ca cc cung b chn hai pha ..........................................274
Hnh 84: th hai pha ......................................................................................................................................280
Hnh 85: th hai pha v b ghp M ...............................................................................................................281
Hnh 86: M hnh lung ca bi ton tm b ghp cc i trn th hai pha...................................................285
Hnh 87: Php xoay trng s cnh .......................................................................................................................289
Hnh 88: Thut ton Hungari ...............................................................................................................................292
Hnh 89: Cy pha "mc" ln hn sau mi ln xoay trng s cnh v tm ng ................................................299
Hnh 90: th G v mt b ghp M ..................................................................................................................304
Hnh 91: Php chp Blossom...............................................................................................................................306
Hnh 92: N Blossom d ng xuyn qua Blossom .....................................................................................306
ix
CHNG TRNH
P_1_02_1.PAS * Thut ton sinh lit k cc dy nh phn di n ....................................................................... 6
P_1_02_2.PAS * Thut ton sinh lit k cc tp con k phn t .............................................................................. 8
P_1_02_3.PAS * Thut ton sinh lit k hon v .................................................................................................... 9
P_1_03_1.PAS * Thut ton quay lui lit k cc dy nh phn di n ............................................................... 12
P_1_03_2.PAS * Thut ton quay lui lit k cc tp con k phn t...................................................................... 14
P_1_03_3.PAS * Thut ton quay lui lit k cc chnh hp khng lp chp k ..................................................... 16
P_1_03_4.PAS * Thut ton quay lui lit k cc cch phn tch s ...................................................................... 17
P_1_03_5.PAS * Thut ton quay lui gii bi ton xp hu ................................................................................. 21
P_1_04_1.PAS * K thut nhnh cn dng cho bi ton ngi du lch................................................................ 26
P_1_04_2.PAS * Dy ABC................................................................................................................................... 28
P_2_07_1.PAS * Tnh gi tr biu thc RPN ........................................................................................................ 81
P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN ............................................................................... 84
P_2_08_1.PAS * Cc thut ton sp xp............................................................................................................. 112
P_3_01_1.PAS * m s cch phn tch s n..................................................................................................... 143
P_3_01_2.PAS * m s cch phn tch s n..................................................................................................... 144
P_3_01_3.PAS * m s cch phn tch s n..................................................................................................... 144
P_3_01_4.PAS * m s cch phn tch s n..................................................................................................... 145
P_3_01_5.PAS * m s cch phn tch s n dng quy ................................................................................ 145
P_3_01_6.PAS * m s cch phn tch s n dng quy ................................................................................ 145
P_3_03_1.PAS * Tm dy con n iu tng di nht ........................................................................................ 152
P_3_03_2.PAS * Ci tin thut ton tm dy con n iu tng di nht ........................................................... 154
P_3_03_3.PAS * Bi ton ci ti ........................................................................................................................ 157
P_3_03_4.PAS * Bin i xu ............................................................................................................................ 161
P_3_03_5.PAS * Dy con c tng chia ht cho k ............................................................................................... 163
P_3_03_6.PAS * Dy con c tng chia ht cho k ............................................................................................... 165
P_3_03_7.PAS * Nhn ti u dy ma trn.......................................................................................................... 169
P_4_03_1.PAS * Thut ton tm kim theo chiu su ........................................................................................ 185
P_4_03_2.PAS * Thut ton tm kim theo chiu rng ...................................................................................... 188
P_4_04_1.PAS * Thut ton Warshall lit k cc thnh phn lin thng ........................................................... 195
P_4_04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh...................................................... 202
P_4_05_1.PAS * Lit k cc khp v cu ca th .......................................................................................... 214
P_4_06_1.PAS * Thut ton Fleury tm chu trnh Euler..................................................................................... 218
P_4_06_2.PAS * Thut ton hiu qu tm chu trnh Euler.................................................................................. 221
P_4_07_1.PAS * Thut ton quay lui lit k chu trnh Hamilton ....................................................................... 224
P_4_08_1.PAS * Thut ton Ford-Bellman ........................................................................................................ 231
P_4_08_2.PAS * Thut ton Dijkstra.................................................................................................................. 233
P_4_08_3.PAS * Thut ton Dijkstra v cu trc Heap...................................................................................... 235
x
P_4_08_4.PAS * ng i ngn nht trn th khng c chu trnh.................................................................239
P_4_08_5.PAS * Thut ton Floyd .....................................................................................................................242
P_4_09_1.PAS * Thut ton Kruskal ..................................................................................................................250
P_4_09_2.PAS * Thut ton Prim.......................................................................................................................254
P_4_10_1.PAS * Thut ton Ford-Fulkerson ......................................................................................................265
P_4_10_2.PAS * Thut ton Preflow-push .........................................................................................................270
P_4_11_1.PAS * Thut ton ng m tm b ghp cc i..............................................................................283
P_4_12_1.PAS * Thut ton Hungari..................................................................................................................295
P_4_12_2.PAS * Ci t phng php Kuhn-Munkres O(k3) ............................................................................300
P_4_13_1.PAS * Phng php Lawler p dng cho thut ton Edmonds ..........................................................310
Pk
n!
)
(n k)!
n
k
O ( .)
K php ch O ln
( .)
K php ln
( .)
K php ln
o ( .)
K php ch o nh
( .)
k php nh
a [i..j]
n!
ab
ab
a b
= S t hp chp k ca n phn t =
n!
k!(n k)!
...a
a
a{
b copies of a
log a x
lg x
Logarithm nh phn (c s 2) ca x
ln x
Logarithm t nhin (c s e) ca x
log*a x
lg* x
log*2 x
ln* x
log*e x
Chuyn
1.1. 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
f(i)
f(i)
n!
(n k)!
1.3. 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
f(i)
HSPHN 1999-2004
Bi ton lit k
1.4. T HP
Mt tp con gm k phn t ca S c gi l mt t hp chp k ca S.
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 ca
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 l
L Minh Hong
n
n!
=
k!(n k)! k
Chuyn
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[1..n] v b[1..n] l hai dy di n, trn cc phn t ca a v b c quan h th t "".
Khi a b nu nh
Hoc a[i] = b[i] vi i: 1 i n.
Hoc tn ti mt s nguyn dng k: 1 k < n :
a[1] = b[1]
a[2] = b[2]
HSPHN 1999-2004
Bi ton lit k
a[k-1] = b[k-1]
a[k] = b[k]
a[k+1] < b[k+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'
000
001
010
011
100
101
110
111
Dy ang c: 10010111
cng thm 1:
cng thm 1:
+1
Dy mi:
10010001
+1
Dy mi:
10011000
L Minh Hong
Chuyn
BSTR.OUT
000
001
010
011
100
101
110
111
Bi ton lit k
L Minh Hong
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}
Chuyn
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
Bi ton lit k
PERMUTE.OUT
123
132
213
231
312
321
10
Chuyn
Bi tp:
Bi 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 .
Bi 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}.
Hng dn: thay h c s 2 bng h c s n.
Bi 3
Hy lit k cc dy nh phn di n m trong cm ch s "01" xut hin ng 2 ln.
Bi 4.
Nhp vo mt danh sch n tn ngi. Lit k tt c cc cch chn ra ng k ngi trong s n
ngi .
Bi 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.
Bi 6
Nhp vo danh sch tn n ngi, in ra tt c cc cch xp n ngi vo mt bn
HSPHN 1999-2004
Bi ton lit k
11
Bi 7
Nhp vo danh sch n bn nam v n bn n, in ra tt c cc cch xp 2n ngi vo mt bn
trn, mi bn nam tip n mt bn n.
Bi 8
Ngi ta c th dng phng php sinh lit k cc chnh hp khng lp chp k. Tuy nhin
c mt cch khc 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} theo c
hai cch.
Bi 9
Lit k tt c cc hon v ch ci trong t MISSISSIPPI theo th t t in.
Bi 10
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).
L Minh Hong
12
Chuyn
Bi ton lit k
13
max = 30;
var
x: array[1..max] of Integer;
n: Integer;
f: Text;
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(f, x[i]);
WriteLn(f);
end;
procedure Try(i: Integer); {Th cc cch chn x[i]}
var
j: Integer;
begin
for j := 0 to 1 do {Xt cc gi tr c th gn cho x[i], vi mi gi tr }
begin
x[i] := j; {Th t x[i]}
if i = n then PrintResult {Nu i = n th in kt qu}
else Try(i + 1); {Nu i cha phi l phn t cui th tm tip x[i+1]}
end;
end;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n); {Nhp d liu}
Close(f);
Assign(f, OutputFile); Rewrite(f);
Try(1); {Th cc cch chn gi tr x[1]}
Close(f);
end.
Try(1)
X1=0
Try(2)
X2=0
X3=0
Try(3)
000
X1=1
Try(2)
X2=1
X2=0
Try(3)
X3=1
001
X3=0
010
X2=1
Try(3)
X3=1
011
X3=0
Try(3)
X3=1
100
101
X3=0
110
X3=1
111
Result
14
Chuyn
x[k] n
x[k-1] x[k] - 1 n - 1
x[i] n - k + i
x[1] n - k + 1.
T suy ra x[i-1] + 1 x[i] n - k + i (1 i k) y ta gi thit c thm mt s x[0] = 0
khi xt i = 1.
Nh vy ta s xt tt c cc cch chn x[1] t 1 (=x[0] + 1) n n - k + 1, vi mi gi tr ,
xt tip tt c cc cch chn x[2] t x[1] +1 n n - k + 2, c nh vy khi chn c n
x[k] th ta c mt cu hnh cn lit k. Chng trnh lit k bng thut ton quay lui nh sau:
P_1_03_2.PAS * Thut ton quay lui lit k cc tp con k phn t
program Combination;
const
InputFile = 'SUBSET.INP';
OutputFile = 'SUBSET.OUT';
max = 30;
var
x: array[0..max] of Integer;
n, k: Integer;
f: Text;
procedure PrintResult; (*In ra tp con {x[1], x[2], , x[k]}*)
var
i: Integer;
begin
Write(f, '{');
for i := 1 to k - 1 do Write(f, x[i], ', ');
WriteLn(f, 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(f, InputFile); Reset(F);
ReadLn(f, n, k);
Close(f);
Assign(f, OutputFile); Rewrite(f);
x[0] := 0;
Try(1);
Close(f);
end.
HSPHN 1999-2004
Bi ton lit k
15
L Minh Hong
ARRANGE.OUT
12
13
21
23
31
32
16
Chuyn
Bi ton lit k
17
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
18
Chuyn
t: array[0..max] of Integer;
f: Text;
procedure Init; {Khi to}
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
x[0] := 1;
t[0] := 0;
end;
procedure PrintResult(k: Integer);
var
i: Integer;
begin
Write(f, n, ' = ');
for i := 1 to k - 1 do Write(f, x[i], '+');
WriteLn(f, x[k]);
end;
procedure Try(i: Integer);
var
j: Integer;
begin
for j := x[i - 1] to (n - T[i - 1]) div 2 do {Trng hp cn chn tip x[i+1]}
begin
x[i] := j;
t[i] := t[i - 1] + j;
Try(i + 1);
end;
x[i] := n - T[i - 1]; {Nu x[i] l phn t cui th n bt buc phi l n-T[i-1], in kt qu}
PrintResult(i);
end;
begin
Init;
Assign(f, OutputFile); Rewrite(f);
Try(1);
Close(f);
end.
3.5. BI TON XP HU
3.5.1. 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:
HSPHN 1999-2004
Bi ton lit k
19
1
2
3
4
W
E
5
6
S
7
8
L Minh Hong
20
Chuyn
Ci t:
Ta c 3 mng logic nh du:
Mng a[1..n]. a[i] = TRUE nu nh ct i cn t do, a[i] = FALSE nu nh ct i b mt
qun hu khng ch
Mng b[2..2n]. b[i] = TRUE nu nh ng cho B-TN th i cn t do, b[i] = FALSE
nu nh ng cho b mt qun hu khng ch.
Mng c[1-n..n-1]. c[i] = TRUE nu nh ng cho N-TB th i cn t do, c[i] = 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)
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 3Mi cch t c n qun hu n cho ta 1 nghim
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 (a[j] = b[i+j] = c[i-j] = TRUE)
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 (a[j] = b[i+j] = c[i-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 (a[j] = b[i+j] = c[i-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
HSPHN 1999-2004
Bi ton lit k
21
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);
3);
1);
2);
4);
5);
3);
1);
4);
(5,
(5,
(5,
(5,
(5,
(5,
(5,
(5,
(5,
(5,
4);
3);
5);
4);
5);
1);
2);
1);
3);
2);
22
Chuyn
Init;
Assign(f, OutputFile); Rewrite(f);
Try(1);
Close(f);
end.
Bi ton lit k
23
Bi 9
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.
Bi 10
Chuyn tt c cc bi tp trong bi trc ang vit bng sinh tun t sang quay lui.
Bi 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.
L Minh Hong
24
Chuyn
4. K THUT NHNH CN
4.1. 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.
4.2. 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 x[i] s ng vi ch 2 nt tng ng vi 2 gi tr
m x[i+1] c th nhn th cy n cp s c ti 2n 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 x[i] 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 x[i+1], x[i+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.
Bi ton lit k
25
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
26
Chuyn
1
1
4
2
2
1
3
TOURISM.INP
46
123
132
141
231
242
344
TOURISM.OUT
1->3->2->4->1
Cost: 6
Bi ton lit k
27
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 x[n]}
begin
Free[j] := False; {nh du thnh ph va th}
Try(i + 1); {Tm cc kh nng chn x[i+1]}
Free[j] := True; {B nh du}
end
else
if T[n] + C[x[n], 1] < MinSpending then {T x[n] 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;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if MinSpending = maxC then WriteLn(f, 'NO SOLUTION')
else
for i := 1 to n do Write(f, BestWay[i], '->');
WriteLn(f, 1);
WriteLn(f, 'Cost: ', MinSpending);
Close(f);
end;
begin
Enter;
Init;
Try(2);
PrintResult;
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 .
4.5. 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)
L Minh Hong
28
Chuyn
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 X[1..n] 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 X[i], nu ta c T[i] k t "C" trong on chn t X[1] n X[i], 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 X[i] nh th ny th s k
t "C" trong dy kt qu (khi chn n X[n]) cho d c lm tt n u cng T[i] + (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
P_1_04_2.PAS * Dy ABC
program ABC_STRING;
const
InputFile = 'ABC.INP';
OutputFile = 'ABC.OUT';
max = 100;
var
N, MinC: Integer;
X, Best: array[1..max] of 'A'..'C';
T: array[0..max] of Integer; {T[i] cho bit s k t "C" trong on t X[1] n X[i]}
f: Text;
{Hm Same(i, l) cho bit xu gm l k t kt thc ti X[i] 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 X[i] c lm hng tnh khng lp ca dy X[1..i] hay khng}
function Check(i: Integer): Boolean;
var
l: Integer;
begin
HSPHN 1999-2004
Bi ton lit k
29
30
Chuyn
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:
Bi 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 lit k
31
L Minh Hong
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
10111
00100
00100
10111
10001
00001
01100
10101
01101
11111
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
34
Chuyn
35
1.3.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.
L Minh Hong
36
Chuyn
Input: a, b
b>0?
No
Output a;
Yes
r := a mod b;
a := b;
b := r
End
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.
HSPHN 1999-2004
37
1.4. 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.
1.5. KIM TH
1.5.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.
L Minh Hong
38
Chuyn
HSPHN 1999-2004
39
(*)
L Minh Hong
40
Chuyn
HSPHN 1999-2004
41
Hnh 5 l biu din th ca k php ln, ln v ln. D thy rng T(n) = (g(n))
nu v ch nu T(n) = O(g(n)) v T(n) = (g(n)).
c2.g(n)
c.g(n)
T(n)
T(n)
T(n)
c.g(n)
c1.g(n)
n0
T(n)= (g(n))
n0
T(n)= (g(n))
n0
T(n)= (g(n))
42
Chuyn
43
( )
(
)
Nu f (n) = ( n
) vi hng s >0 v a.f (n / b) c.f (n) vi hng s c < 1 v n ln
Nu f (n) = n logb a th T(n) = n logb a lg n
log b a +
th T(n) = ( f (n) )
nh l Master l mt nh l quan trng trong vic phn tch phc tp tnh ton ca cc
gii thut lp hay quy. Tuy nhin vic chng minh nh l kh di dng, ta c th tham
kho trong cc ti liu khc.
L Minh Hong
44
Chuyn
Nu mt thut ton c thi gian thc hin l logaf(n). Vi b l mt s dng, ta nhn thy
logaf(n) = logab.logbf(n). Tc l: (logaf(n)) = (logbf(n)). Vy ta c th ni rng phc
tp tnh ton ca thut ton l (log f(n)) m khng cn ghi c s ca logarit.
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 (1).
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.
lgn n
nlgn n2
n3
2n
16
64
16
24
64
512
256
16 64
256
4096
65536
32 160
V d:
Thut ton tnh tng cc s t 1 ti n:
Nu vit theo s nh sau:
Input n;
S := 0;
for i := 1 to n do S := S + i;
Output S;
Th phc tp tnh ton ca thut ton trn l (1), thi gian tnh ton khng ph thuc vo
n.
ex 1 +
45
n
x x2
xn
xi
+
+ ... +
=
vi x v n cho trc.
1! 2!
n! i =0 i!
46
Chuyn
Khng nn ln ln cc cch phn tch trong trng hp xu nht, trung bnh, v tt nht vi
cc k php biu din phc tp tnh ton, y l hai khi nim hon ton phn bit.
Trn phng din l thuyt, nh gi bng k php (.) l tt nht, tuy vy vic nh gi
bng k php (.) i hi phi nh gi bng c k php O(.) ln (.). Dn ti vic phn tch
kh phc tp, gn nh phi biu din chnh xc thi gian thc hin gii thut qua cc hm gii
tch. V vy trong nhng thut ton v sau, phn ln ti s dng k php T(n) = O(f(n)) vi
f(n) l hm tng chm nht c th (nm trong tm hiu bit ca mnh).
2100 , ( 2)lg n , n 2 , n! , 3n ,
k ,
k =1
n lg n ,
k
k =1
47
1 , 2100
ln n ,
k
k =1
( 2)lg n
n lg n , lg(n!)
n2 ,
k
k =1
3n
n!
Bi 2
Xc nh phc tp tnh ton ca nhng gii thut sau bng k php :
a) on chng trnh tnh tng hai a thc:
P(x) = amxm + am-1xm-1 + + a1x + a0 v Q(x) = bnxn + an-1xn-1 + + b1x + b0
c a thc
R(x) = cpxp + cp-1xp-1 + + 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;
48
Chuyn
p n
a)(max(m, n)); b) (m.n)
Bi 3
Ch ra rng cch ni " phc tp tnh ton ca gii thut A ti thiu phi l O(n2)" l khng
thc s chnh xc.
(k php O khng lin quan g n chuyn nh gi "ti thiu" c).
Bi 4
Gii thch ti sao khng c k php (f(n)) ch nhng hm va l o(f(n)) va l (f(n)).
(V khng c hm no va l o(f(n)) va l (f(n)))
Bi 5
Chng minh rng
n! = o(nn)
n! = (2n)
lg(n!) = (nlgn)
n
Hng dn: Dng cng thc xp x ca Stirling: n! = 2n
e
1
1 +
n
Bi 5
Ch ra ch sai trong chng minh sau
Gi s mt gii thut c thi gian thc hin T(n) cho bi
1, if n 1
T(n) =
2.T( n/2 )+n, if n>1
Khi T(n) l (nlgn) v T(n) cng l O(n)!!!
Chng minh
T(n) = (nlgn). Tht vy, ta hon ton c th chn mt s dng c nh T(n) c.n.lgn
vi n 3 (chng hn chn c = 0.1). Ta s chng minh T(n) c.n.lgn cng ng vi n > 3
bng phng php quy np: nu T(n/2) c.n/2.lgn/2 th T(n) c.n.lgn.
T(n) = 2.T( n/2) + n
2.c. n/2.lg(n/2) + n
2.c.(n/2).lg(n/2) + n
= c.n.lg(n/2) + n
= c.n.lgn - c.n.lg2 + n
= c.n.lgn + (1-c).n
HSPHN 1999-2004
49
c.n.lgn
(= nh thc bc nht ca n)
= O(n)
Ta c mt kt qu "th v": T nlgn = O(T(n)) v T(n) = O(n), theo lut bc cu ta suy ra:
nlgn = O(n) !!!wow!!!
L Minh Hong
50
Chuyn
HSPHN 1999-2004
51
2! = 2 * 1!
1! = 1 * 0!
0! = 1
3.3.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:
Cc con th khng bao gi cht
Hai thng sau khi ra i, mi cp th mi s sinh ra mt cp th con (mt c, mt ci)
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)
L Minh Hong
52
Chuyn
X = 10 (chn)
X := 10 div 2;
(5)
2.
X = 5 (l)
X := 5 * 3 + 1;
(16)
3.
X = 16 (chn)
X := 16 div 2;
(8)
4.
X = 8 (chn)
X := 8 div 2
(4)
5.
X = 4 (chn)
X := 4 div 2
(2)
6.
X = 2 (chn)
X := 2 div 2
(1)
53
end;
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); {Th tc tm cch biu din s X > 1 trong trng hp X l}
begin
Solve(X * 3 + 1);
Write(' div 3');
end;
procedure SolveEven(X: Integer); {Th tc tm cch biu din s X trong trng hp X chn}
begin
Solve(X div 2);
Write(' * 2');
end;
procedure Solve(X: Integer); {Phn c t ca th tc Solve khai bo trc trn}
begin
if X = 1 then Write(X)
else
if X mod 2 = 1 then SolveOdd(X)
else SolveEven(X);
end;
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:
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 ?
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
L Minh Hong
54
Chuyn
Hnh 6: Thp H Ni
HSPHN 1999-2004
55
56
Chuyn
Bi 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.
Bi 2
n
Vit mt hm quy tnh theo cng thc truy hi sau:
k
n n
= = 1
0 n
n = n 1 + n 1 ; k:0<k<n
k k 1 k
n
( y ti dng k hiu thay cho Ckn thuc h thng k hiu ca Nga)
k
Bi 3
Nu r cc bc thc hin ca gii thut cho bi Thp H Ni trong trng hp n = 3.
Vit chng trnh gii bi ton Thp H Ni khng quy
Li gii:
C nhiu cch gii, y ti vit mt cch "l" nht vi mc ch gii tr, cc bn t tm hiu
ti sao n hot ng ng:
program HanoiTower;
const
max = 30;
var
Stack: array[1..3, 0..max] of Integer;
nd: array[1..3] of Integer;
RotatedList: array[0..2, 1..2] of Integer;
n: Integer;
i: LongInt;
procedure Init;
var
i: Integer;
begin
Stack[1, 0] := n + 1; Stack[2, 0] := n + 1; Stack[3, 0] := n + 1;
for i := 1 to n do Stack[1, i] := n + 1 - i;
nd[1] := n; nd[2] := 0; nd[3] := 0;
if Odd(n) then
begin
RotatedList[0][1] := 1; RotatedList[0][2] := 2;
RotatedList[1][1] := 1; RotatedList[1][2] := 3;
RotatedList[2][1] := 2; RotatedList[2][2] := 3;
end
else
begin
RotatedList[0][1] := 1; RotatedList[0][2] := 3;
RotatedList[1][1] := 1; RotatedList[1][2] := 2;
RotatedList[2][1] := 2; RotatedList[2][2] := 3;
end;
end;
HSPHN 1999-2004
procedure DisplayStatus;
var
i: Integer;
begin
for i := 1 to 3 do
Writeln('Peg ', i, ': ', nd[i], ' disks');
end;
procedure MoveDisk(x, y: Integer);
begin
if Stack[x][nd[x]] < Stack[y][nd[y]] then
begin
Writeln('Move one disk from ', x, ' to ', y);
Stack[y][nd[y] + 1] := Stack[x][nd[x]];
Inc(nd[y]);
Dec(nd[x]);
end
else
begin
Writeln('Move one disk from ', y, ' to ', x);
Stack[x][nd[x] + 1] := Stack[y][nd[y]];
Inc(nd[x]);
Dec(nd[y]);
end;
end;
begin
Write('n = '); Readln(n);
Init;
DisplayStatus;
for i := 1 to 1 shl n - 1 do
MoveDisk(RotatedList[(i - 1) mod 3][1], RotatedList[(i - 1) mod 3][2]);
DisplayStatus;
end.
L Minh Hong
57
58
Chuyn
t gi tr V vo v tr p:
p
A
Tng n ln 1
Xo phn t khi mng
Mng ban u:
p
A
HSPHN 1999-2004
59
p
A
Gim n i 1
p
A
Data
Gi tr
Lin kt
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
Head
A
L Minh Hong
60
Chuyn
To ra mt nt mi NewNode cha gi tr V:
V
HSPHN 1999-2004
61
Gi tr
Lin kt trc
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
First
A
E
Last
L Minh Hong
62
Chuyn
Bi tp
Bi 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.
Bi 2
HSPHN 1999-2004
63
L Minh Hong
64
Chuyn
5. NGN XP V HNG I
5.1. 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.
65
66
Chuyn
67
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. ( y dng thm bin n cho d hiu cn trn thc t ch cn hai bin Front v
Rear l ta c th kim tra c Queue trn hay cn ri)
program QueueByCList;
const
max = 10000;
var
Queue: array[0..max - 1] of Integer;
i, n, Front, Rear: Integer;
procedure QueueInit; {Khi to Queue rng}
begin
Front := 0; Rear := max - 1; n := 0;
end;
procedure Push(V: Integer); {y gi tr V vo Queue}
begin
if n = max then WriteLn('Queue is Full')
else
begin
Rear := (Rear + 1) mod max; {Rear chy theo vng trn}
Queue[Rear] := V;
L Minh Hong
68
Chuyn
Inc(n);
end;
end;
69
begin
QueueInit;
Test; {a mt vi lnh kim tra hot ng ca Queue}
end.
Bi tp
Bi 1
Tm hiu c ch xp chng ca th tc quy, phng php dng ngn xp kh quy.
Vit chng trnh m t cch i c s t h thp phn sang h c s R dng ngn xp
Bi 2
Hnh 14 l c cu ng tu ti mt ga xe la
1
L Minh Hong
70
Chuyn
6. CY (TREE)
6.1. 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:
Mi nt l mt cy, nt cng l gc ca cy y
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 n1, 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.
tin, ngi ta cn cho php tn ti mt cy khng c nt no m ta gi l cy rng (null
tree).
Xt cy trong Hnh 16:
A
Hnh 16: 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 trong Hnh 16 c ch ra trong Hnh 17:
HSPHN 1999-2004
71
(A / B + C) * (D - E)
72
Chuyn
5
b)
a)
5
c)
d)
5
e)
f)
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.
S lng ti a cc nt trn mc i ca cy nh phn l 2i-1, ti thiu l 1 (i 1).
S lng ti a cc nt trn mt cy nh phn c chiu cao h l 2h-1, ti thiu l h (h 1).
Cy nh phn hon chnh c n nt th chiu cao ca n l h = lg(n) + 1.
HSPHN 1999-2004
73
E
1
4
C
10
11
12
L Minh Hong
13
14
15
16
E
17
...
...
74
Chuyn
Lin ktphi
75
L Minh Hong
76
Chuyn
6.5. 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).
3
1
F
M
C
D
12
L
K
11
10
6
0
10
11
12
HSPHN 1999-2004
77
9
4
B
F
2
L
12
C
D
Info:
Children:
11
10
10
11
12
10
11
10
11
12
2 (F)
9 (A)
4 (I)
11
11
11
11
10
11
12
13
L Minh Hong
1 (B)
Head:
78
Chuyn
INFO
Sibling
FirstChild
HSPHN 1999-2004
79
80
Chuyn
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 cy theo th t sau
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 to 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 vo hai gi tr va ly ra, y kt qu tm c (x 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
X l
Stack
10
y vo Stack
10
HSPHN 1999-2004
81
X l
Stack
y vo Stack
10, 2
y vo Stack
5, 3
y vo Stack
8, 7
y vo Stack
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.
Input
Enter RPN Expression: 10 2/3 + 4 7 -*
Output
10 2 / 3 + 4 7 - * = 24.0000
82
Chuyn
end;
procedure Push(V: Extended);
begin
Inc(Top); Stack[Top] := V;
end;
function Pop: Extended;
begin
Pop := Stack[Top]; Dec(Top);
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 do {Thm nhng du cch gia ton hng v ton t}
if (S[i] in Opt) or (S[i + 1] in Opt) then
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1 do {Xo nhng du cch tha}
if (S[i] = ' ') and (S[i + 1] = ' ') then Delete(S, i + 1, 1);
end;
procedure Process(T: String); {X l phn t T c c t biu thc RPN}
var
x, y: Extended;
e: Integer;
begin
if not (T[1] in Opt) then {T l ton hng}
begin
Val(T, x, e); Push(x); {i T thnh s v y gi tr vo Stack}
end
else {T l ton t}
begin
y := Pop; x := Pop; {Ra hai}
case T[1] of
'+': x := x + y;
'-': x := x - y;
'*': x := x * y;
'/': x := x / y;
end;
Push(x); {Vo mt}
end;
end;
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.
HSPHN 1999-2004
83
X l
Stack
Output
y vo Stack
Hin th
(*
Hin th
(*
23
(+
23*
(+
23*7
Ly ra v hin th "*".
So snh tip:
Php "+" u tin cao hn "(" nh Stack, y "+" vo Stack
7
Hin th
L Minh Hong
84
Chuyn
X l
Stack
Output
(+/
Hin th
(+/
23*78
23*78/+
y vo Stack
*(
Hin th
*(
*(-
Hin th
*(-
23*78/+51
23*78/+51-
Ht
23*78/+5
23*78/+51-*
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:
Input
Infix: (10*3 + 7 /8) * (5-1)
Output
Refined: ( 10 * 3 + 7 / 8 ) * ( 5 - 1 )
RPN: 10 3 * 7 8 / + 5 1 - *
L Minh Hong
85
86
Chuyn
A * (B + C) b) A + B / C + D
A * (B + -C) d) A - (B + C)d/e
A and B or C f) A and (B or not C)
(A or B) and (C or (D and not E)) h) (A = B) or (C = D)
(A < 9) and (A > 3) or not (A > 0)
((A > 0) or (A < 0)) and (B * B - 4 * A * C < 0)
Bi 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.
Bi 5
Vit chng trnh hon chnh tnh gi tr biu thc trung t.
HSPHN 1999-2004
87
8. SP XP (SORTING)
8.1. 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
SBD
H v tn
im thi
A100
Nguyn Vn A
20
B200
Trn Th B
25
X150
Phm Vn C
18
G180
Th D
21
L Minh Hong
88
Chuyn
c th thc hin c bng cch da vo trng lin kt ca bn ghi tng ng thuc bng
kho.
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 STT
20
25
18
21
Sau khi sp xp theo trt t im cao nht ti im thp nht, bng kho s tr thnh:
im thi STT
25
21
20
18
HSPHN 1999-2004
89
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 k[1..n] 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 k[1] k[2] k[n].
Gi s cu trc d liu cho dy kho c m t nh sau:
const
n = ; {S kho trong dy kho, c th khai bo 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}
L Minh Hong
90
Chuyn
procedure SelectionSort;
var
i, j, jmin: Integer;
begin
for i := 1 to n - 1 do {Lm n - 1 lt}
begin
{Chn trong s cc kho trong on k[i..n] ra kho k[jmin] nh nht}
jmin := i;
for j := i + 1 to n do
if k[j] < k[jmin] then jmin := j;
if jmin i then
<o gi tr ca k[jmin] cho k[i]>
end;
end;
i vi phng php kiu la chn, c th coi php so snh (k[j] < k[jmin]) 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
Vy thut ton sp xp kiu chn c phc tp tnh ton l O(n2)
i vi thut ton sp xp ni bt, c th coi php ton tch cc l php so snh k[j] < k[j-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 phc tpl O(n2). Bt k tnh trng d liu vo nh
th no.
91
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 k[i] vo dy k[1..i-1] ton on k[1..i] tr thnh sp xp}
begin
tmp := k[i]; {Gi li gi tr k[i]}
j := i - 1;
while (j > 0) and (tmp < k[j]) do {So snh gi tr cn chn vi ln lt cc kho k[j] (i-1j0)}
begin
k[j+1] := k[j]; {y li gi tr k[j] v pha sau mt v tr, to ra "khong trng" ti v tr j}
j := j - 1;
end;
k[j+1] := tmp; {a gi tr chn vo "khong trng" mi to ra}
end;
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 < k[j] 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. Phn tch trong trng hp tt nht, phc
tp tnh ton ca InsertionSort l (n)
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.
Vy phn tch trong trng hp tt nht, phc tp tnh ton ca InsertionSort l (n2)
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.
Vy phn tch trong trng hp trung bnh, phc tp tnh ton ca InsertionSort l (n2).
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.
C th ci tin thut ton sp xp chn nh nhn xt: Khi dy kho k[1..i-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 gim
i 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 .
L Minh Hong
92
Chuyn
procedure InsertionSortwithBinarySearching;
var
i, inf, sup, median: Integer;
tmp: TKey;
begin
for i := 2 to n do
begin
tmp := k[i]; {Gi li gi tr k[i]}
inf := 1; sup := i - 1; {Tm ch chn gi tr tmp vo on t k[inf] ti k[sup+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 kho t k[inf] ti k[i-1] li sau mt v tr>
k[inf] := tmp; {a gi tr tmp vo "khong trng" mi to ra}
end;
end;
8.5. SHELLSORT
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 ShellSort.
Xt dy kho: k[1..n]. Vi mt s nguyn dng h: 1 h n, ta c th chia dy thnh h
dy con:
Dy con 1: k[1], k[1+h], k[1 + 2h],
Dy con 2: k[2], k[2+h], k[2 + 2h],
Dy con 1:
Dy con 2:
Dy con 3:
2
6
1
3
9
5
93
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 a[i-h], a[i], a[i+h], a[i+2h], }
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 div 2;
end;
end;
94
Chuyn
Ta th phn tch xem ti sao on chng trnh trn hot ng ng: Xt vng lp
repeatuntil trong ln lp u tin, vng lp while th nht chc chn s tm c kho k[i]
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 k[j] kho cht. Nu nh kho k[i] ng
trc kho k[j] th ta o gi tr hai kho, cho i tin v j li. 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
95
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 (Hnh 30).
kL
kj
ki
kH
Kho cht
Kho cht
Theo nhng nhn xt trn, nu c mt kho nm gia k[j] v k[i] 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 k[L] ti k[j] v on
t k[i] ti k[H]. 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 tt nht l ti mi bc chn cht phn on, ta
chn ng trung v ca dy kho (gi tr s ng gia dy khi sp th t), khi phc tp
tnh ton ca QuickSort l (nlgn). Trng hp ti t nht l ti mi bc chn cht phn
on, ta chn ng vo kho ln nht hoc nh nht ca dy kho, to ra mt on gm 1
kho v on cn li gm n - 1 kho, khi phc tp tnh ton ca QuickSort l (n2).
Thi gian thc hin gii thut QuickSort trung bnh l (nlgn). Vic chng minh cc kt qu
ny phi s dng nhng cng c ton hc phc tp, ta tha nhn nhng iu ni trn.
96
Chuyn
Phn "trung v v th t thng k" ny c trnh by trong ni dung tho lun v QuickSort
bi n cung cp mt chin lc chn cht "p" trn l thuyt, ngha l trong trng hp xu
nht, phc tp tnh ton ca QuickSort cng ch l O(nlgn) m thi. gii quyt vn
suy bin ca QuickSort, ta xt bi ton tm trung v ca dy kho v bi ton tng qut hn:
Bi ton th t thng k (Order statistics).
Bi ton: Cho dy kho k1, k2, , kn, hy ch ra kho s ng th p trong dy khi sp th t.
Khi p = n div 2 th bi ton th t thng k tr thnh bi ton tm trung v ca dy kho. Sau
y ta s ni v mt s cch gii quyt bi ton th t thng k vi mc tiu cui cng l tm
ra mt thut ton gii bi ton ny vi phc tp trong trng hp xu nht l O(n)
Cch t nht m ai cng c th ngh ti l sp xp li ton b dy k v a ra kho ng th p
ca dy sp. Trong cc thut ton sp xp tng qut m ta tho lun trong bi, khng thut
ton no cho php thc hin vic ny vi phc tp xu nht v trung bnh l (n) c.
Cch th hai l sa i mt cht th tc Partition ca QuickSort: th tc Partition chn kho
cht v chia on ang xt lm hai on con (thc ra l ba): Cc kho ca on u cht,
cc kho ca on gia = cht, cc kho ca on sau cht. Khi ta hon ton c th xc
nh c kho cn tm nm on no. Nu kho nm on gia th ta ch vic tr v
gi tr kho cht. Nu kho nm on u hay on sau th ch cn gi quy lm tng
t vi mt trong hai on ch khng cn gi quy sp xp c hai on nh QuickSort.
{
Input: Dy kho k[1..n], s p (1 p n)
Output: Gi tr kho ng th p trong dy sau khi sp th t c tr v trong li gi hm Select(1, n)
}
function Select(L, H: Integer): TKey; {Tm trong on k[L..H]}
var
Pivot: TKey;
i, j: Integer;
begin
Pivot := k[Random(H - L + 1) + L];
i := L; j := H;
repeat
while k[i] < Pivot do i := i + 1;
while k[j] > Pivot do j := j - 1;
if i j then
begin
if i < j then o gi tr k[i] v k[j];
i := i + 1; j := j - 1;
end;
until i > j;
{Xc nh kho cn tm nm on no}
if p j then Select := Select(L, j) {Kho cn tm nm trong on u}
else
if p i then Select := Select(i, H) {Kho cn tm nm trong on sau}
else Select := Pivot; {Kho cn tm nm on gia, ch cn tr v Pivot}
end;
Cch th hai tt hn cch th nht khi phn tch phc tp trung bnh v thi gian thc
hin gii thut (C th chng minh c l O(n)). Tuy nhin trong trng hp xu nht, gii
thut ny vn c phc tp O(n2) khi cn ch ra kho ln nht ca dy kho v cht Pivot
HSPHN 1999-2004
97
Nu cui cng qu trnh chia nhm cn li t hn 5 kho (do di on k[L..H] khng chia
ht cho 5), ta b qua khng xt nhng kho d tha ny.
Vi mi nhm 5 kho k trn, ta tm trung v ca nhm (gi tt l trung v nhm - kho ng
th 3 khi sp th t 5 kho) v y trung v nhm ra u on k[L..H] theo th t:
Trung v ca k[L + 0..L + 4] s c o gi tr cho k[L]
Trung v ca k[L + 5..L + 9] s c o gi tr cho k[L + 1]
98
Chuyn
HSPHN 1999-2004
99
Ta s ch ra rng phc tp tnh ton ca thut ton trn l O(n) trong trng hp xu nht.
Nu gi T(n) l thi gian thc hin hm Select trong trng hp xu nht vi di dy kho
k[L..H] bng n. Ta c:
c1 , if n 50
T(n)
n
3n
c 2 .n + T 5 + T 4
n
3n
1
1
3
T(n) c 2 .n + c. + c. c. .n + c. .n + c. .n = c.n
5
4
20
5
4
Ta c iu phi chng minh: T(n) = O(n). S b n ca vic chn s 5 cho kch thc nhm
c gii thch (1/5 + 3/4 < 1)
8.6.3. Kt lun:
C th gii bi ton th t thng k bng thut ton c phc tp O(n) trong trng hp
xu nht.
C th ci t thut ton QuickSort vi phc tp O(nlgn) trong trng hp xu nht bi
ti mi ln phn on ca QuickSort ta c th tm c trung v ca dy trong thi gian
O(n) bng vic gii quyt bi ton th t thng k
Cho ti thi im ny, khi gii mi bi ton c cha th tc sp xp, c th coi l c cch
ci t thi gian thc hin th tc sp xp l O(nlgn) vi mi tnh trng d liu.
8.7.1. ng (heap)
ng l mt dng cy nh phn hon chnh c bit m gi tr lu ti mi nt c u tin
cao hn hay bng gi tr lu trong hai nt con ca n. Trong thut ton sp xp kiu vun ng,
ta coi quan h "u tin hn hay bng" l quan h "ln hn hay bng":
L Minh Hong
100
Chuyn
10
8.7.2. Vun ng
Trong bi 6, ta bit mt dy kho k[1..n] l biu din ca mt cy nh phn hon chnh m
k[i] 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
thc hin thut ton vun ng 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
101
tnh ti k[n] na (Hnh 33). Cn li dy kho k[1..n-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 k[1] cho k[n-1] v tip tc cho ti khi ng ch cn li 1 nt (Hnh 34).
V d:
10
10
L Minh Hong
102
Chuyn
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 := k[root];
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 (k[c] < k[c+1]) then c := c + 1;
if k[c] Key then Break; {C hai nt con ca Root u mang gi tr Key th dng ngay}
k[root] := k[c]; root := c; {Chuyn gi tr t nt con c ln nt cha root v i xung xt nt con c}
end;
k[root] := Key; {t gi tr Key vo nt root}
end;
begin {Bt u thut ton HeapSort}
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 k[1] v k[i]; {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 l [lg(n)] + 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 nn thi gian thc hin mt ln gi Adjust l O(lgn). T c th suy ra, trong trng
hp xu nht, phc tp ca HeapSort cng ch l O(nlgn). 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 HeapSort cng l O(nlgn).
103
R rng phc tp ca php m phn phi l O(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 vn ng, 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:
104
Chuyn
11 =
0
1
(z = 4)
105
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
011
011
010
101
110
011
011
010
101
101
010
011
011
100
100
101
L Minh Hong
106
Chuyn
procedure RadixExchangeSort;
var
z: Integer; { di dy bit biu din mi kho}
procedure Partition(L, H, b: Integer); {Phn on [L, H] da vo bit b}
var
i, j: Integer;
begin
if L H then Exit;
i := L; j := H;
repeat
{Hai vng lp trong di y lun cm canh i < j}
while (i < j) and (Bit b ca k[i] = 0) do i := i + 1; {Tm kho c bit b = 1 t u on}
while (i < j) and (Bit b ca k[j] = 1) do j := j - 1; {Tm kho c bit b = 0 t cui on}
o gi tr k[i] cho k[j];
until i = j;
if <Bit b ca k[j] = 0> then j := j + 1; {j l im bt u ca on c bit b l 1}
if b > 0 then {Cha xt ti bit 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 bit biu din mi kho;
Partition(1, n, z - 1);
end;
Vi Radix Exchange 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 bit th thi gian s l C.n chia tt c cc on cn chia bng bit (C l
hng s). Vy tng thi gian phn on bng z bit s l C.n.z. Trong trng hp xu nht,
phc tp ca Radix Exchange Sort l O(n.z). V phc tp trung bnh ca Radix Exchange
Sort l O(n.min(z, lgn)).
Ni chung, Radix Exchange Sort ci t nh trn ch th hin tc ti a trn cc h thng
cho php x l trc tip trn cc bit: H thng phi cho php ly mt bit ra d dng v thao
tc vi thi gian nhanh hn hn so vi thao tc trn Byte v Word. Khi Radix Exchange
Sort s tt hn nhiu QuickSort. (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 bit ra khi Byte x l li rt chm v lm nh
hng khng nh ti tc ca Radix Exchange 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
QuickSort c.
817
821
638
639
744
742
563
570
166
570
107
821
742
563
744
925
166
817
638
639
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
L Minh Hong
108
Chuyn
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 cch 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; {c[d] l s ln xut hin ch s d ti v tr p}
i, d: Integer;
begin
for d := 0 to radix - 1 do c[d] := 0;
for i := 1 to n do
begin
d := GetDigit(x[i], p); c[d] := c[d] + 1;
end;
for d := 1 to radix - 1 do c[d] := c[d-1] + c[d]; {cc c[d] tr thnh cc mc cui on}
for i := n downto 1 do {in gi tr vo dy y}
begin
d := GetDigit(x[i], p);
y[c[d]] := x[i]; c[d] := c[d] - 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; {Nu kt qu cui cng ang trong t th sao chp gi tr t t sang k}
end;
HSPHN 1999-2004
109
Dy
(2,
(2,
(4,
(4,
(9)
2
4, 9)
4, 9)
9)
9)
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)
tin hnh thut ton sp xp trn hai ng trc tip, ta vit cc th tc:
L Minh Hong
110
Chuyn
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 t[1..n]. Trc ht ta gi
MergeByLength(k, t, 1) trn hai kho 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.
HSPHN 1999-2004
111
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 X[a..b] v X[b+1..c]}
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 X[i] X[j] then {So snh hai kho nh nht trong hai mch m cha b a vo min sp xp}
begin
Y[p] := X[i]; i := i + 1; {a x[i] vo min sp xp v cho i chy}
end
else
begin
Y[p] := X[j]; j := j + 1; {a x[j] vo min sp xp v cho j chy}
end;
p := p + 1;
end;
if i b then Y[p..c] := X[i..b] {Mch 2 ht trc, a phn cui ca mch 1 vo min sp xp}
else Y[p..c] := X[j..c]; {Mch 1 ht trc, a phn cui ca mch 2 vo min sp xp}
end;
procedure MergeByLength(var X, Y: TArray; len: Integer);
begin
a := 1; b := len; c := 2 * len;
while c n do {Trn hai mch x[a..b] v x[b+1..c] u c di len}
begin
Merge(X, Y, a, b, c);
a := a + 2 * len; b := b + 2 * len; c := c + 2 * len; {Dch cc ch s a, b, c v sau 2.len v tr}
end;
if b < n then Merge(X, Y, a, b, n) {Cn li hai mch m mch th hai c di ngn hn len}
else
if a n then Y[a..n] := X[a..n] {Cn li mt mch th a thng mch sang min y}
end;
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 kho 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 lgn 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(nlgn) bt chp trng thi d liu vo.
L Minh Hong
112
Chuyn
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 kho 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.
8.12. 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
14325
798
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 Radix Exchange Sort, ta chn h nh phn. thut ton Straight Radix Sort, 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:
Ch s hng n v l x mod 256 = x mod 28 = x and 255 = x and $FF;
Ch s cn li (= ch s hng cao nht) l x div 256 = x div 28 = x shr 8;
P_2_08_1.PAS * Cc thut ton sp xp
{$M 65520 0 655360}
program SortingAlgorithmsDemo;
uses crt;
const
InputFile = 'SORT.INP';
OutputFile = 'SORT.OUT';
max = 15000;
maxV = 15000;
HSPHN 1999-2004
113
114
Chuyn
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;
{------------------ Sorting Algorithms ------------------}
{ SelectionSort}
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;
{ BubbleSort}
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;
{ InsertionSort}
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;
HSPHN 1999-2004
Integer);
- L + 1)];
Inc(i);
Dec(j);
115
116
Chuyn
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;
{ HeapSort}
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;
HSPHN 1999-2004
117
118
Chuyn
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;
{ MergeSort}
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
HSPHN 1999-2004
119
120
Chuyn
tnh v cng c lp trnh khc, kt qu c th khc. Tuy vy, vic o thi gian thc thi ca
tng thut ton sp xp vn cn thit nu ta mun so snh tc ca cc thut ton cng cp
phc tp bi cc tnh ton trn l thuyt i khi b lch so vi thc t v nhiu l do khc nhau.
C mt vn t ra l ngoi nhng thut ton sp xp cp O(n2), 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 (u cho thi gian chy bng 0 do khng kp o thi gian). Mt cch
gii quyt l cho mi thut ton QuickSort, Radix Sort, thc hin c ln (c l mt s nguyn
ln) trn cc b d liu ngu nhin ri ly thi gian tng chia cho c, hay c th tng kch
thc d liu (iu ny c th dn n vic phi sa li mt vi ch trong chng trnh hoc
thm ch phi thay i mi trng lp trnh).
Ti vit li chng trnh ny trn Borland Delphi a vo mt s ci tin:
C th chy vi kch thc d liu ln hn rt nhiu (hng triu kha)
) hai hay
Thit k da trn kin trc a lung (MultiThreads) cho php chy ng thi (
nhiu thut ton sp xp so snh tc , hin th qu trnh sp xp trc quan trn mn
hnh.
Cng cho php chy tun t (
xc ca chng.
HSPHN 1999-2004
121
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.
Nhng thut ton c phc tp O(n2) th ch nn p dng trong chng trnh c t ln sp
xp v vi kch thc n nh. V tc , BubbleSort 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 BubbleSort cng rt ng ch . Trong nhng thut ton c phc tp O(n2),
InsertionSort t ra nhanh hn nhng phng php cn li v cng c tnh n nh, m lnh
cng tng i n gin, d nh. SelectionSort th khng n nh nhng vi n nh, vic chn
ra m kho 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.
QuickSort, HeapSort, MergeSort v ShellSort 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.
QuickSort gp nhc im trong trng hp suy bin nhng xc sut xy ra trng hp ny
L Minh Hong
122
Chuyn
HSPHN 1999-2004
123
i.n
(1 i k). p dng thut ton tng t
k
L Minh Hong
124
Chuyn
9. TM KIM (SEARCHING)
9.1. 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 r[1..n]. Mi bn ghi r[i] (1 i n) tng ng vi mt kho k[i].
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.
Khng tm c bn ghi no c kho tm kim bng X c, php tm kim tht bi.
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}
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 l (n).
125
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(lgn) v trong trng hp trung
bnh l O(lgn). 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.
L Minh Hong
126
Chuyn
127
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 (Hnh 39).
4
L Minh Hong
128
Chuyn
2
7
Hnh 41: Xa nt c c hai nhnh con trn cy BST thay bng nt cc phi ca cy con tri
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.
4
2
7
Hnh 42: Xa nt c c hai nhnh con trn cy BST thay bng nt cc tri ca cy con phi
HSPHN 1999-2004
129
Trng hp trung bnh, th cc thao tc tm kim, chn, xo trn BST c phc tp l O(lgn).
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(nlgn).
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.
L Minh Hong
130
Chuyn
131
11 =
(z = 4)
5
0
8
1
7
0
4
0
10
1
12
1
11
6
5
2
7
8
10
12
11
4
=
=
=
=
=
=
=
=
=
0110
0101
0010
0111
1000
1010
1100
1011
0100
132
Chuyn
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. Ban u nt Root = nil (cy rng)
HSPHN 1999-2004
133
134
Chuyn
0010
10
11
12
0100
0101
0111
1000
1010
1011
1100
HSPHN 1999-2004
135
010
101
101
010
101
101
111
L Minh Hong
136
Chuyn
010
101
101
111
010
101
101
HSPHN 1999-2004
137
L Minh Hong
138
Chuyn
0
7
10
0
11
12
a)
12
0
1
7
0
4
0
8
0
1
5
10
1
11
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
bit ca kho tm kim khng phi t tri qua phi m theo th t ca cc bit 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.
HSPHN 1999-2004
139
L Minh Hong
142
Chuyn
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 1, v]; if m > v
F[m, v] =
F[m-1,v]+F[m,v-m]; if 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:
HSPHN 1999-2004
Quy hoch ng
143
F 0 1 2 3 4 5
0 1 0 0 0 0 0
1 1 1 1 1 1 1
2 1 1 2 2 3 3
3 1 1 2 3 4 5
4 1 1
5 1 1
2 3 5 6
2 3 5 7
144
Chuyn
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:
P_3_01_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}
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:
P_3_01_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.
HSPHN 1999-2004
Quy hoch ng
145
1.4. CI T QUY
Xem li cng thc truy hi tnh F[m, v] = F[m - 1, v] + F[m, v - m], ta nhn thy rng tnh
F[m, v] ta phi bit c chnh xc F[m - 1, v] v F[m, v - m]. Nh vy vic xc nh th t
tnh cc phn t trong bng F (phn t no tnh trc, phn t no tnh sau) l quan trng. Tuy
nhin ta c th tnh da trn mt hm quy m khng cn phi quan tm ti th t tnh ton.
Vic vit mt hm quy tnh cng thc truy hi kh n gin, nh v d ny ta c th vit:
P_3_01_5.PAS * m s cch phn tch s n dng quy
program Analyse5;
var
n: Integer;
function GetF(m, v: Integer): LongInt;
begin
if m = 0 then {Phn neo ca hm quy}
if v = 0 then GetF := 1
else GetF := 0
else {Phn quy}
if m > v then GetF := GetF(m - 1, v)
else GetF := GetF(m - 1, v) + GetF(m, v - m);
end;
begin
Write('n = '); ReadLn(n);
WriteLn(GetF(n, n), ' Analyses');
end.
146
Chuyn
var
n: Integer;
F: array[0..max, 0..max] of LongInt;
function GetF(m, v: Integer): LongInt;
begin
if F[m, v] = -1 then {Nu F[m, v] cha bit th i tnh F[m, v]}
begin
if m = 0 then {Phn neo ca hm quy}
if v = 0 then F[m, v] := 1
else F[m, v] := 0
else {Phn quy}
if m > v then F[m, v] := GetF(m - 1, v)
else F[m, v] := GetF(m - 1, v) + GetF(m, v - m);
end;
GetF := F[m, v]; {Gn kt qu hm bng F[m, v]}
end;
begin
Write('n = '); ReadLn(n);
FillChar(f, SizeOf(f), $FF); {Khi to mng F bng gi tr -1}
WriteLn(GetF(n, n), ' Analyses');
end.
Vic s dng phng php quy gii cng thc truy hi l mt k thut ng lu , v
khi gp mt cng thc truy hi phc tp, kh xc nh th t tnh ton th phng php ny t
ra rt hiu qu, hn th na n lm r hn bn cht quy ca cng thc truy hi.
HSPHN 1999-2004
Quy hoch ng
147
1 1
,
x + y = 2 . Tip im
tng ng vi nghim ti u ca bi ton cho.
2 2
y
1
x= y=
1
2
x
x+ y = 2
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.
148
Chuyn
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:
Dy Fibonacci l dy v hn cc s nguyn dng F[1], F[2], c nh ngha nh sau:
1, if i 2
F[i] =
F[i 1] + F[i 2], if i 3
Hy tnh F[6]
Xt hai cch ci t chng trnh:
Cch 1
program Fibo1;
function F(i: Integer): Integer;
begin
if i < 3 then F := 1
else F := F(i - 1) + F(i - 2);
end;
begin
WriteLn(F(6));
end.
Cch 2
program Fibo2;
var
F: array[1..6] of Integer;
i: Integer;
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.
HSPHN 1999-2004
Quy hoch ng
149
F(6)
F(5)
F(4)
F(4)
F(3)
F(2)
F(3)
F(2)
F(2)
F(3)
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 (hay phng trnh truy ton) 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:
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.
L Minh Hong
150
Chuyn
HSPHN 1999-2004
Quy hoch ng
151
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: a[0] = - v a[n+1] = +. Khi dy con n iu tng di nht
chc chn s bt u t a[0] v kt thc a[n+1].
Vi i: 0 i n + 1. Ta s tnh L[i] = di dy con n iu tng di nht bt u ti a[i].
L Minh Hong
152
Chuyn
3.1.3. Truy vt
Ti bc xy dng dy L, mi khi gn L[i] := L[jmax] + 1, ta t T[i] = jmax. lu li rng:
Dy con di nht bt u ti a[i] s c phn t th hai k tip l a[jmax].
Sau khi tnh xong hay dy L v T, ta bt u t T[0].
T[0] chnh 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 a[n+1]=+ cui}
begin
<Thng bo chn a[i]>
i := T[i];
end;
10
11
ai
10
L[i]
T[i]
11
10
11
Tracing
Quy hoch ng
153
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 a[j] > a[i] 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 a[i]}
T[i] := jmax; {Lu vt: phn t ng lin sau a[i] trong dy con tng di nht l a[jmax]}
end;
end;
procedure Result;
var
f: Text;
i: Integer;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 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(f, 'a[', i, '] = ', a[i]);
i := T[i];
end;
Close(f);
end;
begin
Enter;
Optimize;
Result;
end.
ai <a j
154
Chuyn
begin
Tnh L[i]; t k := L[i];
if k > m then {Nu dy con tng di nht bt u ti a[i] c di > m}
begin
m := k; {Cp nht li m}
StartOf[k] := i; {Gn gi tr cho StartOf[m]}
end
else
if a[i] > a[StartOf[k]] then {Nu c nhiu dy n iu tng di nht di k th}
StartOf[k] := i; {ch ghi nhn li dy c phn t bt u ln nht}
end;
Khi bt u vo mt ln lp vi mt gi tr i, ta bit c:
m: di dy con n iu tng di nht ca dy a[i+1..n+1]
StartOf[k] (1 k m): Phn t a[StartOf[k]] l phn t ln nht trong s cc phn t trong
on a[i+1..n+1] tho mn: Dy con n iu tng di nht bt u t a[StartOf[k]] c di
k. Do th t tnh ton c p t nh trong s trn, ta d dng nhn thy rng:
a[StartOf[k]] < a[StartOf[k - 1]] <<a[StartOf[1]].
iu kin c dy con n iu tng di p+1 bt u ti a[i] chnh l a[StartOf[p]] > a[i]
(v theo th t tnh ton th khi bt u mt ln lp vi gi tr i, a[StartOf[p]] lun ng sau
a[i]). Mt khc nu em a[i] ghp vo u dy con n iu tng di nht bt u ti
a[StartOf[p]] m thu c dy tng th em a[i] ghp vo u dy con n iu tng di nht
bt u ti a[StartOf[p - 1]] ta cng thu c dy tng. Vy tnh L[i], ta c th tm s p ln
nht tho mn a[StartOf[p]] > a[i] bng thut ton tm kim nh phn ri t L[i] := p + 1
(v sau T[i] := StartOf[p], tt nhin)
P_3_03_2.PAS * Ci tin thut ton tm dy con n iu tng di nht
program LongestSubSequence;
const
InputFile = 'INCSEQ.INP';
OutputFile = 'INCSEQ.OUT';
const
max = 5000;
var
a, L, T, StartOf: array[0..max + 1] of Integer;
n, m: Integer;
procedure Enter;
var
i: Word;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
for i := 1 to n do Read(f, a[i]);
Close(f);
end;
procedure Init;
begin
a[0] := -32768;
a[n + 1] := 32767;
m := 1;
L[n + 1] := 1;
StartOf[1] := n + 1;
end;
HSPHN 1999-2004
Quy hoch ng
155
D thy chi ph thi gian thc hin gii thut ny cp O(nlogn), y l mt v d in hnh
cho thy rng mt cng thc truy hi c th c nhiu phng php tnh.
L Minh Hong
156
Chuyn
3.2. BI TON CI TI
Trong siu th c n gi hng (n 100), gi hng th i c trng lng l W[i] 100 v tr gi
V[i] 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 W[i], V[i] 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
33
44
54
9 10
44
BAG.OUT
11
521
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].
HSPHN 1999-2004
Quy hoch ng
157
F
0
1
2
...
n
0
0
1
0
2
0
......
...0...
M
0
...
...
...
...
...
158
Chuyn
end;
procedure Trace; {Truy vt tm nghim ti u}
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 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(fo, n, ' ');
M := M - W[n]; { chn gi th n ri th ch c th mang thm c trng lng M - W[n] na thi}
end;
Dec(n);
end;
Close(fo);
end;
begin
Enter;
Optimize;
Trace;
end.
3.3. 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
PBBCEFATZQABCDABEFA
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
HSPHN 1999-2004
Quy hoch ng
159
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.
X2
Y1
Y2
Xm-1
Yn-1
Xm
Yn
Ta nhn thy:
Nu X[m] = Y[n] th ta ch cn bin on X[1..m-1] thnh Y[1..n-1]. Tc l trong trng
hp ny: F[m, n] = F[m - 1, n - 1]
X1
X2
Y1
Y2
Xm-1
Yn-1
Xm=Yn
Yn=Xm
X2
Y1
Y2
Xm-1
Xm
Yn-1
Yn
Yn
X2
Y1
Y2
Xm-1
Yn-1
Xm:=Yn
Yn
L Minh Hong
160
Chuyn
X1
X2
Y1
Y2
Xm-1
Yn-1
Xm
Yn
F 0 1 2 3 4
0
1
2
3
4
0
1
2
3
4
1
1
2
3
4
2
1
2
3
4
3
2
1
2
3
4
3
2
2
2
Quy hoch ng
161
Lu : khi truy vt, trnh truy nhp ra ngoi bng, nn to vin cho bng.
P_3_03_4.PAS * Bin i xu
program StrOpt;
const
InputFile = 'STR.INP';
OutputFile = 'STR.OUT';
max = 100;
var
X, Y: String[2 * max];
F: array[-1..max, -1..max] of Integer;
m, n: Integer;
procedure Enter;
var
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, X); ReadLn(fi, Y);
Close(fi);
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}
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 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(fo, X, ' -> '); {In ra xu X trc khi bin i}
L Minh Hong
162
Chuyn
HSPHN 1999-2004
Quy hoch ng
163
SUBSEQ.INP
10 5
1 6 11 5 10 15 20 2 4 9
SUBSEQ.OUT
8
a[10] = 9
a[9] = 4
a[7] = 20
a[6] = 15
a[5] = 10
a[4] = 5
a[3] = 11
a[2] = 6
Sum = 80
164
Chuyn
var
tmp: Integer;
begin
tmp := (x - y) mod k;
if tmp >= 0 then Sub := tmp
else Sub := tmp + k;
end;
procedure Optimize;
var
i, t: Integer;
begin
FillChar(f, SizeOf(f), $FF); {Khi to cc phn t f[0,.] u bng 255 (+)}
f[0, 0] := 0; {Ngoi tr f[0, 0] := 0}
for i := 1 to n do
for t := 0 to k - 1 do {Tnh f[i, t] := min (f[i - 1, t], f[i - 1, Sub(t, a[i])] + 1}
if f[i - 1, t] < f[i - 1, Sub(t, a[i])] + 1 then
f[i, t] := f[i - 1, t]
else
f[i, t] := f[i - 1, Sub(t, a[i])] + 1;
end;
procedure Result;
var
fo: Text;
i, t: Integer;
SumAll, Sum: LongInt;
begin
SumAll := 0;
for i := 1 to n do SumAll := SumAll + a[i];
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, n - f[n, SumAll mod k]); {n - s phn t b i = s phn t gi li}
i := n; t := SumAll mod k;
Sum := 0;
for i := n downto 1 do
if f[i, t] = f[i - 1, t] then {Nu phng n ti u khng b ai, tc l c chn ai}
begin
WriteLn(fo, 'a[', i, '] = ', a[i]);
Sum := Sum + a[i];
end
else
t := Sub(t, a[i]);
WriteLn(fo, 'Sum = ', Sum);
Close(fo);
end;
begin
Enter;
Optimize;
Result;
end.
Quy hoch ng
165
f[i, t] =
max
(f[i 1, t j.i] + j)
0 j Count[i]
Trace[i 1,t j.i]1
Trace[i, t] =
0 j Count[i]
Trace[i 1,t j.i]1
166
Chuyn
for t := 0 to k - 1 do
for j := 0 to Count[i] do
if (Trace[i - 1, Sub(t, j * i)] <> -1) and
(f[i, t] < f[i - 1, Sub(t, j * i)] + j) then
begin
f[i, t] := f[i - 1, Sub(t, j * i)] + j;
Trace[i, t] := j;
end;
end;
procedure Result;
var
fo: Text;
i, t, j: Integer;
Sum: LongInt;
begin
t := 0;
{Tnh li cc Count[i] := S phn t phng n ti u s chn trong lp i}
for i := k - 1 downto 0 do
begin
j := Trace[i, t];
t := Sub(t, j * i);
Count[i] := j;
end;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, f[k - 1, 0]);
Sum := 0;
for i := 1 to n do
begin
t := a[i] mod k;
if Count[t] > 0 then
begin
WriteLn(fo, 'a[', i, '] = ', a[i]);
Dec(Count[t]);
Sum := Sum + a[i];
end;
end;
WriteLn(fo, 'Sum = ', Sum);
Close(fo);
end;
begin
Enter;
Optimize;
Result;
end.
Cch gii th hai tt hn cch gii th nht v n c th thc hin vi n ln. V d ny cho
thy mt bi ton quy hoch ng c th c nhiu cch t cng thc truy hi gii.
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
HSPHN 1999-2004
Quy hoch ng
5
9
167
1
2 3 4
0
6 7 8 x
3
10 11 12
1
0
1
0
1
2
0
1
1
4
5
6
1
0
14
1
= 34
1
54
1
6
14
22
9
36
25 100
41 164
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
c[i, j] := 0;
for k := 1 to q do c[i, j] := c[i, j] + a[i, k] * b[k, j];
end;
Ph tn thc hin php nhn ny c th nh gi qua s php nhn: nhn hai ma trn A
cp pxq v B cp 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, php tnh (A.B) cho ma trn kch thc 3x10 sau 3.4.10=120 php nhn
s, sau nhn tip vi 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), php tnh (B.C) cho ma trn kch thc 4x15 sau 4.10.15=600 php nhn
s, ly A nhn vi ma trn ny 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
n
m[i]=m[1].m[2].....m[n]
i=1
Vi :
m[1] l ma trn kch thc a[1] x a[2]
m[2] l ma trn kch thc a[2] x a[3]
168
Chuyn
MULTMAT.INP
6
3231223
MULTMAT.OUT
Number of numerical multiplications: 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 chi ph
nhn mt cp ma trn c th tnh c ngay. Vy c th ghi nhn c chi ph cho php nhn
hai ma trn lin tip bt k trong dy. 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.
tnh
k
j
m[p]
m[q]
=
. m[r] ; k: i k<j
p =i
q =i
r = k +1
j
Vi mt cch kt hp (ph thuc vo cch chn v tr k), chi ph ti thiu phi thc hin bng:
j
m[r] )
r = k +1
k
cng vi a[j].a[k+1].a[j+1] (l chi ph thc hin php nhn cui cng gia ma trn
m[q]
q =i
v ma trn
r = k +1
3.5.3. Tm cch kt hp ti u
Ti mi bc tnh f[i, j], ta ghi nhn li t[i, j] l im k m cch tnh:
k
j
m[p]
m[q]
. m[r]
=
p =i
q =i
r = k +1
j
HSPHN 1999-2004
Quy hoch ng
169
ti u nhn
t[i, j]
m[q] v cch kt hp ti
q =i
u nhn
r = t[i, j]+1
170
Chuyn
3.6. BI TP LUYN TP
3.6.1. Bi tp c hng dn li gii
Bi 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 ?
Hng dn:
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 th biu din bng
mng x[1..n] gm cc ch s 09 v x[1] + x[2] + + x[n] = k. Nu c nh x[1] = t th ta
nhn thy x[2..n] lp thnh mt s c n - 1 ch s m TCCS bng k - t. Suy ra do x[1] c th
nhn cc gi tr t 0 ti 9 nn v mt s lng: F[n, k] = t =0 F[n 1, k t] . y l cng thc
9
Quy hoch ng
171
1, if 0 k 9
F[1, k] =
0, otherwise
Cu b: Da vo bng phng n F[0..n, 0..k] d ra s mang th t cho.
Bi 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 .
Hng dn:
Gi s s ko cha trong gi th i l A[i]
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.
Vi mt gi tr V, gi k l gi tr cn tm gn cho b[V], v k cn 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. Khi 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 - A[k]. Tc l b[V - A[k]] k - 1 < k.
Suy ra b[V] s c tnh bng cch:
Xt tt c cc gi ko k c A[k] V v tho mn b[V - A[k]] < k, chn ra ch s k b nht gn
cho b[V]. y chnh l cng thc truy hi tnh bng phng n.
b[V] = min{k (A[k] V) & (b[V A[k]] < k)}
172
Chuyn
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.
A =
1
4
2
7
3
8
4
7
2
6
Hng dn:
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
4
2
7
3
8
4
7
2
6
1
B =
7
1
4
3.6.2. Bi tp t lm
Bi 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.
Bi 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 X, Y. Tm xu Z c di ln nht l
xu con ca c X v Y. V d: X = 'abcdefghi123'; Y = 'abc1def2ghi3' th Z l 'abcdefghi3'.
Bi 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:
i xng
Cha xu S
HSPHN 1999-2004
Quy hoch ng
173
MADAM
MADAM
Edbabcd
edcbabcde
00_11_22_33_222_1_000
000_11_222_33_222_11_000
abcdefg_hh_gfe_1_d_2_c_3_ba ab_3_c_2_d_1_efg_hh_gfe_1_d_2_c_3_ba
Bi 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.
Bi 5
Cho n qun -mi-n xp dng ng theo hng ngang v c nh s t 1 n n. Qun mi-n th i c s ghi trn l a[i] v s ghi di l b[i]. Xem hnh v:
1
Bit rng 1 n 100 v 0 a[i], b[i] 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
Bi 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.
L Minh Hong
174
Chuyn
C D
A A A B
B C D A
C
B
B
B A
B D D D
Cho xu S gm n k t ch gm cc ch A, B, C, D.
Xt php co R(i): thay k t S[i] v S[i+1] bi k t nm trn hng S[i], ct S[i+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.
Bi 7
Cho N s t nhin a[1], a[2], , a[n]. Bit rng 1 n 200 v 0 a[i] 200. Ban u cc s
c t lin tip theo ng th t cch nhau bi du "?": a[1] ? a[2] ? ? a[n]. 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 a[i] 100.
V d: Ban u 1 ? 2 ? 3 ? 4 v K = 0 s cho kt qu 1 - 2 - 3 + 4.
Bi 8
Dy Catalan 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 Catalan di n xp theo th t t in th dy
th p l dy no.
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 s rn luyn mi c th c
c. Hy c li 1 tm hiu k cc phng php thng dng khi ci t mt chng
trnh gii cng thc truy hi.
HSPHN 1999-2004
176
Chuyn
1. CC KHI NIM C BN
1.1. 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
Cu trc phn t
HSPHN 1999-2004
L thuyt th
177
V hng
C hng
V hng
n th
C hng
a th
deg(v) = 2m
vV
178
Chuyn
deg
vV
HSPHN 1999-2004
L thuyt th
179
0
A = 1
1
0
0
0
0
1
1
1
0
0
0
1
1
1
0
0
0
1
1
0
0
0
A = 0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
1
0
0
L Minh Hong
180
Chuyn
Hnh 54
Ci t trn mng:
1
(1, 2)
(1, 3)
1, 5)
(2, 3)
5
(3, 4)
6
(4, 5)
(1, 3)
1, 5)
(2, 3)
(3, 4)
(4, 5)
L thuyt th
181
Hnh 55
Cch 1: Dng mt mng cc nh, mng chia lm n on, on th i trong mng lu danh
sch cc nh k vi nh i: Vi th Hnh 55, danh sch k s l mt mng Adj gm 12
phn t:
1
10
11
12
II
III
IV
L Minh Hong
182
Chuyn
List 1:
List 2:
List 3:
List 4:
List 5:
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
Danh sch k yu hn ma trn k vic kim tra (u, v) c phi l cnh hay khng, bi
trong cch biu din ny ta s phi vic phi duyt ton b danh sch k ca u hay danh
sch k ca v.
i vi nhng thut ton m ta s kho st, danh sch k tt hn hn so vi hai phng php
biu din trc. 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.
2.4. 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}
HSPHN 1999-2004
L thuyt th
183
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.
L Minh Hong
184
Chuyn
Hnh 56: th v ng i
L thuyt th
185
ng i t s ti f
2
4
6
7
8
3
PATH.INP
8715
12
13
23
24
35
46
78
PATH.OUT
From 1 you can visit:
1, 2, 3, 4, 5, 6,
The path from 1 to 5:
5<-3<-2<-1
186
Chuyn
InputFile = 'PATH.INP';
OutputFile = 'PATH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Trace: array[1..max] of Integer;
n, s, f: Integer;
procedure Enter; {Nhp d liu}
var
i, u, v, m: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(a, SizeOf(a), False);
ReadLn(fi, n, m, s, f);
for i := 1 to m do
begin
ReadLn(fi, u, v);
a[u, v] := True;
a[v, u] := True; { th v hng nn cnh (u, v) cng l cnh (v, u)}
end;
Close(fi);
end;
procedure DFS(u: Integer); {Thut ton tm kim theo chiu su bt u t u}
var
v: Integer;
begin
for v := 1 to n do
if a[u, v] and (Trace[v] = 0) then {Duyt v cha thm k vi u}
begin
Trace[v] := u; {Lu vt ng i cng l nh du v thm}
DFS(v); {Tm kim theo chiu su bt u t v}
end;
end;
procedure Result; {In kt qu}
var
fo: Text;
v: Integer;
begin
Assign(fo, OutputFile); Rewrite(fo);
Writeln(fo, 'From ', s, ' you can visit: ');
for v := 1 to n do
if Trace[v] <> 0 then Write(fo, v, ', '); {In ra nhng nh n c t s}
WriteLn(fo);
WriteLn(fo, 'The path from ', s, ' to ', f, ': ');
if Trace[f] = 0 then {Nu Trace[f] = 0 th s khng th ti c f}
WriteLn(fo,'not found')
else {s ti c f}
begin
while f <> s do {Truy vt ng i}
begin
Write(fo, f, '<-');
f := Trace[f];
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
HSPHN 1999-2004
L thuyt th
187
Enter;
FillChar(Trace, SizeOf(Trace), 0); {Mi nh u cha thm}
Trace[s] := -1; {Ngoi tr s thm}
DFS(s);
Result;
end.
Nhn xt:
V c k thut nh du, nn th tc DFS s c gi n ln (n l s nh)
C th c nhiu ng i t s ti f, nhng thut ton DFS lun tr v mt ng i c th
t t in nh nht.
Qu trnh tm kim theo chiu su cho ta mt cy DFS gc s. Quan h cha-con trn cy
c nh ngha l: nu t nh u ti thm nh v (DFS(u) gi DFS(v)) th u l nt cha ca
nt v. Hnh 57 l th v cy DFS tng ng vi nh xut pht s = 1.
2nd
2
5th
6
1
1
8
6th
7
8
st
3
3
5
4th
rd
x1
u1
u2
x2
uq
xp
188
Chuyn
danh sch. Chnh v nguyn tc nn danh sch cha nhng nh ang ch s c t chc
di dng hng i (Queue)
Nu ta c Queue l mt hng i vi th tc Push(v) y mt nh v vo hng i v hm
Pop tr v mt nh ly ra t hng i th m hnh ca gii thut c th vit nh sau:
for (v V) do Free[v] := True;
Free[s] := False; {Khi to ban u ch c nh S b nh du}
Queue := ; Push(s); {Khi to hng i ban u ch gm mt nh s}
repeat {Lp ti khi hng i rng}
u := Pop; {Ly t hng i ra mt nh u}
for (v V: Free[v] and ((u, v) E)) do {Xt nhng nh v k u cha b a vo hng i}
begin
Trace[v] := u; {Lu vt ng i}
Free[v] := False; {nh du v}
Push(v); {y v vo hng i}
end;
until Queue = ;
Thng bo t s c th thm c nhng nh v m Free[v] = False;
if Free[f] then {s i ti c f}
Truy theo vt t f tm ng i t s ti f;
Tng t nh thut ton tm kim theo chiu su, ta c th dng mng Trace[1..n] kim lun
chc nng nh du.
P_4_03_2.PAS * Thut ton tm kim theo chiu rng
program Breadth_First_Search;
const
InputFile = 'PATH.INP';
OutputFile = 'PATH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Trace: array[1..max] of Integer;
n, s, f: Integer;
procedure Enter; {Nhp d liu}
var
i, u, v, m: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(a, SizeOf(a), False);
ReadLn(fi, n, m, s, f);
for i := 1 to m do
begin
ReadLn(fi, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(fi);
end;
procedure BFS; {Thut ton tm kim theo chiu rng}
var
Queue: array[1..max] of Integer;
Front, Rear, u, v: Integer;
begin
Front := 1; Rear := 1; {front: ch s u hng i, rear: ch s cui hng i}
Queue[1] := s; {Khi to hng i ban u ch gm mt nh s}
FillChar(Trace, SizeOf(Trace), 0); {Cc nh u cha nh du}
HSPHN 1999-2004
L thuyt th
189
Nhn xt:
C th c nhiu ng i t s ti f nhng thut ton BFS lun tr v mt ng i ngn
nht (theo ngha i qua t cnh nht).
Qu trnh tm kim theo chiu rng cho ta mt cy BFS gc s. Quan h cha - con trn cy
c nh ngha l: nu t nh u ti thm nh v th u l nt cha ca nt v. Hnh 58 l v
d v cy BFS.
L Minh Hong
190
Chuyn
2nd
2
4th
6
1
1
8
6th
7
8
st
3
3
5
rd
5th
HSPHN 1999-2004
L thuyt th
191
G3
G2
Khp
Cu
L Minh Hong
192
Chuyn
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 Scan.
n.(n 1)
cnh v bc ca mi nh u bng n - 1.
2
HSPHN 1999-2004
L thuyt th
193
K3
K4
K5
Hnh 62: th y
L Minh Hong
194
Chuyn
2
5
4
12
10
11
CONNECT.INP
12 9
13
14
15
24
67
68
9 10
9 11
11 12
CONNECT.OUT
Connected Component 1:
1, 2, 3, 4, 5,
Connected Component 2:
6, 7, 8,
Connected Component 3:
9, 10, 11, 12,
HSPHN 1999-2004
L thuyt th
195
196
Chuyn
bi ton ta c mt phng php kh hu hiu da trn thut ton tm kim theo chiu su
Depth First Search.
HSPHN 1999-2004
L thuyt th
197
1st
2nd v
3rd
1st
5th
2nd
3rd
6th
4th u
7th
1st
u 5th
3rd
6th
4th
TH1: v l tin bi ca u
(u, v) l cung ngc
2nd
v 7th
TH2: v l hu du ca u
(u, v) l cung xui
5th
u 6th
4th v
7th
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.
198
Chuyn
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:
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.
HSPHN 1999-2004
L thuyt th
199
3
4
9
10
4
11
10
11
6
7
L Minh Hong
200
Chuyn
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 Number[u] l s th t ca nh u theo cch nh s
. Ta tnh thm Low[u] l gi tr Number[.] 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] :=
Number[u] (u c cung ti chnh u). Sau vi mi nh v ni t u, c hai kh nng:
Nu v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u]mi := min(Low[u]c, Number[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
Number[u]. Nu nh Low[u] = Number[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 Stack 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 Stack ngay sau u. Nu u l cht, ta ch vic ly cc nh
ra khi ngn xp Stack 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);
HSPHN 1999-2004
L thuyt th
201
begin
Count := Count + 1; Number[u] := Count; {Trc ht nh s u}
Low[u] := Number[u];
Push(u); {y u vo ngn xp}
nh du u thm;
for (v: (u, v)E) do
if v thm then
Low[u] := min(Low[u], Number[v])
else
begin
Visit(v);
Low[u] := min(Low[u], Low[v]);
end;
if Number[u] = Low[u] then {Nu u l cht}
begin
Thng bo thnh phn lin thng mnh vi cht u gm c cc nh:;
repeat
v := Pop; {Ly t ngn xp ra mt nh v}
Output v;
Xo nh v khi th;
until v = u;
end;
end;
begin
Thm vo th mt nh x v cc cung (x, v) vi mi v;
Count := 0;
L := ; {Khi to mt ngn xp rng}
Visit(x)
end.
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 thut ton Tarjan vn l O(n + m) trong trng hp biu din th bng danh sch
k, l O(n2) 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 Number v Low vi cng dng nh trn, quy c Number[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 SCONNECT.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 SCONNECT.OUT, lit k cc thnh phn lin thng mnh
L Minh Hong
202
Chuyn
2
8
3
4
9
10
6
7
11
SCONNECT.INP
11 15
12
18
23
34
42
45
56
67
75
89
94
9 10
10 8
10 11
11 8
SCONNECT.OUT
Component 1:
7, 6, 5,
Component 2:
4, 3, 2,
Component 3:
11, 10, 9, 8,
Component 4:
1,
P_4_04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh
program Strong_connectivity;
const
InputFile = 'SCONNECT.INP';
OutputFile = 'SCONNECT.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Number, Low, Stack: array[1..max] of Integer;
n, Count, ComponentCount, Top: Integer;
fo: Text;
procedure Enter;
var
i, u, v, m: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(a, SizeOf(a), False);
ReadLn(fi, n, m);
for i := 1 to m do
begin
ReadLn(fi, u, v);
a[u, v] := True;
end;
Close(fi);
end;
procedure Init; {Khi to}
begin
FillChar(Number, SizeOf(Number), 0); {Mi nh u cha thm}
FillChar(Free, SizeOf(Free), True); {Cha nh no b loi}
Top := 0; {Ngn xp rng}
Count := 0; {Bin nh s th t thm}
ComponentCount := 0; {Bin nh s cc thnh phn lin thng}
end;
procedure Push(v: Integer); {y mt nh v vo ngn xp}
begin
Inc(Top);
Stack[Top] := v;
end;
HSPHN 1999-2004
L thuyt th
203
Bi tp
Bi 1
L Minh Hong
204
Chuyn
11
10
5
5
4
9
11
2
10
Hnh 66: 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)
Bi 2
HSPHN 1999-2004
L thuyt th
205
L Minh Hong
206
Chuyn
L thuyt th
207
5.1.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 (Hnh 67).
L Minh Hong
208
Chuyn
T2
T1
T3
10
11
a)
10
11
b)
Hnh 68: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh)
HSPHN 1999-2004
L thuyt th
209
L Minh Hong
210
Chuyn
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.
HSPHN 1999-2004
L thuyt th
211
10
10
Nhn xt 3:
Vi php nh chiu DFS, 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 DFS. Chnh v vy, mi chu trnh c s ca cy DFS 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 (u, v) 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
L Minh Hong
212
Chuyn
5.3.2. Php nh s v ghi nhn cung ngc ln cao nht trn cy DFS
Trong qu trnh nh chiu, ta thm vo thao tc nh s cc nh theo th t thm DFS,
gi Number[u] l s th t ca nh u theo cch nh s . nh ngha thm Low[u] l gi
tr Number[.] 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 pha gc 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 (Number[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, khi th tc Visit(v) thot c ngha l xy dng
c nhnh DFS gc v nhnh DFS gc u, khi nhng cung ngc i t nhnh DFS
gc v c th coi l cung ngc i t nhnh DFS gc u ta cc tiu ho Low[u] theo cng
thc: Low[u]mi := min(Low[u]c, Low[v])
v thm th (u, v) l mt cung ngc i t nhnh DFS gc u ta s cc tiu ho Low[u]
theo cng thc: Low[u]mi := min(Low[u]c, Number[v])
HSPHN 1999-2004
L thuyt th
213
1
1
1
4
10 2
10
th v hng
5
9
th nh chiu
Gi tr Numbering[.] ghi trong vng trn
Gi tr Low[.] ghi bn ngoi vng trn
214
Chuyn
1
11
2
12
4
8
10
CUT.INP
12 14
12
13
23
24
25
27
36
45
47
5 10
68
69
89
11 12
CUT.OUT
Bridges:
(3, 6)
(5, 10)
(11, 12)
Cut vertices:
2
3
5
6
L thuyt th
end;
begin
Parent[v] := u;
Visit(v); {Thm v}
if Low[u] > Low[v] then Low[u] := Low[v]; {Cc tiu ho Low[u] theo Low[v]}
end
else {v thm, (u, v) l cung ngc}
if Low[u] > Number[v] then Low[u] := Number[v]; {Cc tiu ho Low[u] theo Number[v]}
end;
procedure Solve;
var
u, v: Integer;
begin
Count := 0;
FillChar(Parent, SizeOf(Parent), 0); {nh du mi nh u cha thm}
for u := 1 to n do
if Parent[u] = 0 then {Gp mt nh cha thm}
begin
Parent[u] := -1; {Cho u l mt gc cy DFS}
Visit(u); {Xy dng cy DFS gc u}
end;
end;
procedure Result; {In kt qu}
var
f: Text;
u, v: Integer;
nChildren: array[1..max] of Integer;
IsCut: array[1..max] of Boolean;
begin
FillChar(nChildren, SizeOf(nChildren), 0); {Tnh nChildren[u] = S nhnh con ca nhnh DFS gc u}
for v := 1 to n do
if Parent[v] <> -1 then Inc(nChildren[Parent[v]]);
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Bridges: ');
for v := 1 to n do
begin
u := Parent[v];
if (u <> -1) and (Low[v] >= Number[v]) then {(u, v) l cu}
WriteLn(f, '(', u, ', ', v, ')');
end;
WriteLn(f, 'Cut vertices:');
FillChar(IsCut, SizeOf(IsCut), False);
for v := 1 to n do
if Parent[v] <> -1 then
begin
u := Parent[v];
{Nu Low[v] Number[u] khp u khng phi gc cy DFS hoc u c 2 nhnh con}
if (Low[v] >= Number[u]) then
IsCut[u] := IsCut[u] or (Parent[u] <> -1) or (nChildren[u] >= 2);}
end;
for u := 1 to n do
if IsCut[u] then WriteLn(f, u);
Close(f);
end;
begin
Enter;
Solve;
Result;
end.
L Minh Hong
215
216
Chuyn
6.2. NH NGHA
Chu trnh n cha tt c cc cnh ca th c gi l chu trnh Euler
ng i n cha tt c cc cnh ca th c gi l ng i Euler
Mt th c chu trnh Euler c gi l th Euler
Mt th c ng i Euler c gi l th na Euler.
6.3. NH L
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)
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
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.
HSPHN 1999-2004
L thuyt th
217
7
1
4
8
3
Hnh 72
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
Hnh 73 bng nt lin, cc cnh b xo c v bng nt t.
5
7
1
4
8
3
Hnh 73
L Minh Hong
218
Chuyn
6.5. 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
1
EULER.INP
5
121
132
141
231
341
EULER.OUT
1231341
L thuyt th
ReadLn(f, n);
while not SeekEof(f) do
begin
ReadLn(f, u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
Close(f);
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}
Front, Rear: Integer; {Front: Ch s u hng i, Rear: 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;
Front := 1; Rear := 1;
Queue[1] := y;
repeat
u := Queue[Front]; Inc(Front);
for v := 1 to n do
if Free[v] and (a[u, v] > 0) then
begin
Inc(Rear);
Queue[Rear] := v;
Free[v] := False;
if Free[x] then Break;
end;
until Front > Rear;
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;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
Current := 1;
Write(f, 1, ' '); {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(f, Next, ' '); {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}
L Minh Hong
219
220
Chuyn
end;
until Next = 0; {Cho ti khi khng i tip c na}
Close(f);
end;
begin
Enter;
FindEulerCircuit;
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
HSPHN 1999-2004
L thuyt th
221
222
Chuyn
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
HSPHN 1999-2004
L thuyt th
223
G1
G2
G3
Hnh 74
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
7.2. NH L
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.
L Minh Hong
224
Chuyn
7.3. 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 (2 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
56
12
13
24
35
41
52
HAMILTON.OUT
135241
142531
HSPHN 1999-2004
L thuyt th
225
Bi tp
Bi 1
a) Lp chng trnh nhp vo mt th v ch ra ng mt chu trnh Hamilton nu c.
b) Lp chng trnh nhp vo mt th v ch ra ng mt ng i Hamilton nu c.
Bi 2
Trong m ci ca Perse v Andromde c 2n hip s. Mi hip s c khng qu n - 1 k
th. Hy gip Cassiop, m ca Andromde 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.
Bi 3
Gray code: Mt hnh trn c chia thnh 2n hnh qut ng tm. Hy xp tt c cc xu nh
phn di n vo cc hnh qut, mi xu vo mt hnh qut sao cho bt c hai xu no hai
hnh qut cnh nhau u ch khc nhau ng 1 bit. V d vi n = 3:
L Minh Hong
226
Chuyn
100
000
101
001
111
011
110
010
Bi 4
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 (x[1], y[1]) c th di
chuyn sang (x[2], y[2]) nu x[1]-x[2].y[1]-y[2] = 2 (Xem hnh v).
45
2
43
16
47
30
42
17
46
31
60
15
3
44
1
48
37
64
18
41
36
59
32
57
35
4
19
40
49
38
20
7
50
33
58
25
5
34
9
22
39
52
8
21
6
51
10
23
61 56 13 28 63 54 11 26
14 29 62 55 12 27 24 53
Vi n = 10, xut pht (6, 5)
HSPHN 1999-2004
L thuyt th
227
18
71 100
43
20
69
86
45
22
55
97
42
19
70
99
44
21
24
87
46
72
17
98
95
68
85
88
63
26
23
41
16
96
83
73
80
84
93
81
74
94
89
67
64
90
49
47
62
50
27
79
40
35
82
76
91
66
51
48
36
39
15
12
78
37
75
34
92
77
65
60
2
57
61
52
28
3
53
6
14
33
10
59
56
31
54
29
11
38
13
32
58
55
30
L Minh Hong
228
Chuyn
HSPHN 1999-2004
L thuyt th
229
f1
f2
L Minh Hong
230
Chuyn
20
20
5
6
MINPATH.INP
6714
121
1 6 20
232
363
3 4 20
545
654
MINPATH.OUT
Distance from 1 to 4: 15
4<-5<-6<-3<-2<-1
HSPHN 1999-2004
L thuyt th
231
L Minh Hong
232
Chuyn
L thuyt th
233
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. Ban u d[v] c khi
gn nh trong thut ton Ford-Bellman (d[s] = 0 v d[v] = vi v s). 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:
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.
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
234
Chuyn
L thuyt th
235
begin
WriteLn(fo, 'Distance from ', s, ' to ', f, ': ', d[f]);
while f <> s do
begin
Write(fo, f, '<-');
f := Trace[f];
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
LoadGraph;
Init;
Dijkstra;
PrintResult;
end.
236
Chuyn
L thuyt th
237
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; {Tip tc xt ln pha nt gc}
parent := child div 2;
end;
{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; {Ly t Heap ra nh c nhn t do nh nht}
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, min: Integer;
begin
Update(s); {a nh xut pht v gc Heap}
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 := h^[u] + 1 to h^[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
L Minh Hong
238
Chuyn
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
if d[f] = maxC then
WriteLn(fo, 'There is no path from ', s, ' to ', f)
else
begin
WriteLn(fo, 'Distance from ', s, ' to ', f, ': ', d[f]);
while f <> s do
begin
Write(fo, f, '<-');
f := Trace[f];
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
LoadGraph;
Init;
Dijkstra;
PrintResult;
{Gii phng b nh cp cho cc bin ng}
Dispose(AdjCost);
Dispose(Adj);
Dispose(h);
end.
5
6
6
3
L thuyt th
239
count := count - 1;
end;
begin
nh du mi nh V u cha thm;
count := n; {Bin nh s c khi to bng n m li}
for u := 1 to n do
if u cha thm then Visit(u);
end;
Vic kim tra th khng c c chu trnh cng rt n gin bng cch thm vo on
chng trnh trn vi dng lnh, ti s khng vit di tp trung vo thut ton, cc bn c
th tham kho cc k thut trnh by trong thut ton Tarjan (4, 4.4.3).
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[s] = 0 v d[v] = + vi v s. 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]);
L Minh Hong
240
Chuyn
L thuyt th
241
LoadGraph;
Numbering;
Init;
FindPath;
PrintResult;
end.
L Minh Hong
242
Chuyn
L thuyt th
243
Close(fo);
end;
begin
LoadGraph;
Floyd;
PrintResult;
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.
8.8. 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.
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l
O(n3), thut ton Dijkstra l O(n2), thut ton ti u nhn theo th t tp l O(n2) cn thut
ton Floyd l O(n3). 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
L Minh Hong
244
Chuyn
Bi 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
3
2
2
1
Bi 2
Trn mt phng cho n ng trn (n 2000), ng trn th i c cho bi b ba s thc
(x[i], y[i], R[i]), (x[i], y[i]) l to tm v R[i] 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.
Bi 3
Cho mt dy n s nguyn a[1..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.
Hng dn: Dng th G = (V, E), V = {1, , n}, (i, j) E nu i < j v a[i] + a[j] l s
nguyn t, tm ng i di nht trn th G khng c chu trnh
Bi 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 .
Hng dn: Dng th G = (V, E), trong :
V = {0, 1, , n}
E = {(0, u)|1 u n} {(u, v)|a[u, v] = TRUE}. Trng s mi cung (i, j) t bng t[j]
Tm ng i di nht trn th khng c chu trnh, thi im thch hp thc hin cng
vic i chnh l d[i] - t[i].
Bi 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.
Hng dn: Dng thut ton Dijkstra vi cu trc Heap
Bi 6: Arbitrage
Arbitrage l mt cch s dng s bt hp l trong hi oi tin t kim li.
V d:
Gi s
HSPHN 1999-2004
L thuyt th
245
1$ mua c 0.7
1 mua c 190
1 mua c 0.009$
T 1$, ta c th i sang 0.7, sau sang 0.7x190=133, ri i li sang 133x0.009=1.197$.
Kim c 0.197$ li.
Gi s rng c n loi tin t nh s 1, 2, , n. V mt bng R kch thc nxn cho bit t l
hi oi. Mt n v tin i i c R[i, j] n v tin j.
a) Hy tm thut ton xc nh xem c th kim li t bng t gi hi oi ny bng
phng php Arbitrage hay khng?
b) Gi s rng nh bng thng minh v hiu ho Arbitrage, tnh t l tt nht c th
hon i gia hai loi tin t bt k.
Hng dn:
t R[i, j] := -ln(R[i, j]). Dng th G = (V, E) c n nh v ma trn trng s l R. Thm
vo G mt nh nh s 0 v ni n ti tt c nhng nh cn li bng cung c trng s 0.
a) Dng thut ton Ford-Bellman tm ng i ngn nht xut pht t 0. Sau khi thut ton
Ford-Bellman kt thc, xt tt c cc cp nh. Nu tn ti mt cp (u, v) m d[v] > d[u] +
R[u, v] th thng bo tn ti Arbitrage. Thut ton ny da trn nhn xt: T gi hi oi
cho c th dng Arbitrage nu v ch nu th c chu trnh m.
b) Nu t gi hi oi khng cho php Arbitrage tc l th G khng c chu trnh m. Dng
thut ton Floyd tm ng i ngn nht gia mi cp nh. T l tt nht c th hon i t
loi tin i sang loi tin j chnh l e-d[i, j], trong d[i, j] l di ng i ngn nht gia hai
nh i v j trn G.
Bi 7:
Cho mt th G = (V, E) gm cc cnh c gn trng s khng m. Cho hai nh A v B.
Hy ch ra hai ng i t a ti b tho mn:
Hai ng i ny khng c cnh chung
Tng di hai ng i l nh nht c th
Hng dn:
Coi mi cnh ca th tng ng vi hai cung c hng ngc chiu nhau, trng s trn
cung (u, v) c gn bng c[u, v].
Dng thut ton Dijkstra tm ng i ngn nht t A ti B: v0, v1, , vp. Dc trn ng
i Dijkstra, vi mi cnh (vi-1, vi), ta b i cung (vi-1, vi), gi li cung (vi, vi-1) v gn trng s
cung ny = -c[vi, vi-1]). Sau php bin i c nhng cung trng s m nhng khng to thnh
chu trnh m.
Dng thut ton Ford-Bellman tm ng i ngn nht t A ti B: u0, u1, , uq. Dc trn
ng i Ford-Bellman, vi mi cnh (ui-1, ui), ta b i cung (ui-1, ui).
L Minh Hong
246
Chuyn
ng i Dijkstra 1, 2, 4, 5 ( di 10):
8
B i cc cung (1, 2), (2, 4), (4, 5). t li trng s cc cung ngc chiu ng i:
c[2, 1] := -3; c[4, 2] := -4; c[5, 4] := -3;
8
-3
-3
-4
ng i Ford-Bellman 1, 4, 2, 3, 5 ( di 14):
8
-3
-3
-4
-3
-3
HSPHN 1999-2004
L thuyt th
247
L Minh Hong
248
Chuyn
1
1
1
2
2
1
4
1
2
MINTREE.INP
69
121
131
241
232
251
351
361
452
562
MINTREE.OUT
Minimal spanning tree:
(2, 4) = 1
(3, 6) = 1
(2, 5) = 1
(1, 3) = 1
(1, 2) = 1
Weight = 5
HSPHN 1999-2004
L thuyt th
249
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
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.
L Minh Hong
250
Chuyn
L thuyt th
n, m: Integer;
Connected: Boolean;
procedure LoadGraph;
var
i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, m);
for i := 1 to m do
with e[i] do
ReadLn(f, u, v, c);
Close(f);
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; {Ly gc ca cy cha v}
begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;
procedure Union(r1, r2: Integer); {Hp nht hai cy li thnh mt cy}
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;
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;
L Minh Hong
251
252
Chuyn
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 0 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); {Hp nht hai cy thnh mt cy}
end;
end;
end;
procedure PrintResult;
var
i, Count, W: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if not Connected then
WriteLn(f, 'Error: Graph is not connected')
else
begin
WriteLn(f, '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(f, '(', u, ', ', v, ') = ', c);
Inc(Count);
W := W + c;
end;
if Count = n - 1 then Break; {Cho ti khi n - 1 cnh}
end;
WriteLn(f, 'Weight = ', W);
end;
Close(f);
end;
begin
LoadGraph;
Init;
Kruskal;
PrintResult;
HSPHN 1999-2004
L thuyt th
253
end.
254
Chuyn
d[v] := c[u, v];
Trace[v] := u;
end;
end;
Thng bo cy khung gm c cc cnh (Trace[v], v) vi v V: v 1);
P_4_09_2.PAS * Thut ton Prim
program Minimal_Spanning_Tree_by_Prim;
const
InputFile = 'MINTREE.INP';
OutputFile = 'MINTREE.OUT';
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;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, 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(f, u, v, c[u, v]);
c[v, u] := c[u, v];
end;
Close(f);
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}
HSPHN 1999-2004
L thuyt th
255
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;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if not Connected then {Nu th khng lin thng th tht bi}
WriteLn(f, 'Error: Graph is not connected')
else
begin
WriteLn(f, 'Minimal spanning tree: ');
W := 0;
for v := 2 to n do {Cy khung nh nht gm nhng cnh (v, Trace[v])}
begin
WriteLn(f, '(', Trace[v], ', ', v, ') = ', c[Trace[v], v]);
W := W + c[Trace[v], v];
end;
WriteLn(f, 'Weight = ', W);
end;
Close(f);
end;
begin
LoadGraph;
Init;
Prim;
PrintResult;
end.
Xt v phc tp tnh ton, thut ton Prim c phc tp l O(n2). 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)lgn). Tuy nhin nu phi lm vic vi th tha, ngi ta thng s dng thut
ton Kruskal tm cy khung ch khng dng thut ton Prim vi cu trc Heap.
Bi tp
Bi 1
So snh hiu qu ca thut ton Kruskal v thut ton Prim v tc .
Bi 2
Trn mt nn phng vi h to Decattes vung gc t n my tnh, my tnh th i c t
to (x[i], y[i]). c sn mt s dy cp mng ni gia mt s cp my tnh. Cho php
ni thm cc dy cp mng ni gia tng cp my tnh. Chi ph ni mt dy cp mng t l
L Minh Hong
256
Chuyn
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.
Hng dn:
Xy dng th y G = (V, E). Mi nh tng ng vi mt my tnh.
Trng s cnh (u, v) s c t bng
0, nu c sn cp mng ni hai my u, v.
( x u x v ) + ( yu y v )
2
HSPHN 1999-2004
L thuyt th
257
10.1.2. nh ngha 1
Nu c mng G = (V, E). Ta gi lung trong mng G l mt php gn cho mi cung e = (u,
v) mt s thc khng m (e) = [u, v] gi l lung trn cung e, tho mn 2 tnh cht:
Tnh cht 1: (Capacity constraint): Lung trn mi cng khng c vt qu kh nng
thng qua ca cung : 0 [u, v] c[u, v], (u, v V) .
Tnh cht 2 (Flow conservation): Vi mi nh v khng phi nh pht v cng khng phi
nh thu, tng lung trn cc cung i vo v bng tng lung trn cc cung i ra khi v:
uV
wV
6
6
5
3
vV
6
0
1
5
L Minh Hong
258
Chuyn
Khng gim tnh tng qut, trong bi ton tm lung cc i, ta c th gi thit rng vi mi
lung th lung trn cung (u, v) v lung trn cung (v, u) khng ng thi l s dng (u,
v V). Bi nu khng ta ch vic bt c [u, v] v [v, u] i mt lng bng min([u, v],
[v, u]) th c mt lung mi c gi tr bng lung ban u trong hoc [u, v] bng 0
hoc [v, u] bng 0.
10.1.4. nh ngha 2
Nu c mng G = (V, E), ta gi lung f trn mng G l mt php gn cho mi cung e = (u, v)
mt s thc f(e) = f[u, v] gi l lung trn cung e, tho mn 3 tnh cht:
Tnh cht 1: (Capacity constraint): Lung trn mi cng khng c vt qu kh nng
thng qua ca cung : f[u, v] c[u, v], (u, v V) .
Tnh cht 2: (Skew symmetry): Lung trn cung (u, v) v lung trn cung (v, u) c cng
gi tr tuyt i nhng tri du nhau: f[u, v] = f[v, u], (u, v V) .
Tnh cht 3: (Flow conservation): Vi mi nh u khng phi nh pht v cng khng
phi nh thu, tng lung trn cc cung i ra khi u bng 0:
vV
vV
vV
vV
vV
V gi tr lung, ta c:
f = f[s,v] = ([s,v]-[v,s]) = [s,v] [v,s] =
vV
vV
vV
vV
L thuyt th
259
Tnh cht 1: u, v V, r rng [u, v] khng m v [u, v] = max(f[u, v], 0) c[u, v].
Tnh cht 2: u, v V, ta c f[u, v] = [u, v] - [v, u] bi
Nu f[u, v] 0 th [u, v] = f[u, v] v [v, u] = 0 f[u, v] = [u, v] - [v, u]
Nu f[u, v] < 0 th [u, v] = 0 v [v, u] = f[v, u] = -f[u, v] f[u, v] = [u, v] - [v, u]
Ta li c tng lung trn cc cung i vo v =
uV
khi v =
[v, u] . Hiu s gia tng lung trn cc cung i vo v v tng lung trn cc
uV
cung i ra khi v =
uV
uV
uV
uV
vV
vV
vV
nh l c chng minh.
nh ngha 1 trc quan v d hiu hn nh ngha 2, tuy nhin nh ngha 2 li thch hp hn
cho vic trnh by v chng minh cc thut ton trong bi. Ta s s dng nh ngha 1 trong
cc hnh v v output (ch quan tm ti cc gi tr lung dng) cn cc khi nim khi din
gii thut ton s c hiu theo nh ngha 2.
c(X, Y) =
c[u,v]
f[u,v]
uX,vY
uX,vY
nh l 2:
Vi X V, ta c f(X, X) = 0
Vi X, Y V, ta c f(X, Y) = -f(Y, X)
Vi X, Y, Z V, X Y = , ta c f(X, Z) + f(Y, Z) = f(X Y, Z)
Vi X V\{s, t}, ta c f(X, V) = 0
Chng minh:
Vi X V, ta c f (X, X) =
u,vX
L Minh Hong
260
Chuyn
Vi X, Y V, ta c f (X, Y) =
f[u,v] v f (Y, X) =
uX,vY
vY,uX
xut hin trong tng th nht th hng t f[v, u] xut hin trong tng th hai v ngc li.
Suy ra f(X, Y) = -f(Y, X) theo tnh cht 2 ca lung.
f(X Y,Z)=
f[u,v] =
uX Y,vZ
f[u,v] +
uX,vZ
uY,vZ
|f| = f({s}, V)
(nh ngha)
= f(V, V) - f(V\{s}, V)
(nh l 2)
= -f(V\{s}, V)
(nh l 2)
= f(V, V\{s})
(nh l 2)
(nh l 2)
HSPHN 1999-2004
L thuyt th
261
5:6
5:5
4
6:6
1:3
5
3
6
0:3
3
1
2
6
1
1:6
2:5
1:1
Hnh 78: Mng G v mng thng d Gf tng ng (k hiu f[u,v]:c[u,v] ch lung f[u, v] v kh nng
thng qua c[u, v] trn cung (u, v))
nh l 4: Cho mng G v lung f. Gi f' l mt lung trn mng Gf. Khi (f+f') cng l
mt lung trn G vi gi tr lung bng |f|+|f'|. Trong lung (f+f') c nh ngha nh sau:
(f+f')[u, v] = f[u, v] + f'[u, v] (u, v V)
Chng minh: Ta chng minh (f+f') tho mn 3 tnh cht ca lung.
Vi u, v V. V f'[u, v] cf[u, v] = c[u, v] - f[u, v] nn f[u, v] + f'[u, v] c[u, v]. Tnh
cht 1 c tho mn
Vi u, v V. (f+f')[u, v] = f[u, v] + f'[u, v] = -f[v, u] - f'[v, u] = -(f+f')[v, u]. Tnh cht 2
tho mn
Vi u V\{s, t}.
vV
vV
vV
vV
3 c tho mn.
V gi tr lung. Ta c
f + f ' = (f + f ')[s,v] = f[s,v]+f'[s,v]= f[s,v] + f'[s,v] = f + f '
vV
vV
vV
vV
nh l c chng minh.
L Minh Hong
262
Chuyn
5:6
5:5
4
6:6
1:3
6
0:3
6
1
2
6
1
1:6
2:5
5
3
5
1
1:1
Mng G v lung f
f P [u,v]= - P , if (v, u) P
0, otherwise
2
6
6
0
2
3
5
1
4
6
6
2
4
3
5
1
HSPHN 1999-2004
L thuyt th
263
10.3.1. Lt ct
Ta gi mt lt ct (X, Y) l mt cch phn hoch tp nh V thnh 2 tp khc rng ri nhau X
v Y. Lt ct tho mn s X v t Y gi l lt ct s-t. Kh nng thng qua ca lt ct (X, Y)
c nh ngha bi c(X, Y) =
uX,vY
f (X, Y) =
f[u,v] .
uX,vY
nh l 7: Cho mng G v lung f, khi lung thng qua lt ct s-t bt k bng |f|.
Chng minh: Vi (X, Y) l mt lt ct s-t bt k,
(nh l 2)
= f(X, V) - f(X, X)
(V\Y = X)
= f(X, V)
(nh l 2)
= |f|
nh l 8: Cho mng G v lung f, v (X, Y) l mt lt ct s-t, khi lung thng qua lt ct
(X, Y) khng vt qu kh nng thng qua ca lt ct (X, Y): f(X, Y) c(X, Y).
Chng minh: f (X, Y) =
uX,yV
f[u,v]
c[u,v] = c(X, Y)
uX,yV
264
Chuyn
10.3.2. Ci t
Ta s ci t thut ton Ford-Fulkerson vi Input v Output nh sau
Input: file vn bn MAXFLOW.INP. Trong :
Dng 1: Cha s nh n ( 100), s cnh m ca th, nh pht s, nh thu t 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 107)
Output: file vn bn MAXFLOW.OUT, ghi lung trn cc cung v gi tr lung cc i tm
c
6
3
5
3
6
5
MAXFLOW.INP
6816
125
135
246
253
343
351
466
566
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
HSPHN 1999-2004
L thuyt th
265
c[1..n, 1..n]: Ma trn biu din kh nng thng qua ca cc cung trn mng
f^[1..n, 1..n]: Ma trn biu din lung trn cc cung
Trace[1..n]: Dng lu vt ng tng lung, thut ton tm ng tng lung s s
dng l thut ton tm kim theo chiu rng (BFS)
Ta c th kim tra (u, v) c phi l cung trn mng thng d Gf khng bng ng thc: c[u,
v] > f^[u, v]. Nu (u, v) l cung trn Gf th kh nng thng qua ca n l c[u, v] - f^[u, v].
P_4_10_1.PAS * Thut ton Ford-Fulkerson
program Max_Flow_by_Ford_Fulkerson;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 100;
type
TCapacities = array[1..max, 1..max] of LongInt;
var
c: TCapacities;
f: ^TCapacities;
Trace: array[1..max] of Integer;
n, s, t: Integer;
procedure Enter; {Nhp d liu}
var
m, i, u, v: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(c, SizeOf(c), 0);
ReadLn(fi, n, m, s, t);
for i := 1 to m do
ReadLn(fi, u, v, c[u, v]);
Close(fi);
end;
function FindPath: Boolean; {Tm ng tng lung trn Gf, tr v True tm thy}
var
u, v: Integer;
Queue: array[1..max] of Integer; {Hng i dng cho BFS}
Front, Rear: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0);
Front := 1; Rear := 1;
Queue[1] := s;
Trace[s] := n + 1; {Trace[v] = 0 v cha thm}
repeat
u := Queue[Front]; Inc(Front); {Ly u khi Queue}
for v := 1 to n do
if (Trace[v] = 0) and (c[u, v] > f^[u, v]) then {Xt v cha thm k u trn Gf}
begin
Trace[v] := u;
if v = t then {n c t th thut ton dng}
begin
FindPath := True; Exit;
end;
Inc(Rear); Queue[Rear] := v; {y v vo Queue}
end;
until Front > Rear;
FindPath := False;
end;
L Minh Hong
266
Chuyn
nh l 10: (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.
Chng minh: 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.
HSPHN 1999-2004
L thuyt th
267
nh l 11: ( phc tp tnh ton): Edmonds v Karp chng minh rng nu dng thut ton
BFS tm ng tng lung trn mng c biu din theo kiu danh sch k th c th ci
t thut ton Ford-Fulkerson bng gii thut c phc tp O(nm2). Tuy nhin nu kh
nng thng qua trn cc cung ca mng l s nguyn th c mt cch nh gi khc da trn
gi tr lung cc i: phc tp tnh ton ca thut ton Ford-Fulkerson l O(|f*|.m) vi |f*|
l gi tr lung cc i trn mng.
10.4.1. Preflow
Cho mt mng G = (V, E). Ta gi mt preflow l mt php gn cho mi cung (u, v) E mt
s thc f[u, v] tho mn 3 tnh cht:
Tnh cht 1 (Capacity constraint): preflow trn mi cng khng c vt qu kh nng
thng qua ca cung : f[u, v] c[u, v] (u, v V) .
Tnh cht 2 (Skew symmetry): preflow trn cung (u, v) v preflow trn cung (v, u) c cng
gi tr tuyt i nhng tri du nhau: f[u, v] = f[v, u]
Tnh cht 3: Tng lung trn cc cung i vo mi nh v V\{s} l s khng m:
f[u,v] 0
uV
268
Chuyn
L thuyt th
269
Init;
while <Cn nh b qu ti u> do
if <v V c th thc hin thao tc Push(u, v)> then
Push(u, v)
else
Lift(u);
<Output f>
L Minh Hong
270
Chuyn
Chng minh: C th chng minh thut ton Preflow-Push dng trong thi gian O(n2m). Nu
thut ton dng th khng cn nh no b qu ti, ta c f l lung. Theo nh l 14, khng cn
ng i t s ti t trn Gf. p dng nh l 9, ta c f l lung cc i trn mng.
C th a vo mt s ci tin, chng hn t chc danh sch cc nh qu ti theo dng Queue,
sau vi mi thao tc, thut ton y thm nhng nh qu ti mi pht hin trong mi thao
tc Push vo ch trong Queue khng tn thi gian tm nh qu ti. Thut ton tin hnh
theo cch ny c phc tp tnh ton O(n3).
10.4.6. Ci t
Chng trnh ci t thut ton Preflow-push c Input v Output ging chng trnh ci t
thut ton Ford-Fulkerson.
Cc nh qu ti s c lu trong mt cu trc d liu Queue dng danh sch vng (xem
PHN 2, 5, 5.2.2). Mng Boolean InQueue[1..n], trong InQueue[u] cho bit nh u c
mt trong Queue cha. Hm Discharge(u) c thc hin vi mt nh u b qu ti, hm ny
s c gng chuyn ti t u sang nhng nh v k vi u trn Gf qua thao tc Push. Nu gim ti
c cho u th hm tr v True, ngc li hm tr v False bo cho chng trnh bit phi
thc hin thao tc Lift(u).
P_4_10_2.PAS * Thut ton Preflow-push
program MaximumFlowByPreFlowPush;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 100;
type
TCapacities = array[1..max, 1..max] of LongInt;
var
c: TCapacities;
f: ^TCapacities;
FlowIn: array[1..max] of LongInt;
h: array[1..max] of Integer;
Queue: array[0..max - 1] of Integer;
InQueue: array[1..max] of Boolean;
n, s, t, Front, Rear: Integer;
procedure Enter; {Nhp d liu}
var
m, i, u, v: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(c, SizeOf(c), 0);
ReadLn(fi, n, m, s, t);
for i := 1 to m do
ReadLn(fi, u, v, c[u, v]);
Close(fi);
end;
function OverFlow(u: Integer): Boolean; {OverFlow[u] u b qu ti}
begin
OverFlow := (u <> s) and (u <> t) and (FlowIn[u] > 0)
end;
procedure Init; {Khi to}
HSPHN 1999-2004
L thuyt th
var
v: Integer;
begin
New(f);
FillChar(f^, SizeOf(f^), 0);
FillChar(InQueue, SizeOf(InQueue), False);
FillChar(h, SizeOf(h), 0); {Khi to hm cao}
h[s] := n;
Rear := n - 1;
for v := 1 to n do {Cho s pht ht cng sut ln cc cung lin thuc (s, v)}
begin
f^[s, v] := c[s, v];
f^[v, s] := -c[s, v];
FlowIn[v] := c[s, v];
if OverFlow(v) then {Nu v b qu ti th a v vo Queue}
begin
Rear := (Rear + 1) mod n;
Queue[Rear] := v;
InQueue[v] := True;
end;
end;
Front := 0;
end;
procedure PushToQueue(u: Integer); {y mt nh qu ti u vo Queue}
begin
if not InQueue[u] then
begin
Rear := (Rear + 1) mod n;
Queue[Rear] := u;
InQueue[u] := True;
end;
end;
function PopFromQueue: Integer; {Ly mt nh qu ti ra khi Queue, tr v trong kt qu hm}
var
u: Integer;
begin
u := Queue[Front];
Front := (Front + 1) mod n;
InQueue[u] := False;
PopFromQueue := u;
end;
function Discharge(u: Integer): Boolean; {Hm Discharge c gng gim ti cho nh qu ti u}
var
v: Integer;
Delta: LongInt;
Pushed: Boolean;
begin
Pushed := False;
for v := 1 to n do
if (c[u, v] > f^[u, v]) and (h[u] > h[v]) then {iu kin thc hin Push(u, v)}
begin
{Thc hin thao tc Push(u, v)}
Delta := c[u, v] - f^[u, v];
if FlowIn[u] < Delta then Delta := FlowIn[u];
f^[u, v] := f^[u, v] + Delta;
f^[v, u] := f^[v, u] - Delta;
FlowIn[u] := FlowIn[u] - Delta;
FlowIn[v] := FlowIn[v] + Delta;
if OverFlow(v) then PushToQueue(v); {Thao tc Push(u, v) c th sinh ra nh qu ti mi v}
Pushed := True; {t c bo u c gim ti}
L Minh Hong
271
272
Chuyn
end;
Discharge := Pushed;
end;
function Lift(u: Integer): Boolean; {Thao tc Lift}
var
v, MinH: Integer;
begin
MinH := MaxInt;
for v := 1 to n do
if (c[u, v] > f^[u, v]) and (h[v] < MinH) then
MinH := h[v];
h[u] := MinH + 1;
end;
procedure Preflowpush; {Thut ton Preflow-push}
var
u: Integer;
begin
while Front <> (Rear + 1) mod n do
begin
u := PopFromQueue;
if not Discharge(u) then Lift(u);
if FlowIn[u] > 0 then PushToQueue(u); {Nu Discharge(u) khng chuyn ti c ht cho u th u vn qu ti}
end;
end;
procedure PrintResult; {In kt qu}
var
u, v: Integer;
m: LongInt;
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
m := 0;
for u := 1 to n do
for v := 1 to n do
if f^[u, v] > 0 then
begin
WriteLn(fo, 'f[', u, ', ', v, '] = ', f^[u, v]);
if u = s then m := m + f^[s, v];
end;
WriteLn(fo, 'Max Flow: ', m);
Close(fo);
end;
begin
Enter;
Init;
Preflowpush;
PrintResult;
Dispose(f);
end.
HSPHN 1999-2004
L thuyt th
273
10.5. MT S M RNG
Sau khi hiu cn k hai nh ngha v lung dng v lung (mc 10.1), di y ta s s
dng nh ngha 1 v lung cho d trnh by cc khi nim.
s1
t1
+
+
+
s
a
s21
at21
+
t
+
sp
tq
f[u, v] d[v] .
uV
Nu ta thay mi nh v trn th bng hai nh vin, vout v mt cung (vin, vout) c kh nng
thng qua l d[v], sau thay mi cung i vo v thnh cung i vo vin v thay mi cung i ra
t v bng cung i ra t vout (Hnh 82) th bi ton tm lung cc i trn mng G c th gii
quyt bng cch tm lung cc i trn mng gi ny v gn lung trn mi cung (u, v) trn
mng ban u bng gi tr lung trn cung (uout, vin) trn mng gi.
L Minh Hong
274
Chuyn
in
out
10.5.3. Mng vi rng buc lung thng qua ca cc cung b chn c trn v di
Xt mng G trong mi cung (u, v) ngoi kh nng thng qua c[u, v] cn c gn mt s
khng m d[u, v] l cn di ca lung. Bi ton t ra l c tn ti lung tng thch trn G
hay khng. (Lung tng thch trn G l mt php gn cho mi cung (u, v) mt gi tr f[u, v]
tha mn: d[u, v] f[u, v] c[u, v] ).
a vo mng G mt nh pht gi s' v mt nh thu gi t', xy dng mt mng gi G theo
quy tc: vi mi cung (u, v) trn G s tng ng vi 3 cung trn G: cung (s', v) v (u, t') vi
kh nng thng qua l d[u, v], cung (u, v) vi kh nng thng qua l c[u, v] - d[u, v]. Ngoi ra
thm vo mt cung (t, s) trn G vi kh nng thng qua + (Hnh 83).
+
c[u,v]-d[u,v]
t
d[u,v]
d[u,v]
t
Hnh 83: Mng gi ca mng c kh nng thng qua ca cc cung b chn hai pha
d[u, v] .
( u , v )E
( u , v )E
Bi 1
Cho mt th gm n nh v m cnh v 2 nh A, B. Hy tm cch b i mt s t nht cc
cnh khng cn ng i t A ti B.
HSPHN 1999-2004
L thuyt th
275
L Minh Hong
276
Chuyn
Hy tm ph ng gm t ng i nht (Pmin).
Hng dn:
Gi s V = {1, , n}. Xy dng th G'=(V', E'), trong :
V' = {x0, x1, , xn} {y0, y1, , yn}
E' = {(x0, xi)|i V} {(yj, y0)|j V} {(xi, yj)|(i, j) E}
Tm lung nguyn cc i trn mng G' vi nh pht x0, nh thu y0 v tt c kh nng thng
qua ca cc cung c gn bng 1. Mi cung (xi, yj) trn G' c lung i qua s tng ng vi
mt cung (i, j) ca G c chn vo mt ng i no trong P. Cui cng, nhng nh no
ca G cha thuc P s c a nt vo P vi t cch l ng i di 0.
y1
x2
y2
x3
y3
y0
x0
x1
x4
y4
x5
y5
x6
y6
HSPHN 1999-2004
L thuyt th
277
278
Chuyn
w(v)
HSPHN 1999-2004
L thuyt th
279
nh l 19: Bi ton tm lt ct tng qut hp nht trn th c th gii quyt bng thut ton
c phc tp O(n(m+n)lgn), vi n v m ln lt l s cnh v s nh ca th.
Chng minh: Vi vic p dng k thut gn nhn tng t nh thut ton Prim kt hp vi
vic s dng cu trc Heap chn ra nh gn vi A cht nht, vic xc nh s, t v chn ra
lt ct s-t hp nht c phc tp O((m+n)lgn). Sau khi ghi nhn lt ct s-t hp nht ny, ta
chp s v t li thnh mt nh st v lp li vi th G/{s, t}. Tng cng c n - 2 ln lp, t
suy ra kt qu.
y l mt bi ton hay, vic chng minh tnh ng n ca thut ton phi da trn l thuyt
v lung cc i v lt ct s-t hp nht, nhng lp trnh gii bi ton lt ct tng qut hp
nht th khng cn ng chm g n cc thut ton tm lung cc i c.
L Minh Hong
280
Chuyn
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 (X Y ) or X v Y l ti i - khng b sung c na;
if X Y 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
HSPHN 1999-2004
L thuyt th
281
282
Chuyn
11.4. CI T
11.4.1. Biu din th hai pha
Gi s th hai pha G = (X Y, 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].
HSPHN 1999-2004
L thuyt th
283
11.4.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 y[j] Y ghp, da vo s kin: t y[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 y[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, ghi b ghp cc i tm c
1
1
2
2
3
3
4
4
MATCH.INP
45
11
14
21
22
24
32
33
42
43
MATCH.OUT
Match:
1) x[1] 2) x[2] 3) x[3] 4) x[4] -
y[1]
y[4]
y[3]
y[2]
5
X
284
Chuyn
i, j: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
FillChar(a, SizeOf(a), False);
ReadLn(f, m, n);
while not SeekEof(f) do
begin
ReadLn(f, i, j);
a[i, j] := True;
end;
Close(f);
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, Front, Rear: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[j] = X_nh lin trc y[j] trn ng m}
Rear := 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(Rear);
Queue[Rear] := i;
end;
{Thut ton tm kim theo chiu rng}
Front := 1;
while Front <= Rear do
begin
i := Queue[Front]; Inc(Front); {Ly mt X_nh ra khi Queue (x[i])}
for j := 1 to n do {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(Rear); {y lun matchY[j] vo hng i}
Queue[Rear] := matchY[j];
end;
end;
FindAugmentingPath := 0; { trn khng Exit c tc l khng cn ng m}
end;
{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];
HSPHN 1999-2004
L thuyt th
285
matchX[x] := f;
matchY[f] := x;
f := next;
until f = 0;
end;
procedure Solve; {Thut ton ng m}
var
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;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Match: ');
Count := 0;
for i := 1 to m do
if matchX[i] <> 0 then
begin
Inc(Count);
WriteLn(f, Count, ') x[', i, '] - y[', matchX[i], ']');
end;
Close(f);
end;
begin
Enter;
Init;
Solve;
PrintResult;
end.
L Minh Hong
286
Chuyn
L thuyt th
287
L Minh Hong
288
Chuyn
L thuyt th
289
-1
-1
0 0 0
0
1
7
0 8 9
1 0 0
0
0
6
0 7 8
x[1]-y[3]
x[2]-y[2]
x[3]-y[1]
+1
Hnh 87: Php xoay trng s cnh
290
Chuyn
L thuyt th
291
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;
Output: M l b ghp cn tm;
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.
1
x* = x1, tm thy ng m
x1 y1
Tng cp
2
3
2
1
2
3
x* = x2, tm thy ng m
x2 y1 x1 y2
Tng cp
2
1
2
3
-1
-1
1=
3
2
3
2
2
L Minh Hong
x* = x3, tm thy ng m
y3 y3
Tng cp
+1
2
0
2
3
292
Chuyn
-2
-2
1 +2
2 +2
2=
3 +2
-2 3
-2
2
0
x* = x4, Tm thy ng m
x4y3x3y2x1y1x2y4.
Tng cp
Xong
L thuyt th
293
Fx[1] = 2
Fx[2] = 2
Fx[3] = 3
Fx[4] = 3
Fy[1] = -2
Fy[2] = -2
Fy[3] = -3
Fy[4] = 0
294
Chuyn
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.
12.3.4. Ci t
a) Biu din b ghp
biu din b ghp, ta s dng hai mng: matchX[1..k] v matchY[1..k].
matchX[i] l ch s ca nh thuc tp Y ghp vi nh x[i]
matchY[j] l ch s ca 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:
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
Suy ra:
Thm mt cnh (x[i], y[j]) vo b ghp t matchX[i] := j v matchY[j] := i;
Loi mt cnh (x[i], y[j]) khi b ghp 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 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[j]
Y ghp, da vo s kin: t y[j] ch c th ti c matchY[j] theo duy nht mt 0_cnh
nh hng, nn ta c th nh du thm y[j], thm lun c matchY[j], v y vo Queue
phn t matchY[j] X.
Input: 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).
Output: file vn bn ASSIGN.OUT, m t php phn cng ti u tm c.
HSPHN 1999-2004
L thuyt th
295
2
2
3
6
ASSIGN.INP
56
110
120
210
242
321
330
430
449
5 4 19
ASSIGN.OUT
Optimal assignment:
1) x[1] - y[1] 0
2) x[2] - y[4] 2
3) x[3] - y[2] 1
4) x[4] - y[3] 0
Cost: 3
19
5
X
5
Y
296
Chuyn
Queue[1] := start;
Front := 1; Rear := 1;
repeat
i := Queue[Front]; Inc(Front); {Ly i ra khi Queue, xt x[i]}
for j := 1 to k do
if (Trace[j] = 0) and (GetC(i, j) = 0) then {Ny y[j] cha thm v k vi x[i] qua 0_cnh}
begin
Trace[j] := i; {Lu vt ng i}
if matchY[j] = 0 then {Nu y[j] ghp th ghi nhn v thot ngay}
begin
finish := j;
Exit;
end;
Inc(Rear); Queue[Rear] := matchY[j]; {Khng th y matchY[j] vo Queue, ch duyt tip}
end;
until Front > Rear;
end;
procedure SubX_AddY; {Php xoay trng s cnh}
var
i, j, t, Delta: Integer;
VisitedX, VisitedY: set of Byte;
begin
{Trc ht tm hai tp VisitedX v VisitedY cha ch s cc nh n c t x[start] qua mt ng pha}
VisitedX := [start];
VisitedY := [];
for j := 1 to k do
if Trace[j] <> 0 then
begin
Include(VisitedX, matchY[j]);
Include(VisitedY, j);
end;
{Tnh Delta := min(GetC(i, j)|i VisitedX v j 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}
for t := 1 to k do
begin
if t in VisitedX then Fx[t] := Fx[t] + Delta;
if t in VisitedY then Fy[t] := Fy[t] - Delta;
end;
end;
procedure Enlarge; {Ni rng b ghp bng ng m kt thc ti y[finish]}
var
i, next: Integer;
begin
repeat
i := Trace[finish];
next := matchX[i];
matchX[i] := finish;
matchY[finish] := i;
finish := Next;
until finish = 0; {finish = 0 i = start}
end;
procedure Solve; {Thut ton Hungari}
var
i: Integer;
HSPHN 1999-2004
L thuyt th
297
begin
for i := 1 to k do
begin
start := i; finish := 0;
repeat {Tm cch ghp x[start]}
FindAugmentingPath;
if finish = 0 then SubX_AddY; {Nu khng tm ra ng m xut pht t x[start] th xoay cc trng s cnh}
until finish <> 0;
Enlarge; {Khi tm ra ng m th ch cn tng cp theo ng m}
end;
end;
procedure Result; {In kt qu}
var
i, j, Count, W: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Optimal assignment:');
W := 0; Count := 0;
for i := 1 to m do
begin
j := matchX[i];
if c[i, j] < maxC then {Ch in quan tm ti nhng cnh trng s < maxC}
begin
Inc(Count);
WriteLn(f, Count:3, ') x[', i, '] - y[', j, '] ', c[i, j]);
W := W + c[i, j];
end;
end;
WriteLn(f, 'Cost: ', W);
Close(f);
end;
begin
Enter;
Init;
Solve;
Result;
end.
Nhn xt:
C th gii quyt bi ton phn cng nu nh ma trn chi ph C c phn t m bng cch
sa li mt cht trong th tc khi to (Init): Vi i, thay v gn Fx[i] := 0, ta gn Fx[i] :=
gi tr nh nht trn hng i ca ma trn C, khi s m bo c[i, j] - Fx[i] - Fy[j] 0 (i, j).
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[.], cc gi tr ny c th ln hn rt nhiu ln so vi gi tr ln nht ca cc c[i, j]. Hy
t tm v d gii thch ti sao.
298
Chuyn
12.5. NNG CP
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:
Thut ton tm kim theo chiu rng c s dng tm ng m c phc tp O(k2),
mi ln xoay trng s cnh mt mt chi ph thi gian c O(k2). Vy mi ln tng cp, cn ti
a k ln d ng v k ln xoay trng s cnh, mt mt chi ph thi gian c O(k3). Thut ton
cn k ln tng cp nn phc tp tnh ton trn l thuyt ca phng php ny c O(k4).
HSPHN 1999-2004
L thuyt th
299
12.5.1. 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 (Hnh 89):
-
X
Y
X
Y
X
Y
X
Y
Tm thy ng m
12.5.2. 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 y[j]Y, gi d[j] := khong cch t y[j] n cy pha gc x*. Ban u d[j] c khi
to bng trng s cnh (x*, y[j]) (cy pha ban u ch c ng mt nh x*).
Trong bc tm ng bng BFS, mi ln rt mt nh x[i] ra khi Queue, ta xt nhng nh
y[j]Y cha thm v t li d[j]mi := min(d[j]c, trng s cnh (x[i], y[j])) sau mi kim
tra xem (x[i], y[j]) 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[j]
dng. Ta bt c mt on chng trnh tm gi tr xoay c phc tp O(k2). Cng vic
ti mi bc xoay ch l tm gi tr nh nht trong cc d[j] 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 xoay cho ti khi tm ra ng m c
O(k2). 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 sau mi bc xoay, ta phi tr tt c cc d[j] > 0 i
gi c tnh hp l ca cc d[j].
L Minh Hong
300
Chuyn
12.5.3. 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 dng cy pha li t u (BFS li
bt u t x*).
Khi khng tm thy ng m, bc xoay trng s cnh s c thc hin. Sau khi xoay, ta
s thm lun nhng nh y[j]Y cha thm to vi mt X_nh thm mt 0_cnh (nhng
y[j] cha thm c d[j] = 0), nu tm thy ng m th dng ngay, nu khng thy th y tip
nhng nh matchY[j] 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 cn l O(k2).
12.5.4. 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 phc tp tnh ton O(k3) bi n cn k ln tng cp v chi ph cho mi ln l O(k2).
P_4_12_2.PAS * Ci t phng php Kuhn-Munkres O(k3)
program AssignmentProblemSolve;
const
InputFile = 'ASSIGN.INP';
OutputFile = 'ASSIGN.OUT';
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;
Front, Rear: Integer;
start, finish: Integer;
m, n, k: Integer;
procedure Enter; {Nhp d liu}
var
i, j: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, 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(f) do ReadLn(f, i, j, c[i, j]);
Close(f);
end;
procedure Init; {Khi to}
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
FillChar(Fx, SizeOf(Fx), 0);
FillChar(Fy, SizeOf(Fy), 0);
end;
HSPHN 1999-2004
L thuyt th
function GetC(i, j: Integer): Integer; {Hm tr v trng s cnh (x[i], y[j])}
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure InitBFS; {Th tc c gi trc khi bt u dng mt cy pha}
var
j: Integer;
begin
Front := 1; Rear := 1;
Queue[1] := start;
FillChar(Trace, SizeOf(Trace), 0);
for j := 1 to k do
begin
d[j] := GetC(start, j); {d[j]: Khong cch gn nht t mt X_nh trong cy pha n y[j]}
arg[j] := start; {arg[j]: X_nh ni vi y[j] to ra khong cch gn nht }
end;
finish := 0;
end;
procedure Push(v: Integer);
begin
Inc(Rear); Queue[Rear] := v;
end;
function Pop: Integer;
begin
Pop := Queue[Front]; Inc(Front);
end;
procedure FindAugmentingPath; {Tm ng m xut pht t x[start]}
var
i, j, w: Integer;
begin
repeat
i := Pop; {Ly i khi Queue, xt x[i]}
for j := 1 to k do
if Trace[j] = 0 then {Nu y[j] cha thm}
begin
w := GetC(i, j); {Tnh trng s cnh (x[i], y[j])}
if w = 0 then {Nu cnh (x[i], y[j]) l 0_cnh}
begin
Trace[j] := i;
if matchY[j] = 0 then
begin
finish := j;
Exit;
end;
Push(matchY[j]);
end;
if d[j] > w then {Cp nht li d[j] theo cy pha ni rng hn nh x[i]}
begin
d[j] := w;
arg[j] := i;
end;
end;
until Front > Rear;
end;
procedure SubX_AddY; {Php xoay trng s cnh}
var
Delta: Integer;
i, j: Integer;
L Minh Hong
301
302
Chuyn
begin
{Trc ht tnh Delta := Gi tr nh nht trong s cc d[j] m y[j] cha thm}
Delta := maxC;
for j := 1 to k do
if (Trace[j] = 0) and (d[j] < Delta) then Delta := d[j];
{Xoay}
Fx[start] := Fx[start] + Delta;
for j := 1 to k do
if Trace[j] <> 0 then
begin
i := matchY[j];
Fy[j] := Fy[j] - Delta;
Fx[i] := Fx[i] + Delta;
end
else
d[j] := d[j] - Delta;
for j := 1 to k do
if (Trace[j] = 0) and (d[j] = 0) then {Xt nhng y[j] ni vi cy pha qua mt 0_cnh mi pht sinh}
begin
Trace[j] := arg[j];
if matchY[j] = 0 then {y[j] cha ghp tm thy ng m kt thc y[j]}
begin
finish := j;
Exit;
end;
Push(matchY[j]); {y[j] ghp, y matchY[j] vo Queue ch duyt tip}
end;
end;
procedure Enlarge; {Ni rng b ghp bi ng m kt thc y[finish]}
var
i, next: Integer;
begin
repeat
i := Trace[finish];
next := matchX[i];
matchX[i] := finish;
matchY[finish] := i;
finish := Next;
until finish = 0; {finish = 0 i = start}
end;
procedure Solve; {Th ghp ln lt cc nh t x[1] ti x[k]}
var
i: Integer;
begin
for i := 1 to k do
begin
start := i; {Tm cch ghp x[start]}
InitBFS;
repeat
FindAugmentingPath;
if finish = 0 then SubX_AddY;
until finish <> 0;
Enlarge;
end;
end;
procedure Result; {In kt qu}
var
i, j, Count, W: Integer;
f: Text;
begin
HSPHN 1999-2004
L thuyt th
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Optimal assignment:');
W := 0; Count := 0;
for i := 1 to m do
begin
j := matchX[i];
if c[i, j] < maxC then
begin
Inc(Count);
WriteLn(f, Count:3, ') x[', i, '] - y[', j, '] ', c[i, j]);
W := W + c[i, j];
end;
end;
WriteLn(f, 'Cost: ', W);
Close(f);
end;
begin
Enter;
Init;
Solve;
Result;
end.
L Minh Hong
303
304
Chuyn
9
7
HSPHN 1999-2004
L thuyt th
305
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" (gi tt l nh nht), nhng
nh c th n c t x bng mt ng pha kt thc l cnh m c gn nhn "m"
(gi tt l nh 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. C th kim chng c nhn xt: sau mi php chp, cc cnh m vn c
m bo l b ghp trn th mi:
L Minh Hong
306
Chuyn
Shrink
Shrink
Blossom
Blossom
= nh c s ca blossom
= nh chp t blossom
Expand
Expand
HSPHN 1999-2004
L thuyt th
307
308
Chuyn
Nu:
v l nh cha ghp Tm thy ng m kt thc v, dng
v l nh ghp thm v thm lun match[v] v y match[v] vo Queue.
Lu vt: Cp nht 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 = i[1], i[2], , i[p] = u) v (a = j[1], j[2], , j[q] = v) ln lt l
hai ng pha dn t a ti u v v. Khi (a = i[1], i[2], , i[p] = u, j[q] = v, j[q1], , j[1] = 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[i[1]], b[i[2]], , b[i[p]], b[j[1]],
b[j[2]], , b[j[q]]}, 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.
Bc 3:
Nu bc 2 tm ra ng m th tr v ng m, nu bc 2 khng tm thy ng m
v thot ra do hng i rng th kt lun khng tm thy ng m.
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
3
4
u
S:2
T:3
T:1
2
T:1
Tm thy ng m
Trng hp 2: v cha thm v ghp
HSPHN 1999-2004
L thuyt th
309
S:2
3
S:2
T:3
S:4
T:1
T:1
T:7
S:4
u
x
T:1
S:2
6
T:3
S:7
T:5
S:6
b[.] = 3
S:4
5
T:3
S:5
T:7
S:4
a
x
T:1
S:2
T:3
S:6
T:1
S:2
T:3
S:7
T:5
S:6
13.4. CI T
Ta s ci t phng php Lawler vi khun dng Input/Output nh sau:
Input: file vn bn GMATCH.INP
L Minh Hong
310
Chuyn
10
GMATCH.INP
10 11
12
16
24
28
34
36
56
59
5 10
78
79
GMATCH.OUT
1) 1 6
2) 2 8
3) 3 4
4) 5 10
5) 7 9
L thuyt th
311
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; {Khi to b ghp rng}
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}
Front := 1; Rear := 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 c khi to 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); {y mt nh m v vo hng i}
begin
Inc(Rear);
Queue[Rear] := v;
InQueue[v] := True;
end;
function Pop: Integer; {Ly mt nh m khi hng i, tr v trong kt qu hm}
begin
Pop := Queue[Front];
Inc(Front);
end;
{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht ni 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}
L Minh Hong
312
Chuyn
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); {Tt c cc nhn b[v] c khi to l cha b nh du}
NewBase := FindCommonAncestor(p, q); {xc nh nt c s}
ResetTrace(p); ResetTrace(q); {Gn li nhn}
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
{Chp blossom gn li cc nhn b[i] cho nh 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 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; {Rt mt nh m u ra khi hng i}
{Xt nhng nh v k u qua mt cnh nht m v khng nm cng blossom vi u}
for v := 1 to n do
if (a[u, v]) and (match[u] <> v) and (b[u] <> b[v]) then
if (v = start) or (match[v] <> 0) and (T[match[v]] <> 0) then {Nu v l nh m}
BlossomShrink(u, v) {th gn li vt, chp blossom...}
else
if T[v] = 0 then {Nu v l nh nht cha thm ti}
if match[v] = 0 then {Nu v cha ghp ngha tm c ng m kt thc v, thot}
begin
T[v] := u;
finish := v;
Exit;
end
else {Nu v ghp th ghi vt ng i, thm v, thm lun c match[v] v y match[v] vo Queue}
begin
T[v] := u;
Push(match[v]);
end;
HSPHN 1999-2004
L thuyt th
313
L Minh Hong
314
Chuyn
Cho n nay, phng php tt nht gii bi ton tm b ghp tng qut trn th c
bit n l ca Micali v Vazizani (1980), n c phc tp tnh ton l O( n.m) . Bn c
th tham kho trong cc ti liu khc.
HSPHN 1999-2004
TI LIU C THM
Di y l hai cun sch c th ni l kinh in m hu ht cc ti liu v thut ton u
trch dn t nhiu t hai cun sch ny. Cc bn nn tm mi cch c.
Title: The Art of Computer Programming
Author: Donald E. Knuth
Volume 1: Fundamental Algorithms
Volume 2: Seminumerical Algorithms
Volume 3: Sorting and Searching
Volume 4: Combinatorial Algorithms (in preparation)
Volume 5: Syntactic Algorithms (in preparation)
Title: Introduction to Algorithms
Authors: Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest