Professional Documents
Culture Documents
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) .................................................................................................................. 88
8.1. BI TON SP XP................................................................................................................................88
8.2. THUT TON SP XP KIU CHN (SELECTIONSORT) ...............................................................90
8.3. THUT TON SP XP NI BT (BUBBLESORT)...........................................................................91
8.4. THUT TON SP XP KIU CHN (INSERTIONSORT) ................................................................91
8.5. SP XP CHN VI DI BC GIM DN (SHELLSORT) .....................................................93
8.6. THUT TON SP XP KIU PHN ON (QUICKSORT) ............................................................94
8.7. THUT TON SP XP KIU VUN NG (HEAPSORT) ..............................................................101
8.8. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)......................................104
8.9. TNH N NH CA THUT TON SP XP (STABILITY) .........................................................105
8.10. THUT TON SP XP BNG C S (RADIX SORT) .................................................................106
8.11. THUT TON SP XP TRN (MERGESORT)..............................................................................111
8.12. CI T ...............................................................................................................................................114
8.13. NH GI, NHN XT......................................................................................................................122
iii
9.5. PHP BM (HASH)............................................................................................................................... 132
9.6. KHO S VI BI TON TM KIM ................................................................................................ 132
9.7. CY TM KIM S HC (DIGITAL SEARCH TREE - DST)............................................................ 133
9.8. CY TM KIM C S (RADIX SEARCH TREE - RST) .................................................................. 136
9.9. NHNG NHN XT CUI CNG ...................................................................................................... 141
iv
4.3. TH Y V THUT TON WARSHALL ...........................................................................194
4.4. CC THNH PHN LIN THNG MNH ........................................................................................197
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............................................20
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 ................................................................................................................95
Hnh 30: Trng thi trc khi gi quy ..............................................................................................................96
Hnh 31: Heap......................................................................................................................................................102
Hnh 32: Vun ng ..............................................................................................................................................102
Hnh 33: o gi tr k[1] cho k[n] v xt phn cn li ........................................................................................103
Hnh 34: Vun phn cn li thnh ng ri li o tr k[1] cho k[n-1] .................................................................103
Hnh 35: nh s cc bit .....................................................................................................................................106
Hnh 36: Thut ton sp xp trn.........................................................................................................................111
vii
Hnh 37: My Pentium 4, 3.2GHz, 2GB RAM t ra chm chp khi sp xp 108 kho [0..7.107] cho d nhng
thut ton sp xp tt nht c p dng .............................................................................................. 123
Hnh 38: Cy nh phn tm kim ......................................................................................................................... 128
Hnh 39: Xa nt l cy BST ........................................................................................................................... 129
Hnh 40. Xa nt ch c mt nhnh con trn cy BST ........................................................................................ 130
Hnh 41: Xa nt c c hai nhnh con trn cy BST thay bng nt cc phi ca cy con tri............................ 130
Hnh 42: Xa nt c c hai nhnh con trn cy BST thay bng nt cc tri ca cy con phi............................ 130
Hnh 43: nh s cc bit ..................................................................................................................................... 133
Hnh 44: Cy tm kim s hc............................................................................................................................. 133
Hnh 45: Cy tm kim c s............................................................................................................................... 136
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............... 137
Hnh 47: RST cha cc kho 2, 4, 5, 7 v RST sau khi loi b gi tr 7 ............................................................. 138
Hnh 48: Cy tm kim c s a) v Trie tm kim c s b).................................................................................. 140
Hnh 49: Hm quy tnh s Fibonacci .............................................................................................................. 151
Hnh 50: Tnh ton v truy vt ............................................................................................................................ 154
Hnh 51: Truy vt ................................................................................................................................................ 163
Hnh 52: V d v m hnh th........................................................................................................................ 178
Hnh 53: Phn loi th..................................................................................................................................... 179
Hnh 54................................................................................................................................................................ 182
Hnh 55................................................................................................................................................................ 183
Hnh 56: th v ng i................................................................................................................................ 186
Hnh 57: Cy DFS ............................................................................................................................................... 189
Hnh 58: Cy BFS ............................................................................................................................................... 192
Hnh 59: th G v cc thnh phn lin thng G1, G2, G3 ca n .................................................................. 193
Hnh 60: Khp v cu.......................................................................................................................................... 193
Hnh 61: Lin thng mnh v lin thng yu ...................................................................................................... 194
Hnh 62: th y ........................................................................................................................................ 195
Hnh 63: n th v hng v bao ng ca n............................................................................................. 195
Hnh 64: Ba dng cung ngoi cy DFS ............................................................................................................... 199
Hnh 65: Thut ton Tarjan b cy DFS .......................................................................................................... 201
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)........................................................................................................... 206
Hnh 67: th G v mt s v d cy khung T1, T2, T3 ca n ....................................................................... 210
Hnh 68: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh) ................................ 210
Hnh 69: Php nh chiu DFS............................................................................................................................ 213
Hnh 70: Php nh s v ghi nhn cung ngc ln cao nht ............................................................................. 215
Hnh 71: M hnh th ca bi ton by ci cu ............................................................................................... 219
Hnh 72................................................................................................................................................................ 220
Hnh 73................................................................................................................................................................ 220
Hnh 74................................................................................................................................................................ 226
viii
Hnh 75: Php nh li ch s theo th t tp....................................................................................................241
Hnh 76: Hai cy gc r1 v r2 v cy mi khi hp nht chng .............................................................................252
Hnh 77: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7............................260
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)) ..............................................................................................................................264
Hnh 79: Mng thng d v ng tng lung ....................................................................................................265
Hnh 80: Lung trn mng G trc v sau khi tng.............................................................................................265
Hnh 81: Mng gi ca mng c nhiu im pht v nhiu im thu..................................................................276
Hnh 82: Thay mt nh u bng hai nh uin, uout .................................................................................................277
Hnh 83: Mng gi ca mng c kh nng thng qua ca cc cung b chn hai pha ..........................................277
Hnh 84: th hai pha ......................................................................................................................................283
Hnh 85: th hai pha v b ghp M ...............................................................................................................284
Hnh 86: M hnh lung ca bi ton tm b ghp cc i trn th hai pha...................................................288
Hnh 87: Php xoay trng s cnh .......................................................................................................................292
Hnh 88: Thut ton Hungari ...............................................................................................................................295
Hnh 89: Cy pha mc ln hn sau mi ln xoay trng s cnh v tm ng................................................302
Hnh 90: th G v mt b ghp M ..................................................................................................................307
Hnh 91: Php chp Blossom...............................................................................................................................309
Hnh 92: N Blossom d ng xuyn qua Blossom .....................................................................................309
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 ...................................................................... 18
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............................................................................................................. 114
P_3_01_1.PAS * m s cch phn tch s n..................................................................................................... 145
P_3_01_2.PAS * m s cch phn tch s n..................................................................................................... 146
P_3_01_3.PAS * m s cch phn tch s n..................................................................................................... 146
P_3_01_4.PAS * m s cch phn tch s n..................................................................................................... 147
P_3_01_5.PAS * m s cch phn tch s n dng quy ................................................................................ 147
P_3_01_6.PAS * m s cch phn tch s n dng quy ................................................................................ 148
P_3_03_1.PAS * Tm dy con n iu tng di nht ........................................................................................ 154
P_3_03_2.PAS * Ci tin thut ton tm dy con n iu tng di nht ........................................................... 156
P_3_03_3.PAS * Bi ton ci ti ........................................................................................................................ 159
P_3_03_4.PAS * Bin i xu ............................................................................................................................ 163
P_3_03_5.PAS * Dy con c tng chia ht cho k ............................................................................................... 165
P_3_03_6.PAS * Dy con c tng chia ht cho k ............................................................................................... 167
P_3_03_7.PAS * Nhn ti u dy ma trn.......................................................................................................... 171
P_4_03_1.PAS * Thut ton tm kim theo chiu su ........................................................................................ 187
P_4_03_2.PAS * Thut ton tm kim theo chiu rng ...................................................................................... 190
P_4_04_1.PAS * Thut ton Warshall lit k cc thnh phn lin thng ........................................................... 197
P_4_04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh...................................................... 204
P_4_05_1.PAS * Lit k cc khp v cu ca th .......................................................................................... 216
P_4_06_1.PAS * Thut ton Fleury tm chu trnh Euler..................................................................................... 221
P_4_06_2.PAS * Thut ton hiu qu tm chu trnh Euler.................................................................................. 224
P_4_07_1.PAS * Thut ton quay lui lit k chu trnh Hamilton ....................................................................... 227
P_4_08_1.PAS * Thut ton Ford-Bellman ........................................................................................................ 234
P_4_08_2.PAS * Thut ton Dijkstra.................................................................................................................. 236
P_4_08_3.PAS * Thut ton Dijkstra v cu trc Heap...................................................................................... 239
x
P_4_08_4.PAS * ng i ngn nht trn th khng c chu trnh.................................................................242
P_4_08_5.PAS * Thut ton Floyd .....................................................................................................................245
P_4_09_1.PAS * Thut ton Kruskal ..................................................................................................................253
P_4_09_2.PAS * Thut ton Prim.......................................................................................................................257
P_4_10_1.PAS * Thut ton Ford-Fulkerson ......................................................................................................268
P_4_10_2.PAS * Thut ton Preflow-push .........................................................................................................273
P_4_11_1.PAS * Thut ton ng m tm b ghp cc i..............................................................................286
P_4_12_1.PAS * Thut ton Hungari..................................................................................................................298
P_4_12_2.PAS * Ci t phng php Kuhn-Munkres O(k3) ............................................................................303
P_4_13_1.PAS * Phng php Lawler p dng cho thut ton Edmonds ..........................................................313
Pk
n
k
n!
(n k)!
= S t hp chp k ca n phn t =
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
...a
a
aN
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
HSPHN 1999-2004
Bi ton lit k
PERMUTE.OUT
123
132
213
231
312
321
10
Chuyn
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
Assign(f, OutputFile); Rewrite(f);
for i := 1 to n do x[i] := i; {Khi to cu hnh u: x[1] := 1; x[2] := 2; , x[n] := n}
repeat
for i := 1 to n do Write(f, x[i], ' '); {In ra cu hnh hon v hin ti}
WriteLn(f);
i := n - 1;
while (i > 0) and (x[i] > x[i + 1]) do Dec(i);
if i > 0 then {Cha gp phi hon v cui (n, n-1, , 1)}
begin
k := n; {x[k] l phn t cui dy}
while x[k] < x[i] do Dec(k); {Li dn k tm gp x[k] u tin ln hn x[i]}
Swap(x[k], x[i]); {i ch x[k] v x[i]}
a := i + 1; b := n; {Lt ngc on cui gim dn, a: u on, b: cui on}
while a < b do
begin
Swap(x[a], x[b]); {o gi tr x[a] v x[b]}
Inc(a); {Tin a v li b, tip tc cho ti khi a, b chm nhau}
Dec(b);
end;
end;
until i = 0; {Ton dy l dy gim dn - khng sinh tip c - ht cu hnh}
Close(f);
end.
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
HSPHN 1999-2004
Bi ton lit k
11
L Minh Hong
12
Chuyn
Bi ton lit k
13
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
max = 100;
var
x: array[1..max] of Integer;
n: Integer;
f: Text;
procedure PrintResult; {In cu hnh tm c, do th tc tm quy Attempt 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 Attempt(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 Attempt(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);
Attempt(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
L Minh Hong
101
X3=0
110
X3=1
111
Result
14
Chuyn
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Combination;
const
InputFile = 'SUBSET.INP';
OutputFile = 'SUBSET.OUT';
max = 100;
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 Attempt(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 Attempt(i + 1);
end;
end;
begin
Assign(f, InputFile); Reset(F);
ReadLn(f, n, k);
Close(f);
Assign(f, OutputFile); Rewrite(f);
HSPHN 1999-2004
Bi ton lit k
15
x[0] := 0;
Attempt(1);
Close(f);
end.
L Minh Hong
16
Chuyn
ARRANGE.INP
32
ARRANGE.OUT
12
13
21
23
31
32
HSPHN 1999-2004
Bi ton lit k
17
L Minh Hong
18
Chuyn
ANALYSE.INP
6
ANALYSE.OUT
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+1+3
6 = 1+1+2+2
6 = 1+1+4
6 = 1+2+3
6 = 1+5
6 = 2+2+2
6 = 2+4
6 = 3+3
6=6
Bi ton lit k
19
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:
L Minh Hong
20
Chuyn
1
2
3
4
W
E
5
6
S
7
8
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
HSPHN 1999-2004
Bi ton lit k
21
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
begin
for j := 1 to n do
if a[j] and b[i + j] and c[i - j] then {Ch xt nhng ct j m (i, j) cha b khng ch}
begin
x[i] := j; {Th t qun hu i vo ct j}
if i = n then PrintResult
else
begin
a[j] := False; b[i + j] := False; c[i - j] := False; {nh du}
Attempt(i + 1); {Tm cc cch t qun hu th i + 1}
a[j] := True; b[i + j] := True; c[i - j] := True; {B nh du}
end;
end;
end;
begin
Init;
Assign(f, OutputFile); Rewrite(f);
Attempt(1);
Close(f);
end.
Bi ton lit k
23
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;
Attempt(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
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
L Minh Hong
28
Chuyn
Hai on con bt k lin nhau u khc nhau (on con l mt dy k t lin tip ca xu)
C t k t C nht.
Cch gii:
Khng trnh by, ngh t xem chng trnh hiu, ch ch thch k thut nhnh cn nh
sau:
Nu dy 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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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
HSPHN 1999-2004
Bi ton lit k
29
l: Integer;
begin
for l := 1 to i div 2 do {Th cc di l}
if Same(i, l) then {Nu c xu di l kt thc bi X[i] b trng vi xu lin trc}
begin
Check := False; Exit;
end;
Check := True;
end;
{Gi li kt qu va tm c vo BestConfig (MinC v mng Best)}
procedure KeepResult;
begin
MinC := T[N];
Best := X;
end;
{Thut ton quay lui c nhnh cn}
procedure Attempt(i: Integer); {Th cc gi tr c th ca X[i]}
var
j: 'A'..'C';
begin
for j := 'A' to 'C' do {Xt tt c cc gi tr}
begin
X[i] := j;
if Check(i) then {Nu thm gi tr vo khng lm hng tnh khng lp}
begin
if j = 'C' then T[i] := T[i - 1] + 1 {Tnh T[i] qua T[i - 1]}
else T[i] := T[i - 1];
if T[i] + (N - i) div 4 < MinC then {nh gi nhnh cn}
if i = N then KeepResult
else Attempt(i + 1);
end;
end;
end;
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to N do Write(f, Best[i]);
WriteLn(f);
WriteLn(f, '"C" Letter Count : ', MinC);
end;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, N);
Close(f);
Assign(f, OutputFile); Rewrite(f);
T[0] := 0;
MinC := N; {Khi to cu hnh BestConfig ban u rt ti}
Attempt(1);
PrintResult;
Close(f);
end.
30
Chuyn
((()()))
((())())
((()))()
(()(()))
()((()))
HSPHN 1999-2004
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
Nu f (n) = n logb a th T(n) = n logb a lg n
log b a +
ln 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 ,
n lg n ,
( 2)
n
lg n
, n 2 , n! , 3n ,
k ,
k =1
lg n
, 2n ,
k
k =1
47
1 , 2100
lg* n , lg* ( lg n )
ln n ,
k
k =1
( 2)
lg n
n lg n , lg ( n!)
n
n2 ,
k =1
( lg n )
lg n
, n lg( lg n )
2n
3n
n!
Bi 2
Xc nh phc tp tnh ton ca nhng gii thut sau bng k php :
48
Chuyn
for i := 0 to m do
for j := 0 to n do
c[i + j] := c[i + j] + a[i] * b[j];
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
n
1
Hng dn: Dng cng thc xp x ca Stirling: n! = 2n 1 +
e
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) =
2T ( n 2 ) +n, if n>1
Khi T(n) l (nlgn) v T(n) cng l O(n)!!!
Chng minh:
a) T(n) = (nlgn)
Tht vy, hon ton c th chn mt s dng c nh hn 1 v nh T ( n ) c ( n lg n ) vi
n < 3 (chng hn chn c = 0.1). Ta s chng minh T ( n ) c ( n lg n ) cng ng vi n 3
2T ( n 2 ) + n
2c n 2 lg ( n 2 ) + n
HSPHN 1999-2004
49
2c ( n 2 ) lg ( n 2 ) + n
cn lg ( n 2 ) + n
cn lg n cn lg 2 + n
cn lg n + (1 c)n
cn lg n
b) T(n) = O(n)
Tht vy, ta li c th chn mt s dng c ln T ( n ) < cn vi n < 3 . Ta s chng
minh quy np cho trng hp n 3:
T (n)
2T ( n 2 ) + n
2c n 2 + n
c ( n + 1) + n
(= 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:
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program HanoiTower;
const
max = 64;
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: LongWord;
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;
HSPHN 1999-2004
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 trung t (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.
Input: File vn bn CALRPN.INP ch gm 1 dng c khng qu 255 k t, cha cc s
thc v cc ton t {+, -, *, /}. Quy nh khun dng bt buc l hai s lin nhau trong
biu thc RPN phi vit cch nhau t nht mt du cch.
Output: Kt qu biu thc .
CALRPN.INP
10 2/3 + 7 4 -*
CALRPN.OUT
10 2 / 3 + 7 4 - * = 24.0000
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.
P_2_07_1.PAS * Tnh gi tr biu thc RPN
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program CalculateRPNExpression;
const
InputFile = 'CALRPN.INP';
OutputFile = 'CALRPN.OUT';
Opt = ['+', '-', '*', '/'];
var
T, RPN: String;
Stack: array[1..255] of Extended;
L Minh Hong
82
Chuyn
p, Top: Integer;
f: Text;
{Cc thao tc i vi Stack}
procedure StackInit;
begin
Top := 0;
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
Assign(f, InputFile); Reset(f);
Readln(f, RPN);
Close(f);
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
HSPHN 1999-2004
83
X l
Stack
y vo Stack
10
Output: 10
(/
Output: 2
(/
L Minh Hong
Output
10
84
Chuyn
X l
Stack
Output
(+
Output: 3
(+
y vo Stack
*(
Output: 7
*(
*(-
Output: 4
*(-
Ht
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.
Input: File vn bn RPNCONV.INP ch gm 1 dng cha biu thc trung t.
Output: File vn bn RPNCONV.OUT ghi biu thc trung t sau khi hiu chnh v biu
thc RPN tng ng
V d:
RPNCONV.INP
(10/2 + 3)*(7-4)
RPNCONV.OUT
Refined: ( 10 / 2 + 3 ) * ( 7 - 4 )
RPN
: 10 2 / 3 + 7 4 - *
85
86
Chuyn
Refine(Infix);
Writeln(f, 'Refined: ', Infix);
Write(f, 'RPN
: ');
T := '';
for p := 1 to Length(Infix) do {Tch v x l tng phn t c c t biu thc trung t}
if Infix[p] <> ' ' then T := T + Infix[p]
else
begin
Process(T);
T := '';
end;
while Stack <> '' do Write(f, Pop, ' ');
Close(f);
end.
87
A * (B + -C)
A - (B + C)d/e
A and B or C
A and (B or not C)
(A or B) and (C or (D and not E))
(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.
L Minh Hong
88
Chuyn
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
HSPHN 1999-2004
89
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
L Minh Hong
90
Chuyn
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}
HSPHN 1999-2004
91
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.
92
Chuyn
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], ta
c:
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 .
HSPHN 1999-2004
93
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;
Dy con 1:
Dy con 2:
Dy con 3:
2
6
1
3
9
5
94
Chuyn
95
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
L Minh Hong
96
Chuyn
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.
HSPHN 1999-2004
97
Trong trng hp chn cht l kho nm v tr ngu nhin trong on, tht kh c th
tm ra mt b d liu khin cho QuickSort hot ng chm. Nhng ta cng cn hiu rng
vi mi thut ton to s ngu nhin, trong m! dy hon v ca dy (1, 2, m) th no
cng c mt dy lm QuickSort b suy bin, tuy nhin xc sut xy ra dy ny qu nh v
cng rt kh ch ra nn vic s dng cch chn cht l kho nm v tr ngu nhin c
th coi l an ton vi cc trng hp suy bin ca QuickSort.
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 O(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.
L Minh Hong
98
Chuyn
{
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
c chn lun l kho nh nht ca on k[L..H]. Ta vn phi hng ti mt thut ton tt
hn na.
Cch th ba: S b him ca s 5.
Ta s vit mt hm Select(L, H, p) tr v kho s ng th p khi sp xp dy kho k[L..H].
Nu dy ny c t hn 50 kho, thut ton sp xp kiu chn s c p dng trn dy kho
ny v sau gi tr k[L + p - 1] s c tr v trong kt qu hm Select.
Nu dy ny c 50 kho, ta chia cc kho k[L..H] thnh cc nhm 5 kho:
k[L + 0..L + 4], k[L + 5..L + 9], k[L + 10, L + 14]
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]
99
L Minh Hong
100
Chuyn
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:
HSPHN 1999-2004
101
c1 , if n 50
T(n)
n
3n
c 2 n + T 5 + T 4 , otherwise
n
3n
1
1
3
T(n) c 2 n + c + c
c n + c n + c n = cn
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, ta c th coi thi gian
thc hin th tc sp xp l O(nlgn) vi mi tnh trng d liu vo.
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
102
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
103
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
104
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).
105
R rng phc tp ca php m phn phi l O(M + n)). Nhc im ca php m phn
phi l khi tp gi tr kho 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 t, 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:
106
Chuyn
11 =
0
1
(z = 4)
107
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
108
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, WORD, DWORD, QWORD...
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
109
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
110
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
111
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
112
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
113
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
114
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 106 kho v gi tr mi kho l s t nhin khng qu 106.
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 nu mt gi tr s t nhin x biu din bng d + 1 ch s trong
h 256: x = x d ...x1x 0 (256) th xp = x div 256p mod 256 = (x shr (p shl 3) ) and $FF (1 p d).
P_2_08_1.PAS * Cc thut ton sp xp
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program SortingAlgorithmsDemo;
uses crt, dos;
const
InputFile = 'SORT.INP';
OutputFile = 'SORT.OUT';
max = 1000000;
maxV = 1000000;
BitCount = 64;
nMenu = 13;
SMenu: array[1..nMenu] of String =
(
HSPHN 1999-2004
Display Input',
SelectionSort',
BubbleSort',
InsertionSort',
InsertionSort with binary searching',
ShellSort',
QuickSort',
HeapSort',
Distribution Counting',
Radix Exchange Sort',
Straight Radix Sort',
MergeSort',
Exit'
);
type
TArr = array[1..max] of Integer;
TCount = array[0..maxV] of Integer;
var
k, t: TArr;
c: TCount;
n, MinV, SupV: Integer;
selected: Integer;
StTime: Extended;
115
116
Chuyn
i: Integer;
ch: Char;
begin
Writeln('Running Time = ', GetCurrentTime - StTime:1:4, ' (s)');
Assign(f, OutputFile); Rewrite(f);
for i := 1 to n do Writeln(f, k[i]);
Close(f);
Write('Press <P> to print Output, another key to return to menu...');
ch := ReadKey; Writeln(ch);
if Upcase(ch) = 'P' then
begin
for i := 1 to n do Write(k[i]:8);
Writeln;
Write('Press any key to return to menu...');
ReadKey;
end;
end;
procedure Swap(var x, y: Integer);
var
t: Integer;
begin
t := x; x := y; y := t;
end;
{------------------ 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;
HSPHN 1999-2004
L Minh Hong
117
118
Chuyn
procedure QuickSort;
procedure Partition(L, H: Integer);
var
i, j: Integer;
Pivot: Integer;
begin
if L >= H then Exit;
Pivot := k[L + Random(H - L + 1)];
i := L; j := H;
repeat
while k[i] < Pivot do Inc(i);
while k[j] > Pivot do Dec(j);
if i <= j then
begin
if i < j then Swap(k[i], k[j]);
Inc(i); Dec(j);
end;
until i > j;
Partition(L, j); Partition(i, H);
end;
begin
Enter;
Partition(1, n);
PrintResult;
end;
{ 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;
HSPHN 1999-2004
119
120
Chuyn
121
122
Chuyn
5 : AdvancedInsertionSort;
6 : ShellSort;
7 : QuickSort;
8 : HeapSort;
9 : DistributionCounting;
10: RadixExchangeSort;
11: StraightRadixSort;
12: MergeSort;
13: Halt;
end;
until False;
end.
HSPHN 1999-2004
123
Hnh 37: My Pentium 4, 3.2GHz, 2GB RAM t ra chm chp khi sp xp 108 kho [0..7.107] cho d
nhng thut ton sp xp tt nht c p dng
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 cn a vo mt s sa i nh.
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.
L Minh Hong
124
Chuyn
125
i*n
(1 i k). p dng thut ton th t
k
L Minh Hong
126
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).
127
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
128
Chuyn
129
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
130
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
131
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
132
Chuyn
133
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
134
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
135
136
Chuyn
0010
10
11
12
0100
0101
0111
1000
1010
1011
1100
HSPHN 1999-2004
137
010
101
101
010
101
101
111
L Minh Hong
138
Chuyn
010
101
101
111
010
101
101
HSPHN 1999-2004
139
L Minh Hong
140
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
141
L Minh Hong
144
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
145
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
146
Chuyn
dng mng Current tnh mng Next, mng Next sau khi tnh s mang cc gi tr tng ng
trn dng 1. Ri li gn mng Current := Next v tip tc dng mng Current tnh mng Next,
mng Next s gm cc gi tr tng ng trn dng 2 v.v Vy ta c ci t ci tin sau:
P_3_01_2.PAS * m s cch phn tch s n
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analyse2;
const
max = 100;
var
Current, Next: array[0..max] of Integer;
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analyse3;
const
max = 100;
var
B: array[1..2, 0..max] of Integer;{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
147
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analyse5;
var
n: Integer;
function GetF(m, v: Integer): Integer;
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.
148
Chuyn
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
149
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.
150
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
151
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
152
Chuyn
HSPHN 1999-2004
Quy hoch ng
153
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
154
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
155
Nhn xt:
Nhc li cng thc truy hi tnh cc L[.] l:
L [ n + 1] = 0
L [i ] = max L [ j] + 1; (i=0,n)
i < j n +1
a [i ]< a [ j]
156
Chuyn
L[n + 1] := 1;
StartOf[1] := n + 1;
m := 1; {m l di dy con n iu tng di nht ca dy a[i..n+1] ( bc khi to ny i = n + 1)}
for i := n downto 0 do
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;
3.1.4. Ci tin
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program LongestSubSequence;
const
InputFile = 'INCSEQ.INP';
OutputFile = 'INCSEQ.OUT';
const
max = 1000000;
var
a, L, T, StartOf: array[0..max + 1] of Integer;
n, m: Integer;
procedure Enter;
var
i: Integer;
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;
HSPHN 1999-2004
Quy hoch ng
157
begin
a[0] := Low(Integer);
a[n + 1] := High(Integer);
m := 1;
L[n + 1] := 1;
StartOf[1] := n + 1;
end;
{Hm Find, tm v tr j m nu em ai ghp vo u dy con n iu tng di nht bt u t aj s c dy n
iu tng di nht bt u ti ai}
function Find(i: Integer): Integer;
var
inf, sup, median, j: Integer;
begin
inf := 1; sup := m + 1;
repeat {Thut ton tm kim nh phn}
median := (inf + sup) div 2;
j := StartOf[median];
if a[j] > a[i] then inf := median {Lun aStartOf[inf] > ai aStartOf[sup]}
else sup := median;
until inf + 1 = sup;
Find := StartOf[inf];
end;
procedure Optimize;
var
i, j, k: Integer;
begin
for i := n downto 0 do
begin
j := Find(i);
k := L[j] + 1;
if k > m then
begin
m := k;
StartOf[k] := i;
end
else
if a[StartOf[k]] < a[i] then
StartOf[k] := i;
L[i] := k;
T[i] := j;
end;
end;
procedure Result;
var
f: Text;
i: Integer;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, m - 2);
i := T[0];
while i <> n + 1 do
begin
WriteLn(f, 'a[', i, '] = ', a[i]);
i := T[i];
end;
Close(f);
end;
begin
Enter;
L Minh Hong
158
Chuyn
Init;
Optimize;
Result;
end.
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.
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
159
V theo cch xy dng F[i, j] l gi tr ln nht c th, nn F[i, j] s l max trong 2 gi tr thu
c trn.
F
0
1
2
...
n
0
0
1
0
2
0
......
...0...
M
0
...
...
...
...
...
160
Chuyn
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.
HSPHN 1999-2004
Quy hoch ng
161
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
STR.INP
PBBCEFATZ
QABCDABEFA
Cch gii:
i vi xu k t th vic xo, chn s lm cho cc phn t pha sau v tr bin i b nh ch
s li, gy kh khn cho vic qun l v tr. khc phc iu ny, ta s tm mt th t bin
i tho mn: Php bin i ti v tr i bt buc phi thc hin sau cc php bin i ti v tr i
+ 1, i + 2,
V d: X = 'ABCD';
Insert(0, E) sau Delete(4) cho ra X = 'EABD'. Cch ny khng tun th nguyn tc
Delete(3) sau Insert(0, E) cho ra X = 'EABD'. Cch ny tun th nguyn tc ra.
Ni tm li ta s tm mt dy bin i c v tr thc hin gim dn.
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
Yn-1
Xm
Yn
Yn
162
Chuyn
X2
Y1
Y2
Xm-1
Yn-1
Xm:=Yn
Yn
X2
Y1
Y2
Xm-1
Yn-1
Xm
Yn
HSPHN 1999-2004
Quy hoch ng
163
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
Lu : khi truy vt, trnh truy nhp ra ngoi bng, nn to vin cho bng.
P_3_03_4.PAS * Bin i xu
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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;
L Minh Hong
164
Chuyn
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}
if F[m, n] = F[m, n - 1] + 1 then {Nu y l php chn}
begin
Write(fo, 'Insert(', m, ', ', Y[n], ')');
Insert(Y[n], X, m + 1);
Dec(n); {Truy sang phi}
end
else
if F[m, n] = F[m - 1, n - 1] + 1 then {Nu y l php thay}
begin
Write(fo, 'Replace(', m, ', ', Y[n], ')');
X[m] := Y[n];
Dec(m); Dec(n); {Truy cho ln trn}
end
else {Nu y l php xo}
begin
Write(fo, 'Delete(', m, ')');
Delete(X, m, 1);
Dec(m); {Truy ln trn}
end;
WriteLn(fo, ' -> ', X); {In ra xu X sau php bin i}
end;
Close(fo);
end;
begin
Enter;
Optimize;
Trace;
end.
Quy hoch ng
165
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
166
Chuyn
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, k);
for i := 1 to n do Read(fi, a[i]);
Close(fi);
end;
function Sub(x, y: Integer): Integer; {Tnh x - y (theo mod k)}
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
{Khi to}
f[0, 0] := 0;
for t := 1 to k 1 do f[0, t] := maxK;
{Gii cng thc truy hi}
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: Integer;
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.
HSPHN 1999-2004
Quy hoch ng
167
f [i, t ] =
max
0 j Count [i ]
Trace i 1,t j.i 1
Trace [i, t ] =
( f i 1, t j.i + j)
arg max
0 j Count [i ]
Trace i 1,t j.i 1
( f i 1, t j.i + j)
168
Chuyn
tmp := (x - y) mod k;
if tmp >= 0 then Sub := tmp
else Sub := tmp + k;
end;
procedure Optimize;
var
i, j, t: Integer;
begin
FillChar(f, SizeOf(f), 0);
f[0, 0] := Count[0];
FillChar(Trace, SizeOf(Trace), $FF); {Khi to cc phn t mng Trace=-1}
Trace[0, 0] := Count[0]; {Ngoi tr Trace[0, 0] = Count[0]}
for i := 1 to k - 1 do
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: Integer;
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.
HSPHN 1999-2004
Quy hoch ng
169
V d:
A l ma trn kch thc 3x4, B l ma trn kch thc 4x5 th C s l ma trn kch thc 3x5
1
5
9
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(pq) v B(qr) 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 ma trn c th nh gi qua s ln thc hin php nhn s hc,
vi gii thut nhn hai ma trn k trn, nhn ma trn A cp pxq vi ma trn 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
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]
L Minh Hong
170
Chuyn
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 [ t ] = m [ u ] . m [ v ] ; k: i k<j
t =i
u =i
v = k +1
Vi mt cch kt hp (ph thuc vo cch chn v tr k), chi ph ti thiu phi thc hin bng:
j
m [ v] )
v = 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 [u ]
u =i
v ma trn
v = k +1
Quy hoch ng
171
3.5.3. Tm cch kt hp ti u
Ti mi bc tnh f[i, j], ta ghi nhn li Tr[i, j] l im k m cch tnh:
k
j
=
m
t
m
u
[ ] [ ] . m [ v]
t =i
u =i
v = k +1
Tr[i, j]
t =i
q =i
m [ t ] , ta s in ra cch kt hp ti u nhn
j
u nhn
r = Tr[i, j]+1
m [q ] v cch kt hp ti
172
end;
Chuyn
j := i + len - 1;
for k := i to j - 1 do {Th cc v tr phn hoch k}
begin
p := a[i]; q := a[k + 1]; r := a[j + 1];
x := f[i, k] + f[k + 1, j] + p * q * r;
if x < f[i, j] then {Ti u ho f[i, j]}
begin
f[i, j] := x;
tr[i, j] := k;
end;
end;
end;
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
HSPHN 1999-2004
Quy hoch ng
173
b [ V ] = min k ( A [ k ] V ) b V A [ k ] < k
)}
174
Chuyn
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
Lp trnh gii bi ton ci ti vi kch thc d liu: n 10000; M 10000 v gii hn b
nh 10MB.
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
HSPHN 1999-2004
Quy hoch ng
175
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
C t k t nht (c di ngn nht)
Nu c nhiu xu T tho mn ng thi 3 iu kin trn th ch cn cho bit mt. Chng hn
vi S = 'a_101_b' th chn T = 'ab_101_ba' hay T = 'ba_101_ab' u ng.
V d:
S
MADAM
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
L Minh Hong
176
Chuyn
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.
A
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
178
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
179
V hng
C hng
V hng
n th
C hng
a th
deg ( v ) = 2m
vV
180
Chuyn
deg ( v ) = deg ( v ) = m
+
vV
vV
HSPHN 1999-2004
L thuyt th
181
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
182
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
183
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
184
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 GraphInput;
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
185
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
186
Chuyn
Hnh 56: th v ng i
L thuyt th
187
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
188
Chuyn
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; { 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;
HSPHN 1999-2004
L thuyt th
189
begin
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
1st
5
4th
3rd
x1
u1
L Minh Hong
u2
x2
uq
xp
190
Chuyn
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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;
HSPHN 1999-2004
L thuyt th
191
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}
Trace[s] := -1; {Ngoi tr nh s}
repeat {Lp ti khi hng i rng}
u := Queue[Front]; Inc(Front); {Ly t hng i ra mt nh u}
for v := 1 to n do
if a[u, v] and (Trace[v] = 0) then {Xt nhng nh v cha thm k vi u}
begin
Inc(Rear); Queue[Rear] := v; {y v vo hng i}
Trace[v] := u; {Lu vt ng i, cng l nh du lun}
end;
until Front > Rear;
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, ', ');
WriteLn(fo);
WriteLn(fo, 'The path from ', s, ' to ', f, ': ');
if Trace[f] = 0 then
WriteLn(fo,'not found')
else
begin
while f <> s do
begin
Write(fo, f, '<-');
f := Trace[f];
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
Enter;
BFS;
Result;
end.
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
192
Chuyn
2nd
2
4th
6
1
1
8
6th
7
8
st
3
3
5
rd
5th
HSPHN 1999-2004
L thuyt th
193
G3
G2
Khp
Cu
L Minh Hong
194
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.
HSPHN 1999-2004
L thuyt th
195
K3
K4
K5
Hnh 62: th y
L Minh Hong
196
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
197
198
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
199
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.
200
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
201
3
4
9
10
4
11
10
11
6
7
L Minh Hong
202
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.
Thut ton Tarjan:
HSPHN 1999-2004
L thuyt th
203
procedure Visit(uV);
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
204
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
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
205
Bi tp
Bi 1
L Minh Hong
206
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
207
L Minh Hong
208
Chuyn
L thuyt th
209
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
210
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
211
L Minh Hong
212
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
213
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
214
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
215
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
216
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;
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
217
218
Chuyn
HSPHN 1999-2004
L thuyt th
219
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.
L Minh Hong
220
Chuyn
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
HSPHN 1999-2004
L thuyt th
221
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
222
Chuyn
L thuyt th
223
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 c th khng khng gian nh m t Stack. L do thut ton ch c th p
dng trong trng hp s cnh c gii hn bit trc nh l nh vy.
L Minh Hong
224
Chuyn
L thuyt th
225
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
L Minh Hong
226
Chuyn
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.
HSPHN 1999-2004
L thuyt th
227
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
228
Chuyn
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:
HSPHN 1999-2004
L thuyt th
229
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)
L Minh Hong
230
Chuyn
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
HSPHN 1999-2004
L thuyt th
231
L Minh Hong
232
Chuyn
f1
f2
HSPHN 1999-2004
L thuyt th
233
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
L Minh Hong
234
Chuyn
L thuyt th
235
end;
procedure Ford_Bellman; {Thut ton Ford-Bellman}
var
Stop: Boolean;
u, v, CountLoop: Integer;
begin
for CountLoop := 1 to n - 1 do
begin
Stop := True;
for u := 1 to n do
for v := 1 to n do
if d[v] > d[u] + c[u, v] then {Nu u, v tho mn d[v] > d[u] + c[u, v] th ti u li d[v]}
begin
d[v] := d[u] + c[u, v];
Trace[v] := u; {Lu vt ng i}
Stop := False;
end;
if Stop then Break;
end;
{Thut ton kt thc khi khng sa nhn cc d[v] c na hoc lp n - 1 ln}
end;
procedure PrintResult; {In ng i t s ti f}
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
if d[f] = maxC then {Nu d[f] vn l + th tc l khng c ng}
WriteLn(fo, 'There is no path from ', s, ' to ', f)
else {Truy vt tm ng i}
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;
Ford_Bellman;
PrintResult;
end.
236
Chuyn
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
HSPHN 1999-2004
L thuyt th
OutputFile = 'MINPATH.OUT';
max = 1000;
maxEC = 1000;
maxC = max * maxEC;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean; {Free[u] = True u c nhn t do}
n, s, f: Integer;
procedure LoadGraph; {Nhp th, trng s cc cung phi l s khng m}
var
i, m, u, v: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, m, s, f);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC;
for i := 1 to m do ReadLn(fi, u, v, c[u, v]);
Close(fi);
end;
procedure Init; {Khi to cc nhn d[v], cc nh u c coi l t do}
var
i: Integer;
begin
for i := 1 to n do d[i] := MaxC;
d[s] := 0;
FillChar(Free, SizeOf(Free), True);
end;
procedure Dijkstra; {Thut ton Dijkstra}
var
i, u, v: Integer;
min: Integer;
begin
repeat
{Tm trong cc nh c nhn t do ra nh u c d[u] nh nht}
u := 0; min := maxC;
for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
{Thut ton s kt thc khi cc nh t do u c nhn + hoc chn n nh f}
if (u = 0) or (u = f) then Break;
{C nh nhn nh u}
Free[u] := False;
{Dng nh u ti u nhn nhng nh t do k vi u}
for v := 1 to n do
if Free[v] and (d[v] > d[u] + c[u, v]) then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end;
until False;
end;
procedure PrintResult; {In ng i t s ti f}
L Minh Hong
237
238
Chuyn
var
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;
end.
HSPHN 1999-2004
L thuyt th
P_4_08_3.PAS * Thut ton Dijkstra v cu trc Heap
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Shortest_Path_by_Dijkstra_and_Heap;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 10000;
maxE = 100000;
maxEC = 100000;
maxC = max * maxEC;
type
TAdj = array[1..maxE] of Integer;
TAdjCost = array[1..maxE] of Integer;
THeader = array[1..max + 1] of Integer;
var
adj: TAdj; {Danh sch k dng mng}
adjCost: TAdjCost; {Km trng s}
h: THeader; {Mng nh du cc on trong danh sch k adj}
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean;
heap: array[1..max] of Integer; {heap[i] = nh lu ti nt i ca heap}
Pos: array[1..max] of Integer; {pos[v] = v tr ca nt v trong heap (tc l pos[heap[i]] = i)}
n, s, f, nHeap: Integer;
procedure LoadGraph; {Nhp d liu}
var
i, m, u, v, c: Integer;
fi: Text;
begin
{c file ln 1, xc nh cc on}
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, m, s, f);
{Php m phn phi (Distribution Counting)}
FillChar(h, SizeOf(h), 0);
for i := 1 to m do
begin
ReadLn(fi, u); {Ta ch cn tnh bn bc ra (deg+) ca mi nh nn khng cn c 3 thnh phn}
Inc(h[u]);
end;
for i := 2 to n do h[i] := h[i - 1] + h[i];
Close(fi);
{n y, ta xc nh c h[u] l v tr cui ca danh sch k nh u trong adj}
Reset(fi); {c file ln 2, vo cu trc danh sch k}
ReadLn(fi); {B qua dng u tin Input file}
for i := 1 to m do
begin
ReadLn(fi, u, v, c);
adj[h[u]] := v; {in v v c vo v tr ng trong danh sch k ca u}
adjCost[h[u]] := c;
Dec(h[u]);
end;
h[n + 1] := m;
Close(fi);
end;
procedure Init; {Khi to d[i] = di ng i ngn nht t s ti i qua 0 cnh, Heap rng}
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[s] := 0;
FillChar(Free, SizeOf(Free), True);
L Minh Hong
239
240
Chuyn
L thuyt th
241
end;
until nHeap = 0; {Khng cn nh no mang nhn t do}
end;
procedure PrintResult;
var
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;
end.
5
6
6
3
242
Chuyn
var
v: Integer;
begin
nh du u thm;
for (v V: v cha thm k vi u) do Visit(v);{Thm tip nhng nh cha thm k vi u}
duyt xong nhnh DFS gc u, nh s mi cho nh u l count;
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 thuyt th
Close(fi);
end;
procedure Numbering; {Thut ton nh s cc nh}
var
Free: array[1..max] of Boolean;
u, count: Integer;
procedure Visit(u: Integer);
var
v: Integer;
begin
Free[u] := False;
for v := 1 to n do
if Free[v] and (c[u, v] <> maxC) then Visit(v);
List[count] := u;
Dec(count);
end;
begin
FillChar(Free, SizeOf(Free), True);
count := n;
for u := 1 to n do
if Free[u] then Visit(u);
end;
procedure Init; {Khi to cc nhn trng s}
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[s] := 0;
end;
procedure FindPath; {Thut ton quy hoch ng ti u ho cc d[.]}
var
i, j, u, v: Integer;
begin
for i := 1 to n - 1 do
for j := i + 1 to n do
begin
u := List[i]; v := List[j]; {nh x ngc i, j sang ch s c u, v}
if d[v] > d[u] + c[u, v] then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end
end;
end;
procedure PrintResult; {In kt qu}
var
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, '<-');
L Minh Hong
243
244
Chuyn
f := Trace[f];
end;
WriteLn(fo, s);
end;
Close(fo);
end;
begin
LoadGraph;
Numbering;
Init;
FindPath;
PrintResult;
end.
HSPHN 1999-2004
L thuyt th
245
246
Chuyn
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 .
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
Bi 1
HSPHN 1999-2004
L thuyt th
247
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
1$ mua c 0.7
L Minh Hong
248
Chuyn
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).
HSPHN 1999-2004
L thuyt th
249
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
L Minh Hong
250
Chuyn
HSPHN 1999-2004
L thuyt th
251
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
L Minh Hong
252
Chuyn
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.
HSPHN 1999-2004
L thuyt th
253
254
Chuyn
L thuyt th
e[root] := Key;
end;
procedure Kruskal;
var
i, r1, r2, Count, a: Integer;
tmp: TEdge;
begin
Count := 0;
Connected := False;
for i := m div 2 downto 1 do AdjustHeap(i, m); {Vun danh sch cnh thnh ng}
for i := m - 1 downto 0 do {Rt ln lt cc cnh khi ng, t cnh ngn ti cnh di}
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;
L Minh Hong
255
256
Chuyn
PrintResult;
end.
L thuyt th
begin
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Minimal_Spanning_Tree_by_Prim;
const
InputFile = 'MINTREE.INP';
OutputFile = 'MINTREE.OUT';
max = 1000;
maxCE = 1000;
maxC = max * maxCE;
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];
L Minh Hong
257
258
Chuyn
u := i;
end;
if u = 0 then {Nu khng chn c u no c d[u] < + th th khng lin thng}
begin
Connected := False;
Break;
end;
Free[u] := False; {Nu chn c th nh du u b kt np, lp ln 1 th d nhin u = 1 bi d[1] = 0}
for v := 1 to n do
if Free[v] and (d[v] > c[u, v]) then {Tnh li cc nhn khong cch d[v] (v cha kt np)}
begin
d[v] := c[u, v]; {Ti u nhn d[v] theo cng thc}
Trace[v] := u; {Lu vt, nh ni vi v cho khong cch ngn nht l u}
end;
end;
end;
procedure PrintResult;
var
v, W: Integer;
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
HSPHN 1999-2004
L thuyt th
259
( x u x v ) + ( yu yv )
2
L Minh Hong
260
Chuyn
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 ] (Vi 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
HSPHN 1999-2004
L thuyt th
261
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 cung khng c vt qu kh nng
thng qua ca cung : f [ u, v ] c [ u, v ] vi u, v V.
Tnh cht 2: (Skew symmetry): Vi u, v V, 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 ] .
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:
f [ u, v]=0
vV
vV
vV
vV
vV
V gi tr lung, ta c:
vV
vV
vV
L Minh Hong
262
Chuyn
uV
khi v =
uV
cung i ra khi v =
[ u, v] [ v, u ] = ( [ u, v] [ v, u ]) = f [ u,v] =0. Vy
uV
uV
uV
uV
tng lung trn cc cung i ra khi v bng tng lung trn cc cung i vo v
V gi tr lung, cng t ng thc f[u, v] = [u, v] - [v, u], ta c
= [s, v ] [ v,s ] = ( [s, v ] [ v,s ]) = f [s, v ] = f
vV
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 [ u,v]
uX,vY
f [ u,v]
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 thuyt th
263
Vi X, Y V, ta c f ( X, Y ) =
uX,vY
vY,uX
v] 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 ) =
uX Y
vZ
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)
Kh nng thng qua ca cung (u, v) trn Gf c tnh bng cf[u, v] = c[u, v] - f[u, v], s v t ln
lt c coi l im pht v im thu trn Gf.
Mng Gf nh vy c gi l mng thng d (Residual Network) ca mng G sinh ra bi
lung f. Hnh 78 l v d v mt mng thng d:
L Minh Hong
264
Chuyn
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}.
(f + f ') [ u,v] = ( f [ u,v] + f '[ u,v]) = f [ u,v] + f '[ u,v] =0. Tnh
vV
vV
vV
vV
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.
HSPHN 1999-2004
L thuyt th
265
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
L Minh Hong
4
6
6
2
4
3
5
1
266
Chuyn
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 ) = c [ u,v ] . Lung thng qua lt ct (X, Y) nh ngha bi
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,
f(X, Y) = f(X, V) - f(X, V\Y)
(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 ) = f [ u,v ] c [ u,v ] = c ( X, Y )
uX
yV
uX
yV
L thuyt th
267
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 ( 1000), 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 106)
Output: file vn bn MAXFLOW.OUT, ghi lung trn cc cung v gi tr lung cc i tm
c
L Minh Hong
268
Chuyn
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
L thuyt th
269
Delta;
Delta;
procedure PrintResult;
var
u, v: Integer;
m: Integer;
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 {Ch quan tm n nhng cung c lung dng}
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;
FillChar(f, SizeOf(f), 0);
repeat
if not FindPath then Break;
IncFlow;
until False;
L Minh Hong
270
Chuyn
PrintResult;
end.
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.
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 ]
HSPHN 1999-2004
L thuyt th
271
f [ u,v] 0
uV
272
Chuyn
HSPHN 1999-2004
L thuyt th
273
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
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program MaximumFlowByPreFlowPush;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 1000;
type
TCapacities = array[1..max, 1..max] of Integer;
var
c: TCapacities;
f: TCapacities;
FlowIn: array[1..max] of Integer;
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
L Minh Hong
274
Chuyn
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}
var
v: Integer;
begin
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;
HSPHN 1999-2004
L thuyt th
275
Delta: Integer;
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}
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: Integer;
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
L Minh Hong
276
Chuyn
Enter;
Init;
Preflowpush;
PrintResult;
end.
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
HSPHN 1999-2004
L thuyt th
277
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.
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
d [ u, v] th lung phi l
(u,v)E
278
Chuyn
Bi tp:
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.
Hng dn: Coi G = (V, E) l mng vi im pht A v im thu B, loi b tt c cc cung i
vo A v cc cung i ra khi B, t kh nng thng qua ca cc cung u bng 1, tm lung
cc i trn mng v lt ct s-t hp nht (X, Y), nhng cnh ni gia X v Y l nhng cnh
cn b.
Bi 2: H i din phn bit
Mt lp hc c n bn nam, n bn n. Cho m mn qu lu nim, (n m). Mi bn c s thch
v mt s mn qu no . Hy tm cch phn cng mi bn nam tng mt mn qu cho mt
bn n tho mn:
Mi bn nam ch tng qu cho ng mt bn n
Mi bn n ch nhn qu ca ng mt bn nam
Bn nam no cng i tng qu v bn n no cng c nhn qu, mn qu phi hp s
thch ca c hai ngi.
Mn qu no c mt bn nam chn th bn nam khc khng c chn na.
Hng dn: Xy dng mng G = (V, E), trong V gm 4 lp nh:
Lp nh A[1..n], mi nh tng trng cho mt bn nam
Lp nh B[1..m], mi nh tng trng cho mt mn qu
Lp nh C[1..m], mi nh tng trng cho mt mn qu
Lp nh D[1..n], mi nh tng trng cho mt bn n.
Tp cc cung E c xy dng nh sau:
Mt cung ni t lp A ti lp B tng ng vi mt bn nam v mt mn qu hp s thch
ca bn nam .
Mt cung ni t lp B sang lp C ni mt nh tng trng cho mt mn qu t lp B ti
nh tng trng cho chnh mn qu lp C.
Mt cung ni t lp C sang lp D tng ng vi mt mn qu v mt bn n thch mn
qu .
Tt c cc cung u c kh nng thng qua bng 1
Tm lung cc i trn mng, nu gi tr lung bng m th cch phn cng l tn ti v c th
ch ra bng cch: Trn nhng cung c lung i qua (gi tr lung i qua bng 1 theo nh l v
tnh nguyn), mi cung ni t lp A sang lp B tng ng vi mt bn nam v mt mn
qu bn nam s chn, mi cung t lp C sang lp D tng ng vi mt mn qu v mt
bn n s nhn mn qu .
Bi 3: Minimum Path Cover
HSPHN 1999-2004
L thuyt th
279
y1
x2
y2
x3
y3
y0
x0
x1
x4
y4
x5
y5
x6
y6
280
Chuyn
HSPHN 1999-2004
L thuyt th
281
w(v)
L Minh Hong
282
Chuyn
HSPHN 1999-2004
L thuyt th
283
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
L Minh Hong
284
Chuyn
L thuyt th
285
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].
L Minh Hong
286
Chuyn
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 1000) 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
L thuyt th
287
var
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];
L Minh Hong
288
Chuyn
next := matchX[x];
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.
HSPHN 1999-2004
L thuyt th
289
290
Chuyn
HSPHN 1999-2004
L thuyt th
291
292
Chuyn
-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
L thuyt th
293
294
Chuyn
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
x* = x3, tm thy ng m
y3 y3
Tng cp
2
3
-1
-1
1=
3
2
3
2
2
+1
2
0
2
3
HSPHN 1999-2004
L thuyt th
295
-2
1 +2
-2
2 +2
2=
3 +2
-2 3
-2
2
0
x* = x4, Tm thy ng m
x4y3x3y2x1y1x2y4.
Tng cp
Xong
296
Chuyn
Fx[1] = 2
Fx[2] = 2
Fx[3] = 3
Fx[4] = 3
Fy[1] = -2
Fy[2] = -2
Fy[3] = -3
Fy[4] = 0
L thuyt th
297
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 1000)
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] 1000).
Output: file vn bn ASSIGN.OUT, m t php phn cng ti u tm c.
L Minh Hong
298
Chuyn
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
L thuyt th
299
begin
FillChar(Trace, SizeOf(Trace), 0);
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}
L Minh Hong
300
Chuyn
var
i: Integer;
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[.] khi khai bo mng, 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.
HSPHN 1999-2004
L thuyt th
301
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:
L Minh Hong
302
Chuyn
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
HSPHN 1999-2004
L thuyt th
303
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].
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)
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program AssignmentProblemSolve;
const
InputFile = 'ASSIGN.INP';
OutputFile = 'ASSIGN.OUT';
max = 1000;
maxEC = 1000;
maxC = max * maxEC + 1;
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;
L Minh Hong
304
Chuyn
L thuyt th
end;
end;
until Front > Rear;
end;
procedure SubX_AddY; {Php xoay trng s cnh}
var
Delta: Integer;
i, j: Integer;
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;
L Minh Hong
305
306
Chuyn
Enlarge;
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
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.
HSPHN 1999-2004
L thuyt th
307
9
7
L Minh Hong
308
Chuyn
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:
HSPHN 1999-2004
L thuyt th
309
Shrink
Shrink
Blossom
Blossom
= nh c s ca blossom
= nh chp t blossom
Expand
L Minh Hong
Expand
310
Chuyn
L thuyt th
311
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
T:3
T:1
2
T:1
Tm thy ng m
Trng hp 2: v cha thm v ghp
L Minh Hong
S:2
312
Chuyn
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
HSPHN 1999-2004
L thuyt th
313
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
314
Chuyn
L thuyt th
315
316
Chuyn
end;
until Front > Rear;
end;
procedure Enlarge; {Ni rng b ghp bi ng m bt u t start, kt thc finish}
var
v, next: Integer;
begin
repeat
v := T[finish];
next := match[v];
match[v] := finish;
match[finish] := v;
finish := next;
until finish = 0;
end;
procedure Solve; {Thut ton Edmonds}
var
u: Integer;
begin
for u := 1 to n do
if match[u] = 0 then
begin
start := u; {Vi mi nh cha ghp start}
FindAugmentingPath; {Tm ng m bt u t start}
if finish <> 0 then Enlarge; {Nu thy th ni rng b ghp theo ng m ny}
end;
end;
procedure Result; {In b ghp tm c}
var
u, count: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
count := 0;
for u := 1 to n do
if match[u] > u then {Va trnh in lp cnh (u, v) v (v, u), va loi nhng nh khng ghp c (match[.]=0)}
begin
Inc(count);
WriteLn(f, count, ') ', u, ' ', match[u]);
end;
Close(f);
end;
begin
Enter;
Init;
Solve;
Result;
end.
HSPHN 1999-2004
L thuyt th
317
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
th tham kho trong cc ti liu khc.
L Minh Hong
n.m . Bn c
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, 3rd edition
Author: Donald E. Knuth
Volume 1: Fundamental Algorithms, ISBN: 0-201-89683-4
Volume 2: Seminumerical Algorithms, ISBN: 0-201-89684-2
Volume 3: Sorting and Searching, ISBN: 0-201-89685-0
Volume 4: Combinatorial Algorithms (in preparation)
Volume 5: Syntactic Algorithms (in preparation)
Publisher: Addison-Wesley, 1998
Title: Introduction to Algorithms, 2nd edition, ISBN: 0262032937
Authors: Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest
Publisher: The MIT Press, 2001