You are on page 1of 334

L MINH HONG

(A.K.A DSAP Textbook)

i hc S phm H Ni, 1999-2002

Try not to become a man of success


but rather to become a man of value.
Albert Einstein

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

2. PHNG PHP SINH (GENERATION) ....................................................................................4


2.1. SINH CC DY NH PHN DI N................................................................................................... 5
2.2. LIT K CC TP CON K PHN T ..................................................................................................... 6
2.3. LIT K CC HON V ........................................................................................................................... 8

3. THUT TON QUAY LUI ..........................................................................................................12


3.1. LIT K CC DY NH PHN DI N ........................................................................................... 12
3.2. LIT K CC TP CON K PHN T ................................................................................................... 13
3.3. LIT K CC CHNH HP KHNG LP CHP K ............................................................................. 15
3.4. BI TON PHN TCH S .................................................................................................................... 17
3.5. BI TON XP HU .............................................................................................................................. 19

4. K THUT NHNH CN ...........................................................................................................24


4.1. BI TON TI U.................................................................................................................................. 24
4.2. S BNG N T HP............................................................................................................................ 24
4.3. M HNH K THUT NHNH CN.................................................................................................... 24
4.4. BI TON NGI DU LCH ................................................................................................................. 25
4.5. DY ABC ................................................................................................................................................. 27

PHN 2. CU TRC D LIU V GII THUT ..................................... 33


1. CC BC C BN KHI TIN HNH GII CC BI TON TIN HC .........................34
1.1. XC NH BI TON............................................................................................................................ 34
1.2. TM CU TRC D LIU BIU DIN BI TON ............................................................................. 34
1.3. TM THUT TON ................................................................................................................................. 35
1.4. LP TRNH .............................................................................................................................................. 37
1.5. KIM TH................................................................................................................................................ 37
1.6. TI U CHNG TRNH ...................................................................................................................... 38

2. PHN TCH THI GIAN THC HIN GII THUT ...........................................................40


2.1. GII THIU.............................................................................................................................................. 40
2.2. CC K PHP NH GI PHC TP TNH TON............................................................. 40
2.3. XC NH PHC TP TNH TON CA GII THUT ............................................................ 42
2.4. PHC TP TNH TON VI TNH TRNG D LIU VO....................................................... 45
2.5. CHI PH THC HIN THUT TON.................................................................................................... 46

ii

3. QUY V GII THUT QUY ......................................................................................... 50


3.1. KHI NIM V QUY ........................................................................................................................50
3.2. GII THUT QUY.............................................................................................................................50
3.3. V D V GII THUT QUY ..........................................................................................................51
3.4. HIU LC CA QUY .......................................................................................................................55

4. CU TRC D LIU BIU DIN DANH SCH.................................................................... 58


4.1. KHI NIM DANH SCH ......................................................................................................................58
4.2. BIU DIN DANH SCH TRONG MY TNH ....................................................................................58

5. NGN XP V HNG I ........................................................................................................ 64


5.1. NGN XP (STACK)...............................................................................................................................64
5.2. HNG I (QUEUE)...............................................................................................................................66

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

7. K PHP TIN T, TRUNG T V HU T ....................................................................... 79


7.1. BIU THC DI DNG CY NH PHN .........................................................................................79
7.2. CC K PHP CHO CNG MT BIU THC....................................................................................79
7.3. CCH TNH GI TR BIU THC ........................................................................................................79
7.4. CHUYN T DNG TRUNG T SANG DNG HU T...................................................................83
7.5. XY DNG CY NH PHN BIU DIN BIU THC......................................................................86

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

9. TM KIM (SEARCHING) ....................................................................................................... 126


9.1. BI TON TM KIM ...........................................................................................................................126
9.2. TM KIM TUN T (SEQUENTIAL SEARCH) ...............................................................................126
9.3. TM KIM NH PHN (BINARY SEARCH)........................................................................................126
9.4. CY NH PHN TM KIM (BINARY SEARCH TREE - BST).........................................................127

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

PHN 3. QUY HOCH NG .................................................................... 143


1. CNG THC TRUY HI ..........................................................................................................144
1.1. V D ...................................................................................................................................................... 144
1.2. CI TIN TH NHT........................................................................................................................... 145
1.3. CI TIN TH HAI............................................................................................................................... 147
1.4. CI T QUY ................................................................................................................................. 147

2. PHNG PHP QUY HOCH NG ...................................................................................149


2.1. BI TON QUY HOCH ..................................................................................................................... 149
2.2. PHNG PHP QUY HOCH NG ................................................................................................ 149

3. MT S BI TON QUY HOCH NG ............................................................................153


3.1. DY CON N IU TNG DI NHT ........................................................................................... 153
3.2. BI TON CI TI............................................................................................................................... 158
3.3. BIN I XU ...................................................................................................................................... 160
3.4. DY CON C TNG CHIA HT CHO K............................................................................................ 164
3.5. PHP NHN T HP DY MA TRN............................................................................................... 169
3.6. BI TP LUYN TP........................................................................................................................... 172

PHN 4. CC THUT TON TRN TH .......................................... 177


1. CC KHI NIM C BN .......................................................................................................178
1.1. NH NGHA TH (GRAPH) .......................................................................................................... 178
1.2. CC KHI NIM................................................................................................................................... 179

2. BIU DIN TH TRN MY TNH ..................................................................................181


2.1. MA TRN K (ADJACENCY MATRIX)............................................................................................. 181
2.2. DANH SCH CNH (EDGE LIST) ...................................................................................................... 182
2.3. DANH SCH K (ADJACENCY LIST) ............................................................................................... 183
2.4. NHN XT............................................................................................................................................. 184

3. CC THUT TON TM KIM TRN TH ...................................................................186


3.1. BI TON .............................................................................................................................................. 186
3.2. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH)...................................... 187
3.3. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH) ............................ 189
3.4. PHC TP TNH TON CA BFS V DFS ................................................................................ 192

4. TNH LIN THNG CA TH ..........................................................................................193


4.1. NH NGHA ......................................................................................................................................... 193
4.2. TNH LIN THNG TRONG TH V HNG ........................................................................... 194

iv
4.3. TH Y V THUT TON WARSHALL ...........................................................................194
4.4. CC THNH PHN LIN THNG MNH ........................................................................................197

5. VI NG DNG CA DFS v BFS ......................................................................................... 208


5.1. XY DNG CY KHUNG CA TH............................................................................................208
5.2. TP CC CHU TRNH C S CA TH......................................................................................211
5.3. BI TON NH CHIU TH ........................................................................................................211
5.4. LIT K CC KHP V CU CA TH......................................................................................215

6. CHU TRNH EULER, NG I EULER, TH EULER ............................................. 219


6.1. BI TON 7 CI CU ..........................................................................................................................219
6.2. NH NGHA..........................................................................................................................................219
6.3. NH L .................................................................................................................................................219
6.4. THUT TON FLEURY TM CHU TRNH EULER...........................................................................220
6.5. CI T .................................................................................................................................................221
6.6. THUT TON TT HN......................................................................................................................223

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


7.1. NH NGHA..........................................................................................................................................226
7.2. NH L .................................................................................................................................................226
7.3. CI T .................................................................................................................................................227

8. BI TON NG I NGN NHT..................................................................................... 231


8.1. TH C TRNG S.........................................................................................................................231
8.2. BI TON NG I NGN NHT .................................................................................................231
8.3. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD BELLMAN .........233
8.4. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON DIJKSTRA ...........235
8.5. THUT TON DIJKSTRA V CU TRC HEAP .............................................................................238
8.6. TRNG HP TH KHNG C CHU TRNH - SP XP T P..............................................241
8.7. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD...................................244
8.8. NHN XT .............................................................................................................................................246

9. BI TON CY KHUNG NH NHT ................................................................................... 251


9.1. BI TON CY KHUNG NH NHT ................................................................................................251
9.2. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956) ...................................................................251
9.3. THUT TON PRIM (ROBERT PRIM - 1957)....................................................................................256

10. BI TON LUNG CC I TRN MNG...................................................................... 260


10.1. CC KHI NIM .................................................................................................................................260
10.2. MNG THNG D V NG TNG LUNG ............................................................................263
10.3. THUT TON FORD-FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) .............................266
10.4. THUT TON PREFLOW-PUSH (GOLDBERG - 1986) ..................................................................270
10.5. MT S M RNG.............................................................................................................................276

11. BI TON TM B GHP CC I TRN TH HAI PHA .................................... 283


11.1. TH HAI PHA (BIPARTITE GRAPH) .........................................................................................283
11.2. BI TON GHP I KHNG TRNG V CC KHI NIM .....................................................283
11.3. THUT TON NG M ...............................................................................................................284
11.4. CI T ...............................................................................................................................................285

12. BI TON TM B GHP CC I VI TRNG S CC TIU TRN TH HAI


PHA - THUT TON HUNGARI .................................................................................................291
12.1. BI TON PHN CNG .................................................................................................................... 291
12.2. PHN TCH .......................................................................................................................................... 291
12.3. THUT TON...................................................................................................................................... 292
12.4. BI TON TM B GHP CC I VI TRNG S CC I TRN TH HAI PHA....... 301
12.5. NNG CP........................................................................................................................................... 301

13. BI TON TM B GHP CC I TRN TH.........................................................307


13.1. CC KHI NIM................................................................................................................................. 307
13.2. THUT TON EDMONDS (1965) ..................................................................................................... 308
13.3. THUT TON LAWLER (1973)......................................................................................................... 310
13.4. CI T ............................................................................................................................................... 312
13.5. PHC TP TNH TON............................................................................................................... 316

TI LIU C THM.................................................................................. 319

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

BNG CC K HIU C S DNG

Floor of x: S nguyn ln nht x

Ceiling of x: S nguyn nh nht x

Pk

n

k

S chnh hp khng lp chp k ca n phn t =

n!
(n k)!

Binomial coefficient: H s ca hng t x k trong a thc ( x + 1)

= 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]

Cc phn t trong mng a tnh t ch s i n ch s j

n!

n factorial: Giai tha ca n = 1.2.3n

ab

ab

a b

...a

a
aN

b copies of a

log a x

Logarithm to base a of x: Logarithm c s a ca x ( log a a b = b )

lg x

Logarithm nh phn (c s 2) ca x

ln x

Logarithm t nhin (c s e) ca x

log*a x

S ln ly logarithm c s a thu c s 1 t x ( log*a (a b) = b )

lg* x

log*2 x

ln* x

log*e x

PHN 1. BI TON LIT K

C mt s bi ton trn thc t yu cu ch r: trong mt tp cc i


tng cho trc c bao nhiu i tng tho mn nhng iu kin nht
nh. Bi ton gi l bi ton m.
Trong lp cc bi ton m, c nhng bi ton cn yu cu ch r nhng
cu hnh tm c tho mn iu kin cho l nhng cu hnh no. Bi
ton yu cu a ra danh sch cc cu hnh c th c gi l bi ton lit
k.
gii bi ton lit k, cn phi xc nh c mt thut ton c th
theo ln lt xy dng c tt c cc cu hnh ang quan tm. C
nhiu phng php lit k, nhng chng cn phi p ng c hai yu
cu di y:
Khng c lp li mt cu hnh
Khng c b st mt cu hnh
C th ni rng, phng php lit k l phng k cui cng gii
c mt s bi ton t hp hin nay. Kh khn chnh ca phng php
ny chnh l s bng n t hp dn ti s i hi ln v khng gian v
thi gian thc hin chng trnh. Tuy nhin cng vi s pht trin ca
my tnh in t, bng phng php lit k, nhiu bi ton t hp tm
thy li gii. Qua , ta cng nn bit rng ch nn dng phng php
lit k khi khng cn mt phng php no khc tm ra li gii.
Chnh nhng n lc gii quyt cc bi ton thc t khng dng phng
php lit k thc y s pht trin ca nhiu ngnh ton hc.

Chuyn

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


Cho S l mt tp hu hn gm n phn t v k l mt s t nhin.
Gi X l tp cc s nguyn dng t 1 n k: X = {1, 2, , k}

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)

Vy c th ng nht f vi dy gi tr (f(1), f(2), , f(k)) v coi dy gi tr ny cng l mt


chnh hp lp chp k ca S. Nh v d trn (E, C, E) l mt chnh hp lp chp 3 ca S. D
dng chng minh c kt qu sau bng quy np hoc bng phng php nh gi kh nng
la chn:
S chnh hp lp chp k ca tp gm n phn t l n k

1.2. CHNH HP KHNG LP


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

f(i)

S chnh hp khng lp chp k ca tp gm n phn t l:


n

Pk = n(n 1)(n 2)...(n k + 1) =

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

rng khi k = n th s phn t ca tp X = {1, 2, , n} ng bng s phn t ca S. Do


tnh cht i mt khc nhau nn dy f(1), f(2), , f(n) s lit k c ht cc phn t trong S.
Nh vy f l ton nh. Mt khc do gi thit f l chnh hp khng lp nn f l n nh. Ta c
tng ng 1-1 gia cc phn t ca X v S, do f l song nh. Vy nn ta c th nh ngha
mt hon v ca S l mt song nh gia {1, 2, , n} v S.
S hon v ca tp gm n phn t = s chnh hp khng lp chp n = n!

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

2. PHNG PHP SINH (GENERATION)


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

Th t t in
Trn cc kiu d liu n gin chun, ngi ta thng ni ti khi nim th t. V d trn
kiu s th c quan h: 1 < 2; 2 < 3; 3 < 10; , trn kiu k t Char th cng c quan h 'A' <
'B'; 'C' < 'c'
Xt quan h th t ton phn nh hn hoc bng k hiu trn mt tp hp S, l quan h
hai ngi tho mn bn tnh cht:
Vi a, b, c S
Tnh ph bin: Hoc l a b, hoc b a;
Tnh phn x: a a
Tnh phn i xng: Nu a b v b a th bt buc a = b.
Tnh bc cu: Nu c a b v b c th a c.
Trong trng hp a b v a b, ta dng k hiu < cho gn, (ta ngm hiu cc k hiu nh
, >, khi phi nh ngha)
V d nh quan h trn cc s nguyn cng nh trn cc kiu v hng, lit k l quan h
th t ton phn.
Trn cc dy hu hn, ngi ta cng xc nh mt quan h th t:
Xt a[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'

2.1. SINH CC DY NH PHN DI N


Mt dy nh phn di n l mt dy x[1..n] trong x[i] {0, 1} (i : 1 i n).
D thy: mt dy nh phn x di n l biu din nh phn ca mt gi tr nguyn p(x) no
nm trong on [0, 2n - 1]. S cc dy nh phn di n = s cc s t nhin [0, 2n - 1] = 2n.
Ta s lp chng trnh lit k cc dy nh phn theo th t t in c ngha l s lit k ln
lt cc dy nh phn biu din cc s nguyn theo th t 0, 1, , 2n-1.
V d: Khi n = 3, cc dy nh phn di 3 c lit k nh sau:
p(x)

000

001

010

011

100

101

110

111

Nh vy dy u tin s l 000 v dy cui cng s l 111. Nhn xt rng nu dy x =


x[1..n] l dy ang c v khng phi dy cui cng cn lit k th dy k tip s nhn c
bng cch cng thm 1 ( theo c s 2 c nh) vo dy hin ti.
V d khi n = 8:
Dy ang c: 10010000

Dy ang c: 10010111

cng thm 1:

cng thm 1:

+1

Dy mi:

10010001

+1

Dy mi:

10011000

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


dy v u (xt t hng n v ln), tm s 0 gp u tin

L Minh Hong

Chuyn

Nu thy th thay s 0 bng s 1 v t tt c cc phn t pha sau v tr bng 0.


Nu khng thy th th ton dy l s 1, y l cu hnh cui cng
D liu vo (Input): nhp t file vn bn BSTR.INP cha s nguyn dng n 100
Kt qu ra (Output): ghi ra file vn bn BSTR.OUT cc dy nh phn di n.
BSTR.INP
3

BSTR.OUT
000
001
010
011
100
101
110
111

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


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Binary_Strings;
const
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
max = 100;
var
x: array[1..max] of Integer;
n, i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
Assign(f, OutputFile); Rewrite(f);
FillChar(x, SizeOf(x), 0); {Cu hnh ban u x=00..0}
repeat {Thut ton sinh}
for i := 1 to n do Write(f, x[i]); {In ra cu hnh hin ti}
WriteLn(f);
i := n; {x[i] l phn t cui dy, li dn i cho ti khi gp s 0 hoc khi i = 0 th dng}
while (i > 0) and (x[i] = 1) do Dec(i);
if i > 0 then {Cha gp phi cu hnh 111}
begin
x[i] := 1; {Thay x[i] bng s 1}
FillChar(x[i + 1], (n - i) * SizeOf(x[1]), 0); {t x[i+1] = x[i+2] = = x[n] := 0}
end;
until i = 0; { ht cu hnh}
Close(f);
end.

2.2. LIT K CC TP CON K PHN T


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

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


Cu hnh kt thc l {n - k + 1, n - k + 2, , n}.
Nhn xt: Ta s in ra tp con bng cch in ra ln lt cc phn t ca n theo th t tng dn.
Biu din mi tp con l mt dy x[1..k] trong x[1] < x[2] < < x[k]. Ta nhn thy gii
HSPHN 1999-2004

Bi ton lit k

hn trn (gi tr ln nht c th nhn) ca x[k] l n, ca x[k-1] l n - 1, ca x[k-2] l n - 2


Tng qut: gii hn trn ca x[i] = n - k + i;
Cn tt nhin, gii hn di ca x[i] (gi tr nh nht x[i] c th nhn) l x[i-1] + 1.
Nh vy nu ta ang c mt dy x i din cho mt tp con, nu x l cu hnh kt thc c
ngha l tt c cc phn t trong x u t ti gii hn trn th qu trnh sinh kt thc, nu
khng th ta phi sinh ra mt dy x mi tng dn tho mn va ln hn dy c theo ngha
khng c mt tp con k phn t no chen gia chng khi sp th t t in.
V d: n = 9, k = 6. Cu hnh ang c x = 1, 2, 6, 7, 8, 9. Cc phn t x[3] n x[6] t ti
gii hn trn nn sinh cu hnh mi ta khng th sinh bng cch tng mt phn t trong s
cc x[6], x[5], x[4], x[3] ln c, ta phi tng x[2] = 2 ln thnh x[2] = 3. c cu hnh mi
l x = 1, 3, 6, 7, 8, 9. Cu hnh ny tho mn ln hn cu hnh trc nhng cha tho
mn tnh cht va ln mun vy ta li thay x[3], x[4], x[5], x[6] bng cc gii hn di
ca n. Tc l:
x[3] := x[2] + 1 = 4
x[4] := x[3] + 1 = 5
x[5] := x[4] + 1 = 6
x[6] := x[5] + 1 = 7
Ta c cu hnh mi x = 1, 3, 4, 5, 6, 7 l cu hnh k tip. Nu mun tm tip, ta li nhn
thy rng x[6] = 7 cha t gii hn trn, nh vy ch cn tng x[6] ln 1 l c x = 1, 3, 4,
5, 6, 8.
Vy k thut sinh tp con k tip t tp c x c th xy dng nh sau:
Tm t cui dy ln u cho ti khi gp mt phn t x[i] cha t gii hn trn n - k + i.
Nu tm thy:
Tng x[i] ln 1.
t tt c cc phn t pha sau x[i] bng gii hn di.
Nu khng tm thy tc l mi phn t t gii hn trn, y l cu hnh cui cng
Input: file vn bn SUBSET.INP cha hai s nguyn dng n, k (1 k n 100) cch nhau
t nht mt du cch
Output: file vn bn SUBSET.OUT cc tp con k phn t ca tp {1, 2, , n}
SUBSET.INP
53

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

P_1_02_2.PAS * Thut ton sinh 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[1..max] of Integer;
n, k, i, j: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, k);
Close(f);
Assign(f, OutputFile); Rewrite(f);
for i := 1 to k do x[i] := i; {Khi to x := (1, 2, , k)}
repeat
{In ra cu hnh hin ti}
Write(f, '{');
for i := 1 to k - 1 do Write(f, x[i], ', ');
WriteLn(f, x[k], '}');
{Sinh tip}
i := k; {Xt t cui dy ln tm x[i] cha t gii hn trn n - k + i}
while (i > 0) and (x[i] = n - k + i) do Dec(i);
if i > 0 then {Nu cha li n 0 c ngha l cha phi cu hnh kt thc}
begin
Inc(x[i]); {Tng x[i] ln 1, t cc phn t ng sau x[i] bng gii hn di ca n}
for j := i + 1 to k do x[j] := x[j - 1] + 1;
end;
until i = 0; {Li n tn 0 c ngha l tt c cc phn t t gii hn trn - ht cu hnh}
Close(f);
end.

2.3. LIT K CC HON V


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

2.1243
8.2143
14.3142
20.4132

3.1324
9.2314
15.3214
21.4213

4.1342
10.2341
16.3241
22.4231

5.1423
11.2413
17.3412
23.4312

6.1432
12.2431
18.3421
24.4321

Nh vy hon v u tin s l 1, 2, , n. Hon v cui cng l n, n-1, , 1.


Hon v s sinh ra phi ln hn hon v hin ti, hn th na phi l hon v va ln hn
hon v hin ti theo ngha khng th c mt hon v no khc chen gia chng khi sp th t.
Gi s hon v hin ti l x = 3, 2, 6, 5, 4, 1, xt 4 phn t cui cng, ta thy chng c xp
gim dn, iu c ngha l cho d ta c hon v 4 phn t ny th no, ta cng c mt
hon v b hn hon v hin ti. Nh vy ta phi xt n x[2] = 2, thay n bng mt gi tr
khc. Ta s thay bng gi tr no?, khng th l 1 bi nu vy s c hon v nh hn, khng
th l 3 v c x[1] = 3 ri (phn t sau khng c chn vo nhng gi tr m phn t trc
chn). Cn li cc gi tr 4, 5, 6. V cn mt hon v va ln hn hin ti nn ta chn
x[2] = 4. Cn cc gi tr (x[3], x[4], x[5], x[6]) s ly trong tp {2, 6, 5, 1}. Cng v tnh va

HSPHN 1999-2004

Bi ton lit k

ln nn ta s tm biu din nh nht ca 4 s ny gn cho x[3], x[4], x[5], x[6] tc l 1, 2,


5, 6. Vy hon v mi s l 3, 4, 1, 2, 5, 6.
Ta c nhn xt g qua v d ny: on cui ca hon v hin ti c xp gim dn, s x[5] =
4 l s nh nht trong on cui gim dn tho mn iu kin ln hn x[2] = 2. Nu i ch
x[5] cho x[2] th ta s c x[2] = 4 v on cui vn c sp xp gim dn. Khi mun
biu din nh nht cho cc gi tr trong on cui th ta ch cn o ngc on cui.
Trong trng hp hon v hin ti l 2, 1, 3, 4 th hon v k tip s l 2, 1, 4, 3. Ta cng
c th coi hon v 2, 1, 3, 4 c on cui gim dn, on cui ny ch gm 1 phn t (4)
Vy k thut sinh hon v k tip t hon v hin ti c th xy dng nh sau:
Xc nh on cui gim dn di nht, tm ch s i ca phn t x[i] ng lin trc on cui
. iu ny ng ngha vi vic tm t v tr st cui dy ln u, gp ch s i u tin tha
mn x[i] < x[i+1].
Nu tm thy ch s i nh trn
Trong on cui gim dn, tm phn t x[k] nh nht tho mn iu kin x[k] > x[i]. Do
on cui gim dn, iu ny thc hin bng cch tm t cui dy ln u gp ch s k
u tin tho mn x[k] > x[i] (c th dng tm kim nh phn).
o gi tr x[k] v x[i]
Lt ngc th t on cui gim dn (t x[i+1] n x[k]) tr thnh tng dn.
Nu khng tm thy tc l ton dy sp gim dn, y l cu hnh cui cng
Input: file vn bn PERMUTE.INP cha s nguyn dng n 100
Output: file vn bn PERMUTE.OUT cc hon v ca dy (1, 2, , n)
PERMUTE.INP
3

PERMUTE.OUT
123
132
213
231
312
321

P_1_02_3.PAS * Thut ton sinh lit k hon v


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Permutation;
const
InputFile = 'PERMUTE.INP';
OutputFile = 'PERMUTE.OUT';
max = 100;
var
n, i, k, a, b: Integer;
x: array[1..max] of Integer;
f: Text;
procedure Swap(var X, Y: Integer); {Th tc o gi tr hai tham bin X, Y}
var
Temp: Integer;
begin
Temp := X; X := Y; Y := Temp;
end;
L Minh Hong

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

1010 s tng ng vi tp con {1, 3}. Hy lp chng trnh in ra tt c cc tp con ca {1,


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

L Minh Hong

12

Chuyn

3. THUT TON QUAY LUI


Thut ton quay lui dng gii bi ton lit k cc cu hnh. Mi cu hnh c xy dng
bng cch xy dng tng phn t, mi phn t c chn bng cch th tt c cc kh nng.
Gi s cu hnh cn lit k c dng x[1..n], khi thut ton quay lui thc hin qua cc bc:
1) Xt tt c cc gi tr x[1] c th nhn, th cho x[1] nhn ln lt cc gi tr . Vi mi
gi tr th gn cho x[1] ta s:
2) Xt tt c cc gi tr x[2] c th nhn, li th cho x[2] nhn ln lt cc gi tr . Vi mi
gi tr th gn cho x[2] li xt tip cc kh nng chn x[3] c tip tc nh vy n
bc:

n) Xt tt c cc gi tr x[n] c th nhn, th cho x[n] nhn ln lt cc gi tr , thng bo


cu hnh tm c x[1], x[2], , x[n].
Trn phng din quy np, c th ni rng thut ton quay lui lit k cc cu hnh n phn t
dng x[1..n] bng cch th cho x[1] nhn ln lt cc gi tr c th. Vi mi gi tr th gn
cho x[1] bi ton tr thnh lit k tip cu hnh n - 1 phn t x[2..n].
M hnh ca thut ton quay lui c th m t nh sau:
{Th tc ny th cho x[i] nhn ln lt cc gi tr m n c th nhn}
procedure Attempt(i);
begin
for mi gi tr V c th gn cho x[i] do
begin
Th cho x[i] := V;
if x[i] l phn t cui cng trong cu hnh then
Thng bo cu hnh tm c
else
begin
Ghi nhn vic cho x[i] nhn gi tr V (nu cn);
Attempt(i + 1); {Gi quy chn tip x[i+1]}
Nu cn, b ghi nhn vic th x[i] := V th gi tr khc;
end;
end;
end;

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

3.1. LIT K CC DY NH PHN DI N


Input/Output vi khun dng nh trong P_1_02_1.PAS
Biu din dy nh phn di N di dng x[1..n]. Ta s lit k cc dy ny bng cch th
dng cc gi tr {0, 1} gn cho x[i]. Vi mi gi tr th gn cho x[i] li th cc gi tr c th
gn cho x[i+1].Chng trnh lit k bng thut ton quay lui c th vit:
P_1_03_1.PAS * Thut ton quay lui lit k cc dy nh phn di n
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program BinaryStrings;
const
HSPHN 1999-2004

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.

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

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

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

3.2. LIT K CC TP CON K PHN T


Input/Output c khun dng nh trong P_1_02_2.PAS

L Minh Hong

101

X3=0

110

X3=1

111

Result

14

Chuyn

lit k cc tp con k phn t ca tp S = {1, 2, , n} ta c th a v lit k cc cu hnh


x[1..n], y cc x[i] S v x[1] < x[2] < < x[k]. Ta c nhn xt:
x[k] n
x[k-1] x[k] - 1 n - 1

x[i] n - k + i

x[1] n - k + 1.
T suy ra x[i-1] + 1 x[i] n - k + i (1 i k) y ta gi thit c thm mt s x[0] = 0
khi xt i = 1.
Nh vy ta s xt tt c cc cch chn x[1] t 1 (=x[0] + 1) n n - k + 1, vi mi gi tr ,
xt tip tt c cc cch chn x[2] t x[1] +1 n n - k + 2, c nh vy khi chn c n
x[k] th ta c mt cu hnh cn lit k. Chng trnh lit k bng thut ton quay lui nh sau:
P_1_03_2.PAS * Thut ton quay lui lit k cc tp con k phn t
{$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.

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


chng ch khc nhau th tc Attemp(i) - chn th cc gi tr cho x[i], chng trnh lit k
dy nh phn ta th chn cc gi tr 0 hoc 1 cn chng trnh lit k cc tp con k phn t
ta th chn x[i] l mt trong cc gi tr nguyn t x[i-1] + 1 n n - k + i. Qua ta c th
thy tnh ph dng ca thut ton quay lui: m hnh ci t c th thch hp cho nhiu bi
ton, khc vi phng php sinh tun t, vi mi bi ton li phi c mt thut ton sinh k
tip ring lm cho vic ci t mi bi mt khc, bn cnh , khng phi thut ton sinh k
tip no cng d ci t.

3.3. LIT K CC CHNH HP KHNG LP CHP K


lit k cc chnh hp khng lp chp k ca tp S = {1, 2, , n} ta c th a v lit k cc
cu hnh x[1..k] y cc x[i] S v khc nhau i mt.
Nh vy th tc Attempt(i) - xt tt c cc kh nng chn x[i] - s th ht cc gi tr t 1 n
n, m cc gi tr ny cha b cc phn t ng trc chn. Mun xem cc gi tr no cha
c chn ta s dng k thut dng mng nh du:
Khi to mt mng c[1..n] mang kiu logic boolean. y c[i] cho bit gi tr i c cn t
do hay b chn ri. Ban u khi to tt c cc phn t mng c l TRUE c ngha l cc
phn t t 1 n n u t do.
Ti bc chn cc gi tr c th ca x[i] ta ch xt nhng gi tr j c c[j] = TRUE c ngha
l ch chn nhng gi tr t do.
Trc khi gi quy tm x[i+1]: ta t gi tr j va gn cho x[i] l b chn c ngha l
t c[j] := FALSE cc th tc Attempt(i + 1), Attempt(i + 2) gi sau ny khng chn
phi gi tr j na
Sau khi gi quy tm x[i+1]: c ngha l sp ti ta s th gn mt gi tr khc cho x[i]
th ta s t gi tr j va th thnh t do (c[j] := TRUE), bi khi xi nhn mt gi tr
khc ri th cc phn t ng sau: x[i+1], x[i+2] hon ton c th nhn li gi tr j .
iu ny hon ton hp l trong php xy dng chnh hp khng lp: x[1] c n cch chn,
x[2] c n - 1 cch chn, Lu rng khi th tc Attempt(i) c i = k th ta khng cn phi
nh du g c v tip theo ch c in kt qu ch khng cn phi chn thm phn t no
na.
Input: file vn bn ARRANGE.INP cha hai s nguyn dng n, k (1 k n 100) cch
nhau t nht mt du cch
Output: file vn bn ARRANGE.OUT ghi cc chnh hp khng lp chp k ca tp {1, , n}

L Minh Hong

16

Chuyn
ARRANGE.INP
32

ARRANGE.OUT
12
13
21
23
31
32

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


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Arrangement;
const
InputFile = 'ARRANGES.INP';
OutputFile = 'ARRANGES.OUT';
max = 100;
var
x: array[1..max] of Integer;
c: array[1..max] of Boolean;
n, k: Integer;
f: Text;
procedure PrintResult; {Th tc in cu hnh tm c}
var
i: Integer;
begin
for i := 1 to k do Write(f, x[i], ' ');
WriteLn(f);
end;
procedure Attempt(i: Integer); {Th cc cch chn x[i]}
var
j: Integer;
begin
for j := 1 to n do
if c[j] then {Ch xt nhng gi tr j cn t do}
begin
x[i] := j;
if i = k then PrintResult {Nu chn c n xk th ch vic in kt qu}
else
begin
c[j] := False; {nh du: j b chn}
Attempt(i + 1); {Th tc ny ch xt nhng gi tr cn t do gn cho x[i+1]}
c[j] := True; {B nh du: j li l t do, bi sp ti s th mt cch chn khc ca x[i]}
end;
end;
end;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, k);
Assign(f, OutputFile); Rewrite(f);
FillChar(c, SizeOf(c), True); {Tt c cc s u cha b chn}
Attempt(1); {Th cc cch chn gi tr ca x[1]}
Close(f);
end.

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

HSPHN 1999-2004

Bi ton lit k

17

3.4. BI TON PHN TCH S


3.4.1. Bi ton
Cho mt s nguyn dng n 30, hy tm tt c cc cch phn tch s n thnh tng ca cc s
nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l 1 cch.

3.4.2. Cch lm:


Ta s lu nghim trong mng x, ngoi ra c mt mng t. Mng t xy dng nh sau: t[i] s l
tng cc phn t trong mng x t x[1] n x[i]: t[i] := x[1] + x[2] + + x[i].
Khi lit k cc dy x c tng cc phn t ng bng n, trnh s trng lp ta a thm rng
buc x[i-1] x[i].
V s phn t thc s ca mng x l khng c nh nn th tc PrintResult dng in ra 1
cch phn tch phi c thm tham s cho bit s in ra bao nhiu phn t.
Th tc quy Attempt(i) s th cc gi tr c th nhn ca x[i] (x[i] x[i - 1])
Khi no th in kt qu v khi no th gi quy tm tip ?
Lu rng t[i - 1] l tng ca tt c cc phn t t x[1] n x[i-1] do
Khi t[i] = n tc l (x[i] = n - t[i - 1]) th in kt qu
Khi tm tip, x[i+1] s phi ln hn hoc bng x[i]. Mt khc t[i+1] l tng ca cc s t
x[1] ti x[i+1] khng c vt qu n. Vy ta c t[i+1] n t[i-1] + x[i] + x[i+1] n
x[i] + x[i+1] n - t[i-1] tc l x[i] (n - t[i-1])/2. V d n gin khi n = 10 th chn x[1] =
6, 7, 8, 9 l vic lm v ngha v nh vy cng khng ra nghim m cng khng chn tip
x[2] c na.
Mt cch d hiu: ta gi quy tm tip khi gi tr x[i] c chn cn cho php chn thm
mt phn t khc ln hn hoc bng n m khng lm tng vt qu n. Cn ta in kt qu
ch khi x[i] mang gi tr ng bng s thiu ht ca tng i-1 phn t u so vi n.
Vy th tc Attempt(i) th cc gi tr cho x[i] c th vit nh sau: ( tng qut cho i = 1, ta
t x[0] = 1 v t[0] = 0).
Xt cc gi tr ca x[i] t x[i - 1] n (n - t[i-1]) div 2, cp nht t[i] := t[i - 1] + x[i] v gi
quy tm tip.
Cui cng xt gi tr x[i] = n - t[i-1] v in kt qu t x[1] n x[i].
Input: file vn bn ANALYSE.INP cha s nguyn dng n 100
Output: file vn bn ANALYSE.OUT ghi cc cch phn tch s n.

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

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


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analyses;
const
InputFile = 'ANALYSE.INP';
OutputFile = 'ANALYSE.OUT';
max = 100;
var
n: Integer;
x: array[0..max] of Integer;
t: array[0..max] of Integer;
f: Text;
procedure Init; {Khi to}
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
x[0] := 1;
t[0] := 0;
end;
procedure PrintResult(k: Integer);
var
i: Integer;
begin
Write(f, n, ' = ');
for i := 1 to k - 1 do Write(f, x[i], '+');
WriteLn(f, x[k]);
end;
procedure Attempt(i: Integer);
var
j: Integer;
begin
for j := x[i - 1] to (n - T[i - 1]) div 2 do {Trng hp cn chn tip x[i+1]}
begin
x[i] := j;
t[i] := t[i - 1] + j;
Attempt(i + 1);
end;
x[i] := n - T[i - 1]; {Nu x[i] l phn t cui th n bt buc phi l n-T[i-1], in kt qu}
PrintResult(i);
end;
begin
Init;
Assign(f, OutputFile); Rewrite(f);
Attempt(1);
Close(f);
HSPHN 1999-2004

Bi ton lit k

19

end.

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

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:

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

3.5.2. Phn tch


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

L Minh Hong

20

Chuyn

1
2

3
4
W

E
5
6
S

7
8

Hnh 3: ng cho B-TN mang ch s 10 v ng cho N-TB mang ch s 0

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

thnh t do, bi khi t qun hu i sang v tr khc ri th ct v 2 ng cho


hon ton c th gn cho mt qun hu khc
Hy xem li trong cc chng trnh lit k chnh hp khng lp v hon v v k thut nh
du. y ch khc vi lit k hon v l: lit k hon v ch cn mt mng nh du xem gi
tr c t do khng, cn bi ton xp hu th cn phi nh du c 3 thnh phn: Ct, ng
cho B-TN, ng cho N- TB. Trng hp n gin hn: Yu cu lit k cc cch t n
qun xe ln bn c nxn sao cho khng qun no n qun no chnh l bi ton lit k hon v
Input: file vn bn QUEENS.INP cha s nguyn dng n 100
Output: file vn bn QUEENS.OUT, mi dng ghi mt cch t n qun hu
QUEENS.INP
5

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

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

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

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

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

2);
5);
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);

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


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program n_Queens;
const
InputFile = 'QUEENS.INP';
OutputFile = 'QUEENS.OUT';
max = 100;
var
n: Integer;
x: array[1..max] of Integer;
a: array[1..max] of Boolean;
b: array[2..2 * max] of Boolean;
c: array[1 - max..max - 1] of Boolean;
f: Text;
procedure Init;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
FillChar(a, SizeOf(a), True); {Mi ct u t do}
FillChar(b, SizeOf(b), True); {Mi ng cho ng Bc - Ty Nam u t do}
FillChar(c, SizeOf(c), True); {Mi ng cho ng Nam - Ty Bc u t do}
end;
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to n do Write(f, '(', i, ', ', x[i], '); ');
WriteLn(f);
end;
procedure Attempt(i: Integer); {Th cc cch t qun hu th i vo hng i}
var
j: Integer;
L Minh Hong

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.

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


bng quay lui th chnh xc hn, tuy nhin ng trn phng din bi ton, nu nh ta coi
cng vic gii bi ton bng cch xt tt c cc kh nng cng l 1 cch gii th tn gi Thut
ton quay lui cng khng c g tri logic. Xt hot ng ca chng trnh trn cy tm kim
quay lui ta thy ti bc th chn x[i] n s gi quy tm tip x[i+1] c ngha l qu trnh
s duyt tin su xung pha di n tn nt l, sau khi duyt ht cc nhnh, tin trnh li
li th p t mt gi tr khc cho x[i], chnh l ngun gc ca tn gi thut ton quay
lui
Bi tp:
Bi 1
Mt s chng trnh trn x l khng tt trong trng hp tm thng (n = 0 hoc k = 0), hy
khc phc cc li
Bi 2
Vit chng trnh lit k cc chnh hp lp chp k ca n phn t
Bi 3
Cho hai s nguyn dng l, n. Hy lit k cc xu nh phn di n c tnh cht, bt k hai
xu con no di l lin nhau u khc nhau.
Bi 4
Vi n = 5, k = 3, v cy tm kim quay lui ca chng trnh lit k t hp chp k ca tp {1,
2, , n}
Bi 5
Lit k tt c cc tp con ca tp S gm n s nguyn {S[1], S[2], , S[n]} nhp vo t bn
phm
Bi 6
HSPHN 1999-2004

Bi ton lit k

23

Tng t nh bi 5 nhng ch lit k cc tp con c max - min T (T cho trc).


Bi 7
Mt dy x[1..n] gi l mt hon v hon ton ca tp {1, 2, , n} nu n l mt hon v v
tho mn x[i] i vi i: 1 i n. Hy vit chng trnh lit k tt c cc hon v hon ton
ca tp trn (n vo t bn phm).
Bi 8
Sa li th tc in kt qu (PrintResult) trong bi xp hu c th v hnh bn c v cc cch
t hu ra mn hnh.
Bi 9
M i tun: Cho bn c tng qut kch thc nxn v mt qun M, hy ch ra mt hnh trnh
ca qun M xut pht t ang ng i qua tt c cc cn li ca bn c, mi ng 1 ln.
Bi 10
Chuyn tt c cc bi tp trong bi trc ang vit bng sinh tun t sang quay lui.
Bi 11
Xt s giao thng gm n nt giao thng nh s t 1 ti n v m on ng ni chng,
mi on ng ni 2 nt giao thng. Hy nhp d liu v mng li giao thng , nhp s
hiu hai nt giao thng s v d. Hy in ra tt c cc cch i t s ti d m mi cch i khng
c qua nt giao thng no qu mt ln.

L Minh Hong

24

Chuyn

4. K THUT NHNH CN
4.1. BI TON TI U
Mt trong nhng bi ton t ra trong thc t l vic tm ra mt nghim tho mn mt s iu
kin no , v nghim l tt nht theo mt ch tiu c th, nghin cu li gii cc lp bi
ton ti u thuc v lnh vc quy hoch ton hc. Tuy nhin cng cn phi ni rng trong
nhiu trng hp chng ta cha th xy dng mt thut ton no thc s hu hiu gii bi
ton, m cho ti nay vic tm nghim ca chng vn phi da trn m hnh lit k ton b cc
cu hnh c th v nh gi, tm ra cu hnh tt nht. Vic lit k cu hnh c th ci t bng
cc phng php lit k: Sinh tun t v tm kim quay lui. Di y ta s tm hiu phng
php lit k bng thut ton quay lui tm nghim ca bi ton ti u.

4.2. S BNG N T HP
M hnh thut ton quay lui l tm kim trn 1 cy phn cp. Nu gi thit rng ng vi mi
nt tng ng vi mt gi tr c chn cho x[i] s ng vi ch 2 nt tng ng vi 2 gi tr
m x[i+1] c th nhn th cy n cp s c ti 2n nt l, con s ny ln hn rt nhiu ln so vi
d liu u vo n. Chnh v vy m nu nh ta c thao tc tha trong vic chn x[i] th s phi
tr gi rt ln v chi ph thc thi thut ton bi qu trnh tm kim lng vng v ngha trong
cc bc chn k tip x[i+1], x[i+2], Khi , mt vn t ra l trong qu trnh lit k li
gii ta cn tn dng nhng thng tin tm c loi b sm nhng phng n chc chn
khng phi ti u. K thut gi l k thut nh gi nhnh cn trong tin trnh quay lui.

4.3. M HNH K THUT NHNH CN


Da trn m hnh thut ton quay lui, ta xy dng m hnh sau:
procedure Init;
begin
Khi to mt cu hnh bt k BESTCONFIG;
end;
{Th tc ny th chn cho x[i] tt c cc gi tr n c th nhn}
procedure Attempt(i: Integer);
begin
for Mi gi tr V c th gn cho x[i] do
begin
Th cho x[i] := V;
if Vic th trn vn cn hi vng tm ra cu hnh tt hn BESTCONFIG then
if x[i] l phn t cui cng trong cu hnh then
Cp nht BESTCONFIG
else
begin
Ghi nhn vic th x[i] = V nu cn;
Attempt(i + 1); {Gi quy, chn tip x[i+1]}
B ghi nhn vic th cho x[i] = V (nu cn);
end;
end;
end;
HSPHN 1999-2004

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

4.4. BI TON NGI DU LCH


4.4.1. Bi ton
Cho n thnh ph nh s t 1 n n v m tuyn ng giao thng hai chiu gia chng, mng
li giao thng ny c cho bi bng C cp nxn, y C[i, j] = C[j, i] = Chi ph i on
ng trc tip t thnh ph i n thnh ph j. Gi thit rng C[i, i] = 0 vi i, C[i, j] = +
nu khng c ng trc tip t thnh ph i n thnh ph j.
Mt ngi du lch xut pht t thnh ph 1, mun i thm tt c cc thnh ph cn li mi
thnh ph ng 1 ln v cui cng quay li thnh ph 1. Hy ch ra cho ngi hnh trnh
vi chi ph t nht. Bi ton gi l bi ton ngi du lch hay bi ton hnh trnh ca mt
thng gia (Traveling Salesman)

4.4.2. Cch gii


Hnh trnh cn tm c dng x[1..n + 1] trong x[1] = x[n + 1] = 1 y gia x[i] v x[i+1]:
hai thnh ph lin tip trong hnh trnh phi c ng i trc tip (C[i, j] +) v ngoi tr
thnh ph 1, khng thnh ph no c lp li hai ln. C ngha l dy x[1..n] lp thnh 1
hon v ca (1, 2, , n).
Duyt quay lui: x[2] c th chn mt trong cc thnh ph m x[1] c ng i ti (trc tip),
vi mi cch th chn x[2] nh vy th x[3] c th chn mt trong cc thnh ph m x[2] c
ng i ti (ngoi x[1]). Tng qut: x[i] c th chn 1 trong cc thnh ph cha i qua m
t x[i-1] c ng i trc tip ti (1 i n).
Nhnh cn: Khi to cu hnh BestConfig c chi ph = +. Vi mi bc th chn x[i] xem
chi ph ng i cho ti lc c < Chi ph ca cu hnh BestConfig?, nu khng nh hn th
th gi tr khc ngay bi c i tip cng ch tn thm. Khi th c mt gi tr x[n] ta kim
tra xem x[n] c ng i trc tip v 1 khng ? Nu c nh gi chi ph i t thnh ph 1 n
thnh ph x[n] cng vi chi ph t x[n] i trc tip v 1, nu nh hn chi ph ca ng i
BestConfig th cp nht li BestConfig bng cch i mi.
Sau th tc tm kim quay lui m chi ph ca BestConfig vn bng + th c ngha l n
khng tm thy mt hnh trnh no tho mn iu kin bi cp nht BestConfig, bi ton
L Minh Hong

26

Chuyn

khng c li gii, cn nu chi ph ca BestConfig < + th in ra cu hnh BestConfig - l


hnh trnh t tn km nht tm c
Input: file vn bn TOURISM.INP
Dng 1: Cha s thnh ph n (1 n 100) v s tuyn ng m trong mng li giao
thng
m dng tip theo, mi dng ghi s hiu hai thnh ph c ng i trc tip v chi ph i
trn qung ng (chi ph ny l s nguyn dng 10000)
Output: file vn bn TOURISM.OUT, ghi hnh trnh tm c.
2

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

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


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program TravellingSalesman;
const
InputFile = 'TOURISM.INP';
OutputFile = 'TOURISM.OUT';
max = 100;
maxE = 10000;
maxC = max * maxE;{+}
var
C: array[1..max, 1..max] of Integer; {Ma trn chi ph}
X, BestWay: array[1..max + 1] of Integer; {X th cc kh nng, BestWay ghi nhn nghim}
T: array[1..max + 1] of Integer; {T[i] lu chi ph i t X[1] n X[i]}
Free: array[1..max] of Boolean; {Free nh du, Free[i]= True nu cha i qua tp i}
m, n: Integer;
MinSpending: Integer; {Chi ph hnh trnh ti u}
procedure Enter;
var
i, j, k: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, m);
for i := 1 to n do {Khi to bng chi ph ban u}
for j := 1 to n do
if i = j then C[i, j] := 0 else C[i, j] := maxC;
for k := 1 to m do
begin
ReadLn(f, i, j, C[i, j]);
C[j, i] := C[i, j]; {Chi ph nh nhau trn 2 chiu}
end;
Close(f);
end;
procedure Init; {Khi to}
begin
FillChar(Free, n, True);
Free[1] := False; {Cc thnh ph l cha i qua ngoi tr thnh ph 1}
HSPHN 1999-2004

Bi ton lit k

27

X[1] := 1; {Xut pht t thnh ph 1}


T[1] := 0; {Chi ph ti thnh ph xut pht l 0}
MinSpending := maxC;
end;
procedure Attempt(i: Integer); {Th cc cch chn xi}
var
j: Integer;
begin
for j := 2 to n do {Th cc thnh ph t 2 n n}
if Free[j] then {Nu gp thnh ph cha i qua}
begin
X[i] := j; {Th i}
T[i] := T[i - 1] + C[x[i - 1], j]; {Chi ph := Chi ph bc trc + chi ph ng i trc tip}
if T[i] < MinSpending then {Hin nhin nu c iu ny th C[x[i - 1], j] < + ri}
if i < n then {Nu cha n c x[n]}
begin
Free[j] := False; {nh du thnh ph va th}
Attempt(i + 1); {Tm cc kh nng chn x[i+1]}
Free[j] := True; {B nh du}
end
else
if T[n] + C[x[n], 1] < MinSpending then {T x[n] quay li 1 vn tn chi ph t hn trc}
begin {Cp nht BestConfig}
BestWay := X;
MinSpending := T[n] + C[x[n], 1];
end;
end;
end;
procedure PrintResult;
var
i: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if MinSpending = maxC then WriteLn(f, 'NO SOLUTION')
else
for i := 1 to n do Write(f, BestWay[i], '->');
WriteLn(f, 1);
WriteLn(f, 'Cost: ', MinSpending);
Close(f);
end;
begin
Enter;
Init;
Attempt(2);
PrintResult;
end.

Trn y l mt gii php nhnh cn cn rt th s gii bi ton ngi du lch, trn thc t
ngi ta cn c nhiu cch nh gi nhnh cn cht hn na. Hy tham kho cc ti liu khc
tm hiu v nhng phng php .

4.5. DY ABC
Cho trc mt s nguyn dng N (N 100), hy tm mt xu ch gm cc k t A, B, C
tho mn 3 iu kin:
C di N
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.

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


chng trnh s chy chm hn cht t. L do: th tc Attempt trn s th ln lt cc gi tr
'A', 'B', ri mi n 'C'. C ngha ngay trong cch tm, n tit kim s dng k t 'C' nht
nn trong phn ln cc b d liu n nhanh chng tm ra li gii hn so vi bi ton tng
L Minh Hong

30

Chuyn

ng tm xu t k t 'B' nht. Chnh v vy m nu nh bi yu cu t k t 'B' nht ta c


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

((()()))
((())())
((()))()
(()(()))
()((()))

Bi ton t ra l khi cho bit trc hai s nguyn dng n v k. Hy lit k ht cc dy


ngoc hp l c di l n v su l k (lm c vi n cng ln cng tt).
Bi 2
Cho mt bi mn kch thc mxn vung, trn mt c th c cha mt qu mn hoc khng,
biu din bn mn , ngi ta c hai cch:
Cch 1: dng bn nh du: s dng mt li vung kch thc mxn, trn ti (i, j)
ghi s 1 nu c mn, ghi s 0 nu khng c mn
Cch 2: dng bn mt : s dng mt li vung kch thc mxn, trn ti (i, j) ghi
mt s trong khong t 0 n 8 cho bit tng s mn trong cc ln cn vi (i, j) ( ln cn
vi (i, j) l c chung vi (i, j) t nht 1 nh).
Gi thit rng hai bn c ghi chnh xc theo tnh trng mn trn hin trng.

HSPHN 1999-2004

Bi ton lit k

31

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


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

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

PHN 2. CU TRC D LIU V


GII THUT

Ht nhn ca cc chng trnh my tnh l s lu tr v x l thng tin.


Vic t chc d liu nh th no c nh hng rt ln n cch thc x
l d liu cng nh tc thc thi v s chim dng b nh ca
chng trnh. Vic c t bng cc cu trc tng qut (generic structures)
v cc kiu d liu tru tng (abstract data types) cn cho php ngi
lp trnh c th d dng hnh dung ra cc cng vic c th v gim bt
cng sc trong vic chnh sa, nng cp v s dng li cc thit k c.
Mc ch ca phn ny l cung cp nhng hiu bit nn tng trong vic
thit k mt chng trnh my tnh, thy r c s cn thit ca vic
phn tch, la chn cu trc d liu ph hp cho tng bi ton c th;
ng thi kho st mt s cu trc d liu v thut ton kinh in m lp
trnh vin no cng cn phi nm vng.

34

Chuyn

1. CC BC C BN KHI TIN HNH GII CC BI TON TIN


HC
1.1. XC NH BI TON
Input Process Output
(D liu vo X l Kt qu ra)
Vic xc nh bi ton tc l phi xc nh xem ta phi gii quyt vn g?, vi gi thit no
cho v li gii cn phi t nhng yu cu g. Khc vi bi ton thun tu ton hc ch cn
xc nh r gi thit v kt lun ch khng cn xc nh yu cu v li gii, i khi nhng bi
ton tin hc ng dng trong thc t ch cn tm li gii tt ti mc no , thm ch l ti
mc chp nhn c. Bi li gii tt nht i hi qu nhiu thi gian v chi ph.
V d:
Khi ci t cc hm s phc tp trn my tnh. Nu tnh bng cch khai trin chui v hn th
chnh xc cao hn nhng thi gian chm hn hng t ln so vi phng php xp x. Trn
thc t vic tnh ton lun lun cho php chp nhn mt sai s no nn cc hm s trong
my tnh u c tnh bng phng php xp x ca gii tch s
Xc nh ng yu cu bi ton l rt quan trng bi n nh hng ti cch thc gii quyt v
cht lng ca li gii. Mt bi ton thc t thng cho bi nhng thng tin kh m h v
hnh thc, ta phi pht biu li mt cch chnh xc v cht ch hiu ng bi ton.
V d:
Bi ton: Mt d n c n ngi tham gia tho lun, h mun chia thnh cc nhm v mi
nhm tho lun ring v mt phn ca d n. Nhm c bao nhiu ngi th c trnh ln by
nhiu kin. Nu ly mi nhm mt kin em ghp li th c mt b kin trin khai
d n. Hy tm cch chia s b kin cui cng thu c l ln nht.
Pht biu li: Cho mt s nguyn dng n, tm cc phn tch n thnh tng cc s nguyn
dng sao cho tch ca cc s l ln nht.
Trn thc t, ta nn xt mt vi trng hp c th thng qua hiu c bi ton r hn
v thy c cc thao tc cn phi tin hnh. i vi nhng bi ton n gin, i khi ch cn
qua v d l ta c th a v mt bi ton quen thuc gii.

1.2. TM CU TRC D LIU BIU DIN BI TON


Khi gii mt bi ton, ta cn phi nh ngha tp hp d liu biu din tnh trng c th.
Vic la chn ny tu thuc vo vn cn gii quyt v nhng thao tc s tin hnh trn d
liu vo. C nhng thut ton ch thch ng vi mt cch t chc d liu nht nh, i vi
nhng cch t chc d liu khc th s km hiu qu hoc khng th thc hin c. Chnh v
vy nn bc xy dng cu trc d liu khng th tch ri bc tm kim thut ton gii
quyt vn .
HSPHN 1999-2004

Cu trc d liu v gii thut

35

Cc tiu chun khi la chn cu trc d liu


Cu trc d liu trc ht phi biu din c y cc thng tin nhp v xut ca bi
ton
Cu trc d liu phi ph hp vi cc thao tc ca thut ton m ta la chn gii quyt
bi ton.
Cu trc d liu phi ci t c trn my tnh vi ngn ng lp trnh ang s dng
i vi mt s bi ton, trc khi t chc d liu ta phi vit mt on chng trnh nh
kho st xem d liu cn lu tr ln ti mc no.

1.3. TM THUT TON


Thut ton l mt h thng cht ch v r rng cc quy tc nhm xc nh mt dy thao tc
trn cu trc d liu sao cho: Vi mt b d liu vo, sau mt s hu hn bc thc hin cc
thao tc ch ra, ta t c mc tiu nh.
Cc c trng ca thut ton

1.3.1. Tnh n ngha


mi bc ca thut ton, cc thao tc phi ht sc r rng, khng gy nn s nhp nhng,
ln xn, tu tin, a ngha.
Khng nn ln ln tnh n ngha v tnh n nh: Ngi ta phn loi thut ton ra lm hai
loi: n nh (Deterministic) v Ngu nhin (Randomized). Vi hai b d liu ging nhau
cho trc lm input, thut ton n nh s thi hnh cc m lnh ging nhau v cho kt qu
ging nhau, cn thut ton ngu nhin c th thc hin theo nhng m lnh khc nhau v cho
kt qu khc nhau. V d nh yu cu chn mt s t nhin x: a x b, nu ta vit x := a hay
x := b hay x := (a + b) div 2, thut ton s lun cho mt gi tr duy nht vi d liu vo l hai
s t nhin a v b. Nhng nu ta vit x := a + Random(b - a + 1) th s c th thu c cc kt
qu khc nhau trong mi ln thc hin vi input l a v b tu theo my tnh v b to s ngu
nhin.

1.3.2. Tnh dng


Thut ton khng c ri vo qu trnh v hn, phi dng li v cho kt qu sau mt s hu
hn bc.

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.

1.3.4. Tnh ph dng


Thut ton phi d sa i thch ng c vi bt k bi ton no trong mt lp cc bi
ton v c th lm vic trn cc d liu khc nhau.

L Minh Hong

36

Chuyn

1.3.5. Tnh kh thi


Kch thc phi nh: V d: Mt thut ton s c tnh hiu qu bng 0 nu lng b
nh m n yu cu vt qu kh nng lu tr ca h thng my tnh.
Thut ton phi chuyn c thnh chng trnh: V d mt thut ton yu cu phi biu
din c s v t vi chnh xc tuyt i l khng hin thc vi cc h thng my tnh
hin nay
Thut ton phi c my tnh thc hin trong thi gian cho php, iu ny khc vi li
gii ton (Ch cn chng minh l kt thc sau hu hn bc). V d nh xp thi kho biu
cho mt hc k th khng th cho my tnh chy ti hc k sau mi ra c.
V d:
Input: 2 s nguyn t nhin a v b khng ng thi bng 0
Output: c s chung ln nht ca a v b
Thut ton s tin hnh c m t nh sau: (Thut ton Euclide)
Bc 1 (Input): Nhp a v b: S t nhin
Bc 2: Nu b 0 th chuyn sang bc 3, nu khng th b qua bc 3, i lm bc 4
Bc 3: t r := a mod b; t a := b; t b := r; Quay tr li bc 2.
Bc 4 (Output): Kt lun c s chung ln nht phi tm l gi tr ca a. Kt thc thut ton.
Begin

Input: a, b

b>0?

No

Output a;

Yes
r := a mod b;
a := b;
b := r

End

Hnh 4: Lu thut gii (Flowchart)

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

Cu trc d liu v gii thut

37

Tnh ng n ca nhng m-un thuc ta khng cn phi quan tm na m tp trung gii


quyt cc phn khc.

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

Li thut ton: Li ny t gp nht nhng nguy him nht, nu nh th phi iu chnh li


thut ton, nu nng th c khi phi loi b hon ton thut ton sai v lm li t u.

1.5.2. Xy dng cc b test


C nhiu chng trnh rt kh kim tra tnh ng n. Nht l khi ta khng bit kt qu ng
l th no?. V vy nu nh chng trnh vn chy ra kt qu (khng bit ng sai th no) th
vic tm li rt kh khn. Khi ta nn lm cc b test th chng trnh ca mnh.
Cc b test nn t trong cc file vn bn, bi vic to mt file vn bn rt nhanh v mi ln
chy th ch cn thay tn file d liu vo l xong, khng cn g li b test t bn phm. Kinh
nghim lm cc b test l:
Bt u vi mt b test nh, n gin, lm bng tay cng c c p s so snh vi kt
qu chng trnh chy ra.
Tip theo vn l cc b test nh, nhng cha cc gi tr c bit hoc tm thng. Kinh
nghim cho thy y l nhng test d sai nht.
Cc b test phi a dng, trnh s lp i lp li cc b test tng t.
C mt vi test ln ch kim tra tnh chu ng ca chng trnh m thi. Kt qu c ng
hay khng th trong a s trng hp, ta khng th kim chng c vi test ny.
Lu rng chng trnh chy qua c ht cc test khng c ngha l chng trnh
ng. Bi c th ta cha xy dng c b test lm cho chng trnh chy sai. V vy nu c
th, ta nn tm cch chng minh tnh ng n ca thut ton v chng trnh, iu ny
thng rt kh.

1.6. TI U CHNG TRNH


Mt chng trnh chy ng khng c ngha l vic lp trnh xong, ta phi sa i li
mt vi chi tit chng trnh c th chy nhanh hn, hiu qu hn. Thng thng, trc
khi kim th th ta nn t mc tiu vit chng trnh sao cho n gin, min sao chy ra kt
qu ng l c, sau khi ti u chng trnh, ta xem li nhng ch no vit cha tt th
ti u li m lnh chng trnh ngn hn, chy nhanh hn. Khng nn vit ti u ti u
m n , bi chng trnh c m lnh ti u thng phc tp v kh kim sot.
Vic ti u chng trnh nn da trn cc tiu chun sau:

1.6.1. Tnh tin cy


Chng trnh phi chy ng nh d nh, m t ng mt gii thut ng. Thng thng khi
vit chng trnh, ta lun c thi quen kim tra tnh ng n ca cc bc mi khi c th.

1.6.2. Tnh uyn chuyn


Chng trnh phi d sa i. Bi t c chng trnh no vit ra hon ho ngay c m
vn cn phi sa i li. Chng trnh vit d sa i s lm gim bt cng sc ca lp trnh
vin khi pht trin chng trnh.

HSPHN 1999-2004

Cu trc d liu v gii thut

39

1.6.3. Tnh trong sng


Chng trnh vit ra phi d c d hiu, sau mt thi gian di, khi c li cn hiu mnh
lm ci g?. nu c iu kin th cn c th sa sai (nu pht hin li mi), ci tin hay
bin i c chng trnh gii quyt bi ton khc. Tnh trong sng ca chng trnh ph
thuc rt nhiu vo cng c lp trnh v phong cch lp trnh.

1.6.4. Tnh hu hiu


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

(*)

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


ch n cng nhiu cng tt

L Minh Hong

40

Chuyn

2. PHN TCH THI GIAN THC HIN GII THUT


2.1. GII THIU
Vi mt bi ton khng ch c mt gii thut. Chn mt gii thut a ti kt qu nhanh nht
l mt i hi thc t. Nh vy cn c mt cn c no ni rng gii thut ny nhanh
hn gii thut kia ?.
Thi gian thc hin mt gii thut bng chng trnh my tnh ph thuc vo rt nhiu yu t.
Mt yu t cn ch nht l kch thc ca d liu a vo. D liu cng ln th thi gian
x l cng chm, chng hn nh thi gian sp xp mt dy s phi chu nh hng ca s
lng cc s thuc dy s . Nu gi n l kch thc d liu a vo th thi gian thc hin
ca mt gii thut c th biu din mt cch tng i nh mt hm ca n: T(n).
Phn cng my tnh, ngn ng vit chng trnh v chng trnh dch ngn ng y u nh
hng ti thi gian thc hin. Nhng yu t ny khng ging nhau trn cc loi my, v vy
khng th da vo chng khi xc nh T(n). Tc l T(n) khng th biu din bng n v thi
gian gi, pht, giy c. Tuy nhin, khng phi v th m khng th so snh c cc gii
thut v mt tc . Nu nh thi gian thc hin mt gii thut l T1(n) = n2 v thi gian thc
hin ca mt gii thut khc l T2(n) = 100n th khi n ln, thi gian thc hin ca gii thut
T2 r rng nhanh hn gii thut T1. Khi , nu ni rng thi gian thc hin gii thut t l
thun vi n hay t l thun vi n2 cng cho ta mt cch nh gi tng i v tc thc hin
ca gii thut khi n kh ln. Cch nh gi thi gian thc hin gii thut c lp vi my
tnh v cc yu t lin quan ti my tnh nh vy s dn ti khi nim gi l phc tp tnh
ton ca gii thut.

2.2. CC K PHP NH GI PHC TP TNH TON


Cho mt gii thut thc hin trn d liu vi kch thc n. Gi s T(n) l thi gian thc hin
mt gii thut , g(n) l mt hm xc nh dng vi mi n. Khi ta ni phc tp tnh
ton ca gii thut l:
(g(n)) nu tn ti cc hng s dng c1, c2 v n0 sao cho c1.g(n) f(n) c2.g(n) vi mi n
n0. K php ny c gi l k php ln (big-theta notation). Trong k php ln,
hm g(.) c gi l gii hn cht (asymptotically tight bound) ca hm T(.)
O(g(n)) nu tn ti cc hng s dng c v n0 sao cho T(n) c.g(n) vi mi n n0. K
php ny c gi l k php ch O ln (big-oh notation). Trong k php ch O ln, hm
g(.) c gi l gii hn trn (asymptotic upper bound) ca hm T(.)
(g(n)) nu tn ti cc hng s dng c v n0 sao cho c.g(n) T(n) vi mi n n0. K
hiu ny gi l k php ln (big-omega notation). Trong k php ln, hm g(.) c
gi l gii hn di (asymptotic lower bound) ca hm T(.)

HSPHN 1999-2004

Cu trc d liu v gii thut

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))

Hnh 5: K php ln, ln v ln

Ta ni phc tp tnh ton ca gii thut l


o(g(n)) nu vi mi hng s dng c, tn ti mt hng s dng n0 sao cho T(n) c.g(n)
vi mi n n0. K php ny gi l k php ch o nh (little-oh notation).
(g(n)) nu vi mi hng s dng c, tn ti mt hng s dng n0 sao cho c.g(n) T(n)
vi mi n n0. K php ny gi l k php nh (little-omega notation)
V d nu T(n) = n2 + 1, th:
T(n) = O(n2). Tht vy, chn c = 2 v n0 = 1. R rng vi mi n 1, ta c:
T(n)=n 2 +1 2n 2 =2.g(n)
T(n) o(n2). Tht vy, chn c = 1. R rng khng tn ti n : n 2 + 1 n 2 , tc l khng tn
ti n0 tho mn nh ngha ca k php ch o nh.
Lu rng khng c k php nh
Mt vi tnh cht:
Tnh bc cu (transitivity): Tt c cc k php nu trn u c tnh bc cu:
Nu f(n) = (g(n)) v g(n) = (h(n)) th f(n) = (h(n)).
Nu f(n) = O(g(n)) v g(n) = O(h(n)) th f(n) = O(h(n)).
Nu f(n) = (g(n)) v g(n) = (h(n)) th f(n) = (h(n)).
Nu f(n) = o(g(n)) v g(n) = o(h(n)) th f(n) = o(h(n)).
Nu f(n) = (g(n)) v g(n) = (h(n)) th f(n) = (h(n)).
Tnh phn x (reflexivity): Ch c cc k php ln mi c tnh phn x:
f(n) = (f(n)).
f(n) = O(f(n)).
f(n) = (f(n)).
Tnh i xng (symmetry): Ch c k php ln c tnh i xng:
L Minh Hong

42

Chuyn

f(n) = (g(n)) nu v ch nu g(n) = (f(n)).


Tnh chuyn v i xng (transpose symmetry):
f(n) = O(g(n)) nu v ch nu g(n) = (f(n)).
f(n) = o(g(n)) nu v ch nu g(n) = (f(n)).
d nh ta coi cc k php , , , , ln lt tng ng vi cc php so snh , , =, <,
>. T suy ra cc tnh cht trn.

2.3. XC NH PHC TP TNH TON CA GII THUT


Vic xc nh phc tp tnh ton ca mt gii thut bt k c th rt phc tp. Tuy nhin
phc tp tnh ton ca mt s gii thut trong thc t c th tnh bng mt s qui tc n
gin.

2.3.1. Qui tc b hng s


Nu on chng trnh P c thi gian thc hin T(n) = O(c1.f(n)) vi c1 l mt hng s dng
th c th coi on chng trnh c phc tp tnh ton l O(f(n)).
Chng minh:
T(n) = O(c1.f(n)) nn c0 > 0 v n0 > 0 T(n) c0.c1.f(n) vi n n0. t C = c0.c1 v
dng nh ngha, ta c T(n) = O(f(n)).
Qui tc ny cng ng vi cc k php , , v .

2.3.2. Quy tc ly max


Nu on chng trnh P c thi gian thc hin T(n) = O(f(n) + g(n)) th c th coi on
chng trnh c phc tp tnh ton O(max(f(n), g(n))).
Chng minh
T(n) = O(f(n) + g(n)) nn C > 0 v n0 > 0 T(n) C.f(n) + C.g(n), n n0.
Vy T(n) C.f(n) + C.g(n) 2C.max(f(n), g(n)) (n n0).
T nh ngha suy ra T(n) = O(max(f(n), g(n))).
Quy tc ny cng ng vi cc k php , , v .

2.3.3. Quy tc cng


Nu on chng trnh P1 c thi gian thc hin T1(n) =O(f(n)) v on chng trnh P2 c
thi gian thc hin l T2(n) = O(g(n)) th thi gian thc hin P1 ri n P2 tip theo s l
T1(n) + T2(n) = O(f(n) + g(n))
Chng minh:
T1(n) = O(f(n)) nn n1 > 0 v c1 > 0 T1(n) c1.f(n) vi n n1.
T2(n) = O(g(n)) nn n2 > 0 v c2 > 0 T2(n) c2.g(n) vi n n2.
Chn n0 = max(n1, n2) v c = max(c1, c2) ta c:
Vi n n0:
HSPHN 1999-2004

Cu trc d liu v gii thut

43

T1(n) + T2(n) c1.f(n) + c2.g(n) c.f(n) + c.g(n) c.(f(n) + g(n))


Vy T1(n) + T2(n) = O(f(n) + g(n)).
Quy tc cng cng ng vi cc k php , , v .

2.3.4. Quy tc nhn


Nu on chng trnh P c thi gian thc hin l T(n) = O(f(n)). Khi , nu thc hin k(n)
ln on chng trnh P vi k(n) = O(g(n)) th phc tp tnh ton s l O(g(n).f(n))
Chng minh:
Thi gian thc hin k(n) ln on chng trnh P s l k(n)T(n). Theo nh ngha:
ck 0 v nk > 0 k(n) ck(g(n)) vi n nk
cT 0 v nT > 0 T(n) cT(f(n)) vi n nT
Vy vi n max(nT, nk) ta c k(n).T(n) cT.ck(g(n).f(n))
Quy tc nhn cng ng vi cc k php , , v .

2.3.5. nh l Master (Master Theorem)


Cho a 1 v b >1 l hai hng s, f(n) l mt hm vi i s n, T(n) l mt hm xc nh trn
tp cc s t nhin c nh ngha nh sau:
T ( n ) = a.T ( n/b ) + f ( n )

y n/b c th hiu l n/b hay n/b. Khi :

Nu f (n) = O n logb a vi hng s >0, th T(n) = n log b a

( )
(
)
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.

2.3.6. Mt s tnh cht


Ta quan tm ch yu ti cc k php ln. R rng k php l cht hn k php O v
theo ngha: Nu phc tp tnh ton ca gii thut c th vit l (f(n)) th cng c th vit
l O(f(n)) cng nh (f(n)). Di y l mt s cch biu din phc tp tnh ton qua k
php .
Nu mt thut ton c thi gian thc hin l P(n), trong P(n) l mt a thc bc k th
phc tp tnh ton ca thut ton c th vit l (nk).

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

1024 32768 2147483648

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;

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


3 lp n ln php gn S := S + i, nn thi gian tnh ton t l thun vi n. Tc l phc tp
tnh ton l (n). Dng quy tc cng v quy tc ly max, ta suy ra phc tp tnh ton ca
gii thut trn l (n).
Cn nu vit theo s nh sau:
Input n;
S := n * (n - 1) div 2;
Output S;

Th phc tp tnh ton ca thut ton trn l (1), thi gian tnh ton khng ph thuc vo
n.

2.3.7. Php ton tch cc


Da vo nhng nhn xt nu trn v cc quy tc khi nh gi thi gian thc hin gii
thut, ta ch c bit n mt php ton m ta gi l php ton tch cc trong mt on
chng trnh. l mt php ton trong mt on chng trnh m s ln thc hin
khng t hn cc php ton khc.
Xt hai on chng trnh tnh ex bng cng thc gn ng:
HSPHN 1999-2004

Cu trc d liu v gii thut

ex 1 +

45
n
x x2
xn
xi
+
+ ... +
=
vi x v n cho trc.
1! 2!
n! i =0 i!

{Chng trnh 1: Tnh ring tng hng t ri cng li}


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

{Tnh hng t sau qua hng t trc}


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

Ta c th coi php ton tch cc y l:


p := p * x / j;
S ln thc hin php ton ny l:
0 + 1 + 2 + + n = n(n - 1)/2 ln.
Vy phc tp tnh ton ca thut ton l (n2)

Ta c th coi php ton tch cc y l:


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

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


C nhiu trng hp, thi gian thc hin gii thut khng phi ch ph thuc vo kch thc
d liu m cn ph thuc vo tnh trng ca d liu na. Chng hn thi gian sp xp mt
dy s theo th t tng dn m dy a vo cha c th t s khc vi thi gian sp xp mt
dy s sp xp ri hoc sp xp theo th t ngc li. Lc ny, khi phn tch thi gian
thc hin gii thut ta s phi xt ti trng hp tt nht, trng hp trung bnh v trng
hp xu nht.
Phn tch thi gian thc hin gii thut trong trng hp xu nht (worst-case analysis):
Vi mt kch thc d liu n, tm T(n) l thi gian ln nht khi thc hin gii thut trn
mi b d liu kch thc n v phn tch thi gian thc hin gii thut da trn hm T(n).
Phn tch thi gian thc hin gii thut trong trng hp tt nht (best-case analysis): Vi
mt kch thc d liu n, tm T(n) l thi gian t nht khi thc hin gii thut trn mi b
d liu kch thc n v phn tch thi gian thc hin gii thut da trn hm T(n).
Phn tch thi gian trung bnh thc hin gii thut (average-case analysis): Gi s rng d
liu vo tun theo mt phn phi xc sut no (chng hn phn b u ngha l kh
nng chn mi b d liu vo l nh nhau) v tnh ton gi tr k vng (trung bnh) ca
thi gian chy cho mi kch thc d liu n (T(n)), sau phn tch thi gian thc hin
gii thut da trn hm T(n).
Khi kh khn trong vic xc nh phc tp tnh ton trung bnh (bi vic xc nh T(n)
trung bnh thng phi dng ti nhng cng c ton phc tp), ngi ta thng ch nh gi
phc tp tnh ton trong trng hp xu nht.
L Minh Hong

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).

2.5. CHI PH THC HIN THUT TON


Khi nim phc tp tnh ton t ra khng ch dng nh gi chi ph thc hin mt gii
thut v mt thi gian m l nh gi chi ph thc hin gii thut ni chung, bao gm c
chi ph v khng gian (lng b nh cn s dng). Tuy nhin trn ta ch a nh ngha v
phc tp tnh ton da trn chi ph v thi gian cho d trnh by. Vic nh gi phc tp
tnh ton theo cc tiu ch khc cng tng t nu ta biu din c mc chi ph theo mt
hm T(.) ca kch thc d liu vo. Nu pht biu rng phc tp tnh ton ca mt gii
thut l (n2) v thi gian v (n) v b nh cng khng c g sai v mt ng ngha c.
Thng thng,
Nu ta nh gi c phc tp tnh ton ca mt gii thut qua k php , c th coi
php nh gi ny l cht v khng cn nh gi qua nhng k php khc na.
Nu khng:
nhn mnh n tnh tt ca mt gii thut, cc k php O, o thng c s dng.
Nu nh gi c qua O th khng cn nh gi qua o. ni: Chi ph thc hin thut
ton ti a l, t hn
cp n tnh ti ca mt gii thut, cc k php , thng c s dng.
Nu nh gi c qua th khng cn nh gi qua . ni: Chi ph thc hin thut
ton ti thiu l, cao hn
Bi tp
Bi 1
C 16 gii thut vi chi ph ln lt l g1(n), g2(n), , g16(n) c lit k di y
100

2100 ,

n lg n ,

( 2)
n

lg n

, n 2 , n! , 3n ,

k ,
k =1

lg* n , lg ( n!) , 1 , lg* ( lg n ) , ln n , n lg( lg n ) , ( lg n )

lg n

, 2n ,

k
k =1

y n l kch thc d liu vo.


(Ta dng k hiu lgx ch logarithm nh phn (c s 2) ca x ch khng phi l logarithm thp
phn theo h thng k hiu ca Nga. Hm lg*x cho gi tr bng s ln ly logarithm nh phn
thu c gi tr 1 t s x. V d: lg*2 = 1, lg*4 = 2, lg*16 = 3, lg*65536 = 4)
HSPHN 1999-2004

Cu trc d liu v gii thut

47

Hy xp li cc gii thut theo chiu tng ca phc tp tnh ton. C ngha l tm mt th


t gi[1], gi[2], gi[16] sao cho gi[1] = O(gi[2]), gi[2] = O(gi[3]), , gi[15] = O(gi[16]). Ch r cc gii
thut no l tng ng v phc tp tnh ton theo ngha gi[j]=(gi[j+1]).
p n:
100

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 :

a) on chng trnh tnh tng hai a thc:


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

b) on chng trnh tnh tch hai a thc:


P(x) = amxm + am-1xm-1 + + a1x + a0 v Q(x) = bnxn + an-1xn-1 + + b1x + b0
c a thc
R(x) = cpxp + cp-1xp-1 + + c1x + c0
p := m + n;
for i := 0 to p do c[i] := 0;
L Minh Hong

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

bng phng php quy np: nu T ( n 2 ) c n 2 lg n 2 th T ( n ) c ( n lg n ) .


T (n)

2T ( n 2 ) + n

2c n 2 lg ( n 2 ) + n

(Gi thit quy np)

HSPHN 1999-2004

Cu trc d liu v gii thut

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

(Vi cch chn hng s c < 1)

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

(Gi thit quy np)

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

3. QUY V GII THUT QUY


3.1. KHI NIM V QUY
Ta ni mt i tng l quy nu n c nh ngha qua chnh n hoc mt i tng khc
cng dng vi chnh n bng quy np.
V d: t hai chic gng cu i din nhau. Trong chic gng th nht cha hnh chic
gng th hai. Chic gng th hai li cha hnh chic gng th nht nn tt nhin n cha
li hnh nh ca chnh n trong chic gng th nht mt gc nhn hp l, ta c th thy
mt dy nh v hn ca c hai chic gng.
Mt v d khc l nu ngi ta pht hnh trc tip pht thanh vin ngi bn my v tuyn
truyn hnh, trn mn hnh ca my ny li c chnh hnh nh ca pht thanh vin ngi bn
my v tuyn truyn hnh v c nh th
Trong ton hc, ta cng hay gp cc nh ngha quy:
Giai tha ca n (n!): Nu n = 0 th n! = 1; nu n > 0 th n! = n.(n-1)!
K hiu s phn t ca mt tp hp hu hn S l |S|: Nu S = th |S| = 0; Nu S th
tt c mt phn t x S, khi |S| = |S\{x}| + 1. y l phng php nh ngha tp cc
s t nhin.

3.2. GII THUT QUY


Nu li gii ca mt bi ton P c thc hin bng li gii ca bi ton P' c dng ging nh
P th l mt li gii quy. Gii thut tng ng vi li gii nh vy gi l gii thut
quy. Mi nghe th c v hi l nhng im mu cht cn lu l: P' tuy c dng ging nh P,
nhng theo mt ngha no , n phi nh hn P, d gii hn P v vic gii n khng cn
dng n P.
Trong Pascal, ta thy nhiu v d ca cc hm v th tc c cha li gi quy ti chnh
n, by gi, ta tm tt li cc php quy trc tip v tng h c vit nh th no:
nh ngha mt hm quy hay th tc quy gm hai phn:
Phn neo (anchor): Phn ny c thc hin khi m cng vic qu n gin, c th gii
trc tip ch khng cn phi nh n mt bi ton con no c.
Phn quy: Trong trng hp bi ton cha th gii c bng phn neo, ta xc nh
nhng bi ton con v gi quy gii nhng bi ton con . Khi c li gii (p s)
ca nhng bi ton con ri th phi hp chng li gii bi ton ang quan tm.
Phn quy th hin tnh quy np ca li gii. Phn neo cng rt quan trng bi n quyt
nh ti tnh hu hn dng ca li gii.

HSPHN 1999-2004

Cu trc d liu v gii thut

51

3.3. V D V GII THUT QUY


3.3.1. Hm tnh giai tha
function Factorial(n: Integer): Integer; {Nhn vo s t nhin n v tr v n!}
begin
if n = 0 then Factorial := 1 {Phn neo}
else Factorial := n * Factorial(n - 1); {Phn quy}
end;

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


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

2! = 2 * 1!

1! = 1 * 0!

0! = 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

Nhng vn khng phi nh vy, trong cc cp th thng th n - 1, ch c nhng cp th


c thng th n - 2 mi sinh con thng th n c thi. Do F(n) = F(n - 1) + F(n - 2)
(= s c + s sinh ra). Vy c th tnh c F(n) theo cng thc sau:
F(n) = 1 nu n 2
F(n) = F(n - 1) + F(n - 2) nu n > 2
function F(n: Integer): Integer; {Tnh s cp th thng th n}
begin
if n 2 then F := 1 {Phn neo}
else F := F(n - 1) + F(n - 2); {Phn quy}
end;

3.3.3. Gi thuyt ca Collatz


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

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)

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


* 2 v div 3, hy s dng mt cch hp l hai php ton bin s 1 thnh mt gi tr
nguyn dng X cho trc.
V d: X = 10 ta c 1 * 2 * 2 * 2 * 2 div 3 * 2 = 10.
D thy rng li gii ca bi ton gn nh th t ngc ca php bin i Collatz: biu
din s X > 1 bng mt biu thc bt u bng s 1 v hai php ton * 2, div 3. Ta chia
hai trng hp:
Nu X chn, th ta tm cch biu din s X div 2 v vit thm php ton * 2 vo cui
Nu X l, th ta tm cch biu din s X * 3 + 1 v vit thm php ton div 3 vo cui
procedure Solve(X: Integer); {In ra cch biu din s X}
begin
if X = 1 then Write(X) {Phn neo}
else {Phn quy}
if X mod 2 = 0 then {X chn}
begin
Solve(X div 2); {Tm cch biu din s X div 2}
Write(' * 2'); {Sau vit thm php ton * 2}
end
else {X l}
begin
Solve(X * 3 + 1); {Tm cch biu din s X * 3 + 1}
Write(' div 3'); {Sau vit thm php ton div 3}
end;
HSPHN 1999-2004

Cu trc d liu v gii thut

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

3.3.4. Bi ton Thp H Ni


y l mt bi ton mang tnh cht mt tr chi, tng truyn rng ti ngi n Benares c ba
ci cc kim cng. Khi khai sinh ra th gii, thng t n ci a bng vng chng ln
nhau theo th t gim dn ca ng knh tnh t di ln, a to nht c t trn mt
chic cc.

L Minh Hong

54

Chuyn

Hnh 6: Thp H Ni

Cc nh s ln lt chuyn cc a sang cc khc theo lut:


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

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

HSPHN 1999-2004

Cu trc d liu v gii thut

55

3.4. HIU LC CA QUY


Qua cc v d trn, ta c th thy quy l mt cng c mnh gii cc bi ton. C nhng
bi ton m bn cnh gii thut quy vn c nhng gii thut lp kh n gin v hu hiu.
Chng hn bi ton tnh giai tha hay tnh s Fibonacci. Tuy vy, quy vn c vai tr xng
ng ca n, c nhiu bi ton m vic thit k gii thut quy n gin hn nhiu so vi li
gii lp v trong mt s trng hp chng trnh quy hot ng nhanh hn chng trnh
vit khng c quy. Gii thut cho bi Thp H Ni v thut ton sp xp kiu phn on
(QuickSort) m ta s ni ti trong cc bi sau l nhng v d.
C mt mi quan h khng kht gia quy v quy np ton hc. Cch gii quy cho mt
bi ton da trn vic nh r li gii cho trng hp suy bin (neo) ri thit k lm sao li
gii ca bi ton c suy ra t li gii ca bi ton nh hn cng loi nh th. Tng t nh
vy, quy np ton hc chng minh mt tnh cht no ng vi s t nhin cng bng cch
chng minh tnh cht ng vi mt s trng hp c s (thng ngi ta chng minh n
ng vi 0 hay ng vi 1) v sau chng minh tnh cht s ng vi n bt k nu n
ng vi mi s t nhin nh hn n.
Do ta khng ly lm ngc nhin khi thy quy np ton hc c dng chng minh cc
tnh cht c lin quan ti gii thut quy. Chng hn: Chng minh s php chuyn a
gii bi ton Thp H Ni vi n a l 2n-1:
R rng l tnh cht ny ng vi n = 1, bi ta cn 21 - 1 = 1 ln chuyn a thc hin yu
cu
Vi n > 1; Gi s rng chuyn n - 1 a gia hai cc ta cn 2n-1 - 1 php chuyn a, khi
chuyn n a t cc x sang cc y, nhn vo gii thut quy ta c th thy rng trong
trng hp ny n cn (2n-1 - 1) + 1 + (2n-1 - 1) = 2n - 1 php chuyn a. Tnh cht c
chng minh ng vi n
Vy th cng thc ny s ng vi mi n.
Tht ng tic nu nh chng ta phi lp trnh vi mt cng c khng cho php quy,
nhng nh vy khng c ngha l ta b tay trc mt bi ton mang tnh quy. Mi gii
thut quy u c cch thay th bng mt gii thut khng quy (kh quy), c th ni
c nh vy bi tt c cc chng trnh con quy s u c trnh dch chuyn thnh
nhng m lnh khng quy trc khi giao cho my tnh thc hin.
Vic tm hiu cch kh quy mt cch my mc nh cc chng trnh dch th ch cn
hiu r c ch xp chng ca cc th tc trong mt dy chuyn gi quy l c th lm c.
Nhng mun kh quy mt cch tinh t th phi tu thuc vo tng bi ton m kh quy
cho kho. Khng phi tm u xa, nhng k thut gii cng thc truy hi bng quy hoch
ng l v d cho thy tnh ngh thut trong nhng cch tip cn bi ton mang bn cht
quy tm ra mt gii thut khng quy y hiu qu.
Bi tp
L Minh Hong

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

Cu trc d liu v gii thut


end;
procedure DisplayStatus;
var
i: Integer;
begin
for i := 1 to 3 do
Writeln('Peg ', i, ': ', nd[i], ' disks');
end;
procedure MoveDisk(x, y: Integer);
begin
if Stack[x][nd[x]] < Stack[y][nd[y]] then
begin
Writeln('Move one disk from ', x, ' to ', y);
Stack[y][nd[y] + 1] := Stack[x][nd[x]];
Inc(nd[y]);
Dec(nd[x]);
end
else
begin
Writeln('Move one disk from ', y, ' to ', x);
Stack[x][nd[x] + 1] := Stack[y][nd[y]];
Inc(nd[x]);
Dec(nd[y]);
end;
end;
begin
Write('n = '); Readln(n);
Init;
DisplayStatus;
for i := 1 to LongWord(1) shl (n - 1) - 1 + LongWord(1) shl (n - 1) do
MoveDisk(RotatedList[(i - 1) mod 3][1], RotatedList[(i - 1) mod 3][2]);
DisplayStatus;
end.

L Minh Hong

57

58

Chuyn

4. CU TRC D LIU BIU DIN DANH SCH


4.1. KHI NIM DANH SCH
Danh sch l mt tp sp th t cc phn t cng mt kiu. i vi danh sch, ngi ta c
mt s thao tc: Tm mt phn t trong danh sch, chn mt phn t vo danh sch, xo mt
phn t khi danh sch, sp xp li cc phn t trong danh sch theo mt trt t no v.v

4.2. BIU DIN DANH SCH TRONG MY TNH


Vic ci t mt danh sch trong my tnh tc l tm mt cu trc d liu c th m my tnh
hiu c lu cc phn t ca danh sch ng thi vit cc on chng trnh con m t
cc thao tc cn thit i vi danh sch.

4.2.1. Ci t bng mng mt chiu


Khi ci t danh sch bng mt mng, th c mt bin nguyn n lu s phn t hin c trong
danh sch. Nu mng c nh s bt u t 1 th cc phn t trong danh sch c ct gi
trong mng bng cc phn t c nh s t 1 ti n.
Chn phn t vo mng:
Mng ban u:
p
A

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


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

t gi tr V vo v tr p:
p
A

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

Mun xo phn t th p ca mng m vn gi nguyn th t cc phn t cn li, ta phi:


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

HSPHN 1999-2004

Cu trc d liu v gii thut

59

p
A

Gim n i 1
p
A

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


ch cn o gi tr ca phn t cn xa cho phn t cui cng ri gim s phn t ca mng (n)
i 1.

4.2.2. Ci t bng danh sch ni n


Danh sch ni n gm cc nt c ni vi nhau theo mt chiu. Mi nt l mt bn ghi
(record) gm hai trng:
Trng th nht cha gi tr lu trong nt
Trng th hai cha lin kt (con tr) ti nt k tip, tc l cha mt thng tin bit
nt k tip nt trong danh sch l nt no, trong trng hp l nt cui cng (khng c
nt k tip), trng lin kt ny c gn mt gi tr c bit.

Data

Gi tr
Lin kt

Hnh 7: Cu trc nt ca danh sch ni n

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

Hnh 8: Danh sch ni n

Chn phn t vo danh sch ni n:


Danh sch ban u:
Head
A

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

L Minh Hong

60

Chuyn

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

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


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

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


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

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


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

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


li Head bng nt ng k tip Head (c) trong danh sch. Sau c th gii phng b
nh cp cho nt p (Head c)

4.2.3. Ci t bng danh sch ni kp


Danh sch ni kp gm cc nt c ni vi nhau theo hai chiu. Mi nt l mt bn ghi
(record) gm ba trng:

HSPHN 1999-2004

Cu trc d liu v gii thut

61

Trng th nht cha gi tr lu trong nt


Trng th hai (Next) cha lin kt (con tr) ti nt k tip, tc l cha mt thng tin
bit nt k tip nt l nt no, trong trng hp l nt cui cng (khng c nt k
tip), trng lin kt ny c gn mt gi t c bit.
Trng th ba (Prev) cha lin kt (con tr) ti nt lin trc, tc l cha mt thng tin
bit nt ng trc nt trong danh sch l nt no, trong trng hp l nt u tin
(khng c nt lin trc) trng ny c gn mt gi tr c bit.
Lin kt sau
Data

Gi tr
Lin kt trc

Hnh 9: Cu trc nt ca danh sch ni kp

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

Hnh 10: Danh sch ni kp

Vic chn / xo vo danh sch ni kp cng n gin ch l k thut chnh li cc mi lin kt


gia cc nt cho hp l, ta coi nh bi tp.

4.2.4. Ci t bng danh sch ni vng mt hng


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

Hnh 11: Danh sch ni vng mt hng

L Minh Hong

62

Chuyn

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


c ht cc nt trong danh sch bng cch i theo hng ca cc lin kt. Chnh v l do ny,
khi chn xo vo danh sch ni vng, ta khng phi x l cc trng hp ring khi chn xo
ti v tr ca cht

4.2.5. Ci t bng danh sch ni vng hai hng


Danh sch ni vng mt hng ch cho ta duyt cc nt ca danh sch theo mt chiu, nu ci
t bng danh sch ni vng hai hng th ta c th duyt cc nt ca danh sch c theo chiu
ngc li na. Danh sch ni vng hai hng c th to thnh t danh sch ni kp nu ta cho
trng Prev ca nt First tr thng ti nt Last cn trng Next ca nt Last th tr thng v
nt First.

Hnh 12: Danh sch ni vng hai hng

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

Cu trc d liu v gii thut

63

C n ngi nh s t 1 ti n ngi quanh mt vng trn (n 10000), cng chi mt tr chi:


Mt ngi no m 1, ngi k tip, theo chiu kim ng h m 2 c nh vy cho ti
ngi m n mt s nguyn t th phi ra khi vng trn, ngi k tip li m bt u t 1:
Hy lp chng trnh
Nhp vo 2 s n v S t bn phm
Cho bit nu ngi th nht l ngi m 1 th ngi cn li cui cng trong vng trn l
ngi th my
Cho bit nu ngi cn li cui cng trong vng trn l ngi th k th ngi m 1 l
ngi no?.
Gii quyt hai yu cu trn trong trng hp: u tin tr chi c m theo chiu kim ng
h, khi c mt ngi b ra khi cuc chi th vn l ngi k tip m 1 nhng qu trnh m
ngc li (tc l ngc chiu kim ng h)

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.

5.1.1. M t Stack bng mng


Khi m t Stack bng mng:
Vic b sung mt phn t vo Stack tng ng vi vic thm mt phn t vo cui
mng.
Vic loi b mt phn t khi Stack tng ng vi vic loi b mt phn t cui
mng.
Stack b trn khi b sung vo mng y
Stack l rng khi s phn t thc s ang cha trong mng = 0.
program StackByArray;
const
max = 10000;
var
Stack: array[1..max] of Integer;
Top: Integer; {Top lu ch s phn t cui trong Stack}
procedure StackInit; {Khi to Stack rng}
begin
Top := 0;
end;
procedure Push(V: Integer); {y mt gi tr V vo Stack}
begin
if Top = max then WriteLn('Stack is full') {Nu Stack y th khng y c thm vo na}
else
begin
Inc(Top); Stack[Top] := V; {Nu khng th thm mt phn t vo cui mng}
end;
end;
function Pop: Integer; {Ly mt gi tr ra khi Stack, tr v trong kt qu hm}
begin
if Top = 0 then WriteLn('Stack is empty') {Stack ang rng th khng ly c}
else
begin
Pop := Stack[Top]; Dec(Top); {Ly phn t cui ra khi mng}
end;
end;
begin
StackInit;
HSPHN 1999-2004

Cu trc d liu v gii thut

65

Test; {a mt vi lnh kim tra hot ng ca Stack}


end.

Khi ci t bng mng, tuy cc thao tc i vi Stack vit ht sc n gin nhng y ta


vn chia thnh cc chng trnh con, mi chng trnh con m t mt thao tc, t v
sau, ta ch cn bit rng chng trnh ca ta c mt cu trc Stack, cn ta m phng c th
nh th no th khng cn phi quan tm na, v khi ci t Stack bng cc cu trc d liu
khc, ch cn sa li cc th tc StackInit, Push v Pop m thi.

5.1.2. M t Stack bng danh sch ni n kiu LIFO


Khi ci t Stack bng danh sch ni n kiu LIFO, th Stack b trn khi vng khng gian
nh dng cho cc bin ng khng cn thm mt phn t mi. Tuy nhin, vic kim tra
iu ny rt kh bi n ph thuc vo my tnh v ngn ng lp trnh. V d nh i vi
Turbo Pascal, khi Heap cn trng 80 Bytes th cng ch ch cho 10 bin, mi bin 6 Bytes
m thi. Mt khc, khng gian b nh dng cho cc bin ng thng rt ln nn ci t di
y ta b qua vic kim tra Stack trn.
program StackByLinkedList;
type
PNode = ^TNode; {Con tr ti mt nt ca danh sch}
TNode = record {Cu trc mt nt ca danh sch}
Value: Integer;
Link: PNode;
end;
var
Top: PNode; {Con tr nh Stack}
procedure StackInit; {Khi to Stack rng}
begin
Top := nil;
end;
procedure Push(V: Integer); {y gi tr V vo Stack thm nt mi cha V v ni nt vo danh sch}
var
P: PNode;
begin
New(P); P^.Value := V; {To ra mt nt mi}
P^.Link := Top; Top := P; {Mc nt vo danh sch}
end;
function Pop: Integer; {Ly mt gi tr ra khi Stack, tr v trong kt qu hm}
var
P: PNode;
begin
if Top = nil then WriteLn('Stack is empty')
else
begin
Pop := Top^.Value; {Gn kt qu hm}
P := Top^.Link; {Gi li nt tip theo Top^ (nt c y vo danh sch trc nt Top^)}
Dispose(Top); Top := P; {Gii phng b nh cp cho Top^, cp nht li Top mi}
end;
end;
begin
StackInit;
Test; {a mt vi lnh kim tra hot ng ca Stack}
end.
L Minh Hong

66

Chuyn

5.2. HNG I (QUEUE)


Hng i l mt kiu danh sch c trang b hai php ton b sung mt phn t vo cui
danh sch (Rear) v loi b mt phn t u danh sch (Front).
C th hnh dung hng i nh mt on ngi xp hng mua v: Ngi no xp hng trc
s c mua v trc. V nguyn tc vo trc ra trc , Queue cn c tn gi l danh
sch kiu FIFO (First In First Out).

5.2.1. M t Queue bng mng


Khi m t Queue bng mng, ta c hai ch s Front v Rear, Front lu ch s phn t u
Queue cn Rear lu ch s cui Queue, khi to Queue rng: Front := 1 v Rear := 0;
thm mt phn t vo Queue, ta tng Rear ln 1 v a gi tr vo phn t th Rear.
loi mt phn t khi Queue, ta ly gi tr v tr Front v tng Front ln 1.
Khi Rear tng ln ht khong ch s ca mng th mng y, khng th y thm phn
t vo na.
Khi Front > Rear th tc l Queue ang rng
Nh vy ch mt phn ca mng t v tr Front ti Rear c s dng lm Queue.
program QueueByArray;
const
max = 10000;
var
Queue: array[1..max] of Integer;
Front, Rear: Integer;
procedure QueueInit; {Khi to mt hng i rng}
begin
Front := 1; Rear := 0;
end;
procedure Push(V: Integer); {y V vo hng i}
begin
if Rear = max then WriteLn('Overflow')
else
begin
Inc(Rear);
Queue[Rear] := V;
end;
end;
function Pop: Integer; {Ly mt gi tr khi hng i, tr v trong kt qu hm}
begin
if Front > Rear then WriteLn('Queue is Empty')
else
begin
Pop := Queue[Front];
Inc(Front);
end;
end;
begin
QueueInit;
Test; {a mt vi lnh kim tra hot ng ca Queue}
end.
HSPHN 1999-2004

Cu trc d liu v gii thut

67

5.2.2. M t Queue bng danh sch vng


Xem li chng trnh ci t Stack bng mt mng kch thc ti a 10000 phn t, ta thy
rng nu nh ta lm 6000 ln Push ri 6000 ln Pop ri li 6000 ln Push th vn khng c
vn g xy ra. L do l v ch s Top lu nh ca Stack s c tng ln 6000 ri li gim
n 0 ri li tng tr li ln 6000. Nhng i vi cch ci t Queue nh trn th s gp thng
bo li trn mng, bi mi ln Push, ch s cui hng i Rear cng tng ln v khng bao
gi b gim i c. chnh l nhc im m ta ni ti khi ci t: Ch c cc phn t t v
tr Front ti Rear l thuc Queue, cc phn t t v tr 1 ti Front - 1 l v ngha.
khc phc iu ny, ta m t Queue bng mt danh sch vng (biu din bng mng hoc
cu trc lin kt), coi nh cc phn t ca mng c xp quanh vng theo mt hng no .
Cc phn t nm trn phn cung trn t v tr Front ti v tr Rear l cc phn t ca Queue.
C thm mt bin n lu s phn t trong Queue. Vic thm mt phn t vo Queue tng
ng vi vic ta dch ch s Rear theo vng mt v tr ri t gi tr mi vo . Vic loi b
mt phn t trong Queue tng ng vi vic ly ra phn t ti v tr Front ri dch ch s
Front theo vng.

Last

First

Hnh 13: Dng danh sch vng m t Queue

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;

function Pop: Integer; {Ly mt phn t khi Queue, tr v trong kt qu hm}


begin
if n = 0 then WriteLn('Queue is Empty')
else
begin
Pop := Queue[Front];
Front := (Front + 1) mod max; {Front chy theo vng trn}
Dec(n);
end;
end;
begin
QueueInit;
Test; {a mt vi lnh kim tra hot ng ca Queue}
end.

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


Tng t nh ci t Stack bng danh sch ni n kiu LIFO, ta cng khng kim tra Queue
trn trong trng hp m t Queue bng danh sch ni n kiu FIFO.
program QueueByLinkedList;
type
PNode = ^TNode; {Kiu con tr ti mt nt ca danh sch}
TNode = record {Cu trc mt nt ca danh sch}
Value: Integer;
Link: PNode;
end;
var
Front, Rear: PNode; {Hai con tr ti nt u v nt cui ca danh sch}
procedure QueueInit; {Khi to Queue rng}
begin
Front := nil;
end;
procedure Push(V: Integer); {y gi tr V vo Queue}
var
P: PNode;
begin
New(P); P^.Value := V; {To ra mt nt mi}
P^.Link := nil;
if Front = nil then Front := P {Mc nt vo danh sch}
else Rear^.Link := P;
Rear := P; {Nt mi tr thnh nt cui, cp nht li con tr Rear}
end;
function Pop: Integer; {Ly gi tr khi Queue, tr v trong kt qu hm}
var
P: PNode;
begin
if Front = nil then WriteLn('Queue is empty')
else
begin
Pop := Front^.Value; {Gn kt qu hm}
P := Front^.Link; {Gi li nt tip theo Front^ (Nt c y vo danh sch ngay sau Front^)}
Dispose(Front); Front := P; {Gii phng b nh cp cho Front^, cp nht li Front mi}
end;
end;
HSPHN 1999-2004

Cu trc d liu v gii thut

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

Hnh 14: Di chuyn toa tu

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


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

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


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

Hnh 15: Di chuyn toa tu (2)

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

Cu trc d liu v gii thut

71

Hnh 17: Mc ca cc nt trn cy

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


. Cy trn c chiu cao l 4
Mt tp hp cc cy phn bit c gi l rng (forest), mt cy cng l mt rng. Nu b
nt gc trn cy th s to thnh mt rng cc cy con.
V d:
Mc lc ca mt cun sch vi phn, chng, bi, mc v.v c cu trc ca cy
Cu trc th mc trn a cng c cu trc cy, th mc gc c th coi l gc ca cy
vi cc cy con l cc th mc con v tp nm trn th mc gc.
Gia ph ca mt h tc cng c cu trc cy.
Mt biu thc s hc gm cc php ton cng, tr, nhn, chia cng c th lu tr trong
mt cy m cc ton hng c lu tr cc nt l, cc ton t c lu tr cc nt
nhnh, mi nhnh l mt biu thc con.
*

(A / B + C) * (D - E)

Hnh 18: Cy biu din biu thc

6.2. CY NH PHN (BINARY TREE)


Cy nh phn l mt dng quan trng ca cu trc cy. N c c im l mi nt trn cy ch
c ti a hai nhnh con. Vi mt nt th ngi ta cng phn bit cy con tri v cy con phi
ca nt . Cy nh phn l cy c tnh n th t ca cc nhnh con.
Cn ch ti mt s dng c bit ca cy nh phn
L Minh Hong

72

Chuyn

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


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

5
b)

a)

5
c)

d)

Hnh 19: Cc dng cy nh phn suy bin

Cc cy trong Hnh 20 c gi l cy nh phn hon chnh (complete binary tree): Nu


chiu cao ca cy l h th mi nt c mc < h - 1 u c ng 2 nt con. Cn nu mi nt c
mc h - 1 u c ng 2 nt con nh trng hp cy f) trn th cy c gi l cy nh
phn y (full binary tree). Cy nh phn y l trng hp ring ca cy nh phn
hon chnh.
1

5
e)

f)

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

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

Cu trc d liu v gii thut

73

6.3. BIU DIN CY NH PHN


6.3.1. Biu din bng mng
Nu c mt cy nh phn y , ta c th d dng nh s cho cc nt trn cy theo th t
ln lt t mc 1 tr i, ht mc ny n mc khc v t tri sang phi i vi cc nt mi
mc.
A
1
B

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

Vi cch nh s ny, con ca nt th i s l cc nt th 2i v 2i + 1. Cha ca nt th j l nt j


div 2. T c th lu tr cy bng mt mng T, nt th i ca cy c lu tr bng
phn t T[i].
Vi cy nh phn y Hnh 21 th khi lu tr bng mng, ta s c mng nh sau:
1

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


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

E
1

4
C

10

11

12

Hnh 22: Nhc im ca phng php biu din cy bng mng

L Minh Hong

13

14

15

16
E

17

...
...

74

Chuyn

6.3.2. Biu din bng cu trc lin kt.


Khi biu din cy nh phn bng cu trc lin kt, mi nt ca cy l mt bn ghi (record)
gm 3 trng:
Trng Info: Cha gi tr lu ti nt
Trng Left: Cha lin kt (con tr) ti nt con tri, tc l cha mt thng tin bit
nt con tri ca nt l nt no, trong trng hp khng c nt con tri, trng ny c
gn mt gi tr c bit.
Trng Right: Cha lin kt (con tr) ti nt con phi, tc l cha mt thng tin bit
nt con phi ca nt l nt no, trong trng hp khng c nt con phi, trng ny
c gn mt gi tr c bit.
INFO
Lin kt tri

Lin ktphi

Hnh 23: Cu trc nt ca cy nh phn

i vi cy ta ch cn phi quan tm gi li nt gc, bi t nt gc, i theo cc hng lin kt


Left, Right ta c th duyt mi nt khc.
A

Hnh 24: Biu din cy bng cu trc lin kt

6.4. PHP DUYT CY NH PHN


Php x l cc nt trn cy m ta gi chung l php thm (Visit) cc nt mt cch h thng
sao cho mi nt ch c thm mt ln gi l php duyt cy.
Gi s rng nu nh mt nt khng c nt con tri (hoc nt con phi) th lin kt Left (Right)
ca nt c lin kt thng ti mt nt c bit m ta gi l NIL (hay NULL), nu cy
rng th nt gc ca cy cng c gn bng NIL. Khi c ba cch duyt cy hay c
s dng:
HSPHN 1999-2004

Cu trc d liu v gii thut

75

6.4.1. Duyt theo th t trc (preorder traversal)


Trong php duyt theo th t trc th gi tr trong mi nt bt k s c lit k trc gi tr
lu trong hai nt con ca n, c th m t bng th tc quy sau:
procedure Visit(N); {Duyt nhnh cy nhn N l nt gc ca nhnh }
begin
if N nil then
begin
<Output trng Info ca nt N>
Visit(Nt con tri ca N);
Visit(Nt con phi ca N);
end;
end;

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


Nh cy Hnh 24, nu ta duyt theo th t trc th cc gi tr s ln lt c lit k theo
th t:
ABDHIEJCFKGL

6.4.2. Duyt theo th t gia (inorder traversal)


Trong php duyt theo th t gia th gi tr trong mi nt bt k s c lit k sau gi tr
lu nt con tri v c lit k trc gi tr lu nt con phi ca nt , c th m t bng
th tc quy sau:
procedure Visit(N); {Duyt nhnh cy nhn N l nt gc ca nhnh }
begin
if N nil then
begin
Visit(Nt con tri ca N);
<Output trng Info ca nt N>
Visit(Nt con phi ca N);
end;
end;

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


Nh cy Hnh 24, nu ta duyt theo th t gia th cc gi tr s ln lt c lit k theo
th t:
HDIBEJAKFCGL

6.4.3. Duyt theo th t sau (postorder traversal)


Trong php duyt theo th t sau th gi tr trong mi nt bt k s c lit k sau gi tr lu
hai nt con ca nt , c th m t bng th tc quy sau:
procedure Visit(N); {Duyt nhnh cy nhn N l nt gc ca nhnh }
begin
if N nil then
begin
Visit(Nt con tri ca N);
Visit(Nt con phi ca N);
<Output trng Info ca nt N>
end;
end;

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

L Minh Hong

76

Chuyn

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


theo th t:
HIDJEBKFLGCA

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).

6.5.1. Biu din cy K_phn bng mng


Cng tng t nh vic biu din cy nh phn, ngi ta c th thm vo cy K_phn mt s
nt gi cho mi nt nhnh ca cy K_phn u c ng K nt con, cc nt con c xp
th t t nt con th nht ti nt con th K, sau nh s cc nt trn cy K_phn bt u
t 0 tr i, bt u t mc 1, ht mc ny n mc khc v t tri qua phi mi mc.
Theo cch nh s ny, nt con th j ca nt i l: i * K + j. Nt cha ca nt x l nt (x - 1) div
K. Ta c th dng mt mng T nh s t 0 lu cc gi tr trn cc nt: Gi tr ti nt th i
c lu tr phn t T[i].
0

3
1

F
M

C
D

12

L
K

11
10

6
0

10

11

12

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

6.5.2. Biu din cy K_phn bng cu trc lin kt


Khi biu din cy K_phn bng cu trc lin kt, mi nt ca cy l mt bn ghi (record) gm
hai trng:
Trng Info: Cha gi tr lu trong nt .
Trng Links: L mt mng gm K phn t, phn t th i cha lin kt (con tr) ti nt
con th i, trong trng hp khng c nt con th i th Links[i] c gn mt gi tr c
bit.
i vi cy K_ phn, ta cng ch cn gi li nt gc, bi t nt gc, i theo cc hng lin
kt c th i ti mi nt khc.

HSPHN 1999-2004

Cu trc d liu v gii thut

77

6.6. CY TNG QUT


Trong thc t, c mt s ng dng i hi mt cu trc d liu dng cy nhng khng c rng
buc g v s con ca mt nt trn cy, v d nh cu trc th mc trn a hay h thng
mc ca mt cun sch. Khi , ta phi tm cch m t mt cch khoa hc cu trc d liu
dng cy tng qut. Cng nh trng hp cy nh phn, ngi ta thng biu din cy tng
qut bng hai cch: Lu tr k tip bng mng v lu tr bng cu trc lin kt.

6.6.1. Biu din cy tng qut bng mng


lu tr cy tng qut bng mng, trc ht, ta nh s cc nt trn cy bt u t 1 theo
mt th t tu . Gi s cy c n nt th ta s dng:
Mt mng Info[1..n], trong Info[i] l gi tr lu trong nt th i.
Mt mng Children c chia lm n on, on th i gm mt dy lin tip cc phn t l
ch s cc nt con ca nt i. Nh vy mng Children s cha tt c ch s ca mi nt con
trn cy (ngoi tr nt gc) nn n s gm n - 1 phn t, lu rng khi chia mng
Children lm n on th s c nhng on rng (tng ng vi danh sch cc nt con ca
mt nt l)
Mt mng Head[1..n + 1], nh du v tr ct on trong mng Children: Head[i] l v
tr ng lin trc on th i, hay ni cch khc: on con tnh t ch s Head[i] + 1 n
Head[i] ca mng Children cha ch s cc nt con ca nt th i. Khi Head[i] = Head[i+1]
c ngha l on th i rng. Quy c: Head[n+1] = n - 1.
Mt bin lu ch s ca nt gc.
V d:

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

Hnh 26: Biu din cy tng qut bng mng

L Minh Hong

1 (B)
Head:

78

Chuyn

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


Khi lu tr cy tng qut bng cu trc lin kt, mi nt l mt bn ghi (record) gm ba
trng:
Trng Info: Cha gi tr lu trong nt .
Trng FirstChild: Cha lin kt (con tr) ti nt con u tin ca nt (con c), trong
trng hp l nt l (khng c nt con), trng ny c gn mt gi tr c bit.
Trng Sibling: Cha lin kt (con tr) ti nt em k cn bn phi (nt cng cha vi nt
ang xt, khi sp th t cc con th nt ng lin sau nt ang xt). Trong trng hp
khng c nt em k cn bn phi, trng ny c gn mt gi tr c bit.

INFO

Sibling

FirstChild

Hnh 27: Cu trc nt ca cy tng qut

D thy c tnh ng n ca phng php biu din, bi t mt nt N bt k, ta c th i


theo lin kt FirstChild n nt con c, nt ny chnh l cht ca mt danh sch ni n
cc nt con ca nt N: t nt con c, i theo lin kt Sibling, ta c th duyt tt c cc nt con
ca nt N.
Bi tp
Bi 1
Vit chng trnh m t cy nh phn dng cu trc lin kt, mi nt cha mt s nguyn, v
vit cc th tc duyt trc, gia, sau.
Bi 2
Chng minh rng nu cy nh phn c x nt l v y nt cp 2 th x = y + 1
Bi 3
Chng minh rng nu ta bit dy cc nt c thm ca mt cy nh phn khi duyt theo th
t trc v th t gia th c th dng c cy nh phn . iu ny con ng na khng
i vi th t trc v th t sau? Vi th t gia v th t sau.
Bi 4
Vit cc th tc duyt trc, gia, sau khng quy.

HSPHN 1999-2004

Cu trc d liu v gii thut

79

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


7.1. BIU THC DI DNG CY NH PHN
Chng ta c th biu din cc biu thc s hc gm cc php ton cng, tr, nhn, chia bng
mt cy nh phn, trong cc nt l biu th cc hng hay cc bin (cc ton hng), cc nt
khng phi l l biu th cc ton t (php ton s hc chng hn). Mi php ton trong mt
nt s tc ng ln hai biu thc con nm cy con bn tri v cy con bn phi ca nt .
V d: Cy biu din biu thc (6 / 2 + 3) * (7 - 4)
*

Hnh 28: Biu thc di dng cy nh phn

7.2. CC K PHP CHO CNG MT BIU THC


Vi cy nh phn biu din biu thc trong Hnh 28,
Nu duyt theo th t trc, ta s c * + / 6 2 3 - 7 4, y l dng tin t (prefix) ca
biu thc. Trong k php ny, ton t c vit trc hai ton hng tng ng, ngi ta
cn gi k php ny l k php Ba lan.
Nu duyt theo th t gia, ta s c 6 / 2 + 3 * 7 - 4. K php ny hi mp m v thiu
du ngoc. Nu thm vo th tc duyt inorder vic b sung cc cp du ngoc vo mi
biu thc con s thu c biu thc (((6 / 2) + 3) * (7 - 4)). K php ny gi l dng trung
t (infix) ca mt biu thc (Thc ra ch cn thm cc du ngoc trnh s mp m
m thi, khng nht thit phi thm vo y cc cp du ngoc).
Nu duyt theo th t sau, ta s c 6 2 / 3 + 7 4 - *, y l dng hu t (postfix) ca
biu thc. Trong k php ny ton t c vit sau hai ton hng, ngi ta cn gi k php
ny l k php nghch o Balan (Reverse Polish Notation - RPN)
Ch c dng trung t mi cn c du ngoc, dng tin t v hu t khng cn phi c du
ngoc.

7.3. CCH TNH GI TR BIU THC


C mt vn cn lu l khi my tnh gi tr mt biu thc s hc gm cc ton t hai ngi
(ton t gm hai ton hng nh +, -, *, /) th my ch thc hin c php ton vi hai ton
L Minh Hong

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

Cu trc d liu v gii thut

81

X l

Stack

y vo Stack

10, 2

Ly 2 v 10 khi Stack, Tnh c 10 / 2 = 5, y 5 vo Stack

y vo Stack

5, 3

Ly 3 v 5 khi Stack, tnh c 5 + 3 = 8, y 8 vo Stack

y vo Stack

8, 7

y vo Stack

8, 7, 4

Ly 4 v 7 khi Stack, tnh c 7 - 4 = 3, y 3 vo Stack

8, 3

Ly 3 v 8 khi Stack, tnh c 8 * 3 = 24, y 24 vo Stack

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

Cu trc d liu v gii thut

83

Process(T); {X l phn t va c xong}


T := ''; {t li T chun b c phn t mi}
end;
Assign(f, OutputFile); Rewrite(f);
Writeln(f, RPN, ' = ', Pop:0:4); {In gi tr biu thc RPN c lu trong Stack}
Close(f);
end.

7.4. CHUYN T DNG TRUNG T SANG DNG HU T


C th ni rng vic tnh ton biu thc vit bng k php nghch o Balan l khoa hc hn,
my mc, v n gin hn vic tnh ton biu thc vit bng k php trung t. Ch ring vic
khng phi x l du ngoc cho ta thy u im ca k php RPN. Chnh v l do ny, cc
chng trnh dch vn cho php lp trnh vin vit biu thc trn k php trung t theo thi
quen, nhng trc khi dch ra cc lnh my th tt c cc biu thc u c chuyn v dng
RPN. Vn t ra l phi c mt thut ton chuyn biu thc di dng trung t v dng
RPN mt cch hiu qu, v di y ta trnh by thut ton :
Thut ton s dng mt Stack cha cc ton t v du ngoc m. Th tc Push(V) y
mt phn t vo Stack, hm Pop ly ra mt phn t t Stack, hm Get c gi tr phn
t nm nh Stack m khng ly phn t ra. Ngoi ra mc u tin ca cc ton t
c quy nh bng hm Priority nh sau: u tin cao nht l du * v / vi Priority l 2,
tip theo l du + v - vi Priority l 1, u tin thp nht l du ngoc m ( vi Priority
l 0.
Stack := ;
for <Phn t T c c t biu thc infix> do
{T c th l hng, bin, ton t hoc du ngoc c c t biu thc infix theo th t t tri qua phi}
case T of
'(': Push(T);
')':
repeat
x := Pop;
if x '(' then Output(x);
until x = '(';
'+', '-', '*', '/':
begin
while (Stack ) and (Priority(T) Priority(Get)) do Output(Pop);
Push(T);
end;
else Output(T);
end;
while (Stack ) do Output(Pop);

V d vi biu thc trung t (10 / 2 + 3) * (7 - 4)


c

X l

Stack

y vo Stack

10

Output: 10

Php / c u tin hn ( nh Stack, y / vo Stack

(/

Output: 2

(/

L Minh Hong

Output

10

84

Chuyn

X l

Stack

Output

Php + u tin khng cao hn / nh Stack.

(+

Ly / khi Stack, Output: /


So snh tip:
Php + u tin cao hn ( nh Stack, y + vo Stack
3

Output: 3

(+

Ly ra v hin th cc phn t trong Stack ti khi ly phi du ("

Stack ang l rng, y * vo Stack

y vo Stack

*(

Output: 7

*(

Php - u tin hn ( nh Stack, y - vo Stack

*(-

Output: 4

*(-

Ly ra v hin th cc phn t trong Stack ti khi ly phi du ("

Ht

Ly ra v hin th ht cc phn t cn li trong Stack

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 - *

P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program ConvertInfixToRPN;
const
InputFile = 'RPNCONV.INP';
OutputFile = 'RPNCONV.OUT';
Opt = ['(', ')', '+', '-', '*', '/'];
var
T, Infix, Stack: string;
p: Integer;
f: Text;
procedure StackInit;
begin
Stack := '';
end;
procedure Push(V: Char); {y mt ton t vo Stack}
HSPHN 1999-2004

Cu trc d liu v gii thut


begin
Stack := Stack + V;
end;
function Pop: Char; {Ly mt ton t ra khi Stack, tr v trong kt qu hm}
begin
Pop := Stack[Length(Stack)];
Delete(Stack, Length(Stack), 1);
end;
function Get: Char; {c ton t nh Stack}
begin
Get := Stack[Length(Stack)];
end;
procedure Refine(var S: String); {Hiu chnh biu thc trung t}
var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1 do
if (S[i] in Opt) or (S[i + 1] in Opt) then
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1 do
if (S[i] = ' ') and (S[i + 1] = ' ') then Delete(S, i + 1, 1);
end;
function Priority(Ch: Char): Integer; {Hm tr v u tin ca cc ton t v du ngoc m}
begin
case ch of
'*', '/': Priority := 2;
'+', '-': Priority := 1;
'(': Priority := 0;
end;
end;
procedure Process(T: String); {X l mt phn t c c t biu thc trung t}
var
c, x: Char;
begin
c := T[1];
case c of
'(': Push(c); {T l du ( th y T vo Stack}
')': repeat {T l du ) th ly ra v hin th cc phn t trong Stack n khi ly ti (}
x := Pop;
if x <> '(' then Write(f, x, ' ');
until x = '(';
'+', '-', '*', '/': {T l ton t}
begin
while (Stack <> '') and (Priority(c) <= Priority(Get)) do
Write(f, Pop, ' ');
Push(c);
end;
else
Write(f, T, ' '); {T l ton hng th hin th lun}
end;
end;
begin
Assign(f, InputFile); Reset(f);
Readln(f, Infix);
Close(f);
Assign(f, OutputFile); Rewrite(f);
L Minh Hong

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.

7.5. XY DNG CY NH PHN BIU DIN BIU THC


Ngay trong phn u tin, chng ta bit rng cc dng biu thc trung t, tin t v hu t
u c th c hnh thnh bng cch duyt cy nh phn biu din biu thc theo cc trt
t khc nhau. Vy ti sao khng xy dng ngay cy nh phn biu din biu thc ri thc
hin cc cng vic tnh ton ngay trn cy?. Kh khn gp phi chnh l thut ton xy dng
cy nh phn trc tip t dng trung t c th km hiu qu, trong khi t dng hu t li c
th khi phc li cy nh phn biu din biu thc mt cch rt n gin, gn ging nh qu
trnh tnh ton biu thc hu t:
Bc 1: Khi to mt Stack rng dng cha cc nt trn cy
Bc 2: c ln lt cc phn t ca biu thc RPN t tri qua phi (phn t ny c th l
hng, bin hay ton t) vi mi phn t :
To ra mt nt mi N cha phn t mi c c
Nu phn t ny l mt ton t, ly t Stack ra hai nt (theo th t l y v x), sau em
lin kt tri ca N tr n x, em lin kt phi ca N tr n y.
y nt N vo Stack
Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong, trong Stack ch cn
duy nht mt phn t, phn t chnh l gc ca cy nh phn biu din biu thc.
Bi tp
Bi 1
Vit chng trnh chuyn biu thc trung t dng phc tp hn bao gm: Php ly s i (-x),
php lu tha xy (x^y), li gi hm s hc (sqrt, exp, abs v.v) sang dng RPN.
Bi 2
Vit chng trnh chuyn biu thc logic dng trung t sang dng RPN. V d:
Chuyn: a and b or c and d thnh: a b and c d and or
Bi 3
Chuyn cc biu thc sau y ra dng RPN
a) A * (B + C)
b) A + B / C + D
HSPHN 1999-2004

Cu trc d liu v gii thut


c)
d)
e)
f)
g)
h)
i)
j)

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

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


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

HSPHN 1999-2004

Cu trc d liu v gii thut

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

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


2, tip theo l ngi mang s th t 4, tip na l ngi mang s th t 1, v cui cng l
ngi mang s th t 3, cn mun lit k danh sch y th ta ch vic i chiu vi bng
ban u v lit k theo th t 2, 4, 1, 3.
C th cn ci tin tt hn da vo nhn xt sau: Trong bng kho, ni dung ca trng kho
hon ton c th suy ra c t trng lin kt bng cch: Da vo trng lin kt, tm ti
bn ghi tng ng trong bng chnh ri truy xut trng kho trong bng chnh. Nh v d
trn th ngi mang s th t 1 chc chn s phi c im thi l 20, cn ngi mang s th t
3 th chc chn phi c im thi l 18. Vy th bng kho c th loi b i trng kho m ch
gi li trng lin kt. Trong trng hp cc phn t trong bng ban u c nh s t 1
ti n v trng lin kt chnh l s th t ca bn ghi trong bng ban u nh v d trn,
ngi ta gi k thut ny l k thut sp xp bng ch s: Bng ban u khng h b nh
hng g c, vic sp xp ch n thun l nh li ch s cho cc bn ghi theo th t sp xp.
C th hn:
Nu r[1..n] l cc bn ghi cn sp xp theo mt th t nht nh th vic sp xp bng ch s
tc l xy dng mt dy Index[1..n] m y:
Index[j] = Ch s ca bn ghi s ng th j khi sp th t
(Bn ghi r[index[j]] s phi ng sau j - 1 bn ghi khc khi sp xp)

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}

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


ch s nh cho tng kho trong dy c th coi l s nguyn Integer.

8.2. THUT TON SP XP KIU CHN (SELECTIONSORT)


Mt trong nhng thut ton sp xp n gin nht l phng php sp xp kiu chn. tng
c bn ca cch sp xp ny l:
lt th nht, ta chn trong dy kho k[1..n] ra kho nh nht (kho mi kho khc) v
i gi tr ca n vi k[1], khi gi tr kho k[1] tr thnh gi tr kho nh nht.
lt th hai, ta chn trong dy kho k[2..n] ra kho nh nht v i gi tr ca n vi k[2].

lt th i, ta chn trong dy kho k[i..n] ra kho nh nht v i gi tr ca n vi k[i].

Lm ti lt th n - 1, chn trong hai kho k[n-1], k[n] ra kho nh nht v i gi tr ca n


vi k[n-1].

HSPHN 1999-2004

Cu trc d liu v gii thut

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)

8.3. THUT TON SP XP NI BT (BUBBLESORT)


Trong thut ton sp xp ni bt, dy cc kho s c duyt t cui dy ln u dy (t k[n]
v k[1]), nu gp hai kho k cn b ngc th t th i ch ca chng cho nhau. Sau ln
duyt nh vy, kho nh nht trong dy kho s c chuyn v v tr u tin v vn tr
thnh sp xp dy kho t k[2] ti k[n]:
procedure BubbleSort;
var
i, j: Integer;
begin
for i := 2 to n do
for j := n downto i do {Duyt t cui dy ln, lm ni kho nh nht trong on k[i-1, n] v v tr i-1}
if k[j] < k[j-1] then
<o gi tr k[j] v k[j-1]>
end;

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.

8.4. THUT TON SP XP KIU CHN (INSERTIONSORT)


Xt dy kho k[1..n]. Ta thy dy con ch gm mi mt kho l k[1] c th coi l sp xp
ri. Xt thm k[2], ta so snh n vi k[1], nu thy k[2] < k[1] th chn n vo trc k[1]. i
vi k[3], ta li xt dy ch gm 2 kho k[1], k[2] sp xp v tm cch chn k[3] vo dy
kho c th t sp xp. Mt cch tng qut, ta s sp xp dy k[1..i] trong iu kin
dy k[1..i-1] sp xp ri bng cch chn k[i] vo dy ti v tr ng khi sp xp.
L Minh Hong

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

Cu trc d liu v gii thut

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;

8.5. SP XP CHN VI DI BC GIM DN (SHELLSORT)


Nhc im ca thut ton sp xp kiu chn th hin khi m ta lun phi chn mt kha vo
v tr gn u dy. khc phc nhc im ny, ngi ta thng s dng thut ton sp xp
chn vi di bc gim dn, tng ban u cho thut ton c a ra bi D.L.Shell
nm 1959 nn thut ton cn c mt tn gi khc: ShellSort
Xt dy kho: k[1..n]. Vi mt s nguyn dng h: 1 h n, ta c th chia dy thnh h
dy con:
Dy con 1: k[1], k[1+h], k[1 + 2h],
Dy con 2: k[2], k[2+h], k[2 + 2h],

Dy con h: k[h], k[2h], k[3h],


V d nh dy (4, 6, 7, 2, 3, 5, 1, 9, 8); n = 9; h = 3. C 3 dy con.
Dy kho chnh:

Dy con 1:

Dy con 2:
Dy con 3:

2
6

1
3

9
5

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


ShellSort l: Vi mt bc h, p dng thut ton sp xp kiu chn tng dy con c lp
lm mn dn dy kho chnh. Ri li lm tng t i vi bc h div 2 cho ti khi h = 1 th
ta c dy kho sp xp.
Nh v d trn, nu dng thut ton sp xp kiu chn th khi gp kho k[7] = 1, l kho nh
nht trong dy kho, n phi chn vo v tr 1, tc l phi thao tc trn 6 kho ng trc n.
Nhng nu coi 1 l kho ca dy con 1 th n ch cn chn vo trc 2 kho trong dy con
L Minh Hong

94

Chuyn

m thi. y chnh l nguyn nhn ShellSort hiu qu hn sp xp chn: Kho nh c


nhanh chng a v gn v tr ng ca n.
procedure ShellSort;
var
i, j, h: Integer;
tmp: TKey;
begin
h := n div 2;
while h <> 0 do {Lm mn dy vi di bc h}
begin
for i := h + 1 to n do
begin {Sp xp chn trn dy con a[i-h], a[i], a[i+h], a[i+2h], }
tmp := k[i]; j := i - h;
while (j > 0) and (k[j] > tmp) do
begin
k[j+h] := k[j];
j := j - h;
end;
k[j+h] := tmp;
end;
h := h div 2;
end;
end;

Trn y l phin bn nguyn thu ca ShellSort do D.L.Shell a ra nm 1959. di bc


c em div 2 sau mi ln lp. D thy rng ShellSort hot ng ng th ch cn dy
bc h gim dn v 1 sau mi bc lp l c, c mt s nghin cu v vic chn dy
bc h cho ShellSort nhm tng hiu qu ca thut ton.
ShellSort hot ng nhanh v d ci t, tuy vy vic nh gi phc tp tnh ton ca
ShellSort l tng i kh, ta ch tha nhn cc kt qu sau y:
Nu cc bc h c chn theo th t ngc t dy: 1, 3, 7, 15, , 2i-1, th phc tp
tnh ton ca ShellSort l O(n3/2).
Nu cc bc h c chn theo th t ngc t dy: 1, 8, 23, 77, , 4i+1 + 3.2i + 1, th
phc tp tnh ton ca ShellSort l O(n4/3).
Nu cc bc h c chn theo th t ngc t dy: 1, 2, 3, 4, 6, 8, 9, 12, 16, , 2i3j,
(Dy tng dn ca cc phn t dng 2i3j) th phc tp tnh ton ca ShellSort l
O(n(logn)2).

8.6. THUT TON SP XP KIU PHN ON (QUICKSORT)


8.6.1. T tng ca QuickSort
QuickSort - thut ton c xut bi C.A.R. Hoare - l mt phng php sp xp tt nht,
ngha l d dy kho thuc kiu d liu c th t no, QuickSort cng c th sp xp c v
cha c mt thut ton sp xp tng qut no nhanh hn QuickSort v mt tc trung bnh
(theo ti bit). Hoare mnh dn ly ch Quick t tn cho thut ton.
tng ch o ca phng php c th tm tt nh sau: Sp xp dy kho k[1..n] th c th
coi l sp xp on t ch s 1 ti ch s n trong dy kho . sp xp mt on trong dy
kho, nu on c t hn 2 kho th khng cn phi lm g c, cn nu on c t nht 2
HSPHN 1999-2004

Cu trc d liu v gii thut

95

kho, ta chn mt kho ngu nhin no ca on lm cht (Pivot). Mi kho nh hn


kho cht c xp vo v tr ng trc cht, mi kho ln hn kho cht c xp vo v
tr ng sau cht. Sau php hon chuyn nh vy th on ang xt c chia lm hai on
khc rng m mi kho trong on u u cht v mi kho trong on sau u cht.
Hay ni cch khc: Mi kho trong on u u mi kho trong on sau. V vn tr
thnh sp xp hai on mi to ra (c di ngn hn on ban u) bng phng php
tng t.
procedure QuickSort;
procedure Partition(L, H: Integer); {Sp xp dy kho k[L..H]}
var
i, j: Integer;
Pivot: TKey; {Bin lu gi tr kho cht}
begin
if L H then Exit; {Nu on ch c 1 kho th khng phi lm g c}
Pivot := k[Random(H - L + 1) + L]; {Chn mt kho ngu nhin trong on lm kho cht}
i := L; j := H; {i := v tr u on; j := v tr cui on}
repeat
while k[i] < Pivot do i := i + 1; {Tm t u on kho kho cht}
while k[j] > Pivot do j := j - 1; {Tm t cui on kho kho cht}
{n y ta tm c hai kho k[i] v k[j] m k[i] key k[j]}
if i j then
begin
if i < j then {Nu ch s i ng trc ch s j th o gi tr hai kho k[i] v k[j]}
o gi tr k[i] v k[j]; {Sau php o ny ta c: k[i] key k[j]}
i := i + 1; j := j - 1;
end;
until i > j;
Partition(L, j); Partition(i, H); {Sp xp hai on con mi to ra}
end;
begin
Partition(1, n);
end;

Ta th phn tch xem ti sao on chng trnh trn hot ng ng: Xt vng lp
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

Hnh 29: Vng lp trong ca QuickSort

iu ny m bo cho vng lp repeatuntil ti bc sau, hai vng lp whiledo bn trong


chc chn li tm c hai kho k[i] v k[j] m k[i] kho cht k[j], nu kho k[i] ng

L Minh Hong

96

Chuyn

trc kho k[j] th li o gi tr ca chng, cho i tin ln mt v tr v j li v mt v tr. Vy


vng lp repeatuntil s m bo ti mi bc:
Hai vng lp whiledo bn trong lun tm c hai kho k[i], k[j] m k[i] kho cht
k[j]. Khng c trng hp hai ch s i, j chy ra ngoi on (lun lun c L i, j H).
Sau mi php hon chuyn, mi kho ng trc v tr i lun kho cht v mi kho
ng sau v tr j lun kho cht.
Vng lp repeat until s kt thc khi m ch s i ng pha sau ch s j (Hnh 30).
kL

kj

ki

kH

Kho cht
Kho cht

Hnh 30: Trng thi trc khi gi quy

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.

8.6.2. Trung v v th t thng k (median and order statistics)


Vic chn cht cho php phn on quyt nh hiu qu ca QuickSort, nu chn cht khng
tt, rt c th vic phn on b suy bin thnh trng hp xu khin QuickSort hot ng
chm v trn ngn xp chng trnh con khi gp phi dy chuyn qui qu di. Nhng v d
sau y cho thy vi mt chin lc chn cht ti c th d dng tm ra nhng b d liu
khin QuickSort hot ng chm.
Vi m kh ln:
Nu nh chn cht l kho u on (Pivot := k[L]) hay chn cht l kho cui on
(Pivot := k[H]) th QuickSort s tr thnh Slow Sort vi dy (1, 2, , m).
Nu nh chn cht l kho gia on (Pivot := k[(L+H) div 2]) th QuickSort cng tr
thnh Slow Sort vi dy (1, 2, , m-1, m, m, m-1, , 2, 1).

HSPHN 1999-2004

Cu trc d liu v gii thut

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]

Gi s trung v ca nhm cui cng s c o gi tr cho k[j].


Sau khi cc trung v nhm tp trung v cc v tr k[L..j], ta t Pivot bng trung v ca cc
trung v nhm bng mt lnh gi quy hm Select:
HSPHN 1999-2004

Cu trc d liu v gii thut

99

Pivot := Select(L, j, (j - L + 1) div 2);


Tip tc cc lnh ca hm Select nh th no s bn sau, by gi ta gi s hm Select hot
ng ng xt mt tnh cht quan trng ca Pivot:
Nu di on k[L..H] l (= H L + 1) th c div 5 nhm, nn cng c div 5 trung v
nhm. Pivot l trung v ca cc trung v nhm nn Pivot phi ln hn hay bng ( div 5) div 2
trung v nhm, mi trung v nhm li ln hn hay bng 2 kho khc ca nhm. Vy c th
suy ra rng Pivot ln hn hay bng ( div 5 div 2 * 3) kho ca on k[L..H]. Lp lun tng
t, ta c Pivot nh hn hay bng ( div 5 div 2 * 3) kho khc ca on k[L..H]. Vi n 50,
ta c div 5 div 2 * 3 /4. Suy ra:
C t nht /4 kho nh hn hay bng Pivot c nhiu nht 3/4 kho ln hn Pivot
C t nht /4 kho ln hn hay bng Pivot c nhiu nht 3/4 kho nh hn Pivot
Ta quay li xy dng tip hm Select, khi c Pivot, ta c th m c bao nhiu kho
trong on k[L..H] nh hn Pivot, bao nhiu kho bng Pivot v bao nhiu kho ln hn
Pivot, t xc nh c gi tr cn tm nh hn, ln hn, hay bng Pivot. Nu gi tr cn
tm bng Pivot th ch cn tr v Pivot trong kt qu hm. Nu gi tr cn tm nh hn Pivot, ta
dn tt c cc kho nh hn Pivot trong on k[L..H] v u on v gi quy tm tip vi
on u ny (Ch rng di on c xt tip trong li gi quy khng qu ln
di on k[L..H]), vn tng t i vi trng hp gi tr cn tm ln hn Pivot.

L Minh Hong

100

Chuyn

procedure InsertionSort(L, H: Integer);


begin
Dng InsertionSort sp xp dy k[L..H];
end;
function Select(L, H, p: Integer): TKey; {Hm tr v kho nh th p trong dy kho k[L..H]}
var
i, j, cL, cE: Integer;
Pivot: TKey;
begin
if H - L < 49 then {Nu di on t hn 50 kho}
begin
InsertionSort(L, H); {Thc hin sp xp chn}
Select := k[L + p - 1]; {V tr v phn t nh th p}
Exit;
end;
j := L - 1; i := L;
repeat {Tm trung v ca k[i, i + 4] chuyn v u on}
InsertionSort(i, i + 4);
j := j + 1;
o gi tr k[i + 2] cho k[j];
i := i + 5;
until i + 5 > H;
Pivot := Select(L, j, (j - L + 1) div 2);
cL := 0; cE := 0; {m cL: s phn t nh hn Pivot, cE: s phn t bng Pivot trong dy k[L, H]}
for i := L to H do
if k[i] < Pivot then cL := cL + 1;
else if k[i] = Pivot then cE := cE + 1;
if (cL < p) and (p <= cL + cE) then {Gi tr cn tm bng Pivot}
begin
Select := Pivot;
Exit;
end;
j := L - 1;
if p <= cL then {Gi tr cn tm nh hn Pivot}
begin
for i := L to H do {Dn cc kho nh hn Pivot v u on}
if k[i] < Pivot then
begin
j := j + 1;
o gi tr k[i] cho k[j];
end;
Select := Select(L, j, p); {Gi quy tm tip trong on k[L..j]}
end
else {Gi tr cn tm ln hn Pivot}
begin
for i := L to H do {Dn cc kho ln hn Pivot v u on}
if k[i] > Pivot then
begin
j := j + 1;
o gi tr k[i] cho k[j];
end;
Select := Select(L, j, p - cL - cE); {Gi quy tm tip trong on k[L..j]}
end;
end;

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

Cu trc d liu v gii thut

101

c1 , if n 50

T(n)
n
3n
c 2 n + T 5 + T 4 , otherwise

Bi khi n 50 th thut ton sp xp chn s c thc hin, c th coi on chng trnh ny


kt thc trong thi gian c1 vi c1 l mt hng s ln. Khi n > 50, nhn vo cc on m
trong hm Select, lnh Pivot := Select(L, j, (j - L + 1) div 2) c thi gian thc hin T(n div 5).
Lnh Select := Select(L, j, ) c thi gian thc hin khng qu T(3n/4) do tnh cht ca Pivot.
Thi gian thc hin cc lnh khc trong hm Select tng li c th coi l khng qu c2.n vi c2
l mt hng s ln. t c = max(c1, 20c2), ta c:
Vi 1 n 50, r rng T(n) c1 cn.
Vi n > 50, gi thit quy np rng T(m) cm vi m < n, ta s chng minh T(n) cn, tht
vy:

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. THUT TON SP XP KIU VUN NG (HEAPSORT)


HeapSort c xut bi J.W.J.Williams nm 1981, thut ton khng nhng ng gp mt
phng php sp xp hiu qu m cn xy dng mt cu trc d liu quan trng biu din
hng i c u tin: Cu trc d liu Heap.

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

Hnh 31: Heap

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

Hnh 32: Vun ng

8.7.3. T tng ca HeapSort


u tin, dy kho k[1..n] c vun t di ln n biu din mt ng, khi kho k[1]
tng ng vi nt gc ca ng l kho ln nht, ta o gi tr kho cho k[n] v khng
HSPHN 1999-2004

Cu trc d liu v gii thut

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

Hnh 33: o gi tr k[1] cho k[n] v xt phn cn li

Hnh 34: Vun phn cn li thnh ng ri li o tr k[1] cho k[n-1]

Thut ton HeapSort c hai th tc chnh:


Th tc Adjust(root, endnode) vun cy gc root thnh ng trong iu kin hai cy gc
2.root v 2.root +1 l ng ri. Cc nt t endnode + 1 ti n nm v tr ng v
khng c tnh ti na.
Th tc HeapSort m t li qu trnh vun ng v chn kho theo tng trn:

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).

8.8. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING)


C mt thut ton sp xp n gin cho trng hp c bit: Dy kho k[1..n] l cc s
nguyn nm trong khong t 0 ti M (TKey = 0..M).
Ta dng dy c[0..M] cc bin m, y c[V] l s ln xut hin gi tr V trong dy kho:
for V := 0 to M do c[V] := 0; {Khi to dy bin m}
for i := 1 to n do c[k[i]] := c[k[i]] + 1;

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


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

Cu trc d liu v gii thut

105

Tc l sau khi sp xp:


Gi tr 0 ng trong on t v tr 1 ti v tr c[0].
Gi tr 1 ng trong on t v tr c[0]+1 ti v tr c[0]+c[1].
Gi tr 2 ng trong on t v tr c[0]+c[1]+1 ti v tr c[0]+c[1] c[2].

Gi tr v trong on ng t v tr c[0]+ +c[v-1]+1 ti v tr c[0]++ c[v].

v tr cui ca mi on, nu ta tnh li dy c nh sau:


for V := 1 to M do c[V] := c[V-1] + c[V]

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


Mun dng li dy kho sp xp, ta thm mt dy kho ph x[1..n]. Sau duyt li dy kho
k, mi khi gp kho mang gi tr V ta a gi tr vo kho x[c[V]] v gim c[V] i 1.
for i := n downto 1 do
begin
V := k[i];
X[c[V]] := k[i]; c[V] := c[V] - 1;
end;

Khi dy kho x chnh l dy kho c sp xp, cng vic cui cng l gn gi tr dy


kho x cho dy kho k.
procedure DistributionCounting; {TKey = 0..M}
var
c: array[0..M] of Integer; {Dy bin m s ln xut hin mi gi tr}
t: TArray; {Dy kho ph}
i: Integer;
V: TKey;
begin
for V := 0 to M do c[V] := 0; {Khi to dy bin m}
for i := 1 to n do c[k[i]] := c[k[i]] + 1; {m s ln xut hin cc gi tr}
for V := 1 to M do c[V] := c[V-1] + c[V]; {Tnh v tr cui mi on}
for i := n downto 1 do
begin
V := k[i];
t[c[V]] := k[i]; c[V] := c[V] - 1;
end;
k := x; {Sao chp gi tr t dy kho x sang dy kho k}
end;

R rng phc tp ca php m phn phi l O(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:

8.9. TNH N NH CA THUT TON SP XP (STABILITY)


Mt phng php sp xp c gi l n nh nu n bo ton th t ban u ca cc bn
ghi mang kho bng nhau trong danh sch. V d nh ban u danh sch sinh vin c xp
theo th t tn alphabet, th khi sp xp danh sch sinh vin theo th t gim dn ca im thi,
L Minh Hong

106

Chuyn

nhng sinh vin bng im nhau s c dn v mt on trong danh sch v vn c gi


nguyn th t tn alphabet.
Hy xem li nhng thut ton sp xp trc, trong nhng thut ton , thut ton sp xp
ni bt, thut ton sp xp chn v php m phn phi l nhng thut ton sp xp n nh,
cn nhng thut ton sp xp khc (v ni chung nhng thut ton sp xp i hi phi o
gi tr 2 bn ghi v tr bt k) l khng n nh.
Vi php m phn phi mc trc, ta nhn xt rng nu hai bn ghi c kho sp xp bng
nhau th khi a gi tr vo dy bn ghi ph, bn ghi no vo trc s nm pha sau. Vy nn
ta s y gi tr cc bn ghi vo dy ph theo th t ngc gi c th t tng i ban
u.
Ni chung, mi phng php sp xp tng qut cho d khng n nh th u c th bin i
n tr thnh n nh, phng php chung nht c th hin qua v d sau:
Gi s ta cn sp xp cc sinh vin trong danh sch theo th t gim dn ca im bng mt
thut ton sp xp n nh. Ta thm cho mi sinh vin mt kho Index l th t ban u ca
anh ta trong danh sch. Trong thut ton sp xp c p dng, c ch no cn so snh hai
sinh vin A v B xem ai phi ng trc, trc ht ta quan tm ti im s: Nu im ca A
khc im ca B th ngi no im cao hn s ng trc, nu im s bng nhau th ngi
no c Index nh hn s ng trc.
Trong mt s bi ton, tnh n nh ca thut ton sp xp quyt nh ti c tnh ng n ca
ton thut ton ln. Chnh tnh nhanh ca QuickSort v tnh n nh ca php m phn
phi l c s nn tng cho hai thut ton sp xp cc nhanh trn cc dy kho s m ta s
trnh by di y.

8.10. THUT TON SP XP BNG C S (RADIX SORT)


Bi ton t ra l: Cho dy kho l cc s t nhin k[1..n] hy sp xp chng theo th t
khng gim. (Trong trng hp ta ang xt, TKey l kiu s t nhin)

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


Hy xem li thut ton QuickSort, ti bc phn on n phn on ang xt thnh hai on
tho mn mi kho trong on u mi kho trong on sau v thc hin tng t trn hai
on mi to ra, vic phn on c tin hnh vi s so snh cc kho vi gi tr mt kho
cht.
i vi cc s nguyn th ta c th coi mi s nguyn l mt dy z bit nh s t bit 0 (bit
hng n v) ti bit z - 1 (bit cao nht).
V d:
bit

11 =

0
1

(z = 4)

Hnh 35: nh s cc bit


HSPHN 1999-2004

Cu trc d liu v gii thut

107

Vy th ti bc phn on dy kho t k[1] ti k[n], ta c th a nhng kho c bit cao nht


l 0 v u dy, nhng kho c bit cao nht l 1 v cui dy. D thy rng nhng kho bt u
bng bit 0 s phi nh hn nhng kho bt u bng bit 1. Tip tc qu trnh phn on vi
hai on dy kho: on gm cc kho c bit cao nht l 0 v on gm cc kho c bit cao
nht l 1. Vi nhng kho thuc cng mt on th c bit cao nht ging nhau, nn ta c th
p dng qu trnh phn on tng t trn theo bit th z - 2 v c tip tc nh vy
Qu trnh phn on kt thc nu nh on ang xt l rng hay ta tin hnh phn on
n tn bit n v, tc l tt c cc kho thuc mt trong hai on mi to ra u c bit n v
bng nhau (iu ny ng ngha vi s bng nhau tt c nhng bit khc, tc l bng nhau v
gi tr kho).
V d:
Xt dy kho: 1, 3, 7, 6, 5, 2, 3, 4, 4, 5, 6, 7. Tng ng vi cc dy 3 bit:
001

011

111

110

101

010

011

100

100

101

110

111

111

100

100

101

110

111

100

100

111

110

110

111

101

110

110

111

111

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


001

011

011

010

101

110

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


001

011

011

010

101

101

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


001

010

011

011

100

100

101

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


Qu trnh chia on da vo bit b c th chia thnh mt on rng v mt on gm ton b
cc kho cn li, nhng vic chia on khng bao gi b ri vo qu trnh quy v hn bi
nhng ln quy tip theo s phn on da vo bit b - 1, b - 2 v s phi dng li khi xt
ti bit 0. Cng vic cn li l c gng hiu on chng trnh sau v phn tch xem ti sao n
hot ng ng:

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.

8.10.2. Sp xp c s trc tip (Straight Radix Sort)


Ta s trnh by phng php sp xp c s trc tip bng mt v d: Sp xp dy kho:
925

817

821

638

639

744

742

563

570

166

Trc ht, ta sp xp dy kho ny theo th t tng dn ca ch s hng n v bng mt


thut ton sp xp khc, c dy kho:
HSPHN 1999-2004

Cu trc d liu v gii thut

570

109

821

742

563

744

925

166

817

638

639

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


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

821

925

638

639

742

744

563

166

570

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

563

570

638

639

742

744

817

821

925

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


th t tng dn v gi tr to thnh bi c ba ch s, l dy kho sp.
Nhn xt:
Ta hon ton c th coi s ch s ca mi kho l bng nhau, nh v d trn nu c s 15
trong dy kho th ta c th coi n l 015.
Cng t v d, ta c th thy rng s lt thao tc sp xp phi p dng ng bng s ch s
to thnh mt kho. Vi mt h c s ln, biu din mt gi tr kho s phi dng t ch s
hn. V d s 12345 trong h thp phn phi dng ti 5 ch s, cn trong h c s 1000 ch
cn dng 2 ch s AB m thi, y A l ch s mang gi tr 12 cn B l ch s mang gi tr
345.
Tc ca sp xp c s trc tip ph thuc rt nhiu vo thut ton sp xp n nh ti mi
bc. Khng c mt la chn no khc tt hn php m phn phi. Tuy nhin, php m
phn phi c th khng ci t c hoc km hiu qu nu nh tp gi tr kho qu rng,
khng cho php dng ra dy cc bin m hoc phi s dng dy bin m qu di (iu ny
xy ra nu chn h c s qu ln).
Mt la chn khn ngoan l nn chn h c s thch hp cho tng trng hp c th dung
ho ti mc ti u nht ba mc tiu:
Vic ly ra mt ch s ca mt s c thc hin d dng
S dng t ln gi php m phn phi.
Php m phn phi thc hin nhanh

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;

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


hng s t ta chn t trc, nn khi n ln, phc tp ca php m phn phi l O(n). Thut
ton s dng nDigit ln php m phn phi nn c th thy phc tp ca thut ton l
O(n.nDigit) bt k d liu u vo.
Ta c th coi sp xp c s trc tip l mt m rng ca php m phn phi, khi dy s ch
ton cc s c 1 ch s (trong h radix) th chnh l php m phn phi. S khc bit
y l: Sp xp c s trc tip c th thc hin vi cc kho mang gi tr ln; cn php m
phn phi ch c th lm trong trng hp cc kho mang gi tr nh, bi n cn mt lng
b nh rng ging ra dy bin m s ln xut hin cho tng gi tr.

HSPHN 1999-2004

Cu trc d liu v gii thut

111

8.11. THUT TON SP XP TRN (MERGESORT)


Thut ton sp xp trn (MergeSort hay Collation Sort) l mt trong nhng thut ton sp xp
c in nht, c xut bi J.von Neumann nm 1945. Cho ti nay, ngi ta vn coi
MergeSort l mt thut ton sp xp ngoi mu mc, c a vo ging dy rng ri v
c tch hp trong nhiu phn mm thng mi.

8.11.1. Php trn 2 ng


Php trn 2 ng l php hp nht hai dy kho sp xp ghp li thnh mt dy kho
c kch thc bng tng kch thc ca hai dy kho ban u v dy kho to thnh cng c
th t sp xp. Nguyn tc thc hin ca n kh n gin: so snh hai kho ng u hai dy,
chn ra kho nh nht v a n vo min sp xp (mt dy kho ph c kch thc bng
tng kch thc hai dy kho ban u) v tr thch hp. Sau , kho ny b loi ra khi dy
kho cha n. Qu trnh tip tc cho ti khi mt trong hai dy kho cn, khi ch cn
chuyn ton b dy kho cn li ra min sp xp l xong.
V d: Vi hai dy kho: (1, 3, 10, 11) v (2, 4, 9)
Dy 1
(1, 3, 10, 11)
(3, 10, 11)
(3, 10, 11)
(10, 11)
(10, 11)
(10, 11)

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

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

Kho nh nht trong 2 dy


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

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

8.11.2. Sp xp bng trn 2 ng trc tip


Ta c th coi mi kho trong dy kho k[1..n] l mt mch vi di 1, d nhin cc mch
di 1 c th coi l c sp. Nu trn hai mch lin tip li thnh mt mch c di 2, ta
li c dy gm cc mch c sp. C tip tc nh vy, s mch trong dy s gim dn
sau mi ln trn (Hnh 36)
3

Hnh 36: Thut ton sp xp trn

tin hnh thut ton sp xp trn hai ng trc tip, ta vit cc th tc:

L Minh Hong

112

Chuyn

Th tc Merge(var x, y: TArray; a, b, c: Integer); th tc ny trn mch x[a..b] vi mch


x[b+1..c] c mch y[a..c].
Th tc MergeByLength(var x, y: TArray; len: Integer); th tc ny trn ln lt cc cp
mch theo th t:
Trn mch x[1..len] v x[len+1..2len] thnh mch y[1..2len].
Trn mch x[2len+1..3len] v x[3len+1..4len] thnh mch y[2len+1..4len].

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

Cu trc d liu v gii thut

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

Cu trc d liu v gii thut


'D.
'1.
'2.
'3.
'4.
'5.
'6.
'7.
'8.
'9.
'A.
'B.
'E.

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;

function GetCurrentTime: Extended;


var
h, m, s, s100: Word;
begin
GetTime(h, m, s, s100);
GetCurrentTime := (h * 3600 + m * 60 + s) + s100 / 100;
end;
procedure Enter;
var
f: Text;
begin
Assign(f, InputFile); Reset(f);
n := 0;
MinV := High(Integer); SupV := 0;
while not SeekEof(f) do
begin
Inc(n); Read(f, k[n]);
if k[n] < MinV then MinV := k[n];
if k[n] > SupV then SupV := k[n];
end;
Close(f);
Inc(SupV);
StTime := GetCurrentTime;
end;
procedure PrintInput;
var
i: Integer;
begin
Enter;
for i := 1 to n do Write(k[i]:8);
Write('Press any key to return to menu...');
ReadKey;
end;
procedure PrintResult;
var
f: Text;
L Minh Hong

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

Cu trc d liu v gii thut


for i := 2 to n do
begin
tmp := k[i]; j := i - 1;
while (j > 0) and (tmp < k[j]) do
begin
k[j + 1] := k[j];
Dec(j);
end;
k[j + 1] := tmp;
end;
PrintResult;
end;
{ InsertionSort with Binary searching }
procedure AdvancedInsertionSort;
var
i, inf, sup, median, tmp: Integer;
begin
Enter;
for i := 2 to n do
begin
tmp := k[i];
inf := 1; sup := i - 1;
repeat
median := (inf + sup) shr 1;
if tmp < k[median] then sup := median - 1
else inf := median + 1;
until inf > sup;
Move(k[inf], k[inf + 1], (i - inf) * SizeOf(k[1]));
k[inf] := tmp;
end;
PrintResult;
end;
{ ShellSort }
procedure ShellSort;
var
tmp: Integer;
i, j, h: Integer;
begin
Enter;
h := n shr 1;
while h <> 0 do
begin
for i := h + 1 to n do
begin
tmp := k[i]; j := i - h;
while (j > 0) and (k[j] > tmp) do
begin
k[j + h] := k[j];
j := j - h;
end;
k[j + h] := tmp;
end;
h := h shr 1;
end;
PrintResult;
end;
{ QuickSort }

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

Cu trc d liu v gii thut


var
i, V: Integer;
begin
Enter;
FillChar(c, SizeOf(c), 0);
for i := 1 to n do Inc(c[k[i]]);
for V := MinV + 1 to SupV - 1 do c[V] := c[V - 1] + c[V];
for i := n downto 1 do
begin
V := k[i];
t[c[V]] := k[i];
Dec(c[V]);
end;
k := t;
PrintResult;
end;
{ Radix Exchange Sort }
procedure RadixExchangeSort;
var
MaskBit: array[0..BitCount - 1] of Integer;
i, maxbit: Integer;
procedure Partition(L, H, BIndex: Integer);
var
i, j, Mask: Integer;
begin
if L >= H then Exit;
i := L; j := H; Mask := MaskBit[BIndex];
repeat
while (i < j) and (k[i] and Mask = 0) do Inc(i);
while (i < j) and (k[j] and Mask <> 0) do Dec(j);
Swap(k[i], k[j]);
until i = j;
if k[j] and Mask = 0 then Inc(j);
if BIndex > 0 then
begin
Partition(L, j - 1, BIndex - 1); Partition(j, H, BIndex - 1);
end;
end;
begin
Enter;
maxbit := Trunc(Ln(SupV) / Ln(2));
for i := 0 to maxbit do MaskBit[i] := 1 shl i;
Partition(1, n, maxbit);
PrintResult;
end;
{ Straight Radix Sort}
procedure StraightRadixSort;
const
Radix = 256;
var
p, maxDigit: Integer;
Flag: Boolean;
function GetDigit(key, p: Integer): Integer;
begin
GetDigit := (key shr (p shl 3)) and $FF;
end;
L Minh Hong

119

120

Chuyn

procedure DCount(var x, y: TArr; p: Integer);


var
c: array[0..Radix - 1] of Integer;
i, d: Integer;
begin
FillChar(c, SizeOf(c), 0);
for i := 1 to n do
begin
d := GetDigit(x[i], p); Inc(c[d]);
end;
for d := 1 to Radix - 1 do c[d] := c[d - 1] + c[d];
for i := n downto 1 do
begin
d := GetDigit(x[i], p);
y[c[d]] := x[i];
Dec(c[d]);
end;
end;
begin
Enter;
MaxDigit := Trunc(Ln(SupV) / Ln(Radix));
Flag := True;
for p := 0 to MaxDigit do
begin
if Flag then DCount(k, t, p)
else DCount(t, k, p);
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
{ MergeSort }
procedure MergeSort;
var
Flag: Boolean;
len: Integer;
procedure Merge(var Source, Dest: TArr; a, b, c: Integer);
var
i, j, p: Integer;
begin
p := a; i := a; j := b + 1;
while (i <= b) and (j <= c) do
begin
if Source[i] <= Source[j] then
begin
Dest[p] := Source[i]; Inc(i);
end
else
begin
Dest[p] := Source[j]; Inc(j);
end;
Inc(p);
end;
if i <= b then
Move(Source[i], Dest[p], (b - i + 1) * SizeOf(Source[1]))
else
Move(Source[j], Dest[p], (c - j + 1) * SizeOf(Source[1]));
end;
HSPHN 1999-2004

Cu trc d liu v gii thut

procedure MergeByLength(var Source, Dest: TArr; len: Integer);


var
a, b, c: Integer;
begin
a := 1; b := len; c := len shl 1;
while c <= n do
begin
Merge(Source, Dest, a, b, c);
a := a + len shl 1; b := b + len shl 1; c := c + len shl 1;
end;
if b < n then Merge(Source, Dest, a, b, n)
else
if a <= n then
Move(Source[a], Dest[a], (n - a + 1) * SizeOf(Source[1]));
end;
begin
Enter;
len := 1; Flag := True;
FillChar(t, SizeOf(t), 0);
while len < n do
begin
if Flag then MergeByLength(k, t, len)
else MergeByLength(t, k, len);
len := len shl 1;
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
{---------------- End of Sorting Algorithms ----------------}
function MenuSelect: Integer;
var
i: Integer;
ch: Char;
begin
Clrscr;
Writeln('Sorting Algorithms Demos; Input: SORT.INP; Output: SORT.OUT');
for i := 1 to nMenu do Writeln(' ', SMenu[i]);
Write('Enter your choice: ');
ch := Upcase(ReadKey);
Writeln(ch);
for i := 1 to nMenu do
if SMenu[i][1] = ch then
begin
MenuSelect := i;
Exit;
end;
MenuSelect := 0;
end;
begin
repeat
selected := MenuSelect;
if not (Selected in [1..nMenu]) then Continue;
Writeln(SMenu[selected]);
case selected of
1 : PrintInput;
2 : SelectionSort;
3 : BubbleSort;
4 : InsertionSort;
L Minh Hong

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.

8.13. NH GI, NHN XT


Nhng con s v thi gian v tc chng trnh o c l qua th nghim trn mt b d
liu c th, vi mt my tnh c th v mt cng c lp trnh c th. Vi b d liu khc, my
tnh v cng c lp trnh khc, kt qu c th khc. Ti vit li chng trnh ny trn
Borland Delphi 7 a vo mt s ci tin:
Thit k da trn kin trc a lung (MultiThreads) cho php chy ng thi hai hay nhiu
thut ton sp xp so snh tc , bn cnh vn c th chy tun t cc thut ton
sp xp o thi gian thc hin chnh xc ca chng.
Qu trnh sp xp c hin th trc quan trn mn hnh.
B i thut ton sp xp kiu chn dng nguyn thu, ch gi li thut ton sp xp kiu
chn dng tm kim nh phn
Thut ton ShellSort c vit li, dng cc gi tr trong dy Pratt: 1, 2, 3, 4, 6, 8, 9, 12,
16, , 2i3j, lm di bc.
Th nghim c hai chng trnh, mt trn Free Pascal 1.0.10 v mt trn Delphi 7, nhn
chung tc sp xp ca chng trnh vit trn Delphi nhanh hn nhiu so vi chng trnh
trn FPK, tuy nhin khi so snh tc tng i gia cc thut ton vn c nhiu khc bit
gia hai chng trnh. C mt s thut ton thc hin nhanh bt ng so vi d on v cng
c mt s thut ton thc hin chm hn hn so vi nh gi l thuyt. C th c gng gii
thch qua hiu ng ca b nh Cache v cch thc truy cp b nh nhng iu ny hi phc
tp v cng khng thc s cn thit. Ta ch rt ra kinh nghim rng tc thc thi ca mt
thut ton ph thuc rt nhiu vo phn cng my tnh v chng trnh dch.
Hnh 37 l giao din ca chng trnh vit trn Delphi, bn c th tham kho m ngun km
theo. C mt iu phi lu l chng trnh khng b nh hng bi cc phn mm khc
ang chy, khi khi ng cc threads, bn phm, chut v tt c cc phn mm khc s b treo
tm thi n khi cc threads thc hin xong. V vy khng nn chy cc thut ton sp xp
chm vi d liu ln v s khng th i n khi cc threads kt thc v s phi tt my khi
ng li.

HSPHN 1999-2004

Cu trc d liu v gii thut

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

QuickSort gp nhc im trong trng hp suy bin nhng xc sut xy ra trng hp ny


rt nh. HeapSort th m lnh hi phc tp v kh nh, nhng nu cn chn ra m kho ln
nht trong dy kho th dng HeapSort s khng phi sp xp li ton b dy. MergeSort phi
i hi thm mt khng gian nh ph, nn p dng n trong trng hp sp xp trn file. Cn
ShellSort th hi kh trong vic nh gi v thi gian thc thi, n l sa i ca thut ton sp
xp chn nhng li c tc tng i tt, m lnh n gin v lng b nh cn huy ng
rt t. Tuy nhin, nhng nhc im ca bn phng php ny qu nh so vi u im chung
ca chng l nhanh. Hn na, chng c nh gi cao khng ch v tnh tng qut v tc
nhanh, m cn l kt qu ca nhng cch tip cn khoa hc i vi bi ton sp xp.
Nhng thut ton trn khng ch n thun l cho ta hiu thm v mt cch sp xp mi, m
vic ci t chng cng cho chng ta thm nhiu kinh nghim: K thut s dng s ngu
nhin, k thut chia tr", k thut dng cc bin vi vai tr lun phin v.vVy nn nm
vng ni dung ca nhng thut ton , m cch thuc tt nht chnh l ci t chng vi ln
vi cc rng buc d liu khc nhau (nu c th th c trn hai ngn ng lp trnh th rt
tt) v cng ng qun k thut sp xp bng ch s.
Bi tp
Bi 1
Tm hiu cc ti liu khc chng minh rng: Bt c thut ton sp xp tng qut no da
trn php so snh gi tr hai kho u c phc tp tnh ton trong trng hp xu nht l
(nlgn). (S dng m hnh cy quyt nh Decision Tree Model).
Bi 2
Vit thut ton QuickSort khng quy
Bi 3
Cho mt danh sch th sinh gm n ngi, mi ngi cho bit tn v im thi, hy chn ra m
ngi im cao nht. Gii quyt bng thut ton c phc tp O(n).
Bi 4
C 2 tnh cht quan trng ca thut ton sp xp: Stability v In place:
Stability: Tnh n nh
In place: Gii thut khng yu cu thm khng gian nh ph, iu ny cho php sp xp
mt s lng ln cc kho m khng cn cp pht thm b nh. (Tuy vy vic cp pht
thm mt lng b nh c (1) vn c cho php)
Trong nhng thut ton ta kho st, nhng thut ton no l stability, thut ton no l in
place, thut ton no c c hai tnh cht trn.
Bi 5
Cho mt mng a[1..n]
a) Tm gi tr xut hin nhiu hn n/2 ln trong a hoc thng bo rng khng tn ti gi tr
nh vy. Tm gii thut vi phc tp O(n)
HSPHN 1999-2004

Cu trc d liu v gii thut

125

b) Cho s t nhin k, Lit k tt c cc gi tr xut hin nhiu hn n/k ln trong a. Tm gii


thut vi phc tp O(n.k)
Cch gii:
a) Nu mt gi tr xut hin nhiu hn n/2 ln trong a, gi tr phi l trung v ca dy a. Ta
s tm trung v ca dy v duyt li dy mt ln na xc nhn trung v c xut hin nhiu
hn n/2 khng.
b) Nu mt gi tr xut hin nhiu hn n/k ln trong a, th khi sp xp dy a theo th t khng
gim, gi tr phi nm mt trong cc v tr

i*n
(1 i k). p dng thut ton th t
k

thng k tm phn t ln th n/k, 2n/k, , (k-1)n/k, n, v duyt li dy xc nh gi tr


ca phn t no xut hin nhiu hn n/k ln.
Bi 6
Thut ton sp xp bng c s trc tip c n nh khng ? Ti sao ?
Bi 7
Ci t thut ton sp xp trn hai ng t nhin
Bi 8
Tm hiu php trn k ng v cc phng php sp xp ngoi (trn tp truy nhp tun t v
tp truy nhp ngu nhin)

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}

9.2. TM KIM TUN T (SEQUENTIAL SEARCH)


Tm kim tun t l mt k thut tm kim n gin. Ni dung ca n nh sau: Bt u t bn
ghi u tin, ln lt so snh kho tm kim vi kho tng ng ca cc bn ghi trong danh
sch, cho ti khi tm thy bn ghi mong mun hoc duyt ht danh sch m cha thy
{Tm kim tun t trn dy kho k[1..n]; hm ny th tm xem trong dy c kho no = X khng, nu thy n tr v ch s
ca kho y, nu khng thy n tr v 0. C s dng mt kho ph k[n+1] c gn gi tr = X}
function SequentialSearch(X: TKey): Integer;
var
i: Integer;
begin
i := 1;
while (i <= n) and (k[i] X) do i := i + 1;
if i = n + 1 then SequentialSearch := 0
else SequentialSearch := i;
end;

D thy rng phc tp ca thut ton tm kim tun t trong trng hp tt nht l O(1),
trong trng hp xu nht l O(n) v trong trng hp trung bnh l (n).

9.3. TM KIM NH PHN (BINARY SEARCH)


Php tm kim nh phn c th p dng trn dy kho c th t: k[1] k[2] k[n].
Gi s ta cn tm trong on k[inf...sup] vi kho tm kim l X, trc ht ta xt kho nm
gia dy k[median] vi median = (inf + sup) div 2;
HSPHN 1999-2004

Cu trc d liu v gii thut

127

Nu k[median] < X th c ngha l on t k[inf] ti k[median] ch cha ton kho < X, ta


tin hnh tm kim tip vi on t k[median+1]ti k[sup].
Nu k[median] > X th c ngha l on t k[median] ti k[sup] ch cha ton kho > X, ta
tin hnh tm kim tip vi on t k[inf] ti k[median-1].
Nu k[median] = X th vic tm kim thnh cng (kt thc qu trnh tm kim).
Qu trnh tm kim s tht bi nu n mt bc no , on tm kim l rng (inf > sup).
{Tm kim nh phn trn dy kho k[1] k[2] k[n]; hm ny th tm xem trong dy c kho no = X khng, nu thy n
tr v ch s ca kho y, nu khng thy n tr v 0}
function BinarySearch(X: TKey): Integer;
var
inf, sup, median: Integer;
begin
inf := 1; sup := n;
while inf sup do
begin
median := (inf + sup) div 2;
if k[median] = X then
begin
BinarySearch := median;
Exit;
end;
if k[median] < X then inf := median + 1
else sup := median - 1;
end;
BinarySearch := 0;
end;

Ngi ta chng minh c phc tp tnh ton ca thut ton tm kim nh phn trong
trng hp tt nht l O(1), trong trng hp xu nht l O(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.

9.4. CY NH PHN TM KIM (BINARY SEARCH TREE - BST)


Cho n kho k[1..n], trn cc kho c quan h th t ton phn. Cy nh phn tm kim ng vi
dy kho l mt cy nh phn m mi nt cha gi tr mt kho trong n kho cho, hai
gi tr cha trong hai nt bt k l khc nhau. i vi mi nt trn cy, tnh cht sau lun
c tho mn:
Mi kho nm trong cy con tri ca nt u nh hn kho ng vi nt .
Mi kho nm trong cy con phi ca nt u ln hn kho ng vi nt

L Minh Hong

128

Chuyn

Hnh 38: Cy nh phn tm kim

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


Trc ht, kho tm kim X c so snh vi kho gc cy, v 4 tnh hung c th xy ra:
Khng c gc (cy rng): X khng c trn cy, php tm kim tht bi
X trng vi kho gc: Php tm kim thnh cng
X nh hn kho gc, php tm kim c tip tc trong cy con tri ca gc vi cch
lm tng t
X ln hn kho gc, php tm kim c tip tc trong cy con phi ca gc vi cch
lm tng t
Gi s cu trc mt nt ca cy c m t nh sau:
type
PNode = ^TNode; {Con tr cha lin kt ti mt nt}
TNode = record {Cu trc nt}
Info: TKey; {Trng cha kho}
Left, Right: PNode; {con tr ti nt con tri v phi, tr ti nil nu khng c nt con tri (phi)}
end;
Gc ca cy c lu trong con tr Root. Cy rng th Root = nil

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


{Hm tm kim trn BST, n tr v nt cha kho tm kim X nu tm thy, tr v nil nu khng tm thy}
function BSTSearch(X: TKey): PNode;
var
p: PNode;
begin
p := Root; {Bt u vi nt gc}
while p nil do
if X = p^.Info then Break;
else
if X < p^.Info then p := p^.Left
else p := p^.Right;
BSTSearch := p;
end;

Thut ton dng cy nh phn tm kim t dy kho k[1..n] cng c lm gn ging qu


trnh tm kim. Ta chn ln lt cc kho vo cy, trc khi chn, ta tm xem kho c
trong cy hay cha, nu c ri th b qua, nu n cha c th ta thm nt mi cha kho
cn chn v ni nt vo cy nh phn tm kim ti mi lin kt va r sang khin qu trnh
tm kim tht bi.
HSPHN 1999-2004

Cu trc d liu v gii thut

129

{Th tc chn kho X vo BST}


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

Php loi b trn cy nh phn tm kim khng n gin nh php b sung hay php tm kim.
Mun xo mt gi tr trong cy nh phn tm kim (Tc l dng li cy mi cha tt c nhng
gi tr cn li), trc ht ta tm xem gi tr cn xo nm nt D no, c ba kh nng xy ra:
Nt D l nt l, trng hp ny ta ch vic em mi ni c tr ti nt D (t nt cha ca D)
thay bi nil, v gii phng b nh cp cho nt D (Hnh 39).
4

Hnh 39: Xa nt l cy BST

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


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

L Minh Hong

130

Chuyn

2
7

Hnh 40. Xa nt ch c mt nhnh con trn cy BST

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


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

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

Cu trc d liu v gii thut

131

{Th tc xo kho X khi BST}


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

Trng hp trung bnh, th cc thao tc tm kim, chn, xo trn BST c phc tp l O(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

9.5. PHP BM (HASH)


T tng ca php bm l da vo gi tr cc kho k[1..n], chia cc kho ra thnh cc
nhm. Nhng kho thuc cng mt nhm c mt c im chung v c im ny khng
c trong cc nhm khc. Khi c mt kho tm kim X, trc ht ta xc nh xem nu X thuc
vo dy kho cho th n phi thuc nhm no v tin hnh tm kim trn nhm .
Mt v d l trong cun t in, cc bn sinh vin thng dn vo 26 mnh giy nh vo cc
trang nh du trang no l trang khi u ca mt on cha cc t c cng ch ci u.
khi tra t ch cn tm trong cc trang cha nhng t c cng ch ci u vi t cn tm.
A B

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


gm cc kho ng d theo m-un m.
C nhiu cch ci t php bm:
Cch th nht l chia dy kho lm cc on, mi on cha nhng kho thuc cng mt
nhm v ghi nhn li v tr cc on . khi c kho tm kim, c th xc nh c
ngay cn phi tm kho trong on no.
Cch th hai l chia dy kho lm m nhm, Mi nhm l mt danh sch ni n cha cc
gi tr kho v ghi nhn li cht ca mi danh sch ni n. Vi mt kho tm kim, ta xc
nh c phi tm kho trong danh sch ni n no v tin hnh tm kim tun t trn
danh sch ni n . Vi cch lu tr ny, vic b sung cng nh loi b mt gi tr khi
tp hp kho d dng hn rt nhiu phng php trn.
Cch th ba l nu chia dy kho lm m nhm, mi nhm c lu tr di dng cy nh
phn tm kim v ghi nhn li gc ca cc cy nh phn tm kim , phng php ny c
th ni l tt hn hai phng php trn, tuy nhin dy kho phi c quan h th t ton
phn th mi lm c.

9.6. KHO S VI BI TON TM KIM


Mi d liu lu tr trong my tnh u c s ho, tc l u c lu tr bng cc n v
Bit, Byte, Word v.v iu c ngha l mt gi tr kho bt k, ta hon ton c th bit
c n c m ho bng con s nh th no. V mt iu chc chn l hai kho khc nhau
s c lu tr bng hai s khc nhau.
i vi bi ton sp xp, ta khng th a vic sp xp mt dy kho bt k v vic sp xp
trn mt dy kho s l m ca cc kho. Bi quan h th t trn cc con s c th khc
vi th t cn sp ca cc kho.
HSPHN 1999-2004

Cu trc d liu v gii thut

133

Nhng i vi bi ton tm kim th khc, vi mt kho tm kim, cu tr li hoc l Khng


tm thy hoc l C tm thy v ch nn ta hon ton c th thay cc kho bng cc
m s ca n m khng b sai lm, ch lu mt iu l: hai kho khc nhau phi m ho
thnh hai s khc nhau m thi.
Ni nh vy c ngha l vic nghin cu nhng thut ton tm kim trn cc dy kho s rt
quan trng, v di y ta s trnh by mt s phng php .

9.7. CY TM KIM S HC (DIGITAL SEARCH TREE - DST)


Xt dy kho k[1..n] l cc s t nhin, mi gi tr kho khi i ra h nh phn c z ch s nh
phn (bit), cc bit ny c nh s t 0 (l hng n v) ti z - 1 t phi sang tri.
V d:
bit

11 =

(z = 4)

Hnh 43: nh s cc bit

Cy tm kim s hc cha cc gi tr kho ny c th m t nh sau: Trc ht, n l mt cy


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

5
0

8
1

7
0
4

Hnh 44: Cy tm kim s hc


L Minh Hong

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)

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


ng nt gc, xt ln lt cc bit ca X t tri sang phi (t bit z - 1 ti bit 0), h gp bit
bng 0 th r sang nt con tri, nu gp bit bng 1 th r sang nt con phi. Qu trnh c tip
tc nh vy cho ti khi gp mt trong hai tnh hung sau:
i ti mt nt rng (do r theo mt lin kt nil), qu trnh tm kim tht bi do kho X
khng c trong cy.
i ti mt nt mang gi tr ng bng X, qu trnh tm kim thnh cng
{Hm tm kim trn cy tm kim s hc, n tr v nt cha kho tm kim X nu tm thy, tr v nil nu khng tm thy. z
l di dy bit biu din mt kho}
function DSTSearch(X: TKey): PNode;
var
b: Integer;
p: PNode;
begin
b := z; p := Root; {Bt u vi nt gc}
while (p nil) and (p^.Info X) do {Cha gp phi mt trong 2 tnh hung trn}
begin
b := b - 1; {Xt bit b ca X}
if <Bit b ca X l 0> then p := p^.Left {Gp 0 r tri}
else p := p^.Right; {Gp 1 r phi}
end;
DSTSearch := p;
end;

Thut ton dng cy tm kim s hc t dy kho k[1..n] cng c lm gn ging qu trnh


tm kim. Ta chn ln lt cc kho vo cy, trc khi chn, ta tm xem kho c trong
cy hay cha, nu c ri th b qua, nu n cha c th ta thm nt mi cha kho cn
chn v ni nt vo cy tm kim s hc ti mi ni rng va r sang khin qu trnh tm
kim tht bi

HSPHN 1999-2004

Cu trc d liu v gii thut

135

{Th tc chn kho X vo cy tm kim s hc}


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

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


xo l nt D no, sau tm trong nhnh cy gc D ra mt nt l bt k, chuyn gi tr cha
trong nt l sang nt D ri xo nt l.
{Th tc xo kho X khi cy tm kim s hc}
procedure DSTDelete(X: TKey);
var
b: Integer;
p, q, Node: PNode;
begin
{Trc ht, tm kim gi tr X xem n nm nt no}
b := z;
p := Root;
while (p nil) and (p^.Info X) do
begin
b := b - 1;
q := p; {Mi ln p chuyn sang nt con, ta lun m bo cho q^ l nt cha ca p^}
if <Bit b ca X l 0> then p := p^.Left
else p := p^.Right;
end;
if p = nil then Exit; {X khng tn ti trong cy th khng xo c}
Node := p; {Gi li nt cha kho cn xo}
while (p^.Left nil) or (p^.Right nil) do {chng no p^ cha phi l l}
begin
q := p; {q chy ui theo p, cn p chuyn xung mt trong 2 nhnh con}
if p^.Left nil then p := p^.Left
else p := p^.Right;
end;
Node^.Info := p^.Info; {Chuyn gi tr t nt l p^ sang nt Node^}
if Root = p then Root := nil {Cy ch gm mt nt gc v by gi xo c gc}
else {Ct mi ni t q^ ti p^}
if q^.Left = p then q^.Left := nil
else q^.Right := nil;
Dispose(p);
end;
L Minh Hong

136

Chuyn

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


tp l O(min(z, lgn)) cn trong trng hp xu nht, phc tp ca cc thao tc l O(z),
bi cy tm kim s hc c chiu cao khng qu z + 1.

9.8. CY TM KIM C S (RADIX SEARCH TREE - RST)


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

0010

10

11

12

0100

0101

0111

1000

1010

1011

1100

Hnh 45: Cy tm kim c s

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


gm c mt nt gc, v nt gc tn ti trong sut qu trnh s dng: n khng bao gi b
xo i c.

HSPHN 1999-2004

Cu trc d liu v gii thut

137

tm kim mt gi tr X trong cy tm kim c s, ban u ta ng nt gc v duyt dy


bit ca X t tri qua phi (t bit z - 1 n bit 0), gp bit bng 0 th r sang nt con tri cn gp
bit bng 1 th r sang nt con phi, c tip tc nh vy cho ti khi mt trong hai tnh hung
sau xy ra:
Hoc i ti mt nt rng (do r theo lin kt nil) qu trnh tm kim tht bi do X khng c
trong RST
Hoc duyt ht dy bit ca X v ang ng mt nt l, qu trnh tm kim thnh cng
v chc chn nt l cha gi tr ng bng X.
{Hm tm kim trn cy tm kim c s, tr v nt l cha kho tm kim X nu tm thy, tr v nil nu khng tm thy. z
l di dy bit biu din mt kho}
function RSTSearch(X: TKey): PNode;
var
b: Integer;
p: PNode;
begin
b := z; p := Root; {Bt u vi nt gc, i vi RST th gc lun c sn}
repeat
b := b - 1; {Xt bit b ca X}
if <Bit b ca X l 0> then p := p^.Left {Gp 0 r tri}
else p := p^.Right; {Gp 1 r phi}
until (p = nil) or (b = 0);
RSTSearch := p;
end;

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


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

010

101

101

010

101

101

111

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

L Minh Hong

138

Chuyn

{Th tc chn kho X vo cy tm kim c s}


procedure RSTInsert(X: TKey);
var
b: Integer;
p, q: PNode;
begin
b := z; p := Root; {Bt u t nt gc, i vi RST th gc lun nil}
repeat
b := b - 1; {Xt bit b ca X}
q := p; {Khi p chy xung nt con th q^ lun gi vai tr l nt cha ca p^}
if <Bit b ca X l 0> then p := p^.Left {Gp 0 r tri}
else p := p^.Right; {Gp 1 r phi}
if p = nil then {Khng i c th t thm nt i tip}
begin
New(p); {To ra mt nt mi v em p tr ti nt }
p^.Left := nil; p^.Right := nil;
if <Bit b ca X l 0> then q^.Left := p {Ni p^ vo bn tri q^}
else q^.Right := p; {Ni p^ vo bn phi q^}
end;
until b = 0;
p^.Info := X; {p^ l nt l t X vo}
end;

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


cn phi xo ton b nhnh c o i ti nt trnh lng ph b nh (Hnh 47).

010

101

101

111

010

101

101

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

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


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

HSPHN 1999-2004

Cu trc d liu v gii thut

139

{Th tc xo kho X khi cy tm kim c s}


procedure RSTDelete(X: TKey);
var
b: Integer;
p, q, TurnNode, Child: PNode;
begin
{Trc ht, tm kim gi tr X xem n nm nt no}
b := z; p := Root;
repeat
b := b - 1;
q := p; {Mi ln p chuyn sang nt con, ta lun m bo cho q^ l nt cha ca p^}
if <Bit b ca X l 0> then p := p^.Left
else p := p^.Right;
if (b = z - 1) or (q^.Left nil) and (q^.Right nil) then {q^ l nt ng ba}
begin
TurnNode := q; Child := p; {Ghi nhn li q^ v hng r}
end;
until (p = nil) or (b = 0);
if p = nil then Exit; {X khng tn ti trong cy th khng xo c}
{Trc ht, ct nhnh c o ra khi cy}
if TurnNode^.Left = Child then TurnNode^.Left := nil
else TurnNode^.Right := nil
p := Child; {Chuyn sang on ng c o, bt u xo}
repeat
q := p;
{Lu rng p^ ch c ti a mt nhnh con m thi, cho p tr sang nhnh con duy nht nu c}
if p^.Left nil then p := p^.Left
else p := p^.Right;
Dispose(q); {Gii phng b nh cho nt q^}
until p = nil;
end;

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


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

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)

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

Tng t nh phng php sp xp bng c s, php tm kim bng c s khng nht thit
phi chn h c s 2. Ta c th chn h c s ln hn c tc nhanh hn (km theo s
tn km b nh), ch lu l cy tm kim s hc cng nh cy tm kim c s trong trng
hp ny khng cn l cy nh phn m l cy R_phn vi R l h c s c chn.
Trong cc phng php tm kim bng c s, thc ra cn mt phng php tinh tu v thng
minh nht, n c cu trc gn ging nh cy nhng khng c nt d tha, v qu trnh duyt
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

Cu trc d liu v gii thut

141

9.9. NHNG NHN XT CUI CNG


Tm kim thng l cng vic nhanh hn sp xp nhng li c s dng nhiu hn. Trn
y, ta trnh by php tm kim trong mt tp hp tm ra bn ghi mang kho ng bng
kho tm kim. Tuy nhin, ngi ta c th yu cu tm bn ghi mang kho ln hn hay nh
hn kho tm kim, tm bn ghi mang kho nh nht m ln hn kho tm kim, tm bn ghi
mang kho ln nht m nh hn kho tm kim v.v ci t nhng thut ton nu trn
cho nhng trng hp ny cn c mt s mm do nht nh.
Cng tng t nh sp xp, ta khng nn nh gi gii thut tm kim ny tt hn gii thut
tm kim khc. S dng thut ton tm kim ph hp vi tng yu cu c th l k nng ca
ngi lp trnh, vic ci t cy nh phn tm kim hay cy tm kim c s ch tm kim
trn vi chc bn ghi ch khng nh c mt iu r rng: khng bit th no l gii thut
v lp trnh.
Bi tp
Bi 1
Hy th vit mt chng trnh SearchDemo tng t nh chng trnh SortDemo trong bi
trc. ng thi vit thm vo chng trnh SortDemo bi trc th tc TreeSort v nh
gi tc thc ca n.
Bi 2
Tm hiu cc phng php tm kim chui, thut ton BRUTE-FORCE, thut ton KNUTHMORRIS-PRATT, thut ton BOYER-MOORE v thut ton RABIN-KARP
Bi 3
T tm hiu trong cc ti liu khc v tm kim a hng (multi-way searching), cy nh phn
AVL, cy (2, 3, 4), cy en.
Tuy gi l chuyn v Cu trc d liu v gii thut nhng thc ra, ta mi ch tm hiu v
mt s cu trc d liu v gii thut hay gp. Khng mt ti liu no c th cp ti mi cu
trc d liu v gii thut bi chng qu phong ph v lin tc c b sung. Nhng cu trc
d liu v gii thut khng ph thng lm nh l thuyt th, hnh hc, v.v s c tch
ra v s c ni k hn trong mt chuyn khc.
Vic i su nghin cu nhng cu trc d liu v gii thut, d ch l mt phn nh hp cng
ny sinh rt nhiu vn hay v kh, nh cc vn l thuyt v phc tp tnh ton, vn
NP_y v.v l cng vic ca nhng nh khoa hc my tnh. Nhng trc khi tr
thnh mt nh khoa hc my tnh th iu kin cn l phi bit lp trnh. Vy nn khi tm hiu
bt c cu trc d liu hay gii thut no, nht thit ta phi c gng ci t bng c. Mi
tng hay s ch l b i nu nh khng bin thnh hiu qu, thc t l nh vy.

L Minh Hong

PHN 3. QUY HOCH NG

Cc thut ton quy c u im d ci t, tuy nhin do bn cht ca


qu trnh quy, cc chng trnh ny thng ko theo nhng i hi
ln v khng gian b nh v mt khi lng tnh ton khng l.
Quy hoch ng (Dynamic programming) l mt k thut nhm n gin
ha vic tnh ton cc cng thc truy hi bng cch lu tr ton b hay
mt phn kt qu tnh ton ti mi bc vi mc ch s dng li. Bn
cht ca quy hoch ng l thay th m hnh tnh ton t trn xung
(Top-down) bng m hnh tnh ton t di ln (Bottom-up).
T programming y khng lin quan g ti vic lp trnh cho my
tnh, l mt thut ng m cc nh ton hc hay dng ch ra cc
bc chung trong vic gii quyt mt dng bi ton hay mt lp cc vn
. Khng c mt thut ton tng qut gii tt c cc bi ton quy
hoch ng.
Mc ch ca phn ny l cung cp mt cch tip cn mi trong vic gii
quyt cc bi ton ti u mang bn cht quy, ng thi a ra cc v
d ngi c c th lm quen v hnh thnh cc k nng trong vic
tip cn cc bi ton quy hoch ng.

144

Chuyn

1. CNG THC TRUY HI


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

5
5
5
5
5
5
5

=
=
=
=
=
=
=

1
1
1
1
1
2
5

+
+
+
+
+
+

1
1
1
2
4
3

+
+
+
+

1+1+1
1+2
3
2

(Lu : n = 0 vn coi l c 1 cch phn tch thnh tng cc s nguyn dng (0 l tng
ca dy rng))
gii bi ton ny, trong chuyn mc trc ta dng phng php lit k tt c cc cch
phn tch v m s cu hnh. By gi ta th ngh xem, c cch no tnh ngay ra s lng
cc cch phn tch m khng cn phi lit k hay khng ?. Bi v khi s cch phn tch
tng i ln, phng php lit k t ra kh chm. (n = 100 c 190569292 cch phn tch).
Nhn xt:
Nu gi F[m, v] l s cch phn tch s v thnh tng cc s nguyn dng m. Khi :
Cc cch phn tch s v thnh tng cc s nguyn dng m c th chia lm hai loi:
Loi 1: Khng cha s m trong php phn tch, khi s cch phn tch loi ny chnh l
s cch phn tch s v thnh tng cc s nguyn dng < m, tc l s cch phn tch s v
thnh tng cc s nguyn dng m - 1 v bng F[m - 1, v].
Loi 2: C cha t nht mt s m trong php phn tch. Khi nu trong cc cch phn tch
loi ny ta b i s m th ta s c cc cch phn tch s v - m thnh tng cc s
nguyn dng m (Lu : iu ny ch ng khi khng tnh lp li cc hon v ca mt
cch). C ngha l v mt s lng, s cc cch phn tch loi ny bng F[m, v - m]
Trong trng hp m > v th r rng ch c cc cch phn tch loi 1, cn trong trng hp m
v th s c c cc cch phn tch loi 1 v loi 2. V th:
F[m 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

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


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

1.2. CI TIN TH NHT


Cch lm trn c th tm tt li nh sau: Khi to dng 0 ca bng, sau dng dng 0 tnh
dng 1, dng dng 1 tnh dng 2 v.v ti khi tnh c ht dng n. C th nhn thy rng
khi tnh xong dng th k th vic lu tr cc dng t dng 0 ti dng k - 1 l khng cn
thit bi v vic tnh dng k + 1 ch ph thuc cc gi tr lu tr trn dng k. Vy ta c th
dng hai mng mt chiu: Mng Current lu dng hin thi ang xt ca bng v mng Next
lu dng k tip, u tin mng Current c gn cc gi tr tng ng trn dng 0. Sau
L Minh Hong

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.3. CI TIN TH HAI


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

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.

Phng php ci t ny t ra kh chm v phi gi nhiu ln mi hm GetF(m, v) (bi sau s


gii thch r hn iu ny). Ta c th ci tin bng cch kt hp vi mt mng hai chiu F.
Ban u cc phn t ca F c coi l cha bit (bng cch gn mt gi tr c bit). Hm
GetF(m, v) khi c gi trc ht s tra cu ti F[m, v], nu F[m, v] cha bit th hm
L Minh Hong

148

Chuyn

GetF(m, v) s gi quy tnh gi tr ca F[m, v] ri dng gi tr ny gn cho kt qu hm,


cn nu F[m, v] bit th hm ny ch vic gn kt qu hm l F[m, v] m khng cn gi
quy tnh ton na.
P_3_01_6.PAS * m s cch phn tch s n dng quy
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Analyse6;
const
max = 100;
var
n: Integer;
F: array[0..max, 0..max] of Integer;
function GetF(m, v: Integer): Integer;
begin
if F[m, v] = -1 then {Nu F[m, v] cha bit th i tnh F[m, v]}
begin
if m = 0 then {Phn neo ca hm quy}
if v = 0 then F[m, v] := 1
else F[m, v] := 0
else {Phn quy}
if m > v then F[m, v] := GetF(m - 1, v)
else F[m, v] := GetF(m - 1, v) + GetF(m, v - m);
end;
GetF := F[m, v]; {Gn kt qu hm bng F[m, v]}
end;
begin
Write('n = '); ReadLn(n);
FillChar(f, SizeOf(f), $FF); {Khi to mng F bng gi tr -1}
WriteLn(GetF(n, n), ' Analyses');
end.

Vic s dng phng php quy gii cng thc truy hi l mt k thut ng lu , v
khi gp mt cng thc truy hi phc tp, kh xc nh th t tnh ton th phng php ny t
ra rt hiu qu, hn th na n lm r hn bn cht quy ca cng thc truy hi.

HSPHN 1999-2004

Quy hoch ng

149

2. PHNG PHP QUY HOCH NG


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

x + y = 2 . Tip im 1 , 1 tng ng vi nghim ti u ca bi ton cho.


2
2

y
1

x= y=

1
2
x

x+ y = 2

Cc dng bi ton quy hoch rt phong ph v a dng, ng dng nhiu trong thc t, nhng
cng cn bit rng, a s cc bi ton quy hoch l khng gii c, hoc cha gii c.
Cho n nay, ngi ta mi ch c thut ton n hnh gii bi ton quy hoch tuyn tnh li,
v mt vi thut ton khc p dng cho cc lp bi ton c th.

2.2. PHNG PHP QUY HOCH NG


Phng php quy hoch ng dng gii bi ton ti u c bn cht quy, tc l vic tm
phng n ti u cho bi ton c th a v tm phng n ti u ca mt s hu hn cc
bi ton con. i vi nhiu thut ton quy chng ta tm hiu, nguyn l chia tr
(divide and conquer) thng ng vai tr ch o trong vic thit k thut ton. gii quyt
L Minh Hong

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.

Cch 1 c hm quy F(i) tnh s Fibonacci th i. Chng trnh chnh gi F(6), n s gi


tip F(5) v F(4) tnh Qu trnh tnh ton c th v nh cy di y. Ta nhn thy
tnh F(6) n phi tnh 1 ln F(5), hai ln F(4), ba ln F(3), nm ln F(2), ba ln F(1).

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)

Hnh 49: Hm quy tnh s Fibonacci

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

Cho n nay, vn cha c mt nh l no cho bit mt cch chnh xc nhng bi ton no c


th gii quyt hiu qu bng quy hoch ng. Tuy nhin bit c bi ton c th gii bng
quy hoch ng hay khng, ta c th t t cu hi: Mt nghim ti u ca bi ton ln c
phi l s phi hp cc nghim ti u ca cc bi ton con hay khng ? v Liu c th
no lu tr c nghim cc bi ton con di mt hnh thc no phi hp tm
c nghim bi ton ln"

HSPHN 1999-2004

Quy hoch ng

153

3. MT S BI TON QUY HOCH NG


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

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

Cch gii:
B sung vo A hai phn t: 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].

3.1.1. C s quy hoch ng (bi ton nh nht):


L[n+1] = di dy con n iu tng di nht bt u ti a[n+1] = +. Dy con ny ch
gm mi mt phn t (+) nn L[n+1] = 1.

3.1.2. Cng thc truy hi:


Gi s vi i chy t n v 0, ta cn tnh L[i]: di dy con tng di nht bt u ti a[i]. L[i]
c tnh trong iu kin L[i+1..n+1] bit:
Dy con n iu tng di nht bt u t a[i] s c thnh lp bng cch ly a[i] ghp vo
u mt trong s nhng dy con n iu tng di nht bt u ti v tr a[j] ng sau a[i]. Ta
s chn dy no ghp a[i] vo u? Tt nhin l ch c ghp a[i] vo u nhng dy con
bt u ti a[j] no ln hn a[i] ( m bo tnh tng) v d nhin ta s chn dy di nht
ghp a[i] vo u ( m bo tnh di nht). Vy L[i] c tnh nh sau: Xt tt c cc

L Minh Hong

154

Chuyn

ch s j trong khong t i + 1 n n + 1 m a[j] > a[i], chn ra ch s jmax c L[jmax] ln


nht. t L[i] := L[jmax] + 1:
L [i ] = max L [ j] + 1
i < j n 1
a [i ]< a [ j]

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;

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


Calculating

10

11

ai

10

L[i]

T[i]

11

10

11

Tracing

Hnh 50: Tnh ton v truy vt


P_3_03_1.PAS * 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';
max = 1000000;
var
a, L, T: array[0..max + 1] of Integer;
n: Integer;
procedure Enter;
var
i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
HSPHN 1999-2004

Quy hoch ng

155

for i := 1 to n do Read(f, a[i]);


Close(f);
end;
procedure Optimize; {Quy hoch ng}
var
i, j, jmax: Integer;
begin
a[0] := Low(Integer); a[n + 1] := High(Integer); {Thm hai phn t canh hai u dy a}
L[n + 1] := 1; {in c s quy hoach ng vo bng phng n}
for i := n downto 0 do {Tnh bng phng n}
begin
{Chn trong cc ch s j ng sau i tho mn a[j] > a[i] ra ch s jmax c L[jmax] ln nht}
jmax := n + 1;
for j := i + 1 to n + 1 do
if (a[j] > a[i]) and (L[j] > L[jmax]) then jmax := j;
L[i] := L[jmax] + 1; {Lu di dy con tng di nht bt u ti a[i]}
T[i] := jmax; {Lu vt: phn t ng lin sau a[i] trong dy con tng di nht l a[jmax]}
end;
end;
procedure Result;
var
f: Text;
i: Integer;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, L[0] - 2); {Chiu di dy con tng di nht}
i := T[0]; {Bt u truy vt tm nghim}
while i <> n + 1 do
begin
WriteLn(f, 'a[', i, '] = ', a[i]);
i := T[i];
end;
Close(f);
end;
begin
Enter;
Optimize;
Result;
end.

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]

v tnh ht cc L[.], ta phi mt mt on chng trnh vi phc tp tnh ton l O(n2).


Ta c th ci tin cch ci t c mt on chng trnh vi phc tp tnh ton l
O(nlogn) bng k thut sau:
Vi mi s k, ta gi StartOf[k] l ch s x ca phn t a[x] tho mn: dy n iu tng di
nht bt u t a[x] c di k. Nu c nhiu phn t a[.] cng tho mn iu kin ny th ta
chn phn t a[x] l phn t ln nht trong s nhng phn t . Vic tnh cc gi tr StartOf[.]
c thc hin ng thi vi vic tnh cc gi tr L[.] bng phng php sau:
L Minh Hong

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].

3.2.1. Cng thc truy hi tnh F[i, j].


Vi gii hn trng lng j, vic chn ti u trong s cc gi {1, 2, , i - 1, i} c gi tr ln
nht s c hai kh nng:
Nu khng chn gi th i th F[i, j] l gi tr ln nht c th bng cch chn trong s cc
gi {1, 2, , i - 1} vi gii hn trng lng l j. Tc l
F[i, j] = F[i - 1, j]
Nu c chn gi th i (tt nhin ch xt ti trng hp ny khi m W[i] j) th F[i, j] bng
gi tr gi th i l V[i] cng vi gi tr ln nht c th c c bng cch chn trong s cc
gi {1, 2, , i - 1} vi gii hn trng lng j - W[i]. Tc l v mt gi tr thu c:
F[i, j] = V[i] + F[i - 1, j - W[i]]

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.

3.2.2. C s quy hoch ng:


D thy F[0, j] = gi tr ln nht c th bng cch chn trong s 0 gi = 0.

3.2.3. Tnh bng phng n:


Bng phng n F gm n + 1 dng, M + 1 ct, trc tin c in c s quy hoch ng:
Dng 0 gm ton s 0. S dng cng thc truy hi, dng dng 0 tnh dng 1, dng dng 1
tnh dng 2, v.v n khi tnh ht dng n.

F
0
1
2
...
n

0
0

1
0

2
0

......
...0...

M
0

...

...

...

...

...

3.2.4. Truy vt:


Tnh xong bng phng n th ta quan tm n F[n, M] chnh l gi tr ln nht thu c
khi chn trong c n gi vi gii hn trng lng M. Nu F[n, M] = F[n - 1, M] th tc l
khng chn gi th n, ta truy tip F[n - 1, M]. Cn nu F[n, M] F[n - 1, M] th ta thng bo
rng php chn ti u c chn gi th n v truy tip F[n - 1, M - W[n]]. C tip tc cho ti
khi truy ln ti hng 0 ca bng phng n.
P_3_03_3.PAS * Bi ton ci ti
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program The_Bag;
const
InputFile = 'BAG.INP';
OutputFile = 'BAG.OUT';
max = 100;
var
W, V: Array[1..max] of Integer;
F: array[0..max, 0..max] of Integer;
n, M: Integer;
procedure Enter;
var
i: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, M);
for i := 1 to n do ReadLn(fi, W[i], V[i]);
Close(fi);
end;
procedure Optimize; {Tnh bng phng n bng cng thc truy hi}
var
i, j: Integer;
begin
L Minh Hong

160

Chuyn

FillChar(F[0], SizeOf(F[0]), 0); {in c s quy hoch ng}


for i := 1 to n do
for j := 0 to M do
begin {Tnh F[i, j]}
F[i, j] := F[i - 1, j]; {Gi s khng chn gi th i th F[i, j] = F[i - 1, j]}
{Sau nh gi: nu chn gi th i s c li hn th t li F[i, j]}
if (j >= W[i]) and (F[i, j] < F[i - 1, j - W[i]] + V[i]) then
F[i, j] := F[i - 1, j - W[i]] + V[i];
end;
end;
procedure Trace; {Truy vt tm nghim ti u}
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, F[n, M]); {In ra gi tr ln nht c th kim c}
while n <> 0 do {Truy vt trn bng phng n t hng n ln hng 0}
begin
if F[n, M] <> F[n - 1, M] then {Nu c chn gi th n}
begin
Write(fo, n, ' ');
M := M - W[n]; { chn gi th n ri th ch c th mang thm c trng lng M - W[n] na thi}
end;
Dec(n);
end;
Close(fo);
end;
begin
Enter;
Optimize;
Trace;
end.

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

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.

3.3.1. Cng thc truy hi


Gi s m l di xu X v n l di xu Y. Gi F[i, j] l s php bin i ti thiu bin
xu gm i k t u ca xu X: X[1..i] thnh xu gm j k t u ca xu Y: Y[1..j].
Quan st hai dy X v Y
X1

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

Nu X[m] Y[n] th ti v tr X[m] ta c th s dng mt trong 3 php bin i:


Hoc chn vo sau v tr m ca X, mt k t ng bng Yn:
X1

X2

Y1

Y2

Xm-1
Yn-1

Xm

Yn

Yn

Th khi F[m, n] s bng 1 php chn va ri cng vi s php bin i bin dy


X[1..m] thnh dy Y[1..n-1]: F[m, n] = 1 + F[m, n - 1]
L Minh Hong

162

Chuyn

Hoc thay v tr m ca X bng mt k t ng bng Y[n]:


X1

X2

Y1

Y2

Xm-1
Yn-1

Xm:=Yn
Yn

Th khi F[m, n] s bng 1 php thay va ri cng vi s php bin i bin dy


X[1..m-1] thnh dy Y[1..n-1]: F[m, n] = 1 + F[m-1, n-1]
Hoc xo v tr th m ca X:
X1

X2

Y1

Y2

Xm-1
Yn-1

Xm
Yn

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


X[1..m-1] thnh dy Y[1..n]: F[m, n] = 1 + F[m-1, n]
V F[m, n] phi l nh nht c th, nn trong trng hp X[m] Y[n] th
F[m, n] = min(F[m, n - 1], F[m - 1, n - 1], F[m - 1, n]) + 1.
Ta xy dng xong cng thc truy hi:
F [ m 1, n 1] , if X m = Yn
F [ m, n ] =
min(F [ m, n 1] , F [ m 1, n 1] , F [ m 1, n ]) + 1, if X m Yn

3.3.2. C s quy hoch ng


F[0, j] l s php bin i bin xu rng thnh xu gm j k t u ca F. N cn ti thiu
j php chn: F[0, j] = j
F[i, 0] l s php bin i bin xu gm i k t u ca S thnh xu rng, n cn ti thiu i
php xo: F[i, 0] = i
Vy u tin bng phng n F (c[0..m, 0..n]) c khi to hng 0 v ct 0 l c s quy
hoch ng. T dng cng thc truy hi tnh ra tt c cc phn t bng B.
Sau khi tnh xong th F[m, n] cho ta bit s php bin i ti thiu.
Truy vt:
Nu X[m] = Y[n] th ch vic xt tip F[m - 1, n - 1].
Nu khng, xt 3 trng hp:
Nu F[m, n] = F[m, n - 1] + 1 th php bin i u tin c s dng l: Insert(m, Y[n])
Nu F[m, n] = F[m - 1, n - 1] + 1 th php bin i u tin c s dng l: Replace(m,
Y[n])
Nu F[m, n] = F[m - 1, n] + 1 th php bin i u tin c s dng l: Delete(m)
a v bi ton vi m, n nh hn truy vt tip cho ti khi v F[0, 0]
V d: X =' ABCD'; Y = 'EABD' bng phng n l:

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

Hnh 51: Truy vt

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.

Hy t gii thch ti sao khi gii hn di d liu l 100, li phi khai bo X v Y l


String[200] ch khng phi l String[100] ?.

3.4. DY CON C TNG CHIA HT CHO K


Cho mt dy A gm n (1 n 1000) s nguyn dng a[1..n] v s nguyn dng k (k
1000). Hy tm dy con gm nhiu phn t nht ca dy cho sao cho tng cc phn t ca
dy con ny chia ht cho k.
Input: file vn bn SUBSEQ.INP
Dng 1: Cha s n
Dng 2: Cha n s a[1], a[2], , a[n] cch nhau t nht mt du cch
Output: file vn bn SUBSEQ.OUT
HSPHN 1999-2004

Quy hoch ng

165

Dng 1: Ghi di dy con tm c


Cc dng tip: Ghi cc phn t c chn vo dy con
Dng cui: Ghi tng cc phn t ca dy con .
SUBSEQ.INP
10 5
1 6 11 5 10 15 20 2 4 9

SUBSEQ.OUT
8
a[10] = 9
a[9] = 4
a[7] = 20
a[6] = 15
a[5] = 10
a[4] = 5
a[3] = 11
a[2] = 6
Sum = 80

3.4.1. Cch gii 1


Khng nh hng n kt qu cui cng, ta c th t: a[i] := a[i] mod k vi i: 1 i n. Gi
S l tng cc phn t trong dy A, thay i cch tip cn bi ton: thay v tm xem phi chn
ra mt s ti a nhng phn t c tng chia ht cho k, ta s chn ra mt s ti thiu cc
phn t c tng ng d vi S theo modul k. Khi ch cn loi b nhng phn t ny th
nhng phn t cn li s l kt qu. Cch tip cn ny cho php tit kim c khng gian
lu tr bi s phn t ti thiu cn loi b bao gi cng nh hn k.
Cng thc truy hi: Nu ta gi f[i, t] l s phn t ti thiu phi chn trong dy a[1..i] c
tng chia k d t. Nu khng c phng n chn ta coi f[i, t] = +. Khi f[i, t] c tnh qua
cng thc truy hi sau:
Nu trong dy trn khng phi chn a[i] th f[i, t] = f[i - 1, t];
Nu trong dy trn phi chn a[i] th f[i, t] = 1 + f[i - 1, t A [i ] ] ( t A [i ] y hiu l

php tr trn cc lp ng d mod k. V d khi k = 7 th 1 3 =5)

T trn suy ra f [i, t ] = min f [i 1, t ] ,1 + f i 1, t A [i ]

C s quy hoch ng: f[0, 0] = 0; f[0, i] = + (vi i: 1 i < k).


P_3_03_5.PAS * Dy con c tng chia ht cho k
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program SubSequence;
const
InputFile = 'SUBSEQ.INP';
OutputFile = 'SUBSEQ.OUT';
maxN = 1000;
maxK = 1000;
var
a: array[1..maxN] of Integer;
f: array[0..maxN, 0..maxK - 1] of Integer;
n, k: Integer;
procedure Enter;
var
fi: Text;
i: Integer;
L Minh Hong

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

3.4.2. Cch gii 2


Phn cc phn t trong dy A theo cc lp ng d modul k. Lp i gm cc phn t chia k d
i. Gi Count[i] l s lng cc phn t thuc lp i.
Vi 0 i, t < k; Gi f[i, t] l s phn t nhiu nht c th chn c trong cc lp 0, 1, 2, , i
c tng chia k d t. Trong trng hp c cch chn, gi Trace[i, t] l s phn t c
chn trong lp i theo phng n ny, trong trng hp khng c cch chn, Trace[i, t] c
coi l -1.
Ta d thy rng f[0, 0] = Count[0], Trace[0, 0] = Count[0], cn Trace[0, i] vi i0 bng -1.
Vi i 1; 0 t < k, Gi s phng n chn ra nhiu phn t nht trong cc lp t 0 ti i
c tng chia k d t c ly j phn t ca lp i (0 j Count[i]), khi nu b j phn t ny
i, s phi thu c phng n chn ra nhiu phn t nht trong cc lp t 0 ti i - 1 c
tng chia k d t i * j . T suy ra cng thc truy hi:

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)

P_3_03_6.PAS * Dy con c tng chia ht cho k


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program SubSequence;
const
InputFile = 'SUBSEQ.INP';
OutputFile = 'SUBSEQ.OUT';
maxN = 1000;
maxK = 1000;
var
a: array[1..maxN] of Integer;
Count: array[0..maxK - 1] of Integer;
f, Trace: array[0..maxK - 1, 0..maxK - 1] of Integer;
n, k: Integer;
procedure Enter;
var
fi: Text;
i: Integer;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, k);
FillChar(Count, SizeOf(Count), 0);
for i := 1 to n do
begin
Read(fi, a[i]);
Inc(Count[a[i] mod k]); {Nhp d liu ng thi vi vic tnh cc Count[.]}
end;
Close(fi);
end;
function Sub(x, y: Integer): Integer;
var
tmp: Integer;
begin
L Minh Hong

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

3.5. PHP NHN T HP DY MA TRN


Vi ma trn A={a[i, j]} kch thc pq v ma trn B={b[i, j]} kch thc qr. Ngi ta c
php nhn hai ma trn c ma trn C={c[i, j]} kch thc pr. Mi phn t ca ma
trn C c tnh theo cng thc:

c [i, j] = k =1 a [i, j] .b [ k, j], (1 i p;1 j r)


q

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

khi thc hin php nhn mt dy cc ma trn:

m [i]=m [1].m [ 2].....m [ n ]


i=1

Vi :
m[1] l ma trn kch thc a[1] x a[2]
m[2] l ma trn kch thc a[2] x a[3]

L Minh Hong

170

Chuyn

m[n] l ma trn kch thc a[n] x a[n+1]


Input: file vn bn MULTMAT.INP
Dng 1: Cha s nguyn dng n 100
Dng 2: Cha n + 1 s nguyn dng a[1], a[2], , a[n+1] (i: 1 a[i] 100) cch nhau
t nht mt du cch
Output: file vn bn MULTMAT.OUT
Dng 1: Ghi s php nhn s hc ti thiu cn thc hin
Dng 2: Ghi biu thc kt hp ti u ca php nhn dy ma trn
MULTMAT.INP
6
3231223

MULTMAT.OUT
Number of numerical multiplications: 31
((m[1].(m[2].m[3])).((m[4].m[5]).m[6]))

Trc ht, nu dy ch c mt ma trn th chi ph bng 0, tip theo ta nhn thy chi ph
nhn mt cp ma trn c th tnh c ngay. Vy c th ghi nhn c chi ph cho php nhn
hai ma trn lin tip bt k trong dy. S dng nhng thng tin ghi nhn ti u ho ph
tn nhn nhng b ba ma trn lin tip C tip tc nh vy cho ti khi ta tnh c ph tn
nhn n ma trn lin tip.

3.5.1. Cng thc truy hi:


Gi f[i, j] l s php nhn s hc ti thiu cn thc hin nhn on ma trn lin tip:
j

m [ t ] = m [i].m [i + 1].....m [ j] . Th khi f[i, i] = 0 vi i.


t =i

tnh

m [ t ] , c th c nhiu cch kt hp:


t =i

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

f[i, k] (l chi ph ti thiu tnh

m [ u ] ) cng vi f[k+1, j] (l chi ph ti thiu tnh


u =i

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

m[v] ). T suy ra: do c nhiu cch kt hp, m ta cn chn cch kt hp

v = k +1

c chi ph t nht nn ta s cc tiu ho f[i, j] theo cng thc:


f [i, j] = min ( f [i, k ] + f [ k + 1, j] + a [i ] .a [ k + 1] .a [ j + 1])
1 k < j

3.5.2. Tnh bng phng n


Bng phng n F l bng hai chiu, nhn vo cng thc truy hi, ta thy f[i, j] ch c tnh
khi m f[i, k] cng nh f[k + 1, j] u bit (k: i k < j). Tc l ban u ta in c s quy
HSPHN 1999-2004

Quy hoch ng

171

hoch ng vo ng cho chnh ca bng(i: f[i, i] := 0), t tnh cc gi tr thuc ng


cho nm pha trn (tnh cc f[i, i + 1]), ri li tnh cc gi tr thuc ng cho nm pha trn
na (cc f[i, i + 2]) n khi tnh c f[1, n] th dng li

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

cn s php nhn s hc t nht trn tt c cc cch chn k. Sau , mun in ra php kt hp


ti u nhn

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 [ r ] (c km theo du ng m ngoc) ng thi vit thm du . vo

gia hai biu thc .


P_3_03_7.PAS * Nhn ti u dy ma trn
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program MatrixMultiplications;
const
InputFile = 'MULTMAT.INP';
OutputFile = 'MULTMAT.OUT';
max = 100;
var
a: array[1..max + 1] of Integer;
f: array[1..max, 1..max] of Integer;
tr: array[1..max, 1..max] of Integer;
n: Integer;
fo: Text;
procedure Enter; {Nhp d liu}
var
i: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n);
for i := 1 to n + 1 do Read(fi, a[i]);
Close(fi);
end;
procedure Optimize; {Quy hoch ng}
var
i, j, k, len: Integer;
x, p, q, r: Integer;
begin
{in c s quy hoch ng vo bng phng n}
for i := 1 to n do
for j := i to n do
if i = j then f[i, j] := 0
else f[i, j] := High(Integer);
{Gii cng thc truy hi}
for len := 2 to n do {Th vi cc di on t 2 ti n}
for i := 1 to n - len + 1 do {Tnh cc f[i, i + len - 1]}
begin
L Minh Hong

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;

procedure Trace(i, j: Integer); {Truy vt bng quy, th tc ny in ra cch kt hp ti u tnh m[i]m[j]}


var
k: Integer;
begin
if i = j then Write(fo, 'm[', i, ']')
else
begin
Write(fo, '(');
k := tr[i, j];
Trace(i, k);
Write(fo, '.');
Trace(k + 1, j);
Write(fo, ')');
end;
end;
begin
Enter;
Optimize;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 'Number of numerical multiplications: ', f[1, n]);
Trace(1, n);
Close(fo);
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

nhn cc gi tr t 0 ti 9 nn v mt s lng: F [ n, k ] = t =0 F [ n 1, k t ] . y l cng thc


9

truy hi tnh F[n, k], thc ra ch xt nhng gi tr t t 0 ti 9 v t k m thi ( trnh trng


hp k - t <0). Ch rng nu ti mt bc no tnh ra mt phn t ca F > 109 th ta t li
phn t l 109 + 1 trnh b trn s do cng hai s qu ln. Kt thc qu trnh tnh ton,
nu F[n, k] = 109 + 1 th ta ch cn thng bo chung chung l c > 1 t s.
C s quy hoch ng th c th t l:
F[1, k] = s cc s c 1 ch s m TCCS bng k, nh vy:
1, if 0 k 9
F [1, k ] =
0, otherwise
Cu b: Da vo bng phng n F[0..n, 0..k] d ra s mang th t cho.
Bi 2
Cho n gi ko (n 200), mi gi cha khng qu 200 vin ko, v mt s M 40000. Hy
ch ra mt cch ly ra mt s cc gi ko c tng s ko l M, hoc thng bo rng
khng th thc hin c vic .
Hng dn:
Gi s s ko cha trong gi th i l A[i]
Gi b[V] l s nguyn dng b nht tho mn: C th chn trong s cc gi ko t gi 1 n
gi b[V] ra mt s gi c tng s ko l V. Nu khng c phng n chn, ta coi b[V] =
+. Trc tin, khi to b[0] := 0 v cc b[V] := + vi mi V > 0.
Vi mt gi tr V, gi k l gi tr cn tm gn cho b[V], v k cn b nht c th, nn nu c
cch chn trong s cc gi ko t gi 1 n gi k c s ko V th chc chn phi chn
gi k. Khi chn gi k ri th trong s cc gi ko t 1 n k - 1, phi chn ra c mt s
gi c s ko l V - A[k]. Tc l b[V - A[k]] k - 1 < k.
Suy ra b[V] s c tnh bng cch:
Xt tt c cc gi ko k c A[k] V v tho mn b[V - A[k]] < k, chn ra ch s k b nht gn
cho b[V]. y chnh l cng thc truy hi tnh bng phng n.

b [ V ] = min k ( A [ k ] V ) b V A [ k ] < k

)}

Sau khi tnh ht dy b[1..M]. Nu b[M] vn bng + th c ngha l khng c phng n


chn. Nu khng th s chn gi p[1] = b[M], tip theo s chn gi p[2] = b[M - A[p[1]]], ri
li chn gi p[3] = b[M - A[p[1]] - A[p[2]]] n khi truy vt v ti b[0] th thi.
Bi 3
Cho n gi ko (n 200), mi gi cha khng qu 200 vin ko, hy chia cc gi ko ra lm
hai nhm sao cho s ko gia hai nhm chnh lch nhau t nht
Hng dn:
Gi S l tng s ko v M l na tng s ko, p dng cch gii nh bi 2. Sau
L Minh Hong

174

Chuyn

Tm s nguyn dng T tho mn:


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

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

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


sang c (i, j), v khi sang (i, j) th s im c cng thm A[i, j] na. Chng ta cn B[i,
j] l s im ln nht c th nn B[i, j] = max(B[i, j - 1], B[i - 1, j - 1], B[i + 1, j - 1]) + A[i, j].
Ta dng cng thc truy hi ny tnh tt c cc B[i, j]. Cui cng chn ra B[i, n] l phn t ln
nht trn ct n ca bng B v t truy vt tm ra ng i nhiu im nht.

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

PHN 4. CC THUT TON TRN


TH

Trn thc t c nhiu bi ton lin quan ti mt tp cc


i tng v nhng mi lin h gia chng, i hi ton
hc phi t ra mt m hnh biu din mt cch cht ch
v tng qut bng ngn ng k hiu, l th. Nhng
tng c bn ca n c a ra t th k th XVIII
Leonhard Euler
bi nh ton hc Thu S Leonhard Euler, ng dng
(1707-1783)
m hnh th gii bi ton v nhng cy cu Konigsberg ni ting.
Mc d L thuyt th c khoa hc pht trin t rt lu nhng li
c nhiu ng dng hin i. c bit trong khong vi mi nm tr li
y, cng vi s ra i ca my tnh in t v s pht trin nhanh chng
ca Tin hc, L thuyt th cng c quan tm n nhiu hn. c
bit l cc thut ton trn th c nhiu ng dng trong nhiu lnh
vc khc nhau nh: Mng my tnh, L thuyt m, Ti u ho, Kinh t
hc v.v Hin nay, mn hc ny l mt trong nhng kin thc c s ca
b mn khoa hc my tnh.
Trong phm vi mt chuyn , khng th ni k v ni ht nhng vn
ca l thuyt th. Tp bi ging ny s xem xt l thuyt th di
gc ngi lp trnh, tc l kho st nhng thut ton c bn nht c
th d dng ci t trn my tnh mt s ng dng ca n.. Cng vic
ca ngi lp trnh l c hiu c tng c bn ca thut ton v ci
t c chng trnh trong bi ton tng qut cng nh trong trng
hp c th.

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

Hnh 52: V d v m hnh th

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


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

HSPHN 1999-2004

L thuyt th

179

V hng

C hng

V hng

n th

C hng

a th

Hnh 53: Phn loi th

1.2. CC KHI NIM


Nh trn nh ngha th G = (V, E) l mt cu trc ri rc, tc l cc tp V v E hoc l
tp hu hn, hoc l tp m c, c ngha l ta c th nh s th t 1, 2, 3 cho cc phn
t ca tp V v E. Hn na, ng trn phng din ngi lp trnh cho my tnh th ta ch
quan tm n cc th hu hn (V v E l tp hu hn) m thi, chnh v vy t y v sau,
nu khng ch thch g thm th khi ni ti th, ta hiu rng l th hu hn.

1.2.1. Cnh lin thuc, nh k, bc


i vi th v hng G = (V, E). Xt mt cnh e E, nu e = (u, v) th ta ni hai nh u v
v l k nhau (adjacent) v cnh e ny lin thuc (incident) vi nh u v nh v.
Vi mt nh v trong th, ta nh ngha bc (degree) ca v, k hiu deg(v) l s cnh lin
thuc vi v. D thy rng trn n th th s cnh lin thuc vi v cng l s nh k vi v.
nh l: Gi s G = (V, E) l th v hng vi m cnh, khi tng tt c cc bc nh
trong V s bng 2m:

deg ( v ) = 2m

vV

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


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

180

Chuyn

deg ( v ) = deg ( v ) = m
+

vV

vV

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


c tnh ng 1 ln trong deg+(u) v cng c tnh ng 1 ln trong deg-(v). T suy ra
kt qu

1.2.2. ng i v chu trnh


Mt ng i vi di p l mt dy P=v0, v1, , vp ca cc nh sao cho (vi-1, vi) E, (i:
1 i p). Ta ni ng i P bao gm cc nh v0, v1, , vp v cc cnh (v0, v1), (v1, v2), ,
(vp-1, vp). Nu c mt ng i nh trn th ta ni vp n c (reachable) t v0 qua P. Mt
ng i gi l n gin (simple) nu tt c cc nh trn ng i l hon ton phn bit,
mt ng i con (subpath) P' ca P l mt on lin tc ca cc dy cc nh dc theo P.
ng i P tr thnh chu trnh (circuit) nu v0=vp. Chu trnh P gi l n gin (simple) nu
v1, v2, , vp l hon ton phn bit

1.2.3. Mt s khi nim khc


Hai th G = (V, E) v G'=(V', E') c gi l ng cu (isomorphic) nu tn ti mt song
nh f:VV' sao cho (u, v) E nu v ch nu (f(u), f(v)) E'.
th G'=(V', E') l th con (subgraph) ca th G = (V, E) nu V' V v E' E. Khi
G' c gi l th con cm ng (induced) t G bi V nu E'={(u, v) E| u, v V'}
Cho mt th v hng G = (V, E), ta gi phin bn c hng (directed version) ca G l
mt th c hng G' = (V, E') sao cho (u, v) E' nu v ch nu (u, v) E. Ni cch khc
G' c to thnh t G bng cch thay mi cnh bng hai cung c hng ngc chiu nhau.
Cho mt th c hng G = (V, E), ta gi phin bn v hng (undirected version) ca G
l mt th v hng G' = (V, E') sao cho (u, v) E' nu v ch nu (u, v) E hoc (v, u)
E.
Mt th v hng gi l lin thng (connected) nu vi mi cp nh (u, v) ta c u n
c v. Mt th c hng gi l lin thng mnh (strongly connected) nu vi mi cp
nh (u, v), ta c u n c v v v n c u. Mt th c hng gi l lin thng yu
(weakly connected) nu phin bn v hng ca n l th lin thng.
Mt th v hng c gi l y (complete) nu mi cp nh u l k nhau. Mt
th v hng gi l hai pha (bipartite) nu tp nh ca n c th chia lm hai tp ri nhau
X, Y sao cho khng tn ti cnh ni hai nh X cng nh khng tn ti cnh ni hai nh
Y.
Ngi ta cn m rng khi nim th thnh siu th (hypergraph), mt siu th
tng t nh th v hng, nhng mi siu cnh (hyperedge) khng nhng ch c th ni
hai nh m cn c th ni mt tp cc nh vi nhau.

HSPHN 1999-2004

L thuyt th

181

2. BIU DIN TH TRN MY TNH


2.1. MA TRN K (ADJACENCY MATRIX)
Gi s G = (V, E) l mt n th c s nh (k hiu V) l n, Khng mt tnh tng qut
c th coi cc nh c nh s 1, 2, , n. Khi ta c th biu din th bng mt ma
trn vung A = [a[i, j]] cp n. Trong :
a[i, j] = 1 nu (i, j) E
a[i, j] = 0 nu (i, j) E
Vi i, gi tr ca a[i, i] c th t tu theo mc ch, thng thng nn t bng 0;
i vi a th th vic biu din cng tng t trn, ch c iu nu nh (i, j) l cnh th
khng phi ta ghi s 1 vo v tr a[i, j] m l ghi s cnh ni gia nh i v nh j.
V d:
1

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

Cc tnh cht ca ma trn k:


i vi th v hng G, th ma trn k tng ng l ma trn i xng (a[i, j] = a[j, i]), iu
ny khng ng vi th c hng.
Nu G l th v hng v A l ma trn k tng ng th trn ma trn A:
Tng cc s trn hng i = Tng cc s trn ct i = Bc ca nh i = deg(i)
Nu G l th c hng v A l ma trn k tng ng th trn ma trn A:
Tng cc s trn hng i = Bn bc ra ca nh i = deg+(i)
Tng cc s trn ct i = Bn bc vo ca nh i = deg-(i)
Trong trng hp G l n th, ta c th biu din ma trn k A tng ng l cc phn t
logic. a[i, j] = TRUE nu (i, j) E v a[i, j] = FALSE nu (i, j) E
u im ca ma trn k:
n gin, trc quan, d ci t trn my tnh
kim tra xem hai nh (u, v) ca th c k nhau hay khng, ta ch vic kim tra bng
mt php so snh: a[u, v] 0.
Nhc im ca ma trn k:

L Minh Hong

182

Chuyn

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


phn t ma trn, iu gy lng ph b nh dn ti vic khng th biu din c th
vi s nh ln.
Vi mt nh u bt k ca th, nhiu khi ta phi xt tt c cc nh v khc k vi n,
hoc xt tt c cc cnh lin thuc vi n. Trn ma trn k vic c thc hin bng
cch xt tt c cc nh v v kim tra iu kin a[u, v] 0. Nh vy, ngay c khi nh u l
nh c lp (khng k vi nh no) hoc nh treo (ch k vi 1 nh) ta cng buc phi
xt tt c cc nh v kim tra iu kin trn dn ti lng ph thi gian

2.2. DANH SCH CNH (EDGE LIST)


Trong trng hp th c n nh, m cnh, ta c th biu din th di dng danh sch
cnh bng cch lit k tt c cc cnh ca th trong mt danh sch, mi phn t ca danh
sch l mt cp (u, v) tng ng vi mt cnh ca th. (Trong trng hp th c hng
th mi cp (u, v) tng ng vi mt cung, u l nh u v v l nh cui ca cung). Danh
sch c lu trong b nh di dng mng hoc danh sch mc ni. V d vi th Hnh
54:
1

Hnh 54

Ci t trn mng:
1

(1, 2)

(1, 3)

1, 5)

(2, 3)

5
(3, 4)

6
(4, 5)

Ci t trn danh sch mc ni:


(1, 2)

(1, 3)

1, 5)

(2, 3)

(3, 4)

(4, 5)

u im ca danh sch cnh:


Trong trng hp th tha (c s cnh tng i nh: chng hn m < 6n), cch biu
din bng danh sch cnh s tit kim c khng gian lu tr, bi n ch cn 2m nh
lu danh sch cnh.
Trong mt s trng hp, ta phi xt tt c cc cnh ca th th ci t trn danh sch
cnh lm cho vic duyt cc cnh d dng hn. (Thut ton Kruskal chng hn)
Nhc im ca danh sch cnh:
Nhc im c bn ca danh sch cnh l khi ta cn duyt tt c cc nh k vi nh v
no ca th, th chng c cch no khc l phi duyt tt c cc cnh, lc ra nhng
HSPHN 1999-2004

L thuyt th

183

cnh c cha nh v v xt nh cn li. iu kh tn thi gian trong trng hp th


dy (nhiu cnh).

2.3. DANH SCH K (ADJACENCY LIST)


khc phc nhc im ca cc phng php ma trn k v danh sch cnh, ngi ta
xut phng php biu din th bng danh sch k. Trong cch biu din ny, vi mi nh
v ca th, ta cho tng ng vi n mt danh sch cc nh k vi v.
Vi th G = (V, E). V gm n nh v E gm m cnh. C hai cch ci t danh sch k ph
bin:
1

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

bit mt on nm t ch s no n ch s no, ta c mt mng Head lu v tr ring.


Head[i] s bng ch s ng lin trc on th i. Quy c Head[n + 1] bng m. Vi th
bn th mng Head[1..6] s l: (0, 3, 5, 8, 10, 12)
Cc phn t Adj[Head[i] + 1..Head[i + 1]] s cha cc nh k vi nh i. Lu rng vi
th c hng gm m cung th cu trc ny cn phi cha m phn t, vi th v hng m
cnh th cu trc ny cn phi cha 2m phn t
Cch 2: Dng cc danh sch mc ni: Vi mi nh i ca th, ta cho tng ng vi n mt
danh sch mc ni cc nh k vi i, c ngha l tng ng vi mt nh i, ta phi lu li
List[i] l cht ca mt danh sch mc ni. V d vi th Hnh 55, cc danh sch mc ni
s l:

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

3. CC THUT TON TM KIM TRN TH


3.1. BI TON
Cho th G = (V, E). u v v l hai nh ca G. Mt ng i (path) di p t nh s n
nh f l dy x[0..p] tho mn x[0] = s, x[p] = f v (x[i], x[i+1]) E vi i: 0 i < p.
ng i ni trn cn c th biu din bi dy cc cnh: (s = x[0], x[1]), (x[1], x[2]), ,
(x[p-1], x[p] = f)
nh u c gi l nh u, nh v c gi l nh cui ca ng i. ng i c nh u
trng vi nh cui gi l chu trnh (Circuit), ng i khng c cnh no i qua hn 1 ln
gi l ng i n, tng t ta c khi nim chu trnh n.
V d: Xt mt th v hng v mt th c hng trong Hnh 56:
2

Hnh 56: th v ng i

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


phi ng i v khng c cnh (cung) ni t nh 6 ti nh 5.
Mt bi ton quan trng trong l thuyt th l bi ton duyt tt c cc nh c th n
c t mt nh xut pht no . Vn ny a v mt bi ton lit k m yu cu ca n
l khng c b st hay lp li bt k nh no. Chnh v vy m ta phi xy dng nhng
thut ton cho php duyt mt cch h thng cc nh, nhng thut ton nh vy gi l nhng
thut ton tm kim trn th v y ta quan tm n hai thut ton c bn nht: thut
ton tm kim theo chiu su v thut ton tm kim theo chiu rng cng vi mt s ng
dng ca chng.
Nhng ci t di y l cho n th v hng, mun lm vi th c hng hay a
th cng khng phi sa i g nhiu.
Input: file vn bn PATH.INP. Trong :
Dng 1 cha s nh n ( 100), s cnh m ca th, nh xut pht s, nh kt thc f cch
nhau mt du cch.
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau mt du cch, th
hin c cnh ni nh u v nh v trong th.
Output: file vn bn PATH.OUT:
Danh sch cc nh c th n c t s
HSPHN 1999-2004

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

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


T tng ca thut ton c th trnh by nh sau: Trc ht, mi nh x k vi S tt nhin s
n c t S. Vi mi nh x k vi S th tt nhin nhng nh y k vi x cng n c
t S iu gi cho ta vit mt th tc quy DFS(u) m t vic duyt t nh u bng
cch thm nh u v tip tc qu trnh duyt DFS(v) vi v l mt nh cha thm k vi u.
khng mt nh no b lit k ti hai ln, ta s dng k thut nh du, mi ln thm mt
nh, ta nh du nh li cc bc duyt quy k tip khng duyt li nh na
lu li ng i t nh xut pht s, trong th tc DFS(u), trc khi gi quy DFS(v)
vi v l mt nh k vi u m cha nh du, ta lu li vt ng i t u ti v bng cch t
Trace[v] := u, tc l Trace[v] lu li nh lin trc v trong ng i t s ti v. Khi qu trnh
tm kim theo chiu su kt thc, ng i t s ti f s l:
f p[1] = Trace[F] p[2] = Trace[p[1]] s.
procedure DFS(uV);
begin
Free[u] := False; {Free[u] = False u thm}
for (v V: Free[v] and ((u, v)E) ) do {Duyt mi nh v cha thm k vi u}
begin
Trace[v] := u; {Lu vt ng i, nh lin trc v trn ng i t s ti v l u}
DFS(v); {Gi quy duyt tng t i vi v}
end;
end;
begin {Chng trnh chnh}
Nhp d liu: th, nh xut pht S, nh ch F;
for (v V) do Free[v] := True; {nh du mi nh u cha thm}
DFS(S);
Thng bo t s c th thm c nhng nh v m Free[v] = False;
if Free[f] then {s i ti c f}
Truy theo vt t f tm ng i t s ti f;
end.

Trong ci t c th, ta khng cn mng nh du Free[1..n] m dng lun mng Trace[1..n]


nh du, khi to cc phn t Trace[s] := -1 v Trace[v] := 0 vi vs. iu kin mt
nh v cha thm l Trace[v] = 0, mi khi t nh u thm nh v, php gn Trace[v] := u s
kim lun cng vic nh du v thm.
P_4_03_1.PAS * Thut ton tm kim theo chiu su
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Depth_First_Search;
L Minh Hong

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

Hnh 57: Cy DFS

3.3. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST


SEARCH)
C s ca phng php ci t ny l lp lch duyt cc nh. Vic thm mt nh s ln
lch duyt cc nh k n sao cho th t duyt l u tin chiu rng (nh no gn S hn s
c duyt trc). V d: Bt u ta thm nh S. Vic thm nh S s pht sinh th t duyt
nhng nh (x[1], x[2], , x[p]) k vi S (nhng nh gn S nht). Khi thm nh x[1] s li
pht sinh yu cu duyt nhng nh (u[1], u[2] , u[q]) k vi x[1]. Nhng r rng cc nh
u ny xa S hn nhng nh x nn chng ch c duyt khi tt c nhng nh x duyt
xong. Tc l th t duyt nh sau khi thm x[1] s l: (x[2], x[3], x[p], u[1], u[2], ,
u[q]).
S

x1

u1

L Minh Hong

u2

x2

uq

xp

Phi duyt sau xp

190

Chuyn

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


nh u danh sch v cho nhng nh cha xp hng k vi n xp hng thm vo cui
danh sch. Chnh v nguyn tc nn danh sch cha nhng nh ang ch s c t chc
di dng hng i (Queue)
Nu ta c Queue l mt hng i vi th tc Push(v) y mt nh v vo hng i v hm
Pop tr v mt nh ly ra t hng i th m hnh ca gii thut c th vit nh sau:
for (v V) do Free[v] := True;
Free[s] := False; {Khi to ban u ch c nh S b nh du}
Queue := ; Push(s); {Khi to hng i ban u ch gm mt nh s}
repeat {Lp ti khi hng i rng}
u := Pop; {Ly t hng i ra mt nh u}
for (v V: Free[v] and ((u, v) E)) do {Xt nhng nh v k u cha b a vo hng i}
begin
Trace[v] := u; {Lu vt ng i}
Free[v] := False; {nh du v}
Push(v); {y v vo hng i}
end;
until Queue = ;
Thng bo t s c th thm c nhng nh v m Free[v] = False;
if Free[f] then {s i ti c f}
Truy theo vt t f tm ng i t s ti f;

Tng t nh thut ton tm kim theo chiu su, ta c th dng mng Trace[1..n] kim lun
chc nng nh du.
P_4_03_2.PAS * Thut ton tm kim theo chiu rng
{$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

Hnh 58: Cy BFS

3.4. PHC TP TNH TON CA BFS V DFS


Qu trnh tm kim trn th bt u t mt nh c th thm tt c cc nh cn li, khi
cch biu din th c nh hng ln ti chi ph v thi gian thc hin gii thut:
Trong trng hp ta biu din th bng danh sch k, c hai thut ton BFS v DFS u
c phc tp tnh ton l O(n + m) = O(max(n, m)). y l cch ci t tt nht.
Nu ta biu din th bng ma trn k nh trn th phc tp tnh ton trong trng
hp ny l O(n + n2) = O(n2).
Nu ta biu din th bng danh sch cnh, thao tc duyt nhng nh k vi nh u s
dn ti vic phi duyt qua ton b danh sch cnh, y l ci t ti nht, n c phc
tp tnh ton l O(n.m).
Bi tp
Bi 1
M cung hnh ch nht kch thc m x n gm cc vung n v. Trn mi ghi mt trong
ba k t:
O: Nu an ton
X: Nu c cm by
E: Nu l c mt nh thm him ang ng.
Duy nht ch c 1 ghi ch E. Nh thm him c th t mt i sang mt trong s cc
chung cnh vi ang ng. Mt cch i thot khi m cung l mt hnh trnh i qua cc
an ton ra mt bin. Hy ch gip cho nh thm him mt hnh trnh thot ra khi m cung.
Bi 2
C nhiu cch dng cy gc s cha tt c cc nh n c t s tho mn: nu u l nt cha
ca nt v trn cy th (u, v) phi l cnh ca G. Cy BFS v cy DFS ch l hai trng hp
c bit. Ta bit cy BFS l cy thp nht, vy phi chng cy DFS l cy cao nht trong
s cc cy ny?

HSPHN 1999-2004

L thuyt th

193

4. TNH LIN THNG CA TH


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

G3
G2

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

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


c nhiu thnh phn lin thng hn th ban u, cc nh nh th gi l nh ct hay im
khp. Hon ton tng t, nhng cnh m khi ta b n i s to ra mt th c nhiu thnh
phn lin thng hn so vi th ban u c gi l mt cnh ct hay mt cu.

Khp

Cu

Hnh 60: Khp v cu

4.1.2. i vi th c hng G = (V, E)


C hai khi nim v tnh lin thng ca th c hng tu theo chng ta c quan tm ti
hng ca cc cung khng.
G gi l lin thng mnh (Strongly connected) nu lun tn ti ng i (theo cc cung nh
hng) gia hai nh bt k ca th, G gi l lin thng yu (weakly connected) nu phin
bn v hng ca n l th lin thng.

th G = (V, E) l con ca th G' = (V', E') nu G l th c VV' v E E'

L Minh Hong

194

Chuyn

Hnh 61: Lin thng mnh v lin thng yu

4.2. TNH LIN THNG TRONG TH V HNG


Mt bi ton quan trng trong l thuyt th l bi ton kim tra tnh lin thng ca th
v hng hay tng qut hn: Bi ton lit k cc thnh phn lin thng ca th v hng.
Gi s th v hng G = (V, E) c n nh nh s 1, 2, , n.
lit k cc thnh phn lin thng ca G phng php c bn nht l:
nh du nh 1 v nhng nh c th n t 1, thng bo nhng nh thuc thnh phn
lin thng th nht.
Nu tt c cc nh u b nh du th G l th lin thng, nu khng th s tn ti mt
nh v no cha b nh du, ta s nh du v v cc nh c th n c t v, thng bo
nhng nh thuc thnh phn lin thng th hai.
V c tip tc nh vy cho ti khi tt c cc nh u b nh du
procedure Scan(u)
begin
Dng BFS hoc DFS lit k v nh du nhng nh c th n c t u;
end;
begin
for v V do khi to v cha nh du;
Count := 0;
for u := 1 to n do
if <u cha nh du> then
begin
Count := Count + 1;
WriteLn('Thnh phn lin thng th ', Count, ' gm cc nh : ');
Scan(u);
end;
end.

Vi thut ton lit k cc thnh phn lin thng nh th ny, th phc tp tnh ton ca n
ng bng phc tp tnh ton ca thut ton tm kim trn th trong th tc Scan.

4.3. TH Y V THUT TON WARSHALL


4.3.1. nh ngha:
th y vi n nh, k hiu Kn, l mt n th v hng m gia hai nh bt k ca
n u c cnh ni.
n n ( n 1)
th y Kn c ng: =
cnh v bc ca mi nh u bng n - 1.
2
2

HSPHN 1999-2004

L thuyt th

195

K3

K4

K5

Hnh 62: th y

4.3.2. Bao ng th:


Vi th G = (V, E), ngi ta xy dng th G' = (V, E') cng gm nhng nh ca G cn
cc cnh xy dng nh sau: ( y quy c gia u v u lun c ng i)
Gia nh u v v ca G' c cnh ni Gia nh u v v ca G c ng i
th G' xy dng nh vy c gi l bao ng ca th G.
T nh ngha ca th y , ta d dng suy ra mt th y bao gi cng lin thng
v t nh ngha th lin thng, ta cng d dng suy ra c:
Mt n th v hngl lin thng nu v ch nu bao ng ca n l th y
Mt n th v hng c k thnh phn lin thng nu v ch nu bao ng ca n c k
thnh phn lin thng y .

Hnh 63: n th v hng v bao ng ca n

Bi vic kim tra mt th c phi th y hay khng c th thc hin kh d dng


(m s cnh chng hn) nn ngi ta ny ra tng c th kim tra tnh lin thng ca
th thng qua vic kim tra tnh y ca bao ng. Vn t ra l phi c thut ton xy
dng bao ng ca mt th cho trc v mt trong nhng thut ton l:

4.3.3. Thut ton Warshall


Thut ton Warshall - gi theo tn ca Stephen Warshall, ngi m t thut ton ny vo
nm 1960, i khi cn c gi l thut ton Roy-Warshall v Roy cng m t thut ton
ny vo nm 1959. Thut ton c th m t rt gn:
Vi n th v hng G, vi mi nh k xt theo th t t 1 ti n, ta xt tt c cc cp nh
(u, v): nu c cnh ni (u, k) v cnh ni (k, v) th ta t ni thm cnh (u, v) nu n cha c.

L Minh Hong

196

Chuyn

T tng ny da trn mt quan st n gin nh sau: Nu t u c ng i ti k v t k li


c ng i ti v th tt nhin t u s c ng i ti v.
Vi n l s nh ca th v A = {a[i, j]} l ma trn k biu din th, ta c th vit thut
ton Warshall nh sau:
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];

Vic chng minh tnh ng n ca thut ton i hi phi lt li cc l thuyt v bao ng


bc cu v quan h lin thng, ta s khng trnh by y. C nhn xt rng tuy thut ton
Warshall rt d ci t nhng phc tp tnh ton ca thut ton ny kh ln (O(n3)).
Di y, ta s th ci t thut ton Warshall tm bao ng ca n th v hng sau
m s thnh phn lin thng ca th:
Vic ci t thut ton s qua nhng bc sau:
Nhp ma trn k A ca th (Lu y A[v, v] lun c coi l True vi v)
Dng thut ton Warshall tm bao ng, khi A l ma trn k ca bao ng th
Da vo ma trn k A, nh 1 v nhng nh k vi n s thuc thnh phn lin thng th
nht; vi nh u no khng k vi nh 1, th u cng vi nhng nh k n s thuc
thnh phn lin thng th hai; vi nh v no khng k vi c nh 1 v nh u, th v
cng vi nhng nh k n s thuc thnh phn lin thng th ba v.v
u

Input: file vn bn CONNECT.INP


Dng 1: Cha s nh n ( 100) v s cnh m ca th cch nhau t nht mt du cch
m dng tip theo, mi dng cha mt cp s u v v cch nhau t nht mt du cch tng
trng cho mt cnh (u, v)
Output: file vn bn CONNECT.OUT, lit k cc thnh phn lin thng
1
3

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

P_4_04_1.PAS * Thut ton Warshall lit k cc thnh phn lin thng


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Connectivity;
const
InputFile = 'CONNECT.INP';
OutputFile = 'CONNECT.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th}
Free: array[1..max] of Boolean; {Free[v] = True v cha c lit k vo thnh phn lin thng no}
k, u, v, n: Integer;
Count: Integer;
fo: Text;
procedure Enter; {Nhp th}
var
i, u, v, m: Integer;
fi: Text;
begin
FillChar(a, SizeOf(a), False);
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, m);
for v := 1 to n do a[v, v] := True; {D nhin t v c ng i n chnh v}
for i := 1 to m do
begin
ReadLn(fi, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(fi);
end;
begin
Enter;
{Thut ton Warshall}
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];
Assign(fo, OutputFile); Rewrite(fo);
Count := 0;
FillChar(Free, n, True); {Mi nh u cha c lit k vo thnh phn lin thng no}
for u := 1 to n do
if Free[u] then {Vi mt nh u cha c lit k vo thnh phn lin thng no}
begin
Inc(Count);
WriteLn(fo, 'Connected Component ', Count, ': ');
for v := 1 to n do
if a[u, v] then {Xt nhng nh k u (trn bao ng)}
begin
Write(fo, v, ', '); {Lit k nh vo thnh phn lin thng cha u}
Free[v] := False; {Lit k nh no nh du nh }
end;
WriteLn(fo);
end;
Close(fo);
end.

4.4. CC THNH PHN LIN THNG MNH


i vi th c hng, ngi ta quan tm n bi ton kim tra tnh lin thng mnh, hay
tng qut hn: Bi ton lit k cc thnh phn lin thng mnh ca th c hng. i vi
L Minh Hong

198

Chuyn

bi ton ta c mt phng php kh hu hiu da trn thut ton tm kim theo chiu su
Depth First Search.

4.4.1. Phn tch


Thm vo th mt nh x v ni x vi tt c cc nh cn li ca th bng cc cung nh
hng. Khi qu trnh tm kim theo chiu su bt u t x c th coi nh mt qu trnh xy
dng cy tm kim theo chiu su (cy DFS) gc x.
procedure Visit(uV);
begin
Thm u vo cy tm kim DFS;
for (v: (v cy DFS) and ((u, v) E)) do Visit(v);
end;
begin
Thm vo th nh x v cc cung nh hng (x, v) vi mi v;
Khi to cy tm kim DFS := ;
Visit(x);
end.

th tc thm nh quy Visit(u). Th tc ny xt tt c nhng nh v ni t u, nu v


cha c thm th i theo cung thm v, tc l b sung cung (u, v) vo cy tm kim DFS.
Nu v thm th c ba kh nng xy ra i vi v tr ca u v v trong cy tm kim DFS:
v l tin bi (ancestor - t tin) ca u, tc l v c thm trc u v th tc Visit(u) do dy
chuyn quy t th tc Visit(v) gi ti. Cung (u, v) khi c gi l cung ngc (Back
edge)
v l hu du (descendant - con chu) ca u, tc l u c thm trc v, nhng th tc
Visit(u) sau khi tin quy theo mt hng khc gi Visit(v) ri. Nn khi dy chuyn
quy li li v th tc Visit(u) s thy v l thm nn khng thm li na. Cung (u, v)
khi gi l cung xui (Forward edge).
v thuc mt nhnh ca cy DFS duyt trc , tc l s c mt nh w c thm
trc c u v v. Th tc Visit(w) gi trc s r theo mt nhnh no thm v trc, ri
khi li li, r sang mt nhnh khc thm u. Cung (u, v) khi gi l cung cho (Cross
edge)
(Rt tic l t in thut ng tin hc Anh-Vit qu ngho nn nn khng th tm ra nhng t
tng ng vi cc thut ng trn. Ta c th hiu qua cc v d).

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

TH3: v nm nhnh DFS duyt trc u


(u, v l cung cho)

Hnh 64: Ba dng cung ngoi cy DFS

Ta nhn thy mt c im ca thut ton tm kim theo chiu su, thut ton khng ch duyt
qua cc nh, n cn duyt qua tt c nhng cung na. Ngoi nhng cung nm trn cy tm
kim, nhng cung cn li c th chia lm ba loi: cung ngc, cung xui, cung cho.

4.4.2. Cy tm kim DFS v cc thnh phn lin thng mnh


nh l 1: Nu a, b l hai nh thuc thnh phn lin thng mnh C th vi mi ng i t a
ti b cng nh t b ti a. Tt c nh trung gian trn ng i u phi thuc C.
Chng minh
Nu a v b l hai nh thuc C th tc l c mt ng i t a ti b v mt ng i khc t b
ti a. Suy ra vi mt nh v nm trn ng i t a ti b th a ti c v, v ti c b, m b
c ng ti a nn v cng ti c a. Vy v nm trong thnh phn lin thng mnh cha a tc
l vC. Tng t vi mt nh nm trn ng i t b ti a.
nh l 2: Vi mt thnh phn lin thng mnh C bt k, s tn ti mt nh r C sao cho
mi nh ca C u thuc nhnh DFS gc r.
Chng minh: Trc ht, nhc li mt thnh phn lin thng mnh l mt th con lin
thng mnh ca th ban u tho mn tnh cht ti i tc l vic thm vo thnh phn
mt tp hp nh khc s lm mt i tnh lin thng mnh.
Trong s cc nh ca C, chn r l nh c thm u tin theo thut ton tm kim theo
chiu su. Ta s chng minh C nm trong nhnh DFS gc r. Tht vy: vi mt nh v bt k
ca C, do C lin thng mnh nn phi tn ti mt ng i t r ti v:
(r = x[0], x[1], , x[k] = v)
T nh l 1, tt c cc nh x[1], x[2], , x[k] u thuc C nn chng s phi thm sau nh
r. Khi th tc Visit(r) c gi th tt c cc nh x[1], x[2], x[k]=v u cha thm; v th
tc Visit(r) s lit k tt c nhng nh cha thm n c t r bng cch xy dng nhnh
gc r ca cy DFS, nn cc nh x[1], x[2], , x[k] = v s thuc nhnh gc r ca cy DFS.
Bi chn v l nh bt k trong C nn ta c iu phi chng minh.
nh r trong chng minh nh l - nh thm trc tt c cc nh khc trong C - gi l cht
ca thnh phn C. Mi thnh phn lin thng mnh c duy nht mt cht. Xt v v tr trong
cy tm kim DFS, cht ca mt thnh phn lin thng l nh nm cao nht so vi cc nh
L Minh Hong

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.

4.4.3. Thut ton Tarjan (R.E.Tarjan - 1972)


Chn u l cht m t qu trnh tm kim theo chiu su khng thm thm bt k mt cht
no khc, chn ly thnh phn lin thng mnh th nht l nhnh DFS gc u. Sau loi b
nhnh DFS gc u ra khi cy DFS, li tm thy mt nh cht v khc m nhnh DFS gc v
khng cha cht no khc, li chn ly thnh phn lin thng mnh th hai l nhnh DFS gc
v. Tng t nh vy cho thnh phn lin thng mnh th ba, th t, v.v C th hnh dung
thut ton Tarjan b cy DFS ti v tr cc cht c cc nhnh ri rc, mi nhnh l mt
thnh phn lin thng mnh.

HSPHN 1999-2004

L thuyt th

201

3
4
9

10

4
11

10

11

6
7

Hnh 65: Thut ton Tarjan b cy DFS

Trnh by di dng nh vy, nhng iu quan trng nht by gi mi ni ti: Lm th no


kim tra mt nh v no c phi l cht hay khng ?
Hy nhnh DFS gc nh r no .
Nhn xt 1: Nu nh t cc nh thuc nhnh gc r ny khng c cung ngc hay cung cho
no i ra khi nhnh th r l cht. iu ny d hiu bi nh vy c ngha l t r, i theo cc
cung ca th th ch n c nhng nh thuc nhnh m thi. Vy:
Thnh phn lin thng mnh cha r Tp cc nh c th n t r = Nhnh DFS gc r
nn r l cht.
Nhn xt 2: Nu t mt nh v no ca nhnh DFS gc r c mt cung ngc ti mt nh
w l tin bi ca r, th r khng l cht. Tht vy: do c chu trnh (wrvw) nn w, r, v
thuc cng mt thnh phn lin thng mnh. M w c thm trc r, iu ny mu thun
vi cch xc nh cht (Xem li nh l 2)
Nhn xt 3: Vn phc tp gp phi y l nu t mt nh v ca nhnh DFS gc r, c
mt cung cho i ti mt nhnh khc. Ta s thit lp gii thut lit k thnh phn lin thng
mnh ngay trong th tc Visit(u), khi m nh u duyt xong, tc l khi cc nh khc ca
nhnh DFS gc u u thm v qu trnh thm quy li li v Visit(u). Nu nh u l cht,
ta thng bo nhnh DFS gc u l thnh phn lin thng mnh cha u v loi ngay cc nh
thuc thnh phn khi th cng nh khi cy DFS. C th chng minh c tnh ng
n ca phng php ny, bi nu nhnh DFS gc u cha mt cht u' khc th u' phi duyt
xong trc u v c nhnh DFS gc u' b loi b ri. Hn na cn c th chng minh c
rng, khi thut ton tin hnh nh trn th nu nh t mt nh v ca mt nhnh DFS gc r
c mt cung cho i ti mt nhnh khc th r khng l cht.
chng t iu ny, ta da vo tnh cht ca cy DFS: cung cho s ni t mt nhnh ti
nhnh thm trc , ch khng bao gi c cung cho i ti nhnh thm sau. Gi s c cung
cho (v, v') i t v nhnh DFS gc r ti v' nhnh DFS gc r, gi r' l cht ca thnh phn

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

function Pop: Integer; {Ly mt nh khi ngn xp, tr v trong kt qu hm}


begin
Pop := Stack[Top];
Dec(Top);
end;
function Min(x, y: Integer): Integer;
begin
if x < y then Min := x else Min := y;
end;
procedure Visit(u: Integer); {Thut ton tm kim theo chiu su bt u t u}
var
v: Integer;
begin
Inc(Count); Number[u] := Count; {Trc ht nh s cho u}
Low[u] := Number[u]; {Coi u c cung ti u, nn c th khi gn Low[u] th ny ri sau cc tiu ho dn}
Push(u); {y u vo ngn xp}
for v := 1 to n do
if Free[v] and a[u, v] then {Xt nhng nh v k u}
if Number[v] <> 0 then {Nu v thm}
Low[u] := Min(Low[u], Number[v]) {Cc tiu ho Low[u] theo cng thc ny}
else {Nu v cha thm}
begin
Visit(v); {Tip tc tm kim theo chiu su bt u t v}
Low[u] := Min(Low[u], Low[v]); {Ri cc tiu ho Low[u] theo cng thc ny}
end;
{n y th nh u c duyt xong, tc l cc nh thuc nhnh DFS gc u u thm}
if Number[u] = Low[u] then {Nu u l cht}
begin {Lit k thnh phn lin thng mnh c cht u}
Inc(ComponentCount);
WriteLn(fo, 'Component ', ComponentCount, ': ');
repeat
v := Pop; {Ly dn cc nh ra khi ngn xp}
Write(fo, v, ', '); {Lit k cc nh }
Free[v] := False; {Ri loi lun khi th}
until v = u; {Cho ti khi ly ti nh u}
WriteLn(fo);
end;
end;
procedure Solve;
var
u: Integer;
begin
{Thay v thm mt nh gi x v cc cung (x, v) vi mi nh v ri gi Visit(x), ta c th lm th ny cho nhanh}
for u := 1 to n do
if Number[u] = 0 then Visit(u);
end;
begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
Init;
Solve;
Close(fo);
end.

Bi tp
Bi 1

L Minh Hong

206

Chuyn

Phng php ci t nh trn c th ni l rt hay v hiu qu, i hi ta phi hiu r bn cht


thut ton, nu khng th rt d nhm. Trn thc t, cn c mt phng php khc d hiu
hn, tuy tnh hiu qu c km hn mt cht. Hy vit chng trnh m t phng php sau:
Vn dng thut ton tm kim theo chiu su vi th tc Visit ni u mc, nh s li cc
nh t 1 ti n theo th t duyt xong, sau o chiu tt c cc cung ca th. Xt ln
lt cc nh theo th t t nh duyt xong sau cng ti nh duyt xong u tin, vi mi
nh , ta li dng thut ton tm kim trn th (BFS hay DFS) lit k nhng nh no n
c t nh ang xt, chnh l mt thnh phn lin thng mnh. Lu l khi lit k xong
thnh phn no, ta loi ngay cc nh ca thnh phn khi th.
Tnh ng n ca phng php c th hnh dung khng my kh khn:
Trc ht ta thm vo th nh x v cc cung (x, v) vi mi v, sau gi Visit(x) xy
dng cy DFS gc x. Hin nhin x l cht ca thnh phn lin thng ch gm mi x. Sau
b nh x khi cy DFS, cy s phn r thnh cc cy con.
nh r duyt xong sau cng chc chn l gc ca mt cy con (bi khi duyt xong n chc
chn s li v x) suy ra r l cht. Hn th na, nu mt nh u no ti c r th u cng
phi thuc cy con gc r. Bi nu gi s phn chng rng u thuc cy con khc th u phi
c thm trc r (do cy con gc r c thm ti sau cng), c ngha l khi Visit(u) th r
cha thm. Vy nn r s thuc nhnh DFS gc u, mu thun vi lp lun r l gc. T suy
ra nu u ti c r th r ti c u, tc l khi o chiu cc cung, nu r ti c nh no th
nh thuc thnh phn lin thng cht r.
Loi b thnh phn lin thng vi cht r khi th. Cy con gc r li phn r thnh nhiu
cy con. Lp lun tng t nh trn vi v' l nh duyt xong sau cng (Hnh 66).
V d:

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

Thut ton Warshall c th p dng tm bao ng ca th c hng, vy hy kim tra tnh


lin thng mnh ca mt th c hng bng hai cch: Dng cc thut ton tm kim trn
th v thut ton Warshall, sau so snh u, nhc im ca mi phng php
Bi 3
Trn mt phng vi h to Decattes vung gc cho n ng trn, mi ng trn xc nh
bi b 3 s thc (X, Y, R) y (X, Y) l to tm v R l bn knh. Hai ng trn gi l
thng nhau nu chng c im chung. Hy chia cc ng trn thnh mt s ti thiu cc
nhm sao cho hai ng trn bt k trong mt nhm bt k c th i c sang nhau sau mt
s hu hn cc bc di chuyn gia hai ng trn thng nhau.

L Minh Hong

208

Chuyn

5. VI NG DNG CA DFS V BFS


5.1. XY DNG CY KHUNG CA TH
Cy l th v hng, lin thng, khng c chu trnh n. th v hng khng c chu
trnh n gi l rng (hp ca nhiu cy). Nh vy mi thnh phn lin thng ca rng l mt
cy.
Khi nim cy c s dng rng ri trong nhiu lnh vc khc nhau: Nghin cu cu trc
cc phn t hu c, xy dng cc thut ton t chc th mc, cc thut ton tm kim, lu tr
v nn d liu

5.1.1. nh l (Daisy Chain Theorem)


Gi s T = (V, E) l th v hng vi n nh. Khi cc mnh sau l tng ng:
1. T l cy
2. T khng cha chu trnh n v c n - 1 cnh
3. T lin thng v mi cnh ca n u l cu
4. Gia hai nh bt k ca T u tn ti ng mt ng i n
5. T khng cha chu trnh n nhng h c thm vo mt cnh ta thu c mt chu
trnh n.
6. T lin thng v c n - 1 cnh
Chng minh:
12: T l cy T khng cha chu trnh n v c n - 1 cnh
T T l cy, theo nh ngha T khng cha chu trnh n. Ta s chng minh cy T c n nh
th phi c n - 1 cnh bng quy np theo s nh n. R rng khi n = 1 th cy c 1 nh s cha
0 cnh. Nu n > 1 th do th hu hn nn s cc ng i n trong T cng hu hn, gi P
= (v1, v2, , vk) l mt ng i di nht (qua nhiu cnh nht) trong T. nh v1 khng th c
cnh ni vi nh no trong s cc nh v3, v4, , vk. Bi nu c cnh (v1, vp) (3 p k) th
ta s thit lp c chu trnh n (v1, v2, , vp, v1). Mt khc, nh v1 cng khng th c cnh
ni vi nh no khc ngoi cc nh trn P trn bi nu c cnh (v1, v0) (v0P) th ta thit lp
c ng i (v0, v1, v2, , vk) di hn ng i P. Vy nh v1 ch c ng mt cnh ni
vi v2 hay v1 l nh treo. Loi b v1 v cnh (v1, v2) khi T ta c th mi cng l cy v
c n - 1 nh, cy ny theo gi thit quy np c n - 2 cnh. Vy cy T c n - 1 cnh.
23: T khng cha chu trnh n v c n - 1 cnh T lin thng v mi cnh ca
n u l cu
Gi s T c k thnh phn lin thng T1, T2, , Tk. V T khng cha chu trnh n nn cc
thnh phn lin thng ca T cng khng cha chu trnh n, tc l cc T1, T2, , Tk u l
cy. Gi n1, n2, , nk ln lt l s nh ca T1, T2, , Tk th cy T1 c n1 - 1 cnh, cy T2 c
n2 - 1 cnh, cy Tk c nk - 1 cnh. Cng li ta c s cnh ca T l n1 + n2 + + nk - k = n HSPHN 1999-2004

L thuyt th

209

k cnh. Theo gi thit, cy T c n - 1 cnh, suy ra k = 1, th ch c mt thnh phn lin


thng l th lin thng.
By gi khi T lin thng, nu b i mt cnh ca T th T s cn n - 2 cnh v s khng lin
thng bi nu T vn lin thng th do T khng c chu trnh nn T s l cy v c n - 1 cnh.
iu chng t mi cnh ca T u l cu.
34: T lin thng v mi cnh ca n u l cu Gia hai nh bt k ca T c
ng mt ng i n
Gi x v y l 2 nh bt k trong T, v T lin thng nn s c mt ng i n t x ti y. Nu
tn ti mt ng i n khc t x ti y th nu ta b i mt cnh (u, v) nm trn ng i
th nht nhng khng nm trn ng i th hai th t u vn c th n c v bng cch: i
t u i theo chiu ti x theo cc cnh thuc ng th nht, sau i t x ti y theo ng
th hai, ri li i t y ti v theo cc cnh thuc ng i th nht. iu ny mu thun vi gi
thit (u, v) l cu.
45: Gia hai nh bt k ca T c ng mt ng i n T khng cha chu
trnh n nhng h c thm vo mt cnh ta thu c mt chu trnh n
Th nht T khng cha chu trnh n v nu T cha chu trnh n th chu trnh qua t nht
hai nh u, v. R rng dc theo cc cnh trn chu trnh th t u c hai ng i n ti v.
V l.
Gia hai nh u, v bt k ca T c mt ng i n ni u vi v, vy khi thm cnh (u, v) vo
ng i ny th s to thnh chu trnh.
56: T khng cha chu trnh n nhng h c thm vo mt cnh ta thu c mt
chu trnh n T lin thng v c n - 1 cnh
Gi u v v l hai nh bt k trong T, thm vo T mt cnh (u, v) na th theo gi thit s to
thnh mt chu trnh cha cnh (u, v). Loi b cnh ny i th phn cn li ca chu trnh s l
mt ng i t u ti v. Mi cp nh ca T u c mt ng i ni chng tc l T lin
thng, theo gi thit T khng cha chu trnh n nn T l cy v c n - 1 cnh.
61: T lin thng v c n - 1 cnh T l cy
Gi s T khng l cy th T c chu trnh, hu b mt cnh trn chu trnh ny th T vn lin
thng, nu th mi nhn c vn c chu trnh th li hu mt cnh trong chu trnh mi. C
nh th cho ti khi ta nhn c mt th lin thng khng c chu trnh. th ny l cy
nhng li c < n - 1 cnh (v l). Vy T l cy

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

Hnh 67: th G v mt s v d cy khung T1, T2, T3 ca n

iu kin cn v mt th v hng c cy khung l th phi lin thng


S cy khung ca th y Kn l nn-2.

5.1.3. Thut ton xy dng cy khung


Xt th v hng lin thng G = (V, E) c n nh, c nhiu thut ton xy dng cy khung
ca G
Xy dng cy khung bng thut ton hp nht
Trc ht, t T = (V, ); T khng cha cnh no th c th coi T gm n cy ri rc, mi cy
ch c 1 nh. Sau xt ln lt cc cnh ca G, nu cnh ang xt ni hai cy khc nhau
trong T th thm cnh vo T, ng thi hp nht hai cy li thnh mt cy. C lm nh
vy cho ti khi kt np n - 1 cnh vo T th ta c T l cy khung ca th. Cc phng
php kim tra cnh c ni hai cy khc nhau hay khng cng nh k thut hp nht hai cy s
c bn k hn trong thut ton Kruskal [9 - mc 9.2].
Xy dng cy khung bng cc thut ton tm kim trn th.
p dng thut ton BFS hay DFS bt u t nh S, ti mi bc t nh u ti thm nh v, ta
thm vo thao tc ghi nhn lun cnh (u, v) vo cy khung. Do th lin thng nn thut
ton s xut pht t S v ti thm tt c cc nh cn li, mi nh ng mt ln, tc l qu
trnh duyt s ghi nhn c ng n - 1 cnh. Tt c nhng cnh khng to thnh chu trnh
n bi thut ton khng thm li nhng nh thm. Theo mnh tng ng th hai, ta
c nhng cnh ghi nhn c to thnh mt cy khung ca th.
1

10

11

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

5.2. TP CC CHU TRNH C S CA TH


Xt mt th v hng lin thng G = (V, E); gi T = (V, F) l mt cy khung ca n. Cc
cnh ca cy khung c gi l cc cnh trong, cn cc cnh khc l cc cnh ngoi.
Nu thm mt cnh ngoi e E\F vo cy khung T, th ta c ng mt chu trnh n trong
T, k hiu chu trnh ny l Ce. Tp cc chu trnh:
= {Cee E\F}
c gi l tp cc chu trnh c s ca th G.
Cc tnh cht quan trng ca tp cc chu trnh c s:
Tp cc chu trnh c s l ph thuc vo cy khung, hai cy khung khc nhau c th cho
hai tp chu trnh c s khc nhau.
Nu th lin thng c n nh v m cnh, th trong cy khung c n - 1 cnh, cn li m - n
+ 1 cnh ngoi. Tng ng vi mi cnh ngoi c mt chu trnh c s, vy s chu trnh
c s ca th lin thng l m - n + 1.
Tp cc chu trnh c s l tp nhiu nht cc chu trnh tho mn: Mi chu trnh c
ng mt cnh ring, cnh khng nm trong bt c mt chu trnh no khc. Bi nu c
mt tp gm t chu trnh tho mn iu th vic loi b cnh ring ca mt chu trnh s
khng lm mt tnh lin thng ca th, ng thi khng nh hng ti s tn ti ca cc
chu trnh khc. Nh vy nu loi b tt c cc cnh ring th th vn lin thng v cn m
- t cnh. th lin thng th khng th c t hn n - 1 cnh nn ta c m - t n - 1 hay t
m - n + 1.
Mi cnh trong mt chu trnh n bt k u phi thuc mt chu trnh c s. Bi nu
c mt cnh (u, v) khng thuc mt chu trnh c s no, th khi ta b cnh i th vn
lin thng v khng nh hng ti s tn ti ca cc chu trnh c s. Li b tip nhng
cnh ngoi ca cc chu trnh c s th th vn lin thng v cn li m - (m - n + 1) - 1 =
n - 2 cnh. iu ny v l.
i vi th G = (V, E) c n nh v m cnh, c k thnh phn lin thng, ta c th xt cc
thnh phn lin thng v xt rng cc cy khung ca cc thnh phn . Khi c th m
rng khi nim tp cc chu trnh c s cho th v hng tng qut: Mi khi thm mt cnh
khng nm trong cc cy khung vo rng, ta c ng mt chu trnh n, tp cc chu trnh
n to thnh bng cch ghp cc cnh ngoi nh vy gi l tp cc chu trnh c s ca th
G. S cc chu trnh c s l m - n + k.

5.3. BI TON NH CHIU TH


Bi ton t ra l cho mt th v hng lin thng G = (V, E), hy thay mi cnh ca
th bng mt cung nh hng c mt th c hng lin thng mnh. Nu c phng
n nh chiu nh vy th G c gi l th nh chiu c. Bi ton nh chiu th c
ng dng r nht trong s giao thng ng b. Chng hn nh tr li cu hi: Trong mt

L Minh Hong

212

Chuyn

h thng ng ph, liu c th quy nh cc ng ph thnh ng mt chiu m vn


m bo s i li gia hai nt giao thng bt k hay khng.
C th tng qut ho bi ton nh chiu th: Vi th v hng G = (V, E) hy tm cch
thay mi cnh ca th bng mt cung nh hng c th mi c t thnh phn lin
thng mnh nht. Di y ta xt mt tnh cht hu ch ca thut ton thut ton tm kim
theo chiu su gii quyt bi ton nh chiu th

5.3.1. Php nh chiu DFS


Xt m hnh duyt th bng thut ton tm kim theo chiu su:
procedure Visit(u V);
begin
Thng bo thm u v nh du u thm;
for (v: (u, v) E) do
if v cha thm then Visit(v);
end;
begin
nh du mi nh u cha thm;
for (v V) do
if v cha thm then Visit(v);
end;

Coi mt cnh ca th tng ng vi hai cung c hng ngc chiu nhau. Thut ton
tm kim theo chiu su theo m hnh trn s duyt qua ht cc nh ca th v tt c cc
cung na. Qu trnh duyt cho ta mt cy tm kim DFS. Ta c cc nhn xt sau:
Nhn xt 1:
Qu trnh duyt s khng c cung cho (cung i t mt nhnh DFS thm sau ti nhnh DFS
thm trc). Tht vy, nu qu trnh duyt xt ti mt cung (u, v):
Nu u thm trc v c ngha l khi Visit(u) c gi th v cha thm, v th tc Visit(u) s
xy dng nhnh DFS gc u gm nhng nh cha thm n c t u, suy ra v nm trong
nhnh DFS gc u v l hu du ca u, hay (u, v) l cung DFS hoc cung xui.
Nu u thm sau v (v thm trc u), tng t trn, ta suy ra u nm trong nhnh DFS gc v,
v l tin bi ca u (u, v) l cung ngc.
Nhn xt 2:
Trong qu trnh duyt th theo chiu su, nu c duyt qua cung (u, v) no th ta b i cung
(v, u). (Tc l h duyt qua cung (u, v) th ta nh chiu lun cnh (u, v) theo chiu t u ti v),
ta c mt php nh chiu th gi l php nh chiu DFS.

HSPHN 1999-2004

L thuyt th

213

10

10

Hnh 69: Php nh chiu DFS

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

phi thuc mt chu trnh c s ca cy DFS, nn s c mt chu trnh c s cha c u v v.


Chu trnh c s ca cy DFS qua php nh chiu DFS vn l chu trnh trong G' nn i theo
cc cnh nh hng ca chu trnh , ta c th i t u ti v v ngc li trn G'.
Nu u v v l 2 nh bt k ca G th do G lin thng, tn ti mt ng i (u=x[0], x[1], ,
x[n]=v). V (x[i], x[i + 1]) l cnh ca G nn trong G', t x[i] c th n c x[i+1]. Suy ra
t u cng c th n c v bng cc cnh nh hng ca G'.
Vi nhng kt qu chng minh trn, ta cn suy ra c: Nu th lin thng v mi cnh
ca n nm trn t nht mt chu trnh n th php nh chiu DFS s cho mt th lin
thng mnh. Cn nu khng, th php nh chiu DFS s cho mt th nh hng c t
thnh phn lin thng mnh nht, mt cnh khng nm trn mt chu trnh n no (cu) ca
th ban u s c nh hng thnh cung ni gia hai thnh phn lin thng mnh.
Gii thut cho bi ton nh chiu th n y qu n gin nn c l khng cn ci t c
th chng trnh na. By gi song song vi vic nh chiu, ta m t phng php nh s
v ghi nhn cung ngc ln trn cao nht t mt nhnh cy DFS dng vo mt s bi ton
khc.

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

Hnh 70: Php nh s v ghi nhn cung ngc ln cao nht

5.4. LIT K CC KHP V CU CA TH


Vi mt th v hng G = (V, E), ta dng php nh chiu DFS nh chiu G, khi
hy mt cung (u, v) l cung trn cy DFS, ta c cc nhn xt sau:
Nu t nhnh DFS gc v khng c cung no ngc ln pha trn v c ngha l t mt nh
thuc nhnh DFS gc v i theo cc cung nh hng ch i c ti nhng nh ni b
trong nhnh DFS gc v m thi, suy ra (u, v) l mt cu. Cng d dng chng minh c
iu ngc li. Vy (u, v) l cu Low[v] Number[v].
Nu t nhnh DFS gc v khng c cung no ngc ln pha trn u, tc l nu b u i th t
v khng c cch no ln c cc tin bi ca u. iu ny ch ra rng nu u khng phi l
nt gc ca mt cy DFS th u l khp. Cng d dng chng minh iu ngc li. Vy nu
u khng l gc ca mt cy DFS th u l khp Low[v] Number[u].
Nu r l gc ca mt cy DFS th r l khp r c t nht 2 nhnh con
n y ta c iu kin gii bi ton lit k cc khp v cu ca th: n gin l
dng php nh chiu DFS nh s cc nh theo th t thm v ghi nhn cung ngc ln trn
cao nht xut pht t mt nhnh cy DFS, sau dng ba nhn xt k trn lit k ra tt c
cc cu v khp ca th:
Input: file vn bn CUT.INP, trong
Dng 1: Cha s nh n (n 100) v s cnh m ca n th v hng G cch nhau t
nht mt du cch
m dng tip theo, mi dng ghi hai s u, v cch nhau t nht mt du cch, th hin (u, v)
l mt cnh ca G
Output: file vn bn CUT.OUT, trong ghi:
Danh sch cc cu
Danh sch cc khp
L Minh Hong

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

Ngoi cc mng c ni ti khi trnh by thut ton, c thm mt mng Parent[1..n],


trong Parent[v] ch ra nt cha ca nt v trn cy DFS, nu v l gc ca mt cy DFS th
Parent[v] c t bng -1. Cng dng ca mng Parent l cho php duyt tt c cc cnh
trn cy DFS v kim tra mt nh c phi l gc ca cy DFS hay khng.
P_4_05_1.PAS * Lit k cc khp v cu ca th
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Directivity_Bridges_CutVertices;
const
InputFile = 'CUT.INP';
OutputFile = 'CUT.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Number, Low, Parent: array[1..max] of Integer;
n, Count: Integer;
procedure Enter; {Nhp d liu}
var
f: Text;
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False);
Assign(f, InputFile); Reset(f);
ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
procedure Visit(u: Integer); {Duyt DFS, nh chiu, nh s}
var
v: Integer;
begin
Inc(Count); Number[u] := Count; {Trc ht nh s u}
Low[u] := n + 1; {Khi gin Low[u] = +}
for v := 1 to n do
if a[u, v] then {Xt v k u}
begin
a[v, u] := False; {B i cung (v, u)}
HSPHN 1999-2004

L thuyt th

end;

if Parent[v] = 0 then {Parent[v] = 0 v cha thm, (u, v) l cung DFS}


begin
Parent[v] := u;
Visit(v); {Thm v}
if Low[u] > Low[v] then Low[u] := Low[v]; {Cc tiu ho Low[u] theo Low[v]}
end
else {v thm, (u, v) l cung ngc}
if Low[u] > Number[v] then Low[u] := Number[v]; {Cc tiu ho Low[u] theo Number[v]}
end;

procedure Solve;
var
u, v: Integer;
begin
Count := 0;
FillChar(Parent, SizeOf(Parent), 0); {nh du mi nh u cha thm}
for u := 1 to n do
if Parent[u] = 0 then {Gp mt nh cha thm}
begin
Parent[u] := -1; {Cho u l mt gc cy DFS}
Visit(u); {Xy dng cy DFS gc u}
end;
end;
procedure Result; {In kt qu}
var
f: Text;
u, v: Integer;
nChildren: array[1..max] of Integer;
IsCut: array[1..max] of Boolean;
begin
FillChar(nChildren, SizeOf(nChildren), 0); {Tnh nChildren[u] = S nhnh con ca nhnh DFS gc u}
for v := 1 to n do
if Parent[v] <> -1 then Inc(nChildren[Parent[v]]);
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Bridges: ');
for v := 1 to n do
begin
u := Parent[v];
if (u <> -1) and (Low[v] >= Number[v]) then {(u, v) l cu}
WriteLn(f, '(', u, ', ', v, ')');
end;
WriteLn(f, 'Cut vertices:');
FillChar(IsCut, SizeOf(IsCut), False);
for v := 1 to n do
if Parent[v] <> -1 then
begin
u := Parent[v];
{Nu Low[v] Number[u] khp u khng phi gc cy DFS hoc u c 2 nhnh con}
if (Low[v] >= Number[u]) then
IsCut[u] := IsCut[u] or (Parent[u] <> -1) or (nChildren[u] >= 2);}
end;
for u := 1 to n do
if IsCut[u] then WriteLn(f, u);
Close(f);
end;
begin
Enter;
Solve;
Result;
end.
L Minh Hong

217

218

Chuyn

HSPHN 1999-2004

L thuyt th

219

6. CHU TRNH EULER, NG I EULER, TH EULER


6.1. BI TON 7 CI CU
Thnh ph Konigsberg thuc Ph (nay l Kaliningrad thuc Cng ho Nga), c chia lm 4
vng bng cc nhnh sng Pregel. Cc vng ny gm 2 vng bn b sng (B, C), o
Kneiphof (A) v mt min nm gia hai nhnh sng Pregel (D). Vo th k XVIII, ngi ta
xy 7 chic cu ni nhng vng ny vi nhau. Ngi dn y t hi: Liu c cch no
xut pht ti mt a im trong thnh ph, i qua 7 chic cu, mi chic ng 1 ln ri quay
tr v ni xut pht khng ?
Nh ton hc Thy s Leonhard Euler gii bi ton ny v c th coi y l ng dng u
tin ca L thuyt th, ng m hnh ho s 7 ci cu bng mt a th, bn vng
c biu din bng 4 nh, cc cu l cc cnh. Bi ton tm ng qua 7 cu, mi cu ng
mt ln c th tng qut ho bng bi ton: C tn ti chu trnh n trong a th cha
tt c cc cnh ?.
B

Hnh 71: M hnh th ca bi ton by ci cu

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

Mt th c hng lin thng yu G = (V, E) c ng i Euler nhng khng c chu


trnh Euler nu tn ti ng hai nh u, v V sao cho deg+(u) - deg-(u) = deg-(v) - deg+(v)
= 1, cn tt c nhng nh khc u v v u c bn bc ra bng bn bc vo.

6.4. THUT TON FLEURY TM CHU TRNH EULER


6.4.1. i vi th v hng lin thng, mi nh u c bc chn.
Xut pht t mt nh, ta chn mt cnh lin thuc vi n i tip theo hai nguyn tc sau:
Xo b cnh i qua
Ch i qua cu khi khng cn cnh no khc chn
V ta c chn cnh i mt cch thoi mi nh vy cho ti khi khng i tip c na, ng
i tm c l chu trnh Euler.
V d: Vi th Hnh 72:
5

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

By gi ang ng nh 4 th ta c 3 cch i tip: sang 3, sang 5 hoc sang 6. V (4, 3) l


cu nn ta s khng i theo cnh (4, 3) m s i (4, 5) hoc (4, 6). Nu i theo (4, 5) v c tip
tc i nh vy, ta s c chu trnh Euler l 1, 2, 4, 5, 7, 8, 6, 4, 3, 1. Cn i theo (4, 6) s
tm c chu trnh Euler l: 1, 2, 4, 6, 8, 7, 5, 4, 3, 1.

HSPHN 1999-2004

L thuyt th

221

6.4.2. i vi th c hng lin thng yu, mi nh u c bn bc ra bng


bn bc vo.
Bng cch lm dng thut ng", ta c th m t c thut ton tm chu trnh Euler cho c
th c hng cng nh v hng:
Th nht, di y nu ta ni cnh (u, v) th hiu l cnh ni nh u v nh v trn th
v hng, hiu l cung ni t nh u ti nh v trn th c hng.
Th hai, ta gi cnh (u, v) l mt i khng tr li nu nh t u ta i ti v theo cnh ,
sau xo cnh i th khng c cch no t v quay li u.
Vy th thut ton Fleury tm chu trnh Euler c th m t nh sau:
Xut pht t mt nh, ta i mt cch tu theo cc cnh tun theo hai nguyn tc: Xo b
cnh va i qua v ch chn cnh mt i khng tr li nu nh khng cn cnh no khc
chn.

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

P_4_06_1.PAS * Thut ton Fleury tm chu trnh Euler


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Euler_Circuit;
const
InputFile = 'EULER.INP';
OutputFile = 'EULER.OUT';
max = 100;
var
a: array[1..max, 1..max] of Integer;
n: Integer;
procedure Enter;
var
u, v, k: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
L Minh Hong

222

Chuyn

FillChar(a, SizeOf(a), 0);


ReadLn(f, n);
while not SeekEof(f) do
begin
ReadLn(f, u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
Close(f);
end;
{Th tc ny kim tra nu xo mt cnh ni (x, y) th y c cn quay li c x hay khng}
function CanGoBack(x, y: Integer): Boolean;
var
Queue: array[1..max] of Integer; {Hng i dng cho Breadth First Search}
Front, Rear: Integer; {Front: Ch s u hng i, Rear: Ch s cui hng i}
u, v: Integer;
Free: array[1..max] of Boolean; {Mng nh du}
begin
Dec(a[x, y]); Dec(a[y, x]); {Th xo mt cnh (x, y) S cnh ni (x, y) gim 1}
FillChar(Free, n, True); {sau p dng BFS xem t y c quay li x c khng ?}
Free[y] := False;
Front := 1; Rear := 1;
Queue[1] := y;
repeat
u := Queue[Front]; Inc(Front);
for v := 1 to n do
if Free[v] and (a[u, v] > 0) then
begin
Inc(Rear);
Queue[Rear] := v;
Free[v] := False;
if Free[x] then Break;
end;
until Front > Rear;
CanGoBack := not Free[x];
Inc(a[x, y]); Inc(a[y, x]); { trn th xo cnh th gi phi phc hi}
end;
procedure FindEulerCircuit; {Thut ton Fleury}
var
Current, Next, v, count: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
Current := 1;
Write(f, 1, ' '); {Bt u t nh Current = 1}
count := 1;
repeat
Next := 0;
for v := 1 to n do
if a[Current, v] > 0 then
begin
Next := v;
if CanGoBack(Current, Next) then Break;
end;
if Next <> 0 then
begin
Dec(a[Current, Next]);
Dec(a[Next, Current]); {Xo b cnh va i qua}
Write(f, Next, ' '); {In kt qu i ti Next}
Inc(count);
if count mod 16 = 0 then WriteLn; {In ra ti a 16 nh trn mt dng}
HSPHN 1999-2004

L thuyt th

223

Current := Next; {Li tip tc vi nh ang ng l Next}


end;
until Next = 0; {Cho ti khi khng i tip c na}
Close(f);
end;
begin
Enter;
FindEulerCircuit;
end.

6.6. THUT TON TT HN


Trong trng hp th Euler c s cnh nh, ta c th s dng phng php sau tm
chu trnh Euler trong th v hng: Bt u t mt chu trnh n C bt k, chu trnh ny
tm c bng cch xut pht t mt nh, i tu theo cc cnh cho ti khi quay v nh
xut pht, lu l i qua cnh no xo lun cnh . Nu nh chu trnh C tm c cha tt
c cc cnh ca th th l chu trnh Euler. Nu khng, xt cc nh dc theo chu trnh C,
nu cn c cnh cha xo lin thuc vi mt nh u no th li t u, ta i tu theo cc
cnh cng theo nguyn tc trn cho ti khi quay tr v u, c mt chu trnh n khc qua
u. Loi b v tr u khi chu trnh C v chn vo C chu trnh mi tm c ti ng v tr ca u
va xo, ta c mt chu trnh n C' mi ln hn chu trnh C. C lm nh vy cho ti khi
c chu trnh Euler. Vic chng minh tnh ng n ca thut ton cng l chng minh nh
l v iu kin cn v mt th v hng lin thng c chu trnh Euler.
M hnh thut ton c th vit nh sau:
Khi to mt ngn xp Stack ban u ch gm mi nh 1;
Vit cc phng thc Push (y vo) v Pop(ly ra) mt nh t ngn xp Stack, phng thc Get cho bit phn t
nm nh Stack. Khc vi Pop, phng thc Get ch cho bit phn t nh Stack ch khng ly phn t ra;
while Stack do
begin
x := Get;
if y: (x, y) E then {T x cn i hng khc c}
begin
Push(y);
Loi b cnh (x, y) khi th;
end
else {T x khng i tip c ti u na}
begin
x := Pop;
In ra nh x trn ng i Euler;
end;
end;

Thut ton trn c th dng tm chu trnh Euler trong th c hng lin thng yu, mi
nh c bn bc ra bng bn bc vo. Tuy nhin th t cc nh in ra b ngc so vi cc cung
nh hng, ta c th o ngc hng cc cung trc khi thc hin thut ton c th t
ng.
Thut ton hot ng vi hiu qu cao, d ci t, nhng trng hp xu nht th Stack s
phi cha ton b danh sch nh trn chu trnh Euler chnh v vy m khi a th c s
cnh qu ln th 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

P_4_06_2.PAS * Thut ton hiu qu tm chu trnh Euler


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Euler_Circuit;
const
InputFile = 'EULER.INP';
OutputFile = 'EULER.OUT';
max = 100;
maxE = 20000; {S cnh ti a}
var
a: array[1..max, 1..max] of Integer;
stack: array[1..maxE] of Integer;
n, Top: Integer;
procedure Enter; {Nhp d liu}
var
u, v, k: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
FillChar(a, SizeOf(a), 0);
ReadLn(f, n);
while not SeekEof(f) do
begin
ReadLn(f, u, v, k);
a[u, v] := k;
a[v, u] := k;
end;
Close(f);
end;
procedure Push(v: Integer); {y mt nh v vo ngn xp}
begin
Inc(Top);
Stack[Top] := v;
end;
function Pop: Integer; {Ly mt nh khi ngn xp, tr v trong kt qu hm}
begin
Pop := Stack[Top];
Dec(Top);
end;
function Get: Integer; {Tr v phn t nh (Top) ngn xp}
begin
Get := Stack[Top];
end;
procedure FindEulerCircuit;
var
u, v, count: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
Stack[1] := 1; {Khi to ngn xp ban u ch gm nh 1}
Top := 1;
count := 0;
while Top <> 0 do {Chng no ngn xp cha rng}
begin
u := Get; {Xc nh u l phn t nh ngn xp}
for v := 1 to n do
if a[u, v] > 0 then {Xt tt c cc cnh lin thuc vi u, nu thy}
begin
Dec(a[u, v]); Dec(a[v, u]); {Xo cnh khi th}
HSPHN 1999-2004

L thuyt th

225

Push(v); {y nh tip theo vo ngn xp}


Break;
end;
if u = Get then {Nu phn t nh ngn xp vn l u vng lp trn khng tm thy nh no k vi u}
begin
Inc(count);
Write(f, Pop, ' '); {In ra phn t nh ngn xp}
end;
end;
Close(f);
end;
begin
Enter;
FindEulerCircuit;
end.

Bi tp
Trn mt phng cho n hnh ch nht c cc cnh song song vi cc trc to . Hy ch ra
mt chu trnh:
Ch i trn cnh ca cc hnh ch nht
Trn cnh ca mi hnh ch nht, ngoi tr nhng giao im vi cnh ca hnh ch nht khc
c th qua nhiu ln, nhng im cn li ch c qua ng mt ln.
C

M D A B C M F G N L I J K N H E M

L Minh Hong

226

Chuyn

7. CHU TRNH HAMILTON, NG I HAMILTON, TH


HAMILTON
7.1. NH NGHA
Cho th G = (V, E) c n nh
Chu trnh (x[1], x[2], , x[n], x[1]) c gi l chu trnh Hamilton nu x[i] x[j] vi i, j:
1i<jn
ng i (x[1], x[2], , x[n]) c gi l ng i Hamilton nu x[i] x[j] vi i, j: 1
i<jn
th c chu trnh Hamilton c gi l th Hamilton
th c ng i Hamilton c gi l th na Hamilton
C th pht biu mt cch hnh thc: Chu trnh Hamilton l chu trnh xut pht t 1 nh, i
thm tt c nhng nh cn li mi nh ng 1 ln, cui cng quay tr li nh xut pht.
ng i Hamilton l ng i qua tt c cc nh ca th, mi nh ng 1 ln. Khc vi
khi nim chu trnh Euler v ng i Euler, mt chu trnh Hamilton khng phi l ng i
Hamilton bi c nh xut pht c thm ti 2 ln.
V d: Xt 3 n th G1, G2, G3 nh trong Hnh 74:
b

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

th c hng G lin thng mnh v c n nh. Nu deg+(v) n / 2 v deg-(v) n / 2 vi


mi nh v th G c chu trnh Hamilton

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

P_4_07_1.PAS * Thut ton quay lui lit k chu trnh Hamilton


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program All_of_Hamilton_Circuits;
const
InputFile = 'HAMILTON.INP';
OutputFile = 'HAMILTON.OUT';
max = 100;
var
fo: Text;
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th: a[u, v] = True (u, v) l cnh}
Free: array[1..max] of Boolean; {Mng nh du Free[v] = True nu cha i qua nh v}
x: array[1..max] of Integer; {Chu trnh Hamilton s tm l; 1=x[1]x[2] x[n] x[1]=1}
n: Integer;
procedure Enter;
var
i, u, v, m: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
FillChar(a, SizeOf(a), False);
ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
L Minh Hong

228

Chuyn

procedure PrintResult; {In kt qu nu tm thy chu trnh Hamilton}


var
i: Integer;
begin
for i := 1 to n do Write(fo, x[i], ' ');
WriteLn(fo, x[1]);
end;
procedure Attempt(i: Integer); {Th cc cch chn nh th i trong hnh trnh}
var
j: Integer;
begin
for j := 1 to n do {nh th i (x[i]) c th chn trong nhng nh}
if Free[j] and a[x[i - 1], j] then {k vi x[i - 1] v cha b i qua}
begin
x[i] := j; {Th mt cch chn x[i]}
if i < n then {Nu cha th chn n x[n]}
begin
Free[j] := False; {nh du nh j l i qua}
Attempt(i + 1); { cc bc th k tip khng chn phi nh j na}
Free[j] := True; {S th phng n khc cho x[i] nn s b nh du nh va th}
end
else {Nu th chn n x[n]}
if a[j, x[1]] then PrintResult; {v nu x[n] li k vi x[1] th ta c chu trnh Hamilton}
end;
end;
begin
Enter;
FillChar(Free, SizeOf(Free), True); {Khi to: Cc nh u cha i qua}
x[1] := 1; Free[1] := False; {Bt u t nh 1}
Assign(fo, OutputFile); Rewrite(fo);
Attempt(2); {Th cc cch chn nh k tip}
Close(fo);
end.

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).

Hy tm mt hnh trnh ca qun m t xut pht, i qua tt c cc ca bn c, mi


ng 1 ln.
V d:
Vi n = 8, xut pht (3, 3)

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

Hng dn: Nu coi cc ca bn c l cc nh ca th v cc cnh l ni gia hai nh


tng ng vi hai m giao chn th d thy rng hnh trnh ca qun m cn tm s l mt
ng i Hamilton. Ta c th xy dng hnh trnh bng thut ton quay lui kt hp vi
phng php duyt u tin Warnsdorff: Nu gi deg(x, y) l s k vi (x, y) v cha i
qua (k y theo ngha nh k ch khng phi l k cnh) th t mt ta s khng th xt
ln lt cc hng i c th, m ta s u tin th hng i ti c deg nh nht trc. Trong
trng hp c tn ti ng i, phng php ny hot ng vi tc tuyt vi: Vi mi n
chn trong khong t 6 ti 18, vi mi v tr xut pht, trung bnh thi gian tnh t lc bt
u ti lc tm ra mt nghim < 1 giy. Tuy nhin trong trng hp n l, c lc khng tn ti
ng i, do phi duyt ht mi kh nng nn thi gian thc thi li ht sc ti t. (C xt u
tin nh trn hay xt th t nh trc kia th cng vy thi. Ta c th th vi n l: 5, 7, 9
v xut pht (1, 2), sau ngi xem my tnh tot m hi).

HSPHN 1999-2004

L thuyt th

231

8. BI TON NG I NGN NHT


8.1. TH C TRNG S
th m mi cnh ca n c gn cho tng ng vi mt s (nguyn hoc thc) c gi
l th c trng s. S gn cho mi cnh ca th c gi l trng s ca cnh. Tng t
nh th khng trng s, c nhiu cch biu din th c trng s trong my tnh. i vi
n th th cch d dng nht l s dng ma trn trng s:
Gi s th G = (V, E) c n nh. Ta s dng ma trn vung C kch thc n x n. y:
Nu (u, v) E th C[u, v] = trng s ca cnh (u, v)
Nu (u, v) E th tu theo trng hp c th, C[u, v] c gn mt gi tr no c th
nhn bit c (u, v) khng phi l cnh (Chng hn c th gn bng +, hay bng 0, bng
-, v.v)
Quy c c[v, v] = 0 vi mi nh v.
ng i, chu trnh trong th c trng s cng c nh ngha ging nh trong trng
hp khng trng s, ch c khc l di ng i khng phi tnh bng s cnh i qua, m
c tnh bng tng trng s ca cc cnh i qua.

8.2. BI TON NG I NGN NHT


Trong cc ng dng thc t, chng hn trong mng li giao thng ng b, ng thu
hoc ng khng. Ngi ta khng ch quan tm n vic tm ng i gia hai a im m
cn phi la chn mt hnh trnh tit kim nht (theo tiu chun khng gian, thi gian hay chi
ph). Khi pht sinh yu cu tm ng i ngn nht gia hai nh ca th. Bi ton
pht biu di dng tng qut nh sau: Cho th c trng s G = (V, E), hy tm mt ng
i ngn nht t nh xut pht s V n nh ch f V. di ca ng i ny ta s k
hiu l d[s, f] v gi l khong cch (distance) t s n f. Nu nh khng tn ti ng i t
s ti f th ta s t khong cch = +.
Nu nh th c chu trnh m (chu trnh vi di m) th khong cch gia mt s cp
nh no c th khng xc nh, bi v bng cch i vng theo chu trnh ny mt s ln
ln, ta c th ch ra ng i gia hai nh no trong chu trnh ny nh hn bt k mt s
cho trc no. Trong trng hp nh vy, c th t vn tm ng i c bn (ng i
khng c nh lp li) ngn nht. Vn l mt vn ht sc phc tp m ta s khng
bn ti y.
Nu nh th khng c chu trnh m th ta c th chng minh c rng mt trong nhng
ng i ngn nht l ng i c bn. V nu nh bit c khong cch t s ti tt c
nhng nh khc th ng i ngn nht t s ti f c th tm c mt cch d dng qua thut
ton sau:

L Minh Hong

232

Chuyn

Gi c[u, v] l trng s ca cnh [u, v]. Qui c c[v, v] = 0 vi mi v V v c[u, v] = + nu


nh (u, v) E. t d[s, v] l khong cch t s ti v. tm ng i t s ti f, ta c th nhn
thy rng lun tn ti nh f1 f sao cho:
d[s, f] = d[s, f1] + c[f1, f]
( di ng i ngn nht sf = di ng i ngn nht sf1 + Chi ph i t f1 f)
nh f1 l nh lin trc f trong ng i ngn nht t s ti f. Nu f1s th ng i ngn
nht l ng i trc tip theo cung (s, f). Nu khng th vn tr thnh tm ng i ngn
nht t s ti f1. V ta li tm c mt nh f2 khc f v f1 :
d[s, f1] = d[s, f2] + c[f2, f1]
C tip tc nh vy, sau mt s hu hn bc, ta suy ra rng dy f, f1, f2, khng cha nh
lp li v kt thc s. Lt ngc th t dy cho ta ng i ngn nht t s ti f.

f1
f2

Tuy nhin, ngi ta thng khng s dng phng php ny m s kt hp lu vt ng i


ngay trong qu trnh tm kim.
Di y ta s xt mt s thut ton tm ng i ngn nht t nh s ti nh f trn n
th c hng G = (V, E) c n nh v m cung. Trong trng hp n th v hng vi
trng s khng m, bi ton tm ng i ngn nht c th dn v bi ton trn th c
hng bng cch thay mi cnh ca n bng hai cung c hng ngc chiu nhau. Bn c th
a vo mt s sa i nh trong th tc nhp liu gii quyt bi ton trong trng hp a
th
Input: file vn bn MINPATH.INP
Dng 1: Cha s nh n ( 1000), s cung m ca th, nh xut pht s, nh ch f cch
nhau t nht 1 du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht 1 du cch, th
hin (u, v) l mt cung E v trng s ca cung l c[u, v] (c[u, v] l s nguyn c gi
tr tuyt i 1000)
Output: file vn bn MINPATH.OUT ghi ng i ngn nht t s ti f v di ng i

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

8.3. TRNG HP TH KHNG C CHU TRNH M - THUT TON


FORD BELLMAN
Thut ton Ford-Bellman c th pht biu rt n gin:
Vi nh xut pht s. Gi d[v] l khong cch t s ti v vi cc gi tr khi to l:
d[s] := 0
d[v] := + nu v s
Sau ta ti u ho dn cc d[v] nh sau: Xt mi cp nh u, v ca th, nu c mt cp
nh u, v m d[v] > d[u]+ c[u, v] th ta t li d[v] := d[u] + c[u, v]. Tc l nu di ng
i t s ti v li ln hn tng di ng i t s ti u cng vi chi ph i t u ti v th ta s
hu b ng i t s ti v ang c v coi ng i t s ti v chnh l ng i t s ti u sau
i tip t u ti v. Ch rng ta t c[u, v] = + nu (u, v) khng l cung. Thut ton s kt
thc khi khng th ti u thm bt k mt nhn d[v] no na.
for (v V) do d[v] := +;
d[s] := 0;
repeat
Stop := True;
for (u V) do
for (v V: (u, v) E) do
if d[v] > d[u] + c[u, v] then
begin
d[v] := d[u] + c[u, v];
Stop := False;
end;
until Stop;

Tnh ng ca thut ton:


Ti bc khi to th mi d[v] chnh l di ngn nht ca ng i t s ti v qua khng
qu 0 cnh.
Gi s khi bt u bc lp th i (i 1), d[v] bng di ng i ngn nht t s ti v qua
khng qu i - 1 cnh. Bi ng i t s ti v qua khng qu i cnh s phi thnh lp bng
cch: ly mt ng i t s ti mt nh u no qua khng qu i - 1 cnh, ri i tip ti v
bng cung (u, v), nn di ng i ngn nht t s ti v qua khng qu i cnh s c tnh
bng gi tr nh nht trong cc gi tr (Nguyn l ti u Bellman):
di ng i ngn nht t s ti v qua khng qu i - 1 cnh

L Minh Hong

234

Chuyn

di ng i ngn nht t s ti u qua khng qu i - 1 cnh cng vi trng s cnh (u, v)


(u)
V vy, sau bc lp ti u cc d[v] bng cng thc
d[v]bc i = min(d[v]bc i-1, d[u]bc i-1+ c[u, v]) (u)
th cc d[v] s bng di ng i ngn nht t s ti v qua khng qu i cnh.
Sau bc lp ti u th n - 1, ta c d[v] = di ng i ngn nht t s ti v qua khng qu
n - 1 cnh. V th khng c chu trnh m nn s c mt ng i ngn nht t s ti v l
ng i c bn (qua khng qu n - 1 cnh). Tc l d[v] s l di ng i ngn nht t s
ti v.
Vy th s bc lp ti u ho s khng qu n - 1 bc.
Trong khi ci t chng trnh, nu mi bc lp c m t di dng:
for u := 1 to n do
for v := 1 to n do
d[v] := min(d[v], d[u] + c[u, v]);

S ti u bc cu (dng d[u] ti u d[v] ri li c th dng d[v] ti u d[w] na) ch lm


tc ti u cc nhn d[.] tng nhanh hn nn s bc lp vn s khng qu n - 1 bc
P_4_08_1.PAS * Thut ton Ford-Bellman
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Shortest_Path_by_Ford_Bellman;
const
InputFile = 'MINPATH.INP';
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;
n, s, f: Integer;
procedure LoadGraph; {Nhp th, th khng c c chu trnh m}
var
i, m, u, v: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, m, s, f);
{Nhng cnh khng c trong th c gn trng s +}
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}
var
i: Integer;
begin
for i := 1 to n do d[i] := MaxC;
d[s] := 0;
HSPHN 1999-2004

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.

8.4. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT


TON DIJKSTRA
Trong trng hp trng s trn cc cung khng m, thut ton do Dijkstra xut di y
hot ng hiu qu hn nhiu so vi thut ton Ford-Bellman. Ta hy xem trong trng hp
ny, thut ton Ford-Bellman thiu hiu qu ch no:
Vi nh v V, Gi d[v] l di ng i ngn nht t s ti v. Thut ton Ford-Bellman
khi gn d[s] = 0 v d[v] = + vi v s, sau ti u ho dn cc nhn d[v] bng cch sa
L Minh Hong

236

Chuyn

nhn theo cng thc: d[v] := min(d[v], d[u] + c[u, v]) vi u, v V. Nh vy nu nh ta


dng nh u sa nhn nh v, sau nu ta li ti u c d[u] thm na th ta cng phi sa
li nhn d[v] dn ti vic d[v] c th phi chnh i chnh li rt nhiu ln. Vy nn chng, ti
mi bc khng phi ta xt mi cp nh (u, v) dng nh u sa nhn nh v m s chn
nh u l nh m khng th ti u nhn d[u] thm c na.
Thut ton Dijkstra (E.Dijkstra - 1959) c th m t nh sau:
Bc 1: Khi to
Vi nh v V, gi nhn d[v] l di ng i ngn nht t s ti v. Ban u d[v] c khi
gn nh trong thut ton Ford-Bellman (d[s] = 0 v d[v] = vi v s). Nhn ca mi nh
c hai trng thi t do hay c nh, nhn t do c ngha l c th cn ti u hn c na v
nhn c nh tc l d[v] bng di ng i ngn nht t s ti v nn khng th ti u
thm. lm iu ny ta c th s dng k thut nh du: Free[v] = TRUE hay FALSE tu
theo d[v] t do hay c nh. Ban u cc nhn u t do.
Bc 2: Lp
Bc lp gm c hai thao tc:
C nh nhn: Chn trong cc nh c nhn t do, ly ra nh u l nh c d[u] nh nht, v
c nh nhn nh u.
Sa nhn: Dng nh u, xt tt c nhng nh v v sa li cc d[v] theo cng thc:

d [ v ] := min ( d [ v ] , d [ u ] +c [ u,v ])
Bc lp s kt thc khi m nh ch f c c nh nhn (tm c ng i ngn nht t s
ti f); hoc ti thao tc c nh nhn, tt c cc nh t do u c nhn l + (khng tn ti

ng i). C th t cu hi, thao tc 1, ti sao nh u nh vy c c nh nhn, gi s


d[u] cn c th ti u thm c na th tt phi c mt nh t mang nhn t do sao cho d[u]
> d[t] + c[t, u]. Do trng s c[t, u] khng m nn d[u] > d[t], tri vi cch chn d[u] l nh
nht. Tt nhin trong ln lp u tin th s l nh c c nh nhn do d[s] = 0.
Bc 3: Kt hp vi vic lu vt ng i trn tng bc sa nhn, thng bo ng i ngn

nht tm c hoc cho bit khng tn ti ng i (d[f] = +).


for (v V) do d[v] := +;
d[s] := 0;
repeat
u := arg min(d[v]|v V); {Ly u l nh c nhn d[u] nh nht}
if (u = f) or (d[u] = +) then Break; {Hoc tm ra ng i ngn nht t s ti f, hoc kt lun khng c ng}
for (v V: (u, v) E) do {Dng u ti u nhn nhng nh v k vi u}
d[v] := min (d[v], d[u] + c[u, v]);
until False;
P_4_08_2.PAS * Thut ton Dijkstra
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Shortest_Path_by_Dijkstra;
const
InputFile = 'MINPATH.INP';

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.

8.5. THUT TON DIJKSTRA V CU TRC HEAP


Nu th tha (c nhiu nh, t cnh) ta c th s dng danh sch k km trng s biu
din th, tuy nhin tc ca thut ton Dijkstra vn kh chm v trong trng hp xu
nht, n cn n ln c nh nhn v mi ln tm nh c nh nhn s mt mt on chng
trnh vi phc tp O(n). thut ton lm vic hiu qu hn, ngi ta thng s dng cu
trc d liu Heap (PHN 2, 8, 8.7.1) lu cc nh cha c nh nhn. Heap y l mt
cy nh phn hon chnh tho mn: Nu u l nh lu nt cha v v l nh lu nt con th
d[u] d[v]. (nh r lu gc Heap l nh c d[r] nh nht).
Ti mi bc lp ca thut ton Dijkstra c hai thao tc: Tm nh c nh nhn v Sa nhn.
Vi mi nh v, gi Pos[v] l v tr nh v trong Heap, quy c Pos[v] = 0 nu v cha b
y vo Heap. Mi ln c thao tc sa i v tr cc nh trn cu trc Heap, ta lu cp
nhp li mng Pos ny.
Thao tc tm nh c nh nhn s ly nh lu gc Heap, c nh nhn, a phn t cui
Heap vo th ch v thc hin vic vun ng (Adjust).
Thao tc sa nhn, s duyt danh sch k ca nh va c nh nhn v sa nhn nhng
nh t do k vi nh ny, mi ln sa nhn mt nh no , ta xc nh nh ny nm
u trong Heap (da vo mng Pos) v thc hin vic chuyn nh ln (UpHeap) pha
gc Heap nu cn bo ton cu trc Heap.
Ci t di y c Input/Output ging nh trn nhng c th thc hin trn th 10000
nh, 100000 cnh, trng s mi cnh 100000.

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

FillChar(Pos, SizeOf(Pos), 0);


nHeap := 0;
end;
procedure Update(v: Integer); {nh v va c sa nhn, cn phi chnh li Heap}
var
parent, child: Integer;
begin
child := Pos[v]; {child l v tr ca v trong Heap}
if child = 0 then {Nu v cha c trong Heap th Heap phi b sung thm 1 phn t v coi child = nt l cui Heap}
begin
Inc(nHeap); child := nHeap;
end;
parent := child div 2; {parent l nt cha ca child}
while (parent > 0) and (d[heap[parent]] > d[v]) do
begin {Nu nh lu nt parent u tin km hn v th nh s b y xung nt con child}
heap[child] := heap[parent]; {y nh lu trong nt cha xung nt con}
Pos[heap[child]] := child; {Ghi nhn li v tr mi ca nh }
child := parent; {Tip tc xt ln pha nt gc}
parent := child div 2;
end;
{Thao tc ko xung trn to ra mt khong trng ti nt child ca Heap, nh v s c t vo y}
heap[child] := v;
Pos[v] := child;
end;
function Pop: Integer; {Ly t Heap ra nh c nhn t do nh nht}
var
r, c, v: Integer;
begin
Pop := heap[1]; {Nt gc Heap cha nh c nhn t do nh nht}
v := heap[nHeap]; {v l nh nt l cui Heap, s c o ln u v vun ng}
Dec(nHeap);
r := 1; {Bt u t nt gc}
while r * 2 <= nHeap do {Chng no r cha phi l l}
begin
{Chn c l nt cha nh u tin hn trong hai nt con}
c := r * 2;
if (c < nHeap) and (d[heap[c + 1]] < d[heap[c]]) then Inc(c);
{Nu v u tin hn c nh cha trong C, th thot ngay}
if d[v] <= d[heap[c]] then Break;
heap[r] := heap[c]; {Chuyn nh lu nt con c ln nt cha r}
Pos[heap[r]] := r; {Ghi nhn li v tr mi trong Heap ca nh }
r := c; {Gn nt cha := nt con v lp li}
end;
heap[r] := v; {nh v s c t vo nt r bo ton cu trc Heap}
Pos[v] := r;
end;
procedure Dijkstra;
var
i, u, iv, v, min: Integer;
begin
Update(s); {a nh xut pht v gc Heap}
repeat
u := Pop; {Chn nh t do c nhn nh nht}
if u = f then Break; {Nu nh l f th dng ngay}
Free[u] := False; {C nh nhn nh }
for iv := h[u] + 1 to h[u + 1] do {Xt danh sch k}
begin
v := adj[iv];
if Free[v] and (d[v] > d[u] + adjCost[iv]) then
begin
HSPHN 1999-2004

L thuyt th

241

d[v] := d[u] + adjCost[iv]; {Ti u ho nhn ca cc nh t do k vi u}


Trace[v] := u; {Lu vt ng i}
Update(v); {T chc li Heap}
end;

end;
until nHeap = 0; {Khng cn nh no mang nhn t do}
end;

procedure PrintResult;
var
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.

8.6. TRNG HP TH KHNG C CHU TRNH - SP XP T P


Xt trng hp th c hng, khng c chu trnh (Directed Acyclic Graph - DAG), ta c
mt thut ton hiu qu da trn k thut sp xp T p (Topological Sorting), c s ca
thut ton da vo nh l: Nu G = (V, E) l mt DAG th cc nh ca n c th nh s sao
cho mi cung ca G ch ni t nh c ch s nh hn n nh c ch s ln hn.
1

5
6

6
3

Hnh 75: Php nh li ch s theo th t tp

nh s li cc nh theo iu kin trn, ta c th dng thut ton tm kim theo chiu su


v nh s ngc li vi th t duyt xong, c th vit nh sau:
procedure Number;
procedure Visit(u: Integer);
L Minh Hong

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]);

(Gi thit rng c[u, v] = + nu nh (u, v) khng l cung).


Tc l dng nh u, ti u nhn d[v] ca nhng nh v ni t u, vi u c xt ln lt t 1
ti n - 1. C th lm tt hn na bng cch ch cn cho u chy t nh xut pht ti nh kt
thc. Bi h u chy ti u th nhn d[u] l khng th cc tiu ho thm na.
P_4_08_4.PAS * ng i ngn nht trn th khng c chu trnh
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Critical_Path;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 1000;
maxEC = 1000;
maxC = max * maxEC;
var
c: array[1..max, 1..max] of Integer;
List, d, Trace: array[1..max] of Integer; {List cha danh sch cc nh theo th t nh s mi}
n, s, f: Integer;
procedure LoadGraph; {Nhp d liu}
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]);
HSPHN 1999-2004

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.

8.7. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD


Cho n th c hng, c trng s G = (V, E) vi n nh v m cnh. Bi ton t ra l hy
tnh tt c cc d(u, v) l khong cch t u ti v. R rng l ta c th p dng thut ton tm
ng i ngn nht xut pht t mt nh vi n kh nng chn nh xut pht. Nhng ta c
cch lm gn hn nhiu, cch lm ny rt ging vi thut ton Warshall m ta bit: T ma
trn trng s c, thut ton Floyd tnh li cc c[u, v] thnh di ng i ngn nht t u ti v:
Vi mi nh k ca th c xt theo th t t 1 ti n, xt mi cp nh u, v. Cc tiu ho
c[u, v] theo cng thc:
c[u, v] := min(c[u, v], c[u, k] + c[k, v])
Tc l nu nh ng i t u ti v ang c li di hn ng i t u ti k cng vi ng i
t k ti v th ta hu b ng i t u ti v hin thi v coi ng i t u ti v s l ni ca hai
ng i t u ti k ri t k ti v (Ch rng ta cn c vic lu li vt):
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
c[u, v] := min(c[u, v], c[u, k] + c[k, v]);

Tnh ng ca thut ton:


Gi ck[u, v] l di ng i ngn nht t u ti v m ch i qua cc nh trung gian thuc
tp {1, 2, , k}. R rng khi k = 0 th c0[u, v] = c[u, v] (ng i ngn nht l ng i trc
tip).
Gi s ta tnh c cc ck-1[u, v] th ck[u, v] s c xy dng nh sau:
Nu ng i ngn nht t u ti v m ch qua cc nh trung gian thuc tp {1, 2, , k} li:
Khng i qua nh k th tc l ch qua cc nh trung gian thuc tp {1, 2, , k - 1} th
ck[u, v] = ck-1[u, v]
C i qua nh k th ng i s l ni ca mt ng i t u ti k v mt ng i t k
ti v, hai ng i ny ch i qua cc nh trung gian thuc tp {1, 2, , k - 1}.
ck[u, v] = ck-1[u, k] + ck-1[k, v].
V ta mun ck[u, v] l cc tiu nn suy ra: ck[u, v] = min(ck-1[u, v], ck-1[u, k] + ck-1[k, v]).

HSPHN 1999-2004

L thuyt th

245

V cui cng, ta quan tm ti cn[u, v]: di ng i ngn nht t u ti v m ch i qua cc


nh trung gian thuc tp {1, 2, , n}.
Khi ci t, th ta s khng c cc khi nim ck[u, v] m s thao tc trc tip trn cc trng s
c[u, v]. c[u, v] ti bc ti u th k s c tnh ton ti u qua cc gi tr c[u, v]; c[u, k]
v c[k, v] ti bc th k - 1. Tnh chnh xc ca cch ci t di dng ba vng lp for lng
nh trn c th thy c do s ti u bc cu ch lm tng tc ti u cc c[u, v] trong mi
bc
P_4_08_5.PAS * Thut ton Floyd
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Shortest_Path_by_Floyd;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 1000;
maxEC = 1000;
maxC = max * maxEC;
var
c: array[1..max, 1..max] of Integer;
Trace: array[1..max, 1..max] of Integer; {Trace[u, v] = nh lin sau u trn ng i t u ti v}
n, s, f: Integer;
procedure LoadGraph; {Nhp d liu, th khng c c chu trnh m}
var
i, m, 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 Floyd;
var
k, u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do Trace[u, v] := v; {Gi s ng i ngn nht gia mi cp nh l ng trc tip}
{Thut ton Floyd}
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
if c[u, v] > c[u, k] + c[k, v] then {ng i t qua k tt hn}
begin
c[u, v] := c[u, k] + c[k, v]; {Ghi nhn ng i thay cho ng c}
Trace[u, v] := Trace[u, k]; {Lu vt ng i}
end;
end;
procedure PrintResult; {In ng i t s ti f}
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
if c[s, f] = maxC
L Minh Hong

246

Chuyn

then WriteLn(fo, 'There is no path from ', s, ' to ', f)


else
begin
WriteLn(fo, 'Distance from ', s, ' to ', f, ': ', c[s, f]);
repeat
Write(fo, s, '->');
s := Trace[s, f]; {Nhc li rng Trace[s, f] l nh lin sau s trn ng i ti f}
until s = f;
WriteLn(fo, f);
end;
Close(fo);
end;
begin
LoadGraph;
Floyd;
PrintResult;
end.

Khc bit r rng ca thut ton Floyd l khi cn tm ng i ngn nht gia mt cp nh
khc, chng trnh ch vic in kt qu ch khng phi thc hin li thut ton Floyd na.

8.8. NHN XT
Bi ton ng i di nht trn th trong mt s trng hp c th gii quyt bng cch i
du trng s tt c cc cung ri tm ng i ngn nht, nhng hy cn thn, c th xy ra
trng hp c chu trnh m.
Trong tt c cc ci t trn, v s dng ma trn trng s ch khng s dng danh sch cnh
hay danh sch k c trng s, nn ta u a v th y v em trng s + gn cho
nhng cnh khng c trong th ban u. Trn my tnh th khng c khi nim tru tng
+ nn ta s phi chn mt s dng ln thay. Nh th no l ln? s phi ln
hn tt c trng s ca cc ng i c bn cho d ng i tht c ti t n u vn tt
hn ng i trc tip theo cnh tng tng ra .
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

Gii thch ti sao i vi th sau, cn tm ng i di nht t nh 1 ti nh 4 li khng


th dng thut ton Dijkstra c, c th p dng thut ton Dijkstra theo tng bc xem sao:
2

3
2

2
1

Bi 2
Trn mt phng cho n ng trn (n 2000), ng trn th i c cho bi b ba s thc
(x[i], y[i], R[i]), (x[i], y[i]) l to tm v R[i] l bn knh. Chi ph di chuyn trn mi
ng trn bng 0. Chi ph di chuyn gia hai ng trn bng khong cch gia chng. Hy
tm phng n di chuyn gia hai ng trn s, f cho trc vi chi ph t nht.
Bi 3
Cho mt dy n s nguyn a[1..n] (n 10000; 1 a[i] 10000). Hy tm mt dy con gm
nhiu nht cc phn t ca dy cho m tng ca hai phn t lin tip l s nguyn t.
Hng dn: Dng th G = (V, E), V = {1, , n}, (i, j) E nu i < j v a[i] + a[j] l s
nguyn t, tm ng i di nht trn th G khng c chu trnh
Bi 4
Mt cng trnh ln c chia lm n cng on nh s 1, 2, , n. Cng on i phi thc hin
mt thi gian t[i]. Quan h gia cc cng on c cho bi bng a[i, j]: a[i, j] = TRUE
cng on j ch c bt u khi m cng vic i xong. Hai cng on c lp nhau c th
tin hnh song song, hy b tr lch thc hin cc cng on sao cho thi gian hon thnh c
cng trnh l sm nht, cho bit thi gian sm nht .
Hng dn: Dng th G = (V, E), trong :
V = {0, 1, , n}
E = {(0, u)|1 u n} {(u, v)|a[u, v] = TRUE}. Trng s mi cung (i, j) t bng t[j]
Tm ng i di nht trn th khng c chu trnh, thi im thch hp thc hin cng
vic i chnh l d[i] - t[i].
Bi 5
Cho mt bng cc s t nhin kch thc mxn (1 m, n 100). T mt c th di chuyn
sang mt k cnh vi n. Hy tm mt cch i t (x, y) ra mt bin sao cho tng cc s
ghi trn cc i qua l cc tiu.
Hng dn: Dng thut ton Dijkstra vi cu trc Heap
Bi 6: Arbitrage
Arbitrage l mt cch s dng s bt hp l trong hi oi tin t kim li.
V d:
Gi s
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

Vi mi cung (u, v) ca th, nu c cung (u, v) v (v, u) u c duy tr n bc ny th


loi b lun c hai. Nhng cung cn li ch ra hai ng i t B v A, bng cch lt ngc
chiu ng i, ta c li gii.
V d:
th ban u:
8

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

B i cc cung (1, 4), (4, 2), (2, 3), (3, 5):


8

-3

-3

B nt cung (3, 4) v (4, 3) ta c 2 ng i t 5 v 1: 5, 4, 1 v 5, 3, 2, 1.

L Minh Hong

250

Chuyn

i chiu ln th ban u, tng di 2 ng i tm c = di ng i Dijkstra +


di ng i Ford-Bellman = 24. Lt ngc th t cc nh trong hai ng i trn, ta
c cp ng i t 1 ti 5 c tng di nh nht cn tm.

HSPHN 1999-2004

L thuyt th

251

9. BI TON CY KHUNG NH NHT


9.1. BI TON CY KHUNG NH NHT
Cho G = (V, E) l th v hng lin thng c trng s, vi mt cy khung T ca G, ta gi
trng s ca cy T l tng trng s cc cnh trong T. Bi ton t ra l trong s cc cy khung
ca G, ch ra cy khung c trng s nh nht, cy khung nh vy c gi l cy khung (hay
cy bao trm) nh nht ca th, v bi ton gi l bi ton cy khung nh nht. Sau y
ta s xt hai thut ton thng dng gii bi ton cy khung nh nht ca n th v
hng c trng s. Bn c th a vo mt s sa i nh trong th tc nhp liu gii
quyt bi ton trong trng hp a th.
Input: file vn bn MINTREE.INP:
Dng 1: Ghi hai s s nh n ( 1000) v s cnh m ca th cch nhau t nht 1 du cch
m dng tip theo, mi dng c dng 3 s u, v, c[u, v] cch nhau t nht 1 du cch th hin
th c cnh (u, v) v trng s cnh l c[u, v]. (c[u, v] l s nguyn c gi tr tuyt i
khng qu 1000).
Output: file vn bn MINTREE.OUT ghi cc cnh thuc cy khung v trng s cy khung

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

9.2. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956)


Thut ton Kruskal da trn m hnh xy dng cy khung bng thut ton hp nht (5), ch
c iu thut ton khng phi xt cc cnh vi th t tu m xt cc cnh theo th t sp
xp: Vi th v hng G = (V, E) c n nh. Khi to cy T ban u khng c cnh no.
Xt tt c cc cnh ca th t cnh c trng s nh n cnh c trng s ln, nu vic thm
cnh vo T khng to thnh chu trnh n trong T th kt np thm cnh vo T. C lm
nh vy cho ti khi:
Hoc kt np c n - 1 cnh vo trong T th ta c T l cy khung nh nht
Hoc cha kt np n - 1 cnh nhng h c kt np thm mt cnh bt k trong s cc
cnh cn li th s to thnh chu trnh n. Trong trng hp ny th G l khng lin
thng, vic tm kim cy khung tht bi.
Nh vy c hai vn quan trng khi ci t thut ton Kruskal:

L Minh Hong

252

Chuyn

Th nht, lm th no xt c cc cnh t cnh c trng s nh ti cnh c trng s ln.


Ta c th thc hin bng cch sp xp danh sch cnh theo th t khng gim ca trng s,
sau duyt t u ti cui danh sch cnh. Trong trng hp tng qut, thut ton HeapSort
l hiu qu nht bi n cho php chn ln lt cc cnh t cnh trng nh nht ti cnh trng
s ln nht ra khi Heap v c th x l (b qua hay thm vo cy) lun.
Th hai, lm th no kim tra xem vic thm mt cnh c to thnh chu trnh n trong T hay
khng. rng cc cnh trong T cc bc s to thnh mt rng ( th khng c chu
trnh n). Mun thm mt cnh (u, v) vo T m khng to thnh chu trnh n th (u, v) phi
ni hai cy khc nhau ca rng T, bi nu u, v thuc cng mt cy th s to thnh chu trnh
n trong cy . Ban u, ta khi to rng T gm n cy, mi cy ch gm ng mt nh,
sau , mi khi xt n cnh ni hai cy khc nhau ca rng T th ta kt np cnh vo T,
ng thi hp nht hai cy li thnh mt cy.
Nu cho mi nh v trn cy mt nhn Lab[v] l s hiu nh cha ca nh v trong cy, trong
trng hp v l gc ca mt cy th Lab[v] c gn mt gi tr m. Khi ta hon ton c
th xc nh c gc ca cy cha nh v bng hm GetRoot di y:
function GetRoot(vV): V;
begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;

Vy kim tra mt cnh (u, v) c ni hai cy khc nhau ca rng T hay khng? ta c th
kim tra GetRoot(u) c khc GetRoot(v) hay khng, bi mi cy ch c duy nht mt gc.
hp nht cy gc r1 v cy gc r2 thnh mt cy, ta lu rng mi cy y ch dng
ghi nhn mt tp hp nh thuc cy ch cu trc cnh trn cy th no th khng quan
trng. Vy hp nht cy gc r1 v cy gc r2, ta ch vic coi r1 l nt cha ca r2 trong cy
bng cch t:
Lab[r2] := r1.

r1

r1

r2

r2
u

Hnh 76: Hai cy gc r1 v r2 v cy mi khi hp nht chng

Tuy nhin, thut ton lm vic hiu qu, trnh trng hp cy to thnh b suy bin khin
cho hm GetRoot hot ng chm, ngi ta thng nh gi: hp hai cy li thnh mt,
th gc cy no t nt hn s b coi l con ca gc cy kia.
HSPHN 1999-2004

L thuyt th

253

Thut ton hp nht cy gc r1 v cy gc r2 c th vit nh sau:


{Count[k] l s nh ca cy gc k}
procedure Union(r1, r2 V);
begin
if Count[r1] < Count[r2] then {Hp nht thnh cy gc r2}
begin
Count[r2] := Count[r1] + Count[r2];
Lab[r1] := r2;
end
else {Hp nht thnh cy gc r1}
begin
Count[r1] := Count[r1] + Count[r2];
Lab[r2] := r1;
end;
end;

Khi ci t, ta c th tn dng ngay nhn Lab[r] lu s nh ca cy gc r, bi nh gii


thch trn, Lab[r] ch cn mang mt gi tr m l , vy ta c th coi Lab[r] = -Count[r] vi
r l gc ca mt cy no .
procedure Union(r1, r2 V); {Hp nht cy gc r1 vi cy gc r2}
begin
x := Lab[r1] + Lab[r2]; {-x l tng s nt ca c hai cy}
if Lab[r1] > Lab[r2] then {Cy gc r1 t nt hn cy gc r2, hp nht thnh cy gc r2}
begin
Lab[r1] := r2; {r2 l cha ca r1}
Lab[r2] := x; {r2 l gc cy mi, -Lab[r2] gi y l s nt trong cy mi}
end
else {Hp nht thnh cy gc r1}
begin
Lab[r1] := x; {r1 l gc cy mi, -Lab[r1] gi y l s nt trong cy mi}
Lab[r2] := r1; {cha ca r2 s l r1}
end;
end;

M hnh thut ton Kruskal:


for kV do Lab[k] := -1;
for ((u, v) E theo th t t cnh trng s nh ti cnh trng s ln) do
begin
r1 := GetRoot(u); r2 := GetRoot(v);
if r1 r2 then {(u, v) ni hai cy khc nhau}
begin
<Kt np (u, v) vo cy, nu n - 1 cnh th thut ton dng>
Union(r1, r2); {Hp nht hai cy li thnh mt cy}
end;
end;
P_4_09_1.PAS * Thut ton Kruskal
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Minimal_Spanning_Tree_by_Kruskal;
const
InputFile = 'MINTREE.INP';
OutputFile = 'MINTREE.OUT';
maxV = 1000;
maxE = (maxV - 1) * maxV div 2;
type
TEdge = record {Cu trc mt cnh}
u, v, c: Integer; {Hai nh v trng s}
Mark: Boolean; {nh du c c kt np vo cy khung hay khng}
end;
var
e: array[1..maxE] of TEdge; {Danh sch cnh}
L Minh Hong

254

Chuyn

Lab: array[1..maxV] of Integer; {Lab[v] l nh cha ca v, nu v l gc th Lab[v] = - s con cy gc v}


n, m: Integer;
Connected: Boolean;
procedure LoadGraph;
var
i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, m);
for i := 1 to m do
with e[i] do
ReadLn(f, u, v, c);
Close(f);
end;
procedure Init;
var
i: Integer;
begin
for i := 1 to n do Lab[i] := -1; {Rng ban u, mi nh l gc ca cy gm ng mt nt}
for i := 1 to m do e[i].Mark := False;
end;
function GetRoot(v: Integer): Integer; {Ly gc ca cy cha v}
begin
while Lab[v] > 0 do v := Lab[v];
GetRoot := v;
end;
procedure Union(r1, r2: Integer); {Hp nht hai cy li thnh mt cy}
var
x: Integer;
begin
x := Lab[r1] + Lab[r2];
if Lab[r1] > Lab[r2] then
begin
Lab[r1] := r2;
Lab[r2] := x;
end
else
begin
Lab[r1] := x;
Lab[r2] := r1;
end;
end;
procedure AdjustHeap(root, last: Integer); {Vun thnh ng, dng cho HeapSort}
var
Key: TEdge;
child: Integer;
begin
Key := e[root];
while root * 2 <= Last do
begin
child := root * 2;
if (child < Last) and (e[child + 1].c < e[child].c)
then Inc(child);
if Key.c <= e[child].c then Break;
e[root] := e[child];
root := child;
end;
HSPHN 1999-2004

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.

Xt v phc tp tnh ton, ta c th chng minh c rng thao tc GetRoot c phc tp


l O(lgn), cn thao tc Union l O(1). Gi s ta c danh sch cnh sp xp ri th xt
vng lp dng cy khung, n duyt qua danh sch cnh v vi mi cnh n gi 2 ln thao tc
GetRoot, vy th phc tp l O(mlgn), nu th c cy khung th m n-1 nn ta thy chi
ph thi gian ch yu s nm thao tc sp xp danh sch cnh bi phc tp ca HeapSort
l O(mlgm). Vy phc tp tnh ton ca thut ton l O(mlgm) trong trng hp xu nht.
Tuy nhin, phi lu rng xy dng cy khung th t khi thut ton phi duyt ton b
danh sch cnh m ch mt phn ca danh sch cnh m thi.

9.3. THUT TON PRIM (ROBERT PRIM - 1957)


Thut ton Kruskal hot ng chm trong trng hp th dy (c nhiu cnh). Trong
trng hp ngi ta thng s dng phng php ln cn gn nht ca Prim. Thut ton
c th pht biu hnh thc nh sau:
n th v hng G = (V, E) c n nh c cho bi ma trn trong s C. Qui c c[u, v] =
+ nu (u, v) khng l cnh. Xt cy T trong G v mt nh v, gi khong cch t v ti T l
trng s nh nht trong s cc cnh ni v vi mt nh no trong T:
d[v] = min{c[u, v] uT}
Ban u khi to cy T ch gm c mi nh {1}. Sau c chn trong s cc nh ngoi T ra
mt nh gn T nht, kt np nh vo T ng thi kt np lun c cnh to ra khong cch
gn nht . C lm nh vy cho ti khi:
Hoc kt np c tt c n nh th ta c T l cy khung nh nht
Hoc cha kt np c ht n nh nhng mi nh ngoi T u c khong cch ti T l
+. Khi th cho khng lin thng, ta thng bo vic tm cy khung tht bi.
V mt k thut ci t, ta c th bt u t mt cy rng v khi to d[1] := 0 cn d[v] := +
vi v 1. Ti mi bc chn nh a vo T, ta s chn nh u no ngoi T v c d[u] nh
nht. Khi kt np u vo T ri th cc nhn d[v] s thay i: d[v]mi := min(d[v]c, c[u, v]).
Bc lp u tin s kt np nh 1 vo cy, t bc lp th hai, trc khi kt np mt nh
vo cy, ta lu li cnh to ra khong cch gn nht t cy ti nh cui cng in ra cy
khung nh nht.
for (v V) do
begin
d[v] := +;
Free[v] := True; {Cha c nh no cy}
end;
d[1] := 0;
for k := 1 to n do
begin
u := arg min(d[v]|v V and Free[v] = True); {Chn u l c nhn t do nh nht}
Free[u] := False; {C nh nhn nh u kt np u vo cy}
for (v V: (u, v) E) do
if d[v] > c[u, v] then
HSPHN 1999-2004

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

ni thm cc dy cp mng ni gia tng cp my tnh. Chi ph ni mt dy cp mng t l


thun vi khong cch gia hai my cn ni. Hy tm cch ni thm cc dy cp mng cho
cc my tnh trong ton mng l lin thng v chi ph ni mng l nh nht.
Hng dn:
Xy dng th y G = (V, E). Mi nh tng ng vi mt my tnh.
Trng s cnh (u, v) s c t bng
0, nu c sn cp mng ni hai my u, v.

( x u x v ) + ( yu yv )
2

, nu cha c sn cp mng ni hai my u v v

Tm cy khung nh nht ca G. Nhng cnh trng s 0 tng ng vi nhng cp mng cn


lp t thm.
Bi 3
H thng in trong thnh ph c cho bi n trm bin th v cc ng dy in ni gia
cc cp trm bin th. Mi ng dy in e c an ton l p(e). y 0 < p(e) 1. an
ton ca c li in l tch an ton trn cc ng dy. V d nh c mt ng dy nguy
him: p(e) = 1% th cho d cc ng dy khc l tuyt i an ton ( an ton = 100%) th
an ton ca mng cng rt thp (1%). Hy tm cch b i mt s dy in cho cc trm
bin th vn lin thng v an ton ca mng l ln nht c th.
Hng dn:
Bng k thut ly logarithm, an ton trn li in tr thnh tng an ton trn cc
ng dy. Dng th c mi nh tng ng vi mt trm bin th v mi cnh tng ng
vi mt ng dy in e c gn trng s l -ln(p(e)). Tm cy khung nh nht ri loi b
tt c nhng ng dy in tng ng vi cc cnh khng nm trn cy khung.
Bi 4
Hy th ci t thut ton Prim vi cu trc d liu Heap cha cc nh ngoi cy, tng t
nh i vi thut ton Dijkstra.

L Minh Hong

260

Chuyn

10. BI TON LUNG CC I TRN MNG


10.1. CC KHI NIM
10.1.1. Mng
Ta gi mng (network) l mt th c hng G = (V, E) gm n nh v m cung, trong c
hai nh phn bit s v t, nh s gi l im pht (source) v nh t gi l nh thu (sink). Mi
cung e = (u, v) E c gn vi mt s khng m c(e) = c[u, v] gi l kh nng thng qua
ca cung (capacity). thun tin cho vic trnh by, ta qui c rng nu mng khng c
cung (u, v) th ta thm vo cung (u, v) vi kh nng thng qua c[u, v] bng 0.

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:

[ u, v] = [ v, w ] (Vi v V\{s, t})

uV

wV

Gi tr ca mt lung c nh ngha bng: tng lung trn cc cung i ra khi nh pht tr


i tng lung trn cc cung i vo nh pht: = [s, u ] [ v,s ] .
uV

6
6

5
3

vV

6
0

1
5

Hnh 77: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7

Bi gi tr ca lung trn cc cung l s khng m, i khi ngi ta cn gi l lung


dng (positive flow) trn mng G. Mt s ti liu khc a vo thm rng buc nh s khng
c c cung i vo v nh t khng c cung i ra, khi gi tr lung c tnh bng tng
lung trn cc cung i ra khi nh pht. Cch hiu ny c th quy v mt trng hp ring
ca nh ngha.

10.1.3. Bi ton lung cc i trn mng


Cho mt mng G, hy tm lung * c gi tr ln nht.

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

Gi tr ca mt lung c nh ngha bng: tng lung trn cc cung i ra khi nh pht:


f = f [s, u ] .
uV

nh l 1: Hai nh ngha 1 v 2 l tng ng.


Chng minh:
T tng ng y hiu theo mc ch ca bi ton tm lung cc i, c ngha l vic
tm lung dng cc i theo nh ngha 1 tng ng vi vic tm lung cc i theo nh
ngha 2.
(1)(2): Nu c mt lung dng trn G theo nh ngha 1, ta xy dng lung f nh sau:
f[u, v] := [u, v] - [v, u]
Ta chng minh f tho mn ba iu kin ca lung theo nh ngha 2:
Tnh cht 1:u, v V, do [v, u] 0 nn f[u, v] = [u, v] - [v, u] c[u, v]
Tnh cht 2: u, v V, ta c f[u, v] = [u, v] - [v, u] = -([v, u] - [u, v]) = -f[v, u]
Tnh cht 3: u V, ta c

f[u, v] = ([u, v] [u, v]) = [u, v] [u, v] = 0

vV

vV

vV

vV

V gi tr lung, ta c:

f = f [s,v ] = ( [s,v ] - [ v,s ]) = [s,v ] [ v,s ] =


vV

vV

vV

vV

(2)(1): Nu c mt lung f theo nh ngha 2, ta xy dng lung dng trn G nh sau:


[u, v] := max(f[u, v], 0)

L Minh Hong

262

Chuyn

Tc l ta ch gi li nhng gi tr f[u, v] dng gn cho [u, v]. Ta chng minh tho mn


hai iu kin ca lung theo nh ngha 1:
Tnh cht 1: u, v V, r rng [u, v] khng m v [u, v] = max(f[u, v], 0) c[u, v].
Tnh cht 2: u, v V, ta c f[u, v] = [u, v] - [v, u] bi
Nu f[u, v] 0 th [u, v] = f[u, v] v [v, u] = 0 f[u, v] = [u, v] - [v, u]
Nu f[u, v] < 0 th [u, v] = 0 v [v, u] = f[v, u] = -f[u, v] f[u, v] = [u, v] - [v, u]
Ta li c tng lung trn cc cung i vo v =

[ u, v] , tng lung trn cc cung i ra

uV

khi v =

[ v, u ] . Hiu s gia tng lung trn cc cung i vo v v tng lung trn cc

uV

cung i ra khi v =

[ 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.

10.1.5. Cc tnh cht c bn


Cho X v Y l hai tp con ca nh V, ta gi kh nng thng qua t X n Y l:
c ( X, Y ) =

c [ u,v]

uX,vY

v gi tr lung thng t X sang Y l:


f ( X, Y ) =

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 ) =

f [ u,v] , nh vy nu f[u, v] xut hin trong tng th f[v,

u,vX

u] cng xut hin, theo tnh cht 2 ca lung, ta c f(X, X) = 0


HSPHN 1999-2004

L thuyt th

263

Vi X, Y V, ta c f ( X, Y ) =

f [ u,v] v f ( Y, X ) = f [ v,u ] , nu hng t f[u,

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 ) =

f [ u,v] = f [ u,v] + f [ u,v] = f ( X, Z ) + f ( Y, Z )

uX Y
vZ

uX
vZ

uY
vZ

Vi u V\{s, t}, ta c f({u}, V) = 0 theo tnh cht 3 ca lung, t suy ra vi X


V\{s, t}, ta c f(X, V) = 0. (D nhin khi f(V, X) = 0)
nh l 3: Gi tr lung trn mng bng tng lung trn cc cung i vo nh thu.
Chng minh:

|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)

= f(V, {t}) + f(V, V\{s, t}) (nh l 2)


= f(V, {t})

(nh l 2)

10.2. MNG THNG D V NG TNG LUNG


10.2.1. Mng thng d
T mt mng G v mt lung f trn G, ta xy dng mng Gf = (V, Ef) vi tp cnh Ef c
nh ngha bng tp cnh E b i cc cung bo ho (mt cung gi l bo ho nu lung trn
cung ng bng kh nng thng qua):
Ef =

{( u, v ) ( u, v V ) ( f [ u, v] < c [u, v])}

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

cht 3 c tho mn.


V gi tr lung. Ta c

f + f ' = ( f + f ') [s, v ] = ( f [s,v ] +f' [s,v ]) = f [s,v ] + f' [s,v ] = f + f '
vV

vV

vV

vV

nh l c chng minh.

10.2.2. ng tng lung


Cho mng G v lung f, mt ng i c bn t A ti B trn mng Gf gi l mt ng tng
lung (Augmenting Path).
Vi mt ng tng lung P, ta t P := min{cf(u, v)|(u, v) P} l gi tr nh nht ca cc
kh nng thng qua trn cc cung trn P v gi P l gi tr thng d (Residual capacity) ca
ng P.

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 Gf v ng tng lung P=1, 3, 4, 2, 5, 6; P=2

Mng G v lung f

Hnh 79: Mng thng d v ng tng lung

nh l 5: Vi P l mt ng tng lung th cc gi tr fP[u, v] cho bi :


P , if (u, v) P

f P [ u,v ] = - P , if (v, u) P
0, otherwise

l mt lung trn Gf.


Chng minh: D thy fP tho mn 3 tnh cht ca lung.
nh l 6: Cho mng G v lung f, nu P l ng tng lung trn mng thng d Gf th php
t f := (f+fP) cho ta mt lung mi trn f c gi tr bng |f| + P.
Chng minh: D dng suy ra t nh l 5 v nh l 6.
Php gn f := (f+fP) gi l tng lung dc theo ng P.
V d: Vi mng G, lung f, v th thng d Gf nh Hnh 79, gi s chn ng i P=1, 3,
4, 2, 5, 6 lm ng tng lung vi gi tr thng d P = 2. Lung fP trn Gf s l:
fp[1, 3] = fP[3, 4] = fP[4, 2] = fP[2, 5] = fP[5, 6] = 2
fp[3, 1] = fP[4, 3] = fP[2, 4] = fP[5, 2] = fP[6, 5] = -2
Cng cc gi tr lung ny vo gi tr lung f tng ng trn cc cung, ta s c lung mi
mang gi tr 9.

2
6

6
0

2
3

5
1

Hnh 80: Lung trn mng G trc v sau khi tng

L Minh Hong

4
6

6
2

4
3

5
1

266

Chuyn

10.3. THUT TON FORD-FULKERSON (L.R.FORD & D.R.FULKERSON 1962)


Thut ton Ford-Fulkerson c th vit:
<Khi to mt lung f trn G, chng hn lung 0>
while <Tm c ng tng lung P trn Gf> do f := (f + fP);
<Output f>

Trc ht d thy thut ton Ford-Fulkerson tr v lung tc l kt qu ca thut ton tr v


tho mn 3 tnh cht ca lung. Vic chng minh lung l cc i xy dng mt nh l
quan trng v mi quan h gia lung cc i v lt ct hp nht.

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(s, V) + f(X\{s}, V) (nh l 2)


= f(s, V)

(nh l 2, X\{s} khng cha c s v t)

= |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

H qu: Gi tr ca mt lung f bt k trn mng G khng vt qu kh nng thng qua ca


mt lt ct s-t bt k.
Chng minh: Suy ra trc tip t nh l 8 v 9.
nh l 9: (nh l lung cc i v lt ct s-t hp nht)
Nu f l mt lung trn mng G = (V, E) vi im pht s v im thu t, khi ba mnh sau
l tng ng:
(1). f l lung cc i trn G
HSPHN 1999-2004

L thuyt th

267

(2). Mng thng d Gf khng c ng tng lung


(3). Tn ti (X, Y) l mt lt ct s-t |f| = c(X, Y)
Chng minh
(1) (2)
Gi s phn chng rng Gf c ng tng lung P th ta c (f + fP) cng l lung trn G v gi
tr lung ca (f+fP) ln hn f, tri vi gi thit f l lung cc i trn mng
(2) (3)
Nu Gf khng tn ti ng tng lung th ta t
X = {u|Tn ti ng i t s ti u trn mng Gf}
Y = V\X
Khi X Y = , s X, t X (do khng c ng i t s ti t) nn t Y, nn (X, Y) l
mt lt ct s-t. Vi x X v y Y, ta c f[u, v] = c[u, v] bi nu f[u, v] < c[u, v] th c
cung (u, v) trn Gf v nh vy t s c th n c v, tri vi cch xy dng lt ct. T suy
ra f(X, Y) = c(X, Y)
(3) (1)
Theo nh l 8, gi tr ca mi lung trn G c(X, Y), nu gi tr lung f ng bng kh nng
thng qua ca lt ct (X, Y) th f phi l lung cc i trn mng
nh ngha: Lt ct s-t c kh nng thng qua nh nht (bng gi tr lung cc i trn mng)
gi l lt ct s-t hp nht ca mng G.

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

Ta s dng mt s bin vi cc ngha nh sau


c[1..n, 1..n]: Ma trn biu din kh nng thng qua ca cc cung trn mng
f[1..n, 1..n]: Ma trn biu din lung trn cc cung
Trace[1..n]: Dng lu vt ng tng lung, thut ton tm ng tng lung s s
dng l thut ton tm kim theo chiu rng (BFS)
Ta c th kim tra (u, v) c phi l cung trn mng thng d Gf khng bng ng thc: c[u,
v] > f[u, v]. Nu (u, v) l cung trn Gf th kh nng thng qua ca n l c[u, v] - f[u, v].
P_4_10_1.PAS * Thut ton Ford-Fulkerson
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program Max_Flow_by_Ford_Fulkerson;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 1000;
type
TCapacities = array[1..max, 1..max] of Integer;
var
c: TCapacities;
f: TCapacities;
Trace: array[1..max] of Integer;
n, s, t: Integer;
procedure Enter; {Nhp d liu}
var
m, i, u, v: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(c, SizeOf(c), 0);
ReadLn(fi, n, m, s, t);
for i := 1 to m do
ReadLn(fi, u, v, c[u, v]);
Close(fi);
end;
function FindPath: Boolean; {Tm ng tng lung trn Gf, tr v True tm thy}
var
u, v: Integer;
Queue: array[1..max] of Integer; {Hng i dng cho BFS}
Front, Rear: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0);
Front := 1; Rear := 1;
Queue[1] := s;
Trace[s] := n + 1; {Trace[v] = 0 v cha thm}
repeat
HSPHN 1999-2004

L thuyt th

269

u := Queue[Front]; Inc(Front); {Ly u khi Queue}


for v := 1 to n do
if (Trace[v] = 0) and (c[u, v] > f[u, v]) then {Xt v cha thm k u trn Gf}
begin
Trace[v] := u;
if v = t then {n c t th thut ton dng}
begin
FindPath := True; Exit;
end;
Inc(Rear); Queue[Rear] := v; {y v vo Queue}
end;
until Front > Rear;
FindPath := False;
end;
procedure IncFlow; {Tng
var
Delta, u, v: Integer;
begin
{Tnh Delta = P}
Delta := MaxInt;
v := t;
repeat
u := Trace[v];
if c[u, v] - f[u, v]
v := u;
until v = s;
{f := (f + fP)}
v := t;
repeat
u := Trace[v];
f[u, v] := f[u, v] +
f[v, u] := f[v, u] v := u;
until v = s;
end;

lung dc ng tng lung: f := (f + fP)}

< Delta then Delta := c[u, v] - f[u, v];

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. THUT TON PREFLOW-PUSH (GOLDBERG - 1986)


Thut ton Ford-Fulkerson khng nhng l mt cch tip cn thng minh m vic chng
minh tnh ng n ca n cho ta nhiu kt qu th v v mi lin h gia lung cc i v lt
ct hp nht. Tuy vy phc tp tnh ton ca thut ton Ford-Fulkerson l kh ln, dn ti
nhng kh khn khi thc hin vi d liu ln. Trong phn ny ta s trnh by mt lp cc
thut ton nhanh nht cho ti nay gii bi ton lung cc i, tn chung ca cc thut ton
ny l Preflow-push.
Ta c th hnh dung mng nh mt h thng ng ng dn nc t vi im pht s ti im
thu t, cc cung l cc ng ng, kh nng thng qua l lu lng ng ng c th ti. Nc
chy theo nguyn tc t ch cao v ch thp. Vi mt lng nc ln pht ra t s ti mt
nh v, nu c cch chuyn lng nc sang a im khc th khng c vn g, nu
khng th c hin tng qu ti xy ra ti v, ta dng cao im v lng nc sang
im khc (c th ngc v s). C tip tc qu trnh nh vy cho ti khi khng cn hin
tng qu ti bt c im no. Cch tip cn ny hon ton khc vi thut ton FordFulkerson: thut ton Ford-Fulkerson c gng tm mt dng chy ph (fP) t s ti t v thm
dng chy ny vo lung hin c n khi khng cn dng chy ph na.

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

Tnh cht 3: Tng lung trn cc cung i vo mi nh v V\{s} l s khng m:

f [ u,v] 0

uV

Ta dng bin FlowIn[v] lu tng lung trn cc cung i vo nh v: FlowIn [ v ] = f [ u,v ] .


uV

nh v V\{s, t} c gi l qu ti (overflow) nu FlowIn[v] > 0. Lu rng khi nim qu


ti ch cp ti cc nh khng phi nh pht cng khng phi nh thu.
nh ngha v preflow tng t nh nh ngha lung, ch khc nhau tnh cht 3. V vy ta
cng c khi nim mng thng d Gf ng vi preflow tng t nh i vi lung.

10.4.2. Thao tc khi to (Init)


Ta gi php cho tng ng mi nh v vi mt s t nhin h[u] l mt hm cao. Hm
cao c khi to bng 0 trn cc nh khng phi nh pht v bng n ti nh pht:
for (v V) do
if v = s then h[v] := n
else h[v] := 0

Sau thao tc khi to hm cao, ta khi to preflow:


for ( u, v V, us v vs) do f[u, v] := 0
for ( u V, us) do
begin
f[s, u] := c[s, u];
f[u, s] := -c[s, u];
end;

Cui cng, ta phi tnh cc gi tr FlowIn[.] tng ng vi preflow va khi to


for ( u V) do FlowIn[u] := f[s, u]

10.4.3. Thao tc Push


Thao tc Push(u, v) c p dng khi 3 iu kin sau c tho mn:
u b qu ti: (u s) and (u t) and (FlowIn[u] > 0)
(u, v) l cung trn Gf: cf[u, v] = c[u, v] - f[u, v] > 0
nh u cao hn nh v: h[u] > h[v]
Khi thao tc Push(u, v) s thc hin qua cc bc sau:
t := min(FlowIn[u], cf[u, v])
t f[u, v] := f[u, v] +
t f[v, u] := f[v, u] -
FlowIn[u] := FlowIn[u] -
FlowIn[v] := FlowIn[v] +
Bn cht ca thao tc Push(u, v) l chuyn mt lng nc ng ti u (do qu ti) sang
nh v. D thy c ba tnh cht ca Preflow vn c duy tr sau thao tc Push.

10.4.4. Thao tc Lift


Thao tc Lift(u) c p dng khi hai iu kin sau c tho mn:
L Minh Hong

272

Chuyn

u b qu ti: (u s) and (u t) and (FlowIn[u] > 0)


u khng chuyn c lung xung ni thp hn: (u, v) Ef h[u] h[v]
Khi thao tc Lift(u) t h[u] := 1 + min{h[v]|(u, v) Ef}
Bn cht ca thao tc Lift l khi nh u b qu ti v cng khng chuyn ti c cho nh
khc th ta y nh u ln cao hn nh thp nht c th chuyn ti sang ng mt n v
cao.

10.4.5. Thut ton Preflow-push


Thut ton Preflow-push c th vit:
Init;
while <Cn nh b qu ti u> do
if <v V c th thc hin thao tc Push(u, v)> then
Push(u, v)
else
Lift(u);
<Output f>

Vic chng minh tnh ng n ca thut ton Preflow-push c th suy ra t cc nh l sau:


nh l 12: cao ca cc nh khng bao gi b gim i c.
Chng minh: D thy bi ch c thao tc Lift thay i cao ca nh, thao tc ny ch nng
cao mt nh ln ch khng gim i.
nh l 13: Cc cao h[.] lun tho mn rng buc: (u, v) Ef th h[u] h[v] + 1. Rng
buc ny gi l rng buc cao
Chng minh: R rng ti bc khi to, cc cao h[.] tho mn:
(u, v) Ef h[u] h[v] + 1.
Thao tc Lift(u)
Vi mi cung (u, v) Ef, thao tc Lift t h[u] := 1 + min{h[v]|(u, v) Ef} y u ln cao
hn nhng khng qu h[v] + 1.
Vi mi cung (w, u) Ef, trc khi vo th tc Lift th h[w] h[u] + 1 theo gi thit, vy
nu y u ln cao hn th h[w] vn khng qu h[u] + 1.
Thao tc Push(u, v)
Ch rng thao tc Push(u, v) ch thc hin c nu h[u] > h[v]. Thao tc Push trc ht
thm vo Ef cung (v, u) khi ta c h[v] < h[u], rng buc cao c duy tr. Sau thao
tc Push c th d b cung (u, v) t Ef, vic d b ny cng b lun rng buc cao (h[u]
phi h[v] + 1).
nh l c chng minh.
Ni thm rng c th chng minh c thao tc Push(u, v) ch thc hin c nu u cao hn
v ng 1 n v (h[u] = h[v] + 1). iu ny c th suy ra t rng buc cao h[u] h[v] + 1
v iu kin h[u] > h[v] ca thao tc Push.

HSPHN 1999-2004

L thuyt th

273

nh l 14: Cho G = (V, E) l mt mng vi im pht s v im thu t, gi f l mt preflow


trn G. Khi nu tn ti mt hm cao h trn V tho mn rng buc cao th khng c
ng i t s ti t trong Gf.
Chng minh: Gi s phn chng rng c ng i P = s = v0, v1, vk = t, khng gim tnh
tng qut, c th coi P l ng i c bn, tc l k < n. T rng buc cao ta c:
h[s] = h[v0] h[v1] + 1 h[v2] + 2 h[vk] + k = h[t] + k.
Bi h[t] = 0, ta c h[s] k < n. Mu thun vi vic h[s] c khi to bng n v khng bao
gi b thay i c.
nh l 15: Thut ton Preflow-push l ng n v c phc tp tnh ton O(n2m).
Chng minh: C th chng minh thut ton Preflow-Push dng trong thi gian O(n2m). Nu
thut ton dng th khng cn nh no b qu ti, ta c f l lung. Theo nh l 14, khng cn
ng i t s ti t trn Gf. p dng nh l 9, ta c f l lung cc i trn mng.
C th a vo mt s ci tin, chng hn t chc danh sch cc nh qu ti theo dng Queue,
sau vi mi thao tc, thut ton y thm nhng nh qu ti mi pht hin trong mi thao
tc Push vo ch trong Queue khng tn thi gian tm nh qu ti. Thut ton tin hnh
theo cch ny c phc tp tnh ton O(n3).

10.4.6. Ci t
Chng trnh ci t thut ton Preflow-push c Input v Output ging chng trnh ci t
thut ton Ford-Fulkerson.
Cc nh qu ti s c lu trong mt cu trc d liu Queue dng danh sch vng (xem
PHN 2, 5, 5.2.2). Mng Boolean InQueue[1..n], trong InQueue[u] cho bit nh u c
mt trong Queue cha. Hm Discharge(u) c thc hin vi mt nh u b qu ti, hm ny
s c gng chuyn ti t u sang nhng nh v k vi u trn Gf qua thao tc Push. Nu gim ti
c cho u th hm tr v True, ngc li hm tr v False bo cho chng trnh bit phi
thc hin thao tc Lift(u).
P_4_10_2.PAS * Thut ton Preflow-push
{$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.

Thc ra tn gi preflow-push l mt tn gi chung cho mt lp thut ton m tng ban u


ca n c pht trin bi Karzanov nm 1974, m hnh chung nht cho thut ton preflowpush u tin l generic preflow-push c Goldberg a ra nm 1987 trong lun vn PhD
ca ng. Sau c rt nhiu ci tin t m hnh ny chng hn: FIFO Preflow-push s dng
hng i nh chng ta ci t trn, Highest Label Preflow-push (lun chn nh qu ti nm
cao nht gim ti trc), Lift-to-front Preflow-push, Cc bn c th tham kho
trong cc ti liu chuyn su v bi ton lung.

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.

10.5.1. Mng vi nhiu im pht v nhiu im thu


Xt mng G vi p im pht s[1], s[2], , s[p] v q im thu t[1], t[2], , t[q]. Mt lung c
th i t mt im pht bt k n mt im thu bt k, c nh ngha tng t nh trong
bi ton lung cc i. Bi ton tm lung cc i t cc im pht n cc im thu c th
a v bi ton vi mt im pht v mt im thu bng cch a vo thm mt im pht
gi s v mt im thu gi t. nh s c ni ti tt c cc im pht s[1],..., s[p] v nh t
c ni t tt c cc nh thu t[1], , t[q] bng cung c kh nng thng qua l + (Hnh 81),
sau tm lung cc i trn mng v cui cng d b hai nh gi cng nh cc cung gi
mi thm vo.

s1

t1
+

+
+
s

a
s21

at21

+
t

+
sp

tq

Hnh 81: Mng gi ca mng c nhiu im pht v nhiu im thu

10.5.2. Mng vi kh nng thng qua ca cc nh v cc cung


Gi s trong mng G, ngoi kh nng thng qua ca cc cung c[u, v], mi nh cn c gn
mt s khng m d[.] l kh nng thng qua ca nh . Lung c nh ngha tng t
nhng thm rng buc: tng lung i vo mi nh v khng c vt qu d[v]:

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

Hnh 82: Thay mt nh u bng hai nh uin, uout

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

nh l 16: iu kin cn v tn ti lung tng thch trn G l trn G phi tn ti


lung t s' ti t' vi gi tr lung l

d [ u, v] .

(u,v)E

D thy nu tn ti lung trn G t s' ti t' vi gi tr lung

d [ u, v] th lung phi l

(u,v)E

lung cc i trn G. ch ra lung tng thch trn G, ta ch vic ly gi tr lung trn


cung (u, v) ca G cng thm d[u, v] l c lung trn cung (u, v) ca G.
L Minh Hong

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

Cho mt th G = (V, E) c hng v khng c chu trnh (Directed Acyclic Graph-DAG),


mt ph ng (Path Cover) l mt tp P gm cc ng i trn G tho mn: Vi mi nh
vV, tn ti duy nht mt ng i pP cha v. ng i c th bt u v kt thc bt c
u, c tnh c ng i di 0 (ch gm 1 nh).
Hy tm ph ng gm t ng i nht (Pmin).
Hng dn:
Gi s V = {1, , n}. Xy dng th G'=(V', E'), trong :
V' = {x0, x1, , xn} {y0, y1, , yn}
E' = {(x0, xi)|i V} {(yj, y0)|j V} {(xi, yj)|(i, j) E}
Tm lung nguyn cc i trn mng G' vi nh pht x0, nh thu y0 v tt c kh nng thng
qua ca cc cung c gn bng 1. Mi cung (xi, yj) trn G' c lung i qua s tng ng vi
mt cung (i, j) ca G c chn vo mt ng i no trong P. Cui cng, nhng nh no
ca G cha thuc P s c a nt vo P vi t cch l ng i di 0.

y1

x2

y2

x3

y3
y0

x0

x1

x4

y4

x5

y5

x6

y6

P={(1, 3, 5), (2, 4, 6)}

Trc ht ta c nhn xt rng c mt s tng ng gia ph ng trn G v lung nguyn


cc i trn G'. Tht vy:
Vi mi ng i v[1], v[2], , v[q] ca P, vi mi nh v[j] (j=1, , q), ta c th y 1
n v lung t x0 ti xv[j] qua yv[j+1] n y0. D thy lung trn G' c xy dng nh vy
l tho mn nh ngha lung, bi cc ng i trong P i mt khng c nh chung.
Ngc li, vi mt lung nguyn trn G', ta b qua khng xt nhng cung ni t x0 v
nhng cung ni ti y0 trn G', theo nh l v tnh nguyn, lung trn mi cung ca G'
hoc bo ho (lung = kh nng thng qua = 1), hoc bng 0. Khi to P gm n nh V
v cha c cung no, c th coi P gm n ng i di 0. Mi khi a vo P mt cung (u,
v) tng ng vi mt cung bo ho (xu, yv) trn G', cung s ni 2 ng trn P thnh
mt ng. Ti sao vy?, bi trn G', mi nh xu c nhiu nht mt cung bo ho i ra v
mi nh yv c nhiu nht mt cung bo ho i vo, vy nn nu thm vo P cung (u, v)
tng ng vi cung bo ho (xu, yv) trn G' s khng bao gi lm cho bn bc ra ca u
cng nh bn bc vo ca v vt qu 1 (tc l khng to thnh ng r). T suy ra, theo
L Minh Hong

280

Chuyn

thut ton, mi ln thm vo P mt cung th s ng i trong P s gim i 1. V s cung


bo ho dng (xu, yv) trn G' ng bng gi tr lung cc i trn mng G' nn s ng i
trn P xy dng theo cch trn s l n f vi f l gi tr lung thng qua mng G'. Vic cc
tiu ho s ng i trong P tng ng vi cc i ho gi tr lung qua mng G', tc l
ph ng suy ra t lung cc i l ph ng ti thiu.
Thut ton trn khng thc hin c trong trng hp th c chu trnh, hy t gii thch
ti sao. Cho ti nay, ngi ta vn cho rng bi ton tm ph ng cc tiu trong trng hp
th tng qut l NP-Hard, c ngha l mt thut ton vi phc tp a thc gii quyt
bi ton ph ng cc tiu trn th tng qut s l mt pht minh ln v ng ngc nhin.
Bi 4: The minimum cut
Ta quan tm n th v hng lin thng G = (V, E), cc cnh c gn trng s khng m,
bi ton t ra l hy phn hoch tp nh V thnh hai tp khc rng ri nhau X v Y sao cho
tng trng s cc cnh ni gia X v Y l nh nht c th. Cch phn hoch ny gi l lt ct
tng qut hp nht ca G. K hiu MinCut(G).
Hng dn:
Gi c l ma trn trng s ca G, c[u, v] = 0 nu (u, v) khng l cnh.
Bi ton c th pht biu: Tm X V v Y V tho mn:
(X Y = V) and (X Y = ) and (c(X, Y) min)
Cch 1: Mt cch t nht c th thc hin l th tt c cc cp nh (s, t). Vi mi ln th ta
cho s lm im pht v t lm im thu trn mng G, tm lung cc i v lt ct s-t hp nht.
Cui cng l chn lt ct s-t c trng s nh nht trong tt c cc ln th. Cch ny c th ni
l rt chm (mt n.(n-1)/2 ln tm lung cc i) nn khng kh thi vi d liu ln. Di y
ta trnh by cch lm khc.
Vi hai im u v v ca G, ta gi th G/{u, v} l th to thnh t G bng cch chp 2
nh u v v thnh 1 nh uv. Trng s ca cc cnh (uv, w) c tnh bng tng c[u, w] + c[v,
w]. Khi ta c nh l:
nh l 17: Vi s v t l hai nh bt k ca G, khi MinCut(G) c th thu c bng cch
ly lt ct nh hn trong hai lt ct:
Lt ct s-t hp nht: Coi s v t ln lt l im pht v im thu trn G, lt ct s-t hp nht
c th xc nh bng vic gii quyt bi ton lung cc i trn G vi c l ma trn kh
nng thng qua.
Lt ct tng qut hp nht trn G/{s, t}: MinCut(G/{s, t}).
Chng minh: Lt ct tng qut hp nht trn G c th a s v t vo hai thnh phn lin
thng khc nhau hoc a chng vo cng mt thnh phn lin thng. Trong trng hp 1,
MinCut(G) l lt ct s-t hp nht, trng hp 2, MinCut(G) l MinCut(G/{s, t}).
n y ta c mt thut ton tt hn:

HSPHN 1999-2004

L thuyt th

281

Cch 2: Nu th c ng 2 nh th ch vic ct ri hai nh, nu khng th chn ly hai


nh phn bit s, t bt k ln lt l im pht v im thu, tm lung cc i trn mng v
ghi nhn li lt ct s-t. Sau chp s v t li thnh mt nh st v lp li. Cui cng l ch ra
lt ct tng qut hp nht trong s cc lt ct ghi nhn. Cch 2 tt hn cch 1 ch: thay v
n.(n-1)/2 ln tm lung cc i ta ch cn n-1 ln tm lung cc i. Tuy vy cch ny vn
cha phi tht tt.
C th nhn xt rng ti mi bc ca cch gii 2, ta c th chn hai nh s v t bt k, min
sao s t. Vy ta s tm mt chin thut chn hai nh s v t mt cch hp l c th ch
ngay ra lt ct s-t m khng cn tm lung cc i.
Cch 3: Vi mt tp A V v mt nh v V, ta quan tm ti gi tr c(A, {v}), v mt trc
quan, c(A, {v}) cho bit nh v gn vi A cht ti mc no.
Ly u l mt nh bt k trong V, t A := {u}. Sau c chn nh gn vi A cht nht thm
vo A cho ti khi A = V (Dng k thut tng t nh thut ton Prim -PHN 4, 9, 9.3). Gi
t l nh c kt np cui cng trong tin trnh ny v s l nh c kt np lin trc t.
nh l 18: Lt ct (V\{t}, {t}) l lt ct s-t hp nht.
Chng minh: Vi mt lt ct s-t bt k, ta s chng minh rng kh nng thng qua ca lt ct
ny ln hn hay bng kh nng thng qua ca lt ct (V\{t}, {t}).
Xt mt lt ct s-t bt k . Ta gi nh v l hot tnh nu v v nh c kt np lin trc v
b ri vo hai phn khc nhau ca lt ct . Vi mi nh v, ta gi Av l tp nhng nh c
kt np vo A trc nh v. Gi v l lt ct hn ch trn Av{v} (lt ct v dng ng cch
phn hoch ca lt ct , nhng ch quan tm n tp nh Av{v}). K hiu w() l kh
nng thng qua ca lt ct , k hiu w(v) l kh nng thng qua ca lt ct v.
B : Nu v l nh hot tnh th c(Av, {v}) w(v)
Tht vy, nu v l nh hot tnh u tin c kt np vo A, khi v s chia tp Av{v}
thnh hai tp con m mt trong hai tp con bng {v} do v l nh hot tnh u tin. Trong
trng hp ny ta c c(Av, {v}) = w(v). Gi thit quy np rng b ng vi u, ta s chng
minh b cng ng vi nh hot tnh v c kt np vo A sau u. Tht vy:
c(Av, {v}) = c(Au, {v}) + c(Av\Au, {v}) (Do Au Av)
c(Au, {u}) + c(Av\Au, {v}) (Do u phi gn vi Au cht hn hoc bng v)
w(u) + c(Av\Au, {v})

(Gi thit quy np)

w(v)

(Do u v v u hot tnh, Av\Au phi nm


khc pha vi v trong lt ct Khi tnh
w(v), tp cnh c mt trong php tnh w(u)
cng c mt do Au Av, tp cnh ni t
Av\Au sang v cng c mt, hai tp cnh ny
khng giao nhau)

L Minh Hong

282

Chuyn

p dng b vi t l nh hot tnh, ta c c(At, {t}) w(t) = w(). Tc l kh nng thng


qua ca lt ct (V\{t}, t) nh hn kh nng thng qua ca lt ct , iu ny ng vi mi ,
y l iu phi chng minh.
nh l 19: Bi ton tm lt ct tng qut hp nht trn th c th gii quyt bng thut ton
c phc tp O(n(m+n)lgn), vi n v m ln lt l s cnh v s nh ca th.
Chng minh: Vi vic p dng k thut gn nhn tng t nh thut ton Prim kt hp vi
vic s dng cu trc Heap chn ra nh gn vi A cht nht, vic xc nh s, t v chn ra
lt ct s-t hp nht c phc tp O((m+n)lgn). Sau khi ghi nhn lt ct s-t hp nht ny, ta
chp s v t li thnh mt nh st v lp li vi th G/{s, t}. Tng cng c n - 2 ln lp, t
suy ra kt qu.
y l mt bi ton hay, vic chng minh tnh ng n ca thut ton phi da trn l thuyt
v lung cc i v lt ct s-t hp nht, nhng lp trnh gii bi ton lt ct tng qut hp
nht th khng cn ng chm g n cc thut ton tm lung cc i c.

HSPHN 1999-2004

L thuyt th

283

11. BI TON TM B GHP CC I TRN TH HAI PHA


11.1. TH HAI PHA (BIPARTITE GRAPH)
Cc tn gi th hai pha mt dng n th v hng G = (V, E) m tp nh ca n c
th chia lm hai tp con X, Y ri nhau sao cho bt k cnh no ca th cng ni mt nh
ca X vi mt nh thuc Y. Khi ngi ta cn k hiu G l (X Y, E) v gi mt tp
(chng hn tp X) l tp cc nh tri v tp cn li (chng hn tp Y) l tp cc nh phi
ca th hai pha G. Cc nh thuc X cn gi l cc X_nh, cc nh thuc Y gi l cc
Y_nh.

Hnh 84: th hai pha

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

11.2. BI TON GHP I KHNG TRNG V CC KHI NIM


Cho mt th hai pha G = (X Y, E) y X l tp cc nh tri v Y l tp cc nh phi
ca G. X = {x[1], x[2], , x[m]}, Y = {y[1], y[2], , y[n]}
Mt b ghp (matching) ca G l mt tp hp cc cnh ca G i mt khng c nh chung.

L Minh Hong

284

Chuyn

Bi ton ghp i (matching problem) l tm mt b ghp ln nht (ngha l c s cnh ln


nht) ca G
Xt mt b ghp M ca G.
Cc nh trong M gi l cc nh ghp (matched vertices), cc nh khc l cha ghp.
Cc cnh trong M gi l cc cnh ghp, cc cnh khc l cha ghp
Nu nh hng li cc cnh ca th thnh cung, nhng cnh cha ghp c nh
hng t X sang Y, nhng cnh ghp nh hng t Y v X. Trn th nh hng :
Mt ng i xut pht t mt X_nh cha ghp gi l ng pha, mt ng i t mt
X_nh cha ghp ti mt Y_nh cha ghp gi l ng m.
Mt cch d hiu, c th quan nim nh sau:
Mt ng pha (alternating path) l mt ng i n trong G bt u bng mt X_nh
cha ghp, i theo mt cnh cha ghp sang Y, ri n mt cnh ghp v X, ri li n
mt cnh cha ghp sang Y c xen k nhau nh vy.
Mt ng m (augmenting path) l mt ng pha. Bt u t mt X_nh cha ghp kt
thc bng mt Y_nh cha ghp.
V d: vi th hai pha trong hnh Hnh 85 v b ghp M = {(x[1], y[1]), (x[2], y[2])}
x[3] v y[3] l nhng nh cha ghp, cc nh khc l ghp
ng (x[3], y[2], x[2], y[1]) l ng pha
ng (x[3], y[2], x[2], y[1], x[1], y[3]) l ng m.

Hnh 85: th hai pha v b ghp M

11.3. THUT TON NG M


Thut ton ng m tm mt b ghp ln nht pht biu nh sau:
Bc 1:
Bt u t mt b ghp bt k M (thng thng b ghp c khi gn bng b ghp rng
hay c tm bng cc thut ton tham lam)
Bc 2:
Tm mt ng m
Bc 3:
HSPHN 1999-2004

L thuyt th

285

Nu bc 2 tm c ng m th m rng b ghp M: Trn ng m, loi b nhng


cnh ghp khi M v thm vo M nhng cnh cha ghp. Sau lp li bc 2.
Nu bc 2 khng tm c ng m th thut ton kt thc
Khi to mt b ghp M;
while C ng m xut pht t x ti mt nh y cha ghp Y do
Dc trn ng m, xo b khi M cc cnh ghp v thm vo M nhng cnh cha ghp;
{Sau thao tc ny, nh x v y tr thnh ghp, s cnh ghp tng ln 1}

Nh v d trn, vi b ghp hai cnh M = {(x[1], y[1]), (x[2], y[2])} v ng m tm c


gm cc cnh:
(x[3], y[2]) M
(y[2], x[2]) M
(x[2], y[1]) M
(y[1], x[1]) M
(x[1], y[3]) M
Vy th ta s loi i cc cnh (y[2], x[2]) v (y[1], x[1]) trong b ghp c v thm vo cc
cnh (x[3], y[2]), (x[2], y[1]), (x[1], y[3]) c b ghp 3 cnh.

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].

11.4.2. Biu din b ghp


biu din b ghp, ta s dng hai mng: matchX[1..m] v matchY[1..n].
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 rng:
Nu nh x[i] cha ghp vi nh no ca tp Y th matchX[i] = 0
Nu nh y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.
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;

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

P_4_11_1.PAS * Thut ton ng m tm b ghp cc i


{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program MatchingProblem;
const
InputFile = 'MATCH.INP';
OutputFile = 'MATCH.OUT';
max = 1000;
var
m, n: Integer;
a: array[1..max, 1..max] of Boolean;
matchX, matchY: array[1..max] of Integer;
Trace: array[1..max] of Integer;
procedure Enter;
HSPHN 1999-2004

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.

Kho st tnh ng n ca thut ton cho ta mt kt qu kh th v:


Nu ta thm mt nh s v cho thm m cung t s ti tt c nhng nh ca tp X, thm mt
nh t v ni thm n cung t tt c cc nh ca Y ti t. Ta c mt mng vi nh pht s v
nh thu t.
1

Hnh 86: M hnh lung ca bi ton tm b ghp cc i trn th hai pha

HSPHN 1999-2004

L thuyt th

289

Nu t kh nng thng qua ca cc cung u l 1 sau tm lung cc i trn mng th theo


nh l v tnh nguyn, lung dng tm c trn cc cung u phi l s nguyn (tc l
bng 1 hoc 0). Khi d thy rng nhng cung c lung dng bng 1 t tp X ti tp Y s
cho ta mt b ghp ln nht. chng minh thut ton ng m tm c b ghp ln nht
sau hu hn bc, ta s chng minh rng s b ghp tm c bng thut ton ng m s
bng gi tr lung cc i ni trn, iu cng rt d bi v nu k mt cht th ng
m chng qua l ng tng lung trn mng thng d m thi, ngay ci tn augmenting path
cho ta bit iu ny. V vy thut ton ng m trng hp ny l mt cch ci t
hiu qu trn mt dng th c bit, n lm cho chng trnh sng sa hn nhiu so vi
phng php tm b ghp da trn bi ton lung thun ty.
Ngi ta chng minh c chi ph thi gian thc hin gii thut ny trong trng hp xu
nht s l O(n3) i vi th dy v O(n(n + m)logn) i vi th tha. Tuy nhin, cng
ging nh thut ton Ford-Fulkerson, trn thc t phng php ny hot ng rt nhanh.
Bi tp
Bi 1
C n th v m cng vic (n, m 100). Mi th cho bit mnh c th lm c nhng vic no,
hy phn cng cc th lm cc cng vic sao cho:
Mi th phi lm t nht hai vic
Mt vic ch giao cho mt th thc hin
S vic thc hin c l nhiu nht c th.
Hng dn: Dng th hai pha G = (X Y, E), X tp cc th v Y l tp cc cng vic. S
dng thut ton ng m vi cch hiu ng m l ng pha xut pht t 1 th cha
c phn hai vic v kt thc mt vic cha c phn cng.
Bi 2
C n th v m cng vic (n, m 100). Mi th cho bit mnh c th lm c nhng vic no,
hy phn cng thc hin cc cng vic sao cho:
Mi cng vic ch giao cho mt th thc hin
S cng vic phn cho ngi th lm nhiu nht l cc tiu.
Hng dn: Dng th hai pha G = (X Y, E), X l tp cc cng vic v Y l tp th. Vi
mt s nguyn k (1 k m), tm cch phn cng thc hin cc cng vic sao cho khng th
no lm qu k vic. C th s dng thut ton ng m vi cch hiu ng m l ng
pha xut pht t mt vic cha c phn cng v kt thc mt th cha lm k vic.
S k s c th ln lt t 1 ti m, xc nh s k u tin cho php tm ra php phn cng
thc hin ht cc vic v in kt qu ra php phn cng tng ng vi s k . C hai iu
quan trng phi lu : Th nht l php th vi k = k0 c th tn dng kt qu ca php phn
cng vi k = k0 - 1 ch khng cn thc hin li t u. Th hai l vic ci tin bng p
dng thut ton tm kim nh phn ch ra s k nh nht tha mn yu cu phn cng ton
L Minh Hong

290

Chuyn

b cc cng vic s khng gip ch g m s ch lm chng trnh chm i, l do l bi mi


ln tng cp da trn ng m th s vic c phn cng cng ch tng ln 1 m thi.
Bi 3
Xem li bi ton Minimum Path Cover 10. Ci t li theo cch bt cng knh hn bng
cch s dng nhng k thut hc c trong bi ton tm b ghp cc i.
Bi 4
Cho th hai pha G = (X Y, E). Hy ch ra mt tp S gm t nht cc nh sao cho mi
cnh E u lin thuc vi t nht mt nh thuc S.
Hng dn: C th a v m hnh bi ton lung vi kh nng thng qua ca c cc cung v
cc nh: a mt nh pht gi s ni ti mi nh X, mt nh thu gi t ni t mi nh
Y. Cc cnh trong E c nh chiu t X sang Y, kh nng thng qua ca cc cung c t
bng +. Kh nng thng qua ca cc nh X Y t bng 1. Sau tm lung cc i t
s ti t v lt ct hp nht, lt ct ny chc chn ct ti cc nh, nhng nh b ct s c
chn vo tp S. Tuy nhin, bng mt s suy lun, ta c th a v m hnh bi ton b ghp
cc i d dng hn trong vic ci t bng phng php sau:
Tm b ghp cc i trn G
Khi tm xong b ghp, tc l th tc tm ng m khng tm ra ng m, ta xc nh
c:
Tp Y*={Tp cc Y_nh i n c t mt X_nh cha ghp qua mt ng pha}
Tp X*={xX|x ghp v nh ghp vi x Y*}
t S = X* Y*

HSPHN 1999-2004

L thuyt th

291

12. BI TON TM B GHP CC I VI TRNG S CC TIU


TRN TH HAI PHA - THUT TON HUNGARI
12.1. BI TON PHN CNG
y l mt dng bi ton pht biu nh sau: C m ngi (nh s 1, 2, , m) v n cng vic
(nh s 1, 2, , n), mi ngi c kh nng thc hin mt s cng vic no . giao cho
ngi i thc hin cng vic j cn mt chi ph l c[i, j] 0. Cn phn cho mi th mt vic v
mi vic ch do mt th thc hin sao cho s cng vic c th thc hin c l nhiu nht v
nu c 2 phng n u thc hin c nhiu cng vic nht th ch ra phng n chi ph t
nht.
Dng th hai pha G = (X Y, E) vi X l tp m ngi, Y l tp n vic v (u, v) E vi
trng s c[u, v] nu nh ngi u lm c cng vic v. Bi ton a v tm b ghp nhiu
cnh nht ca G c trng s nh nht.
Gi k = max(m, n). B sung vo tp X v Y mt s nh gi X=Y= k.
Gi M l mt s dng ln hn chi ph ca mi php phn cng c th. Vi mi cp nh
(u, v): u X v v Y. Nu (u, v) E th ta b sung cnh (u, v) vo E vi trng s l M.
Khi ta c G l mt th hai pha y ( th hai pha m gia mt nh bt k ca
X v mt nh bt k ca Y u c cnh ni). V nu nh ta tm c b ghp y k cnh
mang trng s nh nht th ta ch cn loi b khi b ghp nhng cnh mang trng s M
va thm vo th s c k hoch phn cng 1 ngi 1 vic cn tm. iu ny d hiu bi
b ghp y mang trng s nh nht tc l phi t cnh trng s M nht, tc l s php
phn cng l nhiu nht, v tt nhin trong s cc phng n ghp t cnh trng s M nht th
y l phng n trng s nh nht, tc l tng chi ph trn cc php phn cng l t nht.

12.2. PHN TCH


Input: th hai pha y G = (X Y, E); X = {x[1], , x[k]}, Y = {y[1], , y[k]}.
c cho bi ma trn vung C c kxk, c[i, j] = trng s cnh ni nh x[i] vi y[j]. Gi thit
c[i, j] 0 (i, j)
Output B ghp y trng s nh nht.
Hai nh l sau y tuy rt n gin nhng l nhng nh l quan trng to c s cho thut
ton s trnh by:
nh l 1: Loi b khi G nhng cnh trng s > 0. Nu nhng cnh trng s 0 cn li to ra
b ghp k cnh trong G th y l b ghp cn tm.
Chng minh: Theo gi thit, cc cnh ca G mang trng s khng m nn bt k b ghp no
trong G cng c trng s khng m, m b ghp trn mang trng s 0, nn tt nhin l b
ghp y trng s nh nht.
L Minh Hong

292

Chuyn

nh l 2: Vi nh x[i], nu ta cng thm mt s (dng hay m) vo tt c nhng cnh


lin thuc vi x[i] (tng ng vi vic cng thm vo tt c cc phn t thuc hng i ca
ma trn C) th khng nh hng ti b ghp y trng s nh nht.
Chng minh: Vi mt b ghp y bt k th c mt v ch mt cnh ghp vi x[i]. Nn
vic cng thm vo tt c cc cnh lin thuc vi x[i] s lm tng trng s b ghp ln .
V vy nu nh ban u, M l b ghp y trng s nh nht th sau thao tc trn, M vn l
b ghp y trng s nh nht.
H qu: Vi nh y[j], nu ta cng thm mt s (dng hay m) vo tt c nhng cnh lin
thuc vi y[j] (tng ng vi vic cng thm vo tt c cc phn t thuc ct j ca ma
trn C) th khng nh hng ti b ghp y trng s nh nht.
T y c th nhn ra t tng ca thut ton: T th G, ta tm chin lc cng / tr
mt cch hp l trng s ca cc cnh lin thuc vi tng nh c mt th mi vn
c cc cnh trng s khng m, m cc cnh trng s 0 ca th mi cha mt b
ghp y k cnh.
V d: Bin i ma trn trng s ca th hai pha 3 nh tri, 3 nh phi:

-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

12.3. THUT TON


12.3.1. Cc khi nim:
cho gn, ta gi nhng cnh trng s 0 ca G l nhng 0_cnh.
Xt mt b ghp M ch gm nhng 0_cnh.
Nhng nh M gi l nhng nh ghp, nhng nh cn li gi l nhng nh cha
ghp.
Nhng 0_cnh M gi l nhng 0_cnh ghp, nhng 0_cnh cn li l nhng 0_cnh
cha ghp.
Nu ta nh hng li cc 0_cnh theo cch: Nhng 0_cnh cha ghp cho hng t tp X
sang tp Y, nhng 0_cnh ghp cho hng t tp Y v tp X. Khi :
ng pha (Alternating Path) l mt ng i c bn xut pht t mt X_nh cha ghp
i theo cc 0_cnh nh hng trn. Nh vy dc trn ng pha, cc 0_cnh cha
ghp v nhng 0_cnh ghp xen k nhau. V ng pha ch l ng i c bn trn
HSPHN 1999-2004

L thuyt th

293

th nh hng nn vic xc nh nhng nh no c th n c t x X bng mt


ng pha c th s dng cc thut ton tm kim trn th (BFS hoc DFS). Nhng nh
v nhng cnh c duyt qua to thnh mt cy pha gc x
Mt ng m (Augmenting Path) l mt ng pha i t mt X_nh cha ghp ti mt
Y_nh cha ghp.
Nh vy:
ng i trc tip t mt X_nh cha ghp ti mt Y_nh cha ghp qua mt 0_cnh
cha ghp cng l mt ng m.
Dc trn ng m, s 0_cnh cha ghp nhiu hn s 0_cnh ghp ng 1 cnh.

12.3.2. Thut ton Hungari


Bc 1: Khi to:
Mt b ghp M :=
Bc 2: Vi mi nh x*X, ta tm cch ghp x*:
Bt u t nh x*, th tm ng m bt u x* bng thut ton tm kim trn th. C
hai kh nng c th xy ra:
Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v
thm vo M nhng cnh cha ghp, ta c mt b ghp mi nhiu hn b ghp c 1
cnh v nh x* tr thnh ghp.
Hoc khng tm c ng m th c th xc nh c:
VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
Gi l trng s nh nht ca cc cnh ni gia mt nh thuc VisitedX vi mt nh
khng thuc VisitedY. D thy > 0 bi nu = 0 th tn ti mt 0_cnh (x, y) vi
xVisitedX v yVisitedY. V x* n c x bng mt ng pha v (x, y) l mt
0_cnh nn x* cng n c y bng mt ng pha, dn ti y VisitedY, iu ny v
l.
Bin i th G: Vi x VisitedX, tr vo trng s nhng cnh lin thuc vi x,
Vi y VisitedY, cng vo trng s nhng cnh lin thuc vi y.
Lp li th tc tm kim trn th th tm ng m xut pht x* cho ti khi tm ra
ng m.
Bc 3: Sau bc 2 th mi X_nh u c ghp, in kt qu v b ghp tm c.
M hnh ci t ca thut ton c th vit nh sau:
M := ;
for (x*X) do
begin
repeat
Tm ng m xut pht x*;
if Khng tm thy ng m then Bin i th G: Chn := ;
L Minh Hong

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

x* = x4, khng thy ng m


VisitedX = {x3, x4}
VisitedY = {y3}
Gi tr xoay = 1 (=c[3,2])
Tr trng s nhng cnh lin
thuc vi {x3,x4} i 1
Cng trng s nhng cnh
lin thuc vi {y3} ln 1

2
0

2
3

HSPHN 1999-2004

L thuyt th

295

-2

1 +2

-2

2 +2
2=
3 +2

-2 3

-2

x* = x4, khng thy ng m


VisitedX = {x1, x2, x3, x4}
VisitedY = {y1, y2, y3}
Gi tr xoay = 2 (=c[3,4])
Tr trng s nhng cnh lin
thuc vi {x1, x2, x3, x4} i 2
Cng trng s nhng cnh
lin thuc vi {y1, y2, y3} ln 2

2
0

x* = x4, Tm thy ng m
x4y3x3y2x1y1x2y4.
Tng cp
Xong

Hnh 88: Thut ton Hungari

rng nu nh khng tm thy ng m xut pht x* th qu trnh tm kim trn th


s cho ta mt cy pha gc x*. Gi tr xoay thc cht l trng s nh nht ca cnh ni mt
X_nh trong cy pha vi mt Y_nh ngoi cy pha (cnh ngoi). Vic tr vo nhng cnh
lin thuc vi X_nh trong cy pha v cng vo nhng cnh lin thuc vi Y_nh trong
cy pha s lm cho cnh ngoi ni trn tr thnh 0_cnh, cc cnh khc vn c trng s 0.
Nhng quan trng hn l tt c nhng cnh trong cy pha vn c l 0_cnh. iu m
bo cho qu trnh tm kim trn th ln sau s xy dng c cy pha mi ln hn cy pha
c. V tp cc Y_ nh ghp l hu hn nn sau khng qu k bc, cy pha s qut ti mt
Y_nh cha ghp, tc l tm ra ng m

12.3.3. Phng php i ngu Kuhn-Munkres


Phng php Kuhn-Munkres i tm hai dy s Fx[1..k] v Fy[1..k] tho mn:
c[i, j] - Fx[i] - Fy[j] 0
Tp cc cnh (x[i], y[j]) tho mn c[i, j] - Fx[i] - Fy[j] = 0 cha trn mt b ghp y k
cnh, y chnh l b ghp cn tm.
R rng nu tm c hai dy s tho mn trn th ta ch vic thc hin hai thao tc:
Vi mi nh x[i], tr tt c trng s ca nhng cnh lin thuc vi x[i] i Fx[i]
Vi mi nh y[j], tr tt c trng s ca nhng cnh lin thuc vi y[j] i Fy[j]
(Hai thao tc ny tng ng vi vic tr tt c trng s ca cc cnh (x[i], y[j]) i mt
lng Fx[i] + Fy[j] tc l c[i, j] := c[i, j] - Fx[i] - Fy[j])
Th d thy th mi to thnh s gm c cc cnh trng s khng m v nhng 0_cnh ca
th cha trn mt b ghp y .
L Minh Hong

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

(C nhiu phng n khc: Fx = (0, 0, 1, 1); Fy = (0, 0, -1, 2) cng ng)


Vy phng php Kuhn-Munkres a vic bin i th G (bin i ma trn C) v vic bin
i hay dy s Fx v Fy. Vic tr vo trng s tt c nhng cnh lin thuc vi x[i] tng
ng vi vic tng Fx[i] ln . Vic cng vo trng s tt c nhng cnh lin thuc vi y[j]
tng ng vi gim Fy[j] i . Khi cn bit trng s cnh (x[i], y[j]) l bao nhiu sau cc
bc bin i, thay v vit c[i, j], ta vit c[i, j] - Fx[i] - Fy[j].
S ci t phng php Kuhn-Munkres c th vit nh sau:
Bc 1: Khi to:
M := ;
Vic khi to cc Fx, Fy c th c nhiu cch min sao c[i, j] - Fx[i] - Fy[j] 0, n gin
nht c th t tt c cc Fx[.] v Fy[.] bng 0
Bc 2: Vi mi nh x*X, ta tm cch ghp x* nh sau:
Bt u t nh x*, th tm ng m bt u x* bng thut ton tm kim trn th (BFS
hoc DFS). C hai kh nng xy ra:
Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v
thm vo M nhng cnh cha ghp.
Hoc khng tm c ng m th xc nh c:
VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
t := min{c[i, j] - Fx[i] - Fy[j] x[i] VisitedX; y[j] VisitedY}
Vi x[i] VisitedX: t Fx[i] := Fx[i] + ;
Vi y[j] VisitedY: t Fy[j] := Fy[j] - ;
Lp li th tc tm ng m xut pht ti x* cho ti khi tm ra ng m.
Bc 3:
Lu rng bc 2 lun tm ra ng m v th c lm cho tr nn cn bng (|X|=|Y|)
v y , ta ch vic tr v ng m tm c.
ng lu phng php Kuhn-Munkres l phng php ny khng lm thay i ma trn C
ban u. iu thc s hu ch trong trng hp trng s ca cnh (x[i], y[j]) khng c
HSPHN 1999-2004

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

P_4_12_1.PAS * Thut ton Hungari


{$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, Trace: array[1..max] of Integer;
m, n, k, start, finish: Integer;
procedure Enter; {Nhp d liu}
var
i, j: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, m, n);
if m > n then k := m else k := n;
for i := 1 to k do
for j := 1 to k do c[i, j] := maxC;
while not SeekEof(f) do ReadLn(f, i, j, c[i, j]);
Close(f);
end;
procedure Init; {Khi to b ghp rng v cc gi tr Fx[.], Fy[.]}
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
FillChar(Fx, SizeOf(Fx), 0);
FillChar(Fy, SizeOf(Fy), 0);
end;
function GetC(i, j: Integer): Integer; {Hm tr v trng s cnh (x[i], y[j])}
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure FindAugmentingPath; {Th tc tm ng m xut pht x[start]}
var
Queue: array[1..max] of Integer; {Hng i dng cho BFS, ch cha ch s cc nh X}
i, j, Front, Rear: Integer;
HSPHN 1999-2004

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.4. BI TON TM B GHP CC I VI TRNG S CC I TRN


TH HAI PHA
Bi ton tm b ghp cc i vi trng s cc i cng c th gii nh phng php Hungari
bng cch i du tt c cc phn t ma trn chi ph.
Khi ci t, ta c th sa li i cht trong chng trnh trn gii bi ton tm b ghp cc
i vi trng s cc i m khng cn i du trng s. C th nh sau:
Bc 1: Khi to:
M := ;
Khi to hai dy Fx v Fy tho mn: i, j: Fx[i] + Fy[j] c[i, j]; chng hn ta c th t
Fx[i] := Phn t ln nht trn dng i ca ma trn C v t cc Fy[j] := 0.
Bc 2: Vi mi nh x*X, ta tm cch ghp x*:
Bt u t nh x*, th tm ng m bt u x*. C hai kh nng xy ra:
Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v
thm vo M nhng cnh cha ghp.
Hoc khng tm c ng m th xc nh c:
VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
t := min{Fx[i] + Fy[j] - c[i, j] x[i] VisitedX; y[j] VisitedY}
Xoay trng s cnh:
Vi x[i] VisitedX: Fx[i] := Fx[i] - ;
Vi y[j] VisitedY: Fy[j] := Fy[j] + ;
Lp li th tc tm ng m xut pht ti x* cho ti khi tm ra ng m.
Bc 3: Sau bc 2 th mi X_nh u ghp, ta c mt b ghp y k cnh vi
trng s ln nht.
D dng chng minh c tnh ng n ca phng php, bi nu ta t:
c'[i, j] = - c[i, j]; F'x[i] := - Fx[i]; F'y[j] = - Fy[j].
Th bi ton tr thnh tm cp ghp y trng s cc tiu trn th hai pha vi ma trn
trng s c'[1..k, 1..k]. Bi ton ny c gii quyt bng cch tnh hai dy i ngu F'x v F'y.
T bng nhng bin i i s c bn, ta c th kim chng c tnh tng ng gia
cc bc ca phng php nu trn vi cc bc ca phng php Kuhn-Munkres mc
trc.

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

Thut ton tm kim theo chiu rng c s dng tm ng m c phc tp O(k2),


mi ln xoay trng s cnh mt mt chi ph thi gian c O(k2). Vy mi ln tng cp, cn ti
a k ln d ng v k ln xoay trng s cnh, mt mt chi ph thi gian c O(k3). Thut ton
cn k ln tng cp nn phc tp tnh ton trn l thuyt ca phng php ny c O(k4).
C th ci tin m hnh ci t c mt thut ton vi phc tp O(k3) da trn nhng
nhn xt sau:

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

Hnh 89: Cy pha mc ln hn sau mi ln xoay trng s cnh v tm ng

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

procedure Init; {Khi to}


begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
FillChar(Fx, SizeOf(Fx), 0);
FillChar(Fy, SizeOf(Fy), 0);
end;
function GetC(i, j: Integer): Integer; {Hm tr v trng s cnh (x[i], y[j])}
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;
procedure InitBFS; {Th tc c gi trc khi bt u dng mt cy pha}
var
j: Integer;
begin
Front := 1; Rear := 1;
Queue[1] := start;
FillChar(Trace, SizeOf(Trace), 0);
for j := 1 to k do
begin
d[j] := GetC(start, j); {d[j]: Khong cch gn nht t mt X_nh trong cy pha n y[j]}
arg[j] := start; {arg[j]: X_nh ni vi y[j] to ra khong cch gn nht }
end;
finish := 0;
end;
procedure Push(v: Integer);
begin
Inc(Rear); Queue[Rear] := v;
end;
function Pop: Integer;
begin
Pop := Queue[Front]; Inc(Front);
end;
procedure FindAugmentingPath; {Tm ng m xut pht t x[start]}
var
i, j, w: Integer;
begin
repeat
i := Pop; {Ly i khi Queue, xt x[i]}
for j := 1 to k do
if Trace[j] = 0 then {Nu y[j] cha thm}
begin
w := GetC(i, j); {Tnh trng s cnh (x[i], y[j])}
if w = 0 then {Nu cnh (x[i], y[j]) l 0_cnh}
begin
Trace[j] := i;
if matchY[j] = 0 then
begin
finish := j;
Exit;
end;
Push(matchY[j]);
end;
if d[j] > w then {Cp nht li d[j] theo cy pha ni rng hn nh x[i]}
begin
d[j] := w;
arg[j] := i;
HSPHN 1999-2004

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

13. BI TON TM B GHP CC I TRN TH


13.1. CC KHI NIM
Xt th G = (V, E), mt b ghp trn th G l mt tp cc cnh i mt khng c nh
chung.
Bi ton tm b ghp cc i trn th tng qut pht biu nh sau:
Cho mt th G, phi tm mt b ghp cc i trn G (b ghp c nhiu cnh nht).
Vi mt b ghp M ca th G, ta gi:
Nhng cnh thuc M c gi l cnh ghp hay cnh m
Nhng cnh khng thuc M c gi l cnh cha ghp hay cnh nht
Nhng nh u mt ca cc cnh m c gi l nh ghp, nhng nh cn li gi
l nh cha ghp
Mt ng i c bn (ng i khng c nh lp li) c gi l ng pha nu n bt
u bng mt cnh nht v tip theo l cc cnh m, nht nm ni tip xen k nhau.
Mt chu trnh c bn (chu trnh khng c nh trong lp li) c gi l mt Blossom nu
n i qua t nht 3 nh, bt u v kt thc bng cnh nht v dc trn chu trnh, cc cnh
m, nht nm ni tip xen k nhau. nh xut pht ca chu trnh (cng l nh kt thc)
c gi l nh c s (base) ca Blossom.
ng m l mt ng pha bt u mt nh cha ghp v kt thc mt nh cha
ghp.
V d: Vi th G v b ghp M trong Hnh 90:
ng (8, 1, 2, 5, 6, 4) l mt ng pha
Chu trnh (2, 3, 4, 6, 5, 2) l mt Blossom
ng (8, 1, 2, 3, 4, 6, 5, 7) l mt ng m
ng (8, 1, 2, 3, 4, 6, 5, 2, 1, 9) tuy c cc cnh m/nht xen k nhng khng phi ng
pha (v tt nhin khng phi ng m) v y khng phi l ng i c bn.

9
7

Hnh 90: th G v mt b ghp M

Ta d dng suy ra c cc tnh cht sau:

L Minh Hong

308

Chuyn

ng m cng nh Blossom u l ng i di l vi s cnh nht nhiu hn s


cnh m ng 1 cnh.
Trong mi Blossom, nhng nh khng phi nh c s u l nh ghp v nh ghp
vi nh cng phi thuc Blossom.
V Blossom l mt chu trnh nn trong mi Blossom, nhng nh khng phi nh c s
u tn ti hai ng pha t nh c s i n n, mt ng kt thc bng cnh m v
mt ng kt thc bng cnh nht, hai ng pha ny c hnh thnh bng cch i dc
theo chu trnh theo hai hng ngc nhau. Nh v d Hnh 90, nh 4 c hai ng pha
i nh c s 2 i ti: (2, 3, 4) l ng pha kt thc bng cnh m v (2, 5, 6, 4) l
ng pha kt thc bng cnh nht

13.2. THUT TON EDMONDS (1965)


C s ca thut ton l nh l (C.Berge): Mt b ghp M ca th G l cc i khi v ch
khi khng tn ti ng m i vi M.
Thut ton Edmonds:
M := ;
for ( nh u cha ghp) do
if Tm ng m xut pht t u then
Dc trn ng m: Loi b nhng cnh m khi M; Thm vo M nhng cnh nht;
Tr v M l b ghp cc i trn G;

iu kh nht trong thut ton Edmonds l phi xy dng thut ton tm ng m xut pht
t mt nh cha ghp. Thut ton c xy dng bng cch kt hp mt thut ton tm
kim trn th vi php chp Blossom.
Xt nhng ng pha xut pht t mt nh x cha ghp. Nhng nh c th n c t x
bng mt ng pha kt thc l cnh nht c gn nhn nht (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

Hnh 91: Php chp Blossom

Thut ton tm ng m xut pht t nh x c th pht biu nh sau.


Trc ht nh xut pht x c gn nhn m.
Tip theo l thut ton tm kim trn th bt u t x, theo nguyn tc: t nh m ch
c php i tip theo cnh nht v t nh nht ch c i tip theo cnh m. Mi khi
thm ti mt nh, ta gn nhn m/nht cho nh v tip tc thao tc tm kim trn th
nh bnh thng. Cng trong qu trnh tm kim, mi khi pht hin thy mt cnh nht ni hai
nh m, ta dng li ngay v nu gn nhn tip s gp tnh trng mt nh c c hai nhn
m/nht, trong trng hp ny, Blossom c pht hin (xem tnh cht ca Blossom) v b
chp thnh mt nh, thut ton c bt u li vi th mi cho ti khi tr li c cu
hi: c tn ti ng m xut pht t x hay khng?".
Nu ng m tm c khng i qua nh chp no th ta ch vic tng cp dc theo ng
m. Nu ng m c i qua mt nh chp th ta li n nh chp ra thnh Blossom
thay nh chp ny trn ng m bng mt on ng xuyn qua Blossom:

Expand

Hnh 92: N Blossom d ng xuyn qua Blossom

L Minh Hong

Expand

310

Chuyn

Lu rng khng phi Blossom no cng b chp, ch nhng Blossom nh hng ti qu


trnh tm ng m mi phi chp m bo rng ng m tm c l ng i c bn.
Tuy nhin vic ci t trc tip cc php chp Blossom v n nh kh rc ri, i hi mt
chng trnh vi phc tp O(n4).
Di y ta s trnh by mt phng php ci t hiu qu hn vi phc tp O(n3),
phng php ny ci t khng phc tp, nhng yu cu phi hiu rt r bn cht thut ton.

13.3. THUT TON LAWLER (1973)


Trong thut ton Edmonds, sau khi chp mi Blossom thnh mt nh th nh hon ton
li c th nm trn mt Blossom mi v b chp tip. Thut ton Lawler ch quan tm n
nh chp cui cng, i din cho Blossom ngoi nht (Outermost Blossom), nh chp cui
cng ny c nh danh (nh s) bng nh c s ca Blossom ngoi nht.
Cng chnh v thao tc chp/n ni trn m ta cn m rng khi nim Blossom, c th coi
mt Blossom l mt tp nh n ra t mt nh chp ch khng n thun ch l mt chu
trnh pha c bn na.
Xt mt Blossom B c nh c s l nh r. Vi vB, v r, ta lu li hai ng pha t r ti
v, mt ng kt thc bng cnh m v mt ng kt thc bng cnh nht, nh vy c hai
loi vt gn cho mi nh v (hai vt ny c cp nht trong qu trnh tm ng):
S[v] l nh lin trc v trn ng pha kt thc bng cnh m, nu khng tn ti ng
pha loi ny th S[v] = 0.
T[v] l nh lin trc v trn ng pha kt thc bng cnh nht, nu khng tn ti ng
pha loi ny th T[v] = 0.
Bn cnh hai nhn S v T, mi nh v cn c thm:
Nhn b[v] l nh c s ca Blossom cha v. Hai nh u v v thuc cng mt Blossom
b[u] = b[v].
Nhn match[v] l nh ghp vi nh v. Nu v cha ghp th match[v] = 0.
Khi thut ton tm ng m bt u t nh x cha ghp c th pht biu nh sau:
Bc 1: (Init)
Hng i Queue dng cha nhng nh m ch duyt, ban u ch gm mt nh m
x.
Vi mi nh u, khi gn b[u] = u v match[u] = 0 vi u.
Gn S[x] 0; vi ux, gn S[u] = 0
Vi v: gn T[v] = 0
Bc 2: (BFS)
Lp li cc bc sau cho ti khi hng i rng:
Vi mi nh m u ly ra t Queue, xt nhng cnh nht (u, v):
Nu v cha thm:
HSPHN 1999-2004

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

Thm c v ln match[v], gn nhn T[v] v S[match[v]]


Trng hp 3: v thm, l nh m thuc cng blossom vi u
T:3
S:5

T:7
S:4

u
x

T:1

S:2
6

T:3
S:7

T:5
S:6
b[.] = 3

Khng xt, b qua


Trng hp 4: v thm, l nh m v b[u] b[v]
T:3
4

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

Pht hin Blossom, tm nh c s a = 3, gn li nhn S v T dc chu trnh pha. y hai


nh m mi 4, 6 vo hng i, Ti nhng bc sau, khi duyt ti nh 6, s tm thy ng
m kt thc 8, truy vt theo nhn S v T tm c ng (1, 2, 3, 4, 5, 7, 6, 8)
T tng chnh ca phng php Lawler l dng cc nhn b[v] thay cho thao tc chp trc
tip Blossom, dng cc nhn S v T truy vt tm ng m, trnh thao tc n Blossom.
Phng php ny da trn mt nhn xt: Mi khi tm ra ng m, nu ng m xuyn
qua mt Blossom ngoi nht th chc chn n phi i vo Blossom ny t nt c s v thot
ra khi Blossom bng mt cnh nht.

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

Dng 1: Cha hai s n, m ln lt l s cnh v s nh ca th cch nhau t nht mt


du cch (n 1000)
m dng tip theo, mi dng cha hai s u, v tng trng cho mt cnh (u, v) ca th
Output: file vn bn GMATCH.OUT, ghi b ghp cc i tm c
7

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

Chng trnh ny sa i mt cht m hnh ci t trn da vo nhn xt:


v l mt nh m nu v ch nu v = x hoc match[v] l mt nh nht, vy kim tra
mt nh v c phi nh m hay khng ta c th kim tra bng biu thc:
(v = x) or (match[v] <> 0) and (T[match[v]] <> 0) = TRUE
Nu v l nh m th S[v] = match[v]
Cc bin c s dng vi vai tr nh sau:
match[v] l nh ghp vi nh v
b[v] l nh c s ca Blossom cha v
T[v] l nh lin trc v trn ng pha t nh xut pht ti v kt thc bng cnh nht,
T[v] = 0 nu qu trnh BFS cha xt ti v.
InQueue[v] l bin Boolean, InQueue[v] = True v l nh m c y vo Queue
ch duyt.
start v finish: Ni bt u v kt thc ng m.
P_4_13_1.PAS * Phng php Lawler p dng cho thut ton Edmonds
{$MODE DELPHI} (*This program uses 32-bit Integer [-231..231 - 1]*)
program MatchingInGeneralGraph;
const
InputFile = 'GMATCH.INP';
OutputFile = 'GMATCH.OUT';
max = 1000;
var
a: array[1..max, 1..max] of Boolean;
match, Queue, b, T: array[1..max] of Integer;
InQueue: array[1..max] of Boolean;
n, Front, Rear, start, finish: Integer;
procedure Enter;
var
i, m, u, v: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
L Minh Hong

314

Chuyn

FillChar(a, SizeOf(a), False);


ReadLn(f, n, m);
for i := 1 to m do
begin
ReadLn(f, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(f);
end;
procedure Init; {Khi to b ghp rng}
begin
FillChar(match, SizeOf(match), 0);
end;
procedure InitBFS; {Th tc ny c gi khi to trc khi tm ng m xut pht t start}
var
i: Integer;
begin
{Hng i ch gm mt nh m start}
Front := 1; Rear := 1;
Queue[1] := start;
FillChar(InQueue, SizeOf(InQueue), False);
InQueue[start] := True;
{Cc nhn T c khi gn = 0}
FillChar(T, SizeOF(T), 0);
{Nt c s ca outermost blossom cha i c khi to l i}
for i := 1 to n do b[i] := i;
finish := 0; {finish = 0 ngha l cha tm thy ng m}
end;
procedure Push(v: Integer); {y mt nh m v vo hng i}
begin
Inc(Rear);
Queue[Rear] := v;
InQueue[v] := True;
end;
function Pop: Integer; {Ly mt nh m khi hng i, tr v trong kt qu hm}
begin
Pop := Queue[Front];
Inc(Front);
end;
{Kh nht ca phng php Lawler l th tc ny: Th tc x l khi gp cnh nht ni hai nh m p, q}
procedure BlossomShrink(p, q: Integer);
var
i, NewBase: Integer;
Mark: array[1..max] of Boolean;
{Th tc tm nt c s bng cch truy vt ngc theo ng pha t p v q}
function FindCommonAncestor(p, q: Integer): Integer;
var
InPath: array[1..max] of Boolean;
begin
FillChar(InPath, SizeOf(Inpath), False);
repeat {Truy vt t p}
p := b[p]; {Nhy ti nt c s ca Blossom cha p, php nhy ny tng tc truy vt}
InPath[p] := True; {nh du nt }
if p = start then Break; {Nu truy v n ni xut pht th dng}
p := T[match[p]]; {Nu cha v n start th truy li tip hai bc, theo cnh m ri theo cnh nht}
until False;
HSPHN 1999-2004

L thuyt th

315

repeat {Truy vt t q, tng t nh i vi p}


q := b[q];
if InPath[q] then Break; {Tuy nhin nu chm vo ng pha ca p th dng ngay}
q := T[match[q]];
until False;
FindCommonAncestor := q; {Ghi nhn nh c s mi}
end;
procedure ResetTrace(x: Integer); {Gn li nhn vt dc trn ng pha t start ti x}
var
u, v: Integer;
begin
v := x;
while b[v] <> NewBase do {Truy vt ng pha t start ti nh m x}
begin
u := match[v];
Mark[b[v]] := True; {nh du nhn blossom ca cc nh trn ng i}
Mark[b[u]] := True;
v := T[u];
if b[v] <> NewBase then T[v] := u; {Ch t li vt T[v] nu b[v] khng phi nt c s mi}
end;
end;
begin {BlossomShrink}
FillChar(Mark, SizeOf(Mark), False); {Tt c cc nhn b[v] c khi to l cha b nh du}
NewBase := FindCommonAncestor(p, q); {xc nh nt c s}
ResetTrace(p); ResetTrace(q); {Gn li nhn}
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
{Chp blossom gn li cc nhn b[i] cho nh i nu blossom b[i] b nh du}
for i := 1 to n do
if Mark[b[i]] then b[i] := NewBase;
{Xt nhng nh m i cha c a vo Queue nm trong Blossom mi, y i v Queue ch duyt sau}
for i := 1 to n do
if not InQueue[i] and (b[i] = NewBase) then
Push(i);
end;
{Th tc tm ng m}
procedure FindAugmentingPath;
var
u, v: Integer;
begin
InitBFS; {Khi to}
repeat {BFS}
u := Pop; {Rt mt nh m u ra khi hng i}
{Xt nhng nh v k u qua mt cnh nht m v khng nm cng blossom vi u}
for v := 1 to n do
if (a[u, v]) and (match[u] <> v) and (b[u] <> b[v]) then
if (v = start) or (match[v] <> 0) and (T[match[v]] <> 0) then {Nu v l nh m}
BlossomShrink(u, v) {th gn li vt, chp blossom...}
else
if T[v] = 0 then {Nu v l nh nht cha thm ti}
if match[v] = 0 then {Nu v cha ghp ngha tm c ng m kt thc v, thot}
begin
T[v] := u;
finish := v;
Exit;
end
else {Nu v ghp th ghi vt ng i, thm v, thm lun c match[v] v y match[v] vo Queue}
begin
T[v] := u;
Push(match[v]);
L Minh Hong

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.

13.5. PHC TP TNH TON


Th tc BlossomShrink c phc tp O(n). Th tc FindAugmentingPath cn khng qu n
ln gi th tc BlossomShrink, cng thm chi ph ca thut ton tm kim theo chiu rng, c
phc tp O(n2). Phng php Lawler cn khng qu n ln gi th tc FindAugmentingPath
nn c phc tp tnh ton l O(n3).

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

Ngoi ra bn c th tham kho thm nhng cun sch sau y:


Alfred V. Aho, Jeffrey D. Ullman, John E. Hopcroft. Data Structures and Algorithms,
ISBN: 0201000237, Addison Wesley, 1983.
Robert Sedgewick. Algorithms 2nd edition, ISBN: 0201066734, Addison Wesley, 1988.
Mikhail J. Atallah Ed. Algorithms and Theory of Computation Handbook, ISBN:
0849326494, CRC Press, 1998.

You might also like