You are on page 1of 0

L MINH HONG

Bi ging chuyn









i hc S phm H Ni, 1999-2002



Li cm n


Ti mun by t lng bit n i vi nhng ngi thy ch dy tn tnh trong nhng nm thng
y kh khn khi ti mi bc vo hc tin hc v lp trnh. S hiu bit v lng nhit tnh ca cc
thy khng nhng cung cp cho ti nhng kin thc qu bu m cn l tm gng sng cho ti
noi theo khi ti ng trn bc ging cng vi t cch l mt ngi thy.

Cun ti liu ny c vit da trn nhng ti liu thu thp c t nhiu ngun khc nhau, bi
cng sc ca nhiu th h thy tr tng ging dy v hc tp ti Khi Ph thng chuyn Ton-
Tin, i hc S phm H Ni, cn ti ch l ngi tng hp li. Qua y, ti mun gi li cm n
ti cc ng nghip c v ng gp nhng kin qu bu, cm n cc bn hc sinh - nhng
con ngi trc tip lm nn cun sch ny.

Do thi gian hn hp, mt s chuyn tuy c nhng cha kp chnh sa v a vo ti liu.
Bn c c th tham kho thm trong phn tra cu. Rt mong nhn c nhng li nhn xt v gp
ca cc bn hon thin cun sch ny.

Tokyo, 28 thng 4 nm 2003



L Minh Hong

i

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...........................................................................................................................16
3.5. BI TON XP HU.....................................................................................................................................18
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........................................................................................................................................................28
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. PHC TP TNH TON CA GII THUT........................................................................................40
2.2. XC NH PHC TP TNH TON CA GII THUT....................................................................40
2.3. PHC TP TNH TON VI TNH TRNG D LIU VO..............................................................43
2.4. CHI PH THC HIN THUT TON...........................................................................................................43


ii
3. QUY V GII THUT QUY............................................................................................... 45
3.1. KHI NIM V QUY.............................................................................................................................. 45
3.2. GII THUT QUY .................................................................................................................................. 45
3.3. V D V GII THUT QUY................................................................................................................ 46
3.4. HIU LC CA QUY............................................................................................................................. 50
4. CU TRC D LIU BIU DIN DANH SCH.......................................................................... 52
4.1. KHI NIM DANH SCH............................................................................................................................ 52
4.2. BIU DIN DANH SCH TRONG MY TNH.......................................................................................... 52
5. NGN XP V HNG I.............................................................................................................. 58
5.1. NGN XP (STACK)..................................................................................................................................... 58
5.2. HNG I (QUEUE)..................................................................................................................................... 60
6. CY (TREE)........................................................................................................................................ 64
6.1. NH NGHA ................................................................................................................................................. 64
6.2. CY NH PHN (BINARY TREE) ............................................................................................................... 65
6.3. BIU DIN CY NH PHN........................................................................................................................ 67
6.4. PHP DUYT CY NH PHN.................................................................................................................... 69
6.5. CY K_PHN................................................................................................................................................ 70
6.6. CY TNG QUT......................................................................................................................................... 71
7. K PHP TIN T, TRUNG T V HU T............................................................................. 74
7.1. BIU THC DI DNG CY NH PHN............................................................................................... 74
7.2. CC K PHP CHO CNG MT BIU THC.......................................................................................... 74
7.3. CCH TNH GI TR BIU THC.............................................................................................................. 75
7.4. CHUYN T DNG TRUNG T SANG DNG HU T......................................................................... 78
7.5. XY DNG CY NH PHN BIU DIN BIU THC............................................................................ 80
8. SP XP (SORTING) ........................................................................................................................ 82
8.1. BI TON SP XP...................................................................................................................................... 82
8.2. THUT TON SP XP KIU CHN (SELECTIONSORT)..................................................................... 84
8.3. THUT TON SP XP NI BT (BUBBLESORT)................................................................................. 85
8.4. THUT TON SP XP KIU CHN......................................................................................................... 85
8.5. SHELLSORT................................................................................................................................................... 87
8.6. THUT TON SP XP KIU PHN ON (QUICKSORT).................................................................. 88
8.7. THUT TON SP XP KIU VUN NG (HEAPSORT) ...................................................................... 92
8.8. SP XP BNG PHP M PHN PHI (DISTRIBUTION COUNTING) ............................................. 95
8.9. TNH N NH CA THUT TON SP XP (STABILITY) ................................................................. 96
8.10. THUT TON SP XP BNG C S (RADIXSORT).......................................................................... 97
8.11. THUT TON SP XP TRN (MERGESORT).................................................................................... 102
8.12. CI T..................................................................................................................................................... 105
8.13. NH GI, NHN XT............................................................................................................................ 112
9. TM KIM (SEARCHING) ............................................................................................................. 116


iii
9.1. BI TON TM KIM..................................................................................................................................116
9.2. TM KIM TUN T (SEQUENTIAL SEARCH) ......................................................................................116
9.3. TM KIM NH PHN (BINARY SEARCH) ..............................................................................................116
9.4. CY NH PHN TM KIM (BINARY SEARCH TREE - BST) ...............................................................117
9.5. PHP BM (HASH)......................................................................................................................................122
9.6. KHO S VI BI TON TM KIM.......................................................................................................122
9.7. CY TM KIM S HC (DIGITAL SEARCH TREE - DST)...................................................................123
9.8. CY TM KIM C S (RADIX SEARCH TREE - RST) .........................................................................126
9.9. NHNG NHN XT CUI CNG.............................................................................................................131
PHN 3. QUY HOCH NG ............................................................................ 133
1. CNG THC TRUY HI................................................................................................................134
1.1. V D.............................................................................................................................................................134
1.2. CI TIN TH NHT..................................................................................................................................135
1.3. CI TIN TH HAI......................................................................................................................................137
1.4. CI T QUY........................................................................................................................................137
2. PHNG PHP QUY HOCH NG.........................................................................................139
2.1. BI TON QUY HOCH............................................................................................................................139
2.2. PHNG PHP QUY HOCH NG.......................................................................................................139
3. MT S BI TON QUY HOCH NG..................................................................................143
3.1. DY CON N IU TNG DI NHT..................................................................................................143
3.2. BI TON CI TI......................................................................................................................................148
3.3. BIN I XU.............................................................................................................................................150
3.4. DY CON C TNG CHIA HT CHO K...................................................................................................154
3.5. PHP NHN T HP DY MA TRN......................................................................................................159
3.6. BI TP LUYN TP..................................................................................................................................163
PHN 4. CC THUT TON TRN TH .................................................. 169
1. CC KHI NIM C BN.............................................................................................................170
1.1. NH NGHA TH (GRAPH).................................................................................................................170
1.2. CC KHI NIM..........................................................................................................................................171
2. BIU DIN TH TRN MY TNH........................................................................................173
2.1. MA TRN LIN K (MA TRN K) .........................................................................................................173
2.2. DANH SCH CNH.....................................................................................................................................174
2.3. DANH SCH K...........................................................................................................................................175
2.4. NHN XT....................................................................................................................................................176
3. CC THUT TON TM KIM TRN TH.........................................................................177
3.1. BI TON.....................................................................................................................................................177
3.2. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH).............................................178
3.3. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST SEARCH) ...................................184


iv
3.4. PHC TP TNH TON CA BFS V DFS ...................................................................................... 189
4. TNH LIN THNG CA TH ............................................................................................... 190
4.1. NH NGHA ............................................................................................................................................... 190
4.2. TNH LIN THNG TRONG TH V HNG.................................................................................. 191
4.3. TH Y V THUT TON WARSHALL ................................................................................. 191
4.4. CC THNH PHN LIN THNG MNH.............................................................................................. 195
5. VI NG DNG CA CC THUT TON TM KIM TRN TH ............................... 205
5.1. XY DNG CY KHUNG CA TH ................................................................................................. 205
5.2. TP CC CHU TRNH C BN CA TH ........................................................................................ 208
5.3. NH CHIU TH V BI TON LIT K CU.............................................................................. 208
5.4. LIT K KHP ............................................................................................................................................ 214
6. CHU TRNH EULER, NG I EULER, TH EULER................................................... 218
6.1. BI TON 7 CI CU................................................................................................................................ 218
6.2. NH NGHA ............................................................................................................................................... 218
6.3. NH L....................................................................................................................................................... 218
6.4. THUT TON FLEURY TM CHU TRNH EULER................................................................................. 219
6.5. CI T....................................................................................................................................................... 220
6.6. THUT TON TT HN ........................................................................................................................... 222
7. CHU TRNH HAMILTON, NG I HAMILTON, TH HAMILTON........................ 225
7.1. NH NGHA ............................................................................................................................................... 225
7.2. NH L....................................................................................................................................................... 225
7.3. CI T....................................................................................................................................................... 226
8. BI TON NG I NGN NHT .......................................................................................... 230
8.1. TH C TRNG S............................................................................................................................... 230
8.2. BI TON NG I NGN NHT....................................................................................................... 230
8.3. TRNG HP TH KHNG C CHU TRNH M - THUT TON FORD BELLMAN............... 232
8.4. TRNG HP TRNG S TRN CC CUNG KHNG M - THUT TON DIJKSTRA................. 234
8.5. THUT TON DIJKSTRA V CU TRC HEAP................................................................................... 237
8.6. TRNG HP TH KHNG C CHU TRNH - TH T T P.................................................... 240
8.7. NG I NGN NHT GIA MI CP NH - THUT TON FLOYD......................................... 242
8.8. NHN XT................................................................................................................................................... 245
9. BI TON CY KHUNG NH NHT......................................................................................... 247
9.1. BI TON CY KHUNG NH NHT...................................................................................................... 247
9.2. THUT TON KRUSKAL (JOSEPH KRUSKAL - 1956) ......................................................................... 247
9.3. THUT TON PRIM (ROBERT PRIM - 1957).......................................................................................... 252
10. BI TON LUNG CC I TRN MNG............................................................................ 256
10.1. BI TON.................................................................................................................................................. 256
10.2. LT CT, NG TNG LUNG, NH L FORD - FULKERSON................................................. 256
10.3. CI T..................................................................................................................................................... 258


v
10.4. THUT TON FORD - FULKERSON (L.R.FORD & D.R.FULKERSON - 1962)..................................262
11. BI TON TM B GHP CC I TRN TH HAI PHA...........................................266
11.1. TH HAI PHA (BIPARTITE GRAPH)................................................................................................266
11.2. BI TON GHP I KHNG TRNG V CC KHI NIM............................................................266
11.3. THUT TON NG M......................................................................................................................267
11.4. CI T......................................................................................................................................................268
12. BI TON TM B GHP CC I VI TRNG S CC TIU TRN TH HAI
PHA - THUT TON HUNGARI .......................................................................................................273
12.1. BI TON PHN CNG...........................................................................................................................273
12.2. PHN TCH.................................................................................................................................................273
12.3. THUT TON ............................................................................................................................................274
12.4. CI T......................................................................................................................................................278
12.5. BI TON TM B GHP CC I VI TRNG S CC I TRN TH HAI PHA.............284
12.6. NNG CP..................................................................................................................................................284
13. BI TON TM B GHP CC I TRN TH ..............................................................290
13.1. CC KHI NIM........................................................................................................................................290
13.2. THUT TON EDMONDS (1965) ............................................................................................................291
13.3. PHNG PHP LAWLER (1973) .............................................................................................................293
13.4. CI T......................................................................................................................................................295
13.5. PHC TP TNH TON .....................................................................................................................299
TI LIU C THM.......................................................................................... 301



vi
HNH V

Hnh 1: Cy tm kim quay lui trong bi ton lit k dy nh phn.................................................................................. 13
Hnh 2: Xp 8 qun hu trn bn c 8x8.......................................................................................................................... 19
Hnh 3: ng cho B-TN mang ch s 10 v ng cho N-TB mang ch s 0 ...................................................... 19
Hnh 4: Lu thut gii (Flowchart).............................................................................................................................. 36
Hnh 5: Thp H Ni ........................................................................................................................................................ 49
Hnh 6: Cu trc nt ca danh sch ni n..................................................................................................................... 53
Hnh 7: Danh sch ni n............................................................................................................................................... 53
Hnh 8: Cu trc nt ca danh sch ni kp..................................................................................................................... 55
Hnh 9: Danh sch ni kp ............................................................................................................................................... 55
Hnh 10: Danh sch ni vng mt hng......................................................................................................................... 55
Hnh 11: Danh sch ni vng hai hng.......................................................................................................................... 56
Hnh 12: Dng danh sch vng m t Queue................................................................................................................... 61
Hnh 13: Di chuyn toa tu............................................................................................................................................... 63
Hnh 14: Di chuyn toa tu (2) ......................................................................................................................................... 63
Hnh 15: Cy .................................................................................................................................................................... 64
Hnh 16: Mc ca cc nt trn cy................................................................................................................................... 65
Hnh 17: Cy biu din biu thc..................................................................................................................................... 65
Hnh 18: Cc dng cy nh phn suy bin ........................................................................................................................ 66
Hnh 19: Cy nh phn hon chnh v cy nh phn y ............................................................................................. 66
Hnh 20: nh s cc nt ca cy nh phn y biu din bng mng................................................................... 67
Hnh 21: Nhc im ca phng php biu din cy bng mng.................................................................................. 68
Hnh 22: Cu trc nt ca cy nh phn ........................................................................................................................... 68
Hnh 23: Biu din cy bng cu trc lin kt.................................................................................................................. 69
Hnh 24: nh s cc nt ca cy 3_phn biu din bng mng................................................................................. 71
Hnh 25: Biu din cy tng qut bng mng .................................................................................................................. 72
Hnh 26: Cu trc nt ca cy tng qut .......................................................................................................................... 73
Hnh 27: Biu thc di dng cy nh phn..................................................................................................................... 74
Hnh 28: Vng lp trong ca QuickSort........................................................................................................................... 89
Hnh 29: Trng thi trc khi gi quy......................................................................................................................... 90
Hnh 30: Heap .................................................................................................................................................................. 92
Hnh 31: Vun ng........................................................................................................................................................... 93
Hnh 32: o gi tr k
1
cho k
n
v xt phn cn li............................................................................................................ 93
Hnh 33: Vun phn cn li thnh ng ri li o tr k
1
cho k
n-1
...................................................................................... 94
Hnh 34: nh s cc bit .................................................................................................................................................. 97
Hnh 35: Thut ton sp xp trn ................................................................................................................................... 102
Hnh 36: Ci t cc thut ton sp xp vi d liu ln................................................................................................. 114
Hnh 37: Cy nh phn tm kim.................................................................................................................................... 118
Hnh 38: Xa nt l cy BST ...................................................................................................................................... 119
Hnh 39. Xa nt ch c mt nhnh con trn cy BST................................................................................................... 120


vii
Hnh 40: Xa nt c c hai nhnh con trn cy BST thay bng nt cc phi ca cy con tri .......................................120
Hnh 41: Xa nt c c hai nhnh con trn cy BST thay bng nt cc tri ca cy con phi .......................................120
Hnh 42: nh s cc bit.................................................................................................................................................123
Hnh 43: Cy tm kim s hc.........................................................................................................................................124
Hnh 44: Cy tm kim c s ..........................................................................................................................................126
Hnh 45: Vi di dy bit z = 3, cy tm kim c s gm cc kho 2, 4, 5 v sau khi thm gi tr 7 ..........................127
Hnh 46: RST cha cc kho 2, 4, 5, 7 v RST sau khi loi b gi tr 7.........................................................................128
Hnh 47: Cy tm kim c s a) v Trie tm kim c s b) .............................................................................................130
Hnh 48: Hm quy tnh s Fibonacci..........................................................................................................................141
Hnh 49: Tnh ton v truy vt ........................................................................................................................................144
Hnh 50: Truy vt............................................................................................................................................................153
Hnh 51: V d v m hnh th ...................................................................................................................................170
Hnh 52: Phn loi th ................................................................................................................................................171
Hnh 53 ...........................................................................................................................................................................174
Hnh 54 ...........................................................................................................................................................................175
Hnh 55: th v ng i ...........................................................................................................................................177
Hnh 56: Cy DFS...........................................................................................................................................................180
Hnh 57: Cy BFS...........................................................................................................................................................184
Hnh 58: Thut ton loang ..............................................................................................................................................187
Hnh 59: th G v cc thnh phn lin thng G1, G2, G3 ca n..............................................................................190
Hnh 60: Khp v cu .....................................................................................................................................................190
Hnh 61: Lin thng mnh v lin thng yu..................................................................................................................191
Hnh 62: th y ....................................................................................................................................................192
Hnh 63: n th v hng v bao ng ca n ........................................................................................................192
Hnh 64: Ba dng cung ngoi cy DFS...........................................................................................................................196
Hnh 65: Thut ton Tarjan "b" cy DFS ......................................................................................................................198
Hnh 66: nh s li, o chiu cc cung v duyt BFS vi cch chn cc nh xut pht ngc li vi th t duyt
xong (th t 11, 10 3, 2, 1) ................................................................................................................................204
Hnh 67: th G v mt s v d cy khung T1, T2, T3 ca n...................................................................................207
Hnh 68: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh)............................................207
Hnh 69: Php nh chiu DFS........................................................................................................................................210
Hnh 70: Php nh s v ghi nhn cung ngc ln cao nht.........................................................................................212
Hnh 71 Duyt DFS, xc nh cy DFS v cc cung ngc............................................................................................215
Hnh 72: M hnh th ca bi ton by ci cu...........................................................................................................218
Hnh 73 ...........................................................................................................................................................................219
Hnh 74 ...........................................................................................................................................................................219
Hnh 75 ...........................................................................................................................................................................225
Hnh 76: Php nh li ch s theo th t tp...............................................................................................................240
Hnh 77: Hai cy gc r
1
v r
2
v cy mi khi hp nht chng ........................................................................................248
Hnh 78: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7 ...................................256
Hnh 79: Mng G, lung trn cc cung (1 pht, 6 thu) v th tng lung tng ng..................................................257
Hnh 80: Lung trn mng G trc v sau khi tng........................................................................................................258


viii
Hnh 81: th hai pha................................................................................................................................................. 266
Hnh 82: th hai pha v b ghp M.......................................................................................................................... 267
Hnh 83: M hnh lung ca bi ton tm b ghp cc i trn th hai pha ............................................................. 271
Hnh 84: Php xoay trng s cnh.................................................................................................................................. 274
Hnh 85: Thut ton Hungari.......................................................................................................................................... 277
Hnh 86: Cy pha "mc" ln hn sau mi ln xoay trng s cnh v tm ng........................................................... 285
Hnh 87: th G v mt b ghp M............................................................................................................................. 290
Hnh 88: Php chp Blossom......................................................................................................................................... 292
Hnh 89: N Blossom d ng xuyn qua Blossom................................................................................................ 292



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.................................................................15
P_1_03_4.PAS * Thut ton quay lui lit k cc cch phn tch s..................................................................................17
P_1_03_5.PAS * Thut ton quay lui gii bi ton xp hu.............................................................................................21
P_1_04_1.PAS * K thut nhnh cn dng cho bi ton ngi du lch............................................................................26
P_1_04_2.PAS * Dy ABC..............................................................................................................................................28
P_2_07_1.PAS * Tnh gi tr biu thc RPN....................................................................................................................76
P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN...........................................................................................79
P_2_08_1.PAS * Cc thut ton sp xp ........................................................................................................................105
P_3_01_1.PAS * m s cch phn tch s n ................................................................................................................135
P_3_01_2.PAS * m s cch phn tch s n ................................................................................................................136
P_3_01_3.PAS * m s cch phn tch s n ................................................................................................................136
P_3_01_4.PAS * m s cch phn tch s n ................................................................................................................137
P_3_01_5.PAS * m s cch phn tch s n dng quy............................................................................................137
P_3_01_6.PAS * m s cch phn tch s n dng quy............................................................................................138
P_3_03_1.PAS * Tm dy con n iu tng di nht....................................................................................................144
P_3_03_2.PAS * Ci tin thut ton tm dy con n iu tng di nht.......................................................................146
P_3_03_3.PAS * Bi ton ci ti ....................................................................................................................................149
P_3_03_4.PAS * Bin i xu........................................................................................................................................153
P_3_03_5.PAS * Dy con c tng chia ht cho k...........................................................................................................156
P_3_03_6.PAS * Dy con c tng chia ht cho k...........................................................................................................158
P_3_03_7.PAS * Nhn ti u dy ma trn .....................................................................................................................162
P_4_03_1.PAS * Thut ton tm kim theo chiu su....................................................................................................178
P_4_03_2.PAS * Thut ton tm kim theo chiu su khng quy .............................................................................181
P_4_03_3.PAS * Thut ton tm kim theo chiu rng dng hng i ..........................................................................185
P_4_03_4.PAS * Thut ton tm kim theo chiu rng dng phng php loang .........................................................187
P_4_04_1.PAS * Thut ton Warshall lit k cc thnh phn lin thng.......................................................................194
P_4_04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh .................................................................201
P_4_05_1.PAS * Php nh chiu DFS v lit k cu ....................................................................................................213
P_4_05_2.PAS * Lit k cc khp ca th .................................................................................................................216
P_4_06_1.PAS * Thut ton Fleury tm chu trnh Euler.................................................................................................220
P_4_06_2.PAS * Thut ton hiu qu tm chu trnh Euler .............................................................................................223
P_4_07_1.PAS * Thut ton quay lui lit k chu trnh Hamilton...................................................................................226
P_4_08_1.PAS * Thut ton Ford-Bellman....................................................................................................................233
P_4_08_2.PAS * Thut ton Dijkstra .............................................................................................................................235
P_4_08_3.PAS * Thut ton Dijkstra v cu trc Heap .................................................................................................237


x
P_4_08_4.PAS * ng i ngn nht trn th khng c chu trnh ........................................................................... 241
P_4_08_5.PAS * Thut ton Floyd................................................................................................................................ 243
P_4_09_1.PAS * Thut ton Kruskal............................................................................................................................. 249
P_4_09_2.PAS * Thut ton Prim.................................................................................................................................. 252
P_4_10_1.PAS * Thut ton tm lung cc i trn mng ............................................................................................ 259
P_4_10_2.PAS * Thut ton Ford-Fulkerson................................................................................................................. 262
P_4_11_1.PAS * Thut ton ng m tm b ghp cc i ........................................................................................ 269
P_4_12_1.PAS * Thut ton Hungari ............................................................................................................................ 280
P_4_12_2.PAS * Ci t phng php Kuhn-Munkres O(n
3
) ....................................................................................... 286
P_4_13_1.PAS * Phng php Lawler p dng cho thut ton Edmonds..................................................................... 296


P PH H N N 1 1. . B B I I T TO O N N L LI I T T K 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
i hc S phm H Ni, 1999-2002
2
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 1 2 3
f(i) E C E
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:
k
k
n n A =

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 1 2 3
f(i) C A E
S chnh hp khng lp chp k ca tp gm n phn t:
)! k n (
! n
) 1 k n )...( 2 n )( 1 n ( n A
k
n

= + =
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 1 2 3 4 5 6
f(i) A D C E B F
rng khi k = n th s phn t ca tp X = {1, 2, , n} ng bng s phn t ca S. Do tnh
cht i mt khc nhau nn dy f(1), f(2), , f(n) s lit k c ht cc phn t trong S. Nh vy f
l ton nh. Mt khc do gi thit f l chnh hp khng lp nn f l n nh. Ta c tng ng 1-1
Bi ton lit k
L Minh Hong
3
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 P
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:
)! k n ( ! k
! n
! k
A
C
k
n k
n

= =
S tp con ca tp n phn t:

n n
n
1
n
0
n
2 C ... C C = + + +
Chuyn
i hc S phm H Ni, 1999-2002
4
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 = (a
1
, a
2
, , a
n
) v b = (b
1
, b
2
, , b
n
); trn cc phn t ca a
1
, , a
n
, b
1
, , b
n
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

Bi ton lit k
L Minh Hong
5
a
2
= b
2


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 = x
1
x
2
x
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, 2
n
- 1]. S cc dy nh phn di n = s cc s nguyn [0, 2
n
- 1] = 2
n
. 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,, 2
n
-1.
V d: Khi n = 3, cc dy nh phn di 3 c lit k nh sau:
p(x) 0 1 2 3 4 5 6 7
x 000 001 010 011 100 101 110 111
Nh vy dy u tin s l 000 v dy cui cng s l 111. Nhn xt rng nu dy x = (x
1
,
x
2
, , x
n
) l dy ang c v khng phi dy cui cng th dy k tip s nhn c bng cch cng
thm 1 ( theo c s 2 c nh) vo dy hin ti.
V d khi n = 8:
Dy ang c: 10010000 Dy ang c: 10010111
cng thm 1: + 1 cng thm 1: + 1




Dy mi: 10010001 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), gp s 0 u tin th thay n bng s 1 v t tt c cc phn
t pha sau v tr bng 0.
i := n;
while (i > 0) and (x
i
= 1) do i := i - 1;
if i > 0 then
begin
Chuyn
i hc S phm H Ni, 1999-2002
6
x
i
:= 1;
for j := i + 1 to n do x
j
:= 0;
end;
D liu vo (Input): nhp t file vn bn BSTR.INP cha s nguyn dng n 30
Kt qu ra (Output): ghi ra file vn bn BSTR.OUT cc dy nh phn di n.
BSTR.INP
3

BSTR.OUT
000
001
010
011
100
101
110
111
P_1_02_1.PAS * Thut ton sinh lit k cc dy nh phn di n
program Binary_Strings;
const
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
max = 30;
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
1
= x
2
= = x
n
:= 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. T ,
ta c nhn xt nu x = {x
1
, x
2
, , x
k
} v x
1
< x
2
< < x
k
th gii 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
Bi ton lit k
L Minh Hong
7
C th: 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.
i := n;
while (i > 0) and (x
i
= n - k + i) do i := i - 1;
(1, 2, 6, 7, 8, 9);
Nu tm thy:
if i > 0 then
Tng x
i
ln 1.
x
i
:= x
i
+ 1;
(1, 3, 6, 7, 8, 9)
t tt c cc phn t pha sau x
i
bng gii hn di:
for j := i + 1 to k do x
j
:= x
j-1
+ 1;
(1, 3, 4, 5, 6, 7)
Input: file vn bn SUBSET.INP cha hai s nguyn dng n, k (1 k n 30) cch nhau t nht
mt du cch
Output: file vn bn SUBSET.OUT cc tp con k phn t ca tp {1, 2, , n}
Chuyn
i hc S phm H Ni, 1999-2002
8
SUBSET.INP
5 3

SUBSET.OUT
{1, 2, 3}
{1, 2, 4}
{1, 2, 5}
{1, 3, 4}
{1, 3, 5}
{1, 4, 5}
{2, 3, 4}
{2, 3, 5}
{2, 4, 5}
{3, 4, 5}
P_1_02_2.PAS * Thut ton sinh lit k cc tp con k phn t
program Combination;
const
InputFile = 'SUBSET.INP';
OutputFile = 'SUBSET.OUT';
max = 30;
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; {x
1
:= 1; x
2
:= 2; ; x
3
:= k (Cu hnh khi to)}
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; {x
i
l phn t cui dy, li dn i cho ti khi gp mt 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 2.1243 3.1324 4.1342 5.1423 6.1432
7.2134 8.2143 9.2314 10.2341 11.2413 12.2431
13.3124 14.3142 15.3214 16.3241 17.3412 18.3421
19.4123 20.4132 21.4213 22.4231 23.4312 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
Bi ton lit k
L Minh Hong
9
hn hon v hin ti!. Nh vy ta phi xt n x2 = 2, thay n bng mt gi tr khc. Ta s thay
bng gi tr no?, khng th l 1 bi nu vy s c hon v nh hn, khng th l 3 v c x1 =
3 ri (phn t sau khng c chn vo nhng gi tr m phn t trc chn). Cn li cc gi tr
4, 5, 6. V cn mt hon v va ln hn hin ti nn ta chn 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 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).
(3, 2, 6, 5, 4, 1) (3, 4, 1, 2, 5, 6).
Ta c nhn xt g qua v d ny: on cui ca hon v c xp gim dn, s 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 ton dy l gim dn, th l cu hnh cui.
i := n - 1;
while (i > 0) and (x
i
> x
i+1
) do i := i - 1;
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).
k := n;
while x
k
< x
i
do k := k - 1;
i ch x
k
v x
i
, lt ngc th t on cui gim dn (t x
i+1
n x
k
) tr thnh tng dn.
Input: file vn bn PERMUTE.INP cha s nguyn dng n 12
Output: file vn bn PERMUTE.OUT cc hon v ca dy (1, 2, , n)
PERMUTE.INP
3

PERMUTE.OUT
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
P_1_02_3.PAS * Thut ton sinh lit k hon v
program Permutation;
const
InputFile = 'PERMUTE.INP';
OutputFile = 'PERMUTE.OUT';
max = 12;
var
n, i, k, a, b: Integer;
x: array[1..max] of Integer;
f: Text;
Chuyn
i hc S phm H Ni, 1999-2002
10

procedure Swap(var X, Y: Integer); {Th tc o gi tr hai tham bin X, Y}
var
Temp: Integer;
begin
Temp := X; X := Y; Y := Temp;
end;

begin
Assign(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]); {i ch x
a
v x
b
}
Inc(a); {Tin a v li b, i ch tip cho ti khi a, b chm nhau}
Dec(b);
end;
end;
until i = 0; {Ton dy l dy gim dn - khng sinh tip c - ht cu hnh}
Close(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}.
Gi : 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 ton lit k
L Minh Hong
11
Gi : xy dng mt nh x t tp {1, 2, , n} n tp cc tn ngi. V d xy dng mt mng
Tn: Tn[1] := 'Nguyn vn A'; Tn[2] := 'Trn th B';. sau lit k tt c cc tp con k phn t
ca tp {1, 2, , n}. Ch c iu khi in tp con, ta khng in gi tr s {1, 3, 5} m thay vo s in
ra {Tn[1], Tn [3], Tn[5]}. Tc l in ra nh ca cc gi tr tm c qua nh x
Bi 5
Lit k tt c cc tp con ca tp {1, 2, , n}. C th dng phng php lit k tp con nh trn
hoc dng phng php lit k tt c cc dy nh phn. Mi s 1 trong dy nh phn tng ng vi
mt phn t c chn trong tp. V d vi tp {1, 2, 3, 4} th dy nh phn 1010 s tng ng vi
tp con {1, 3}. Hy lp chng trnh in ra tt c cc tp con ca {1, 2, , n} theo hai phng php.
Bi 6
Nhp vo danh sch tn n ngi, in ra tt c cc cch xp n ngi vo mt bn
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).
Chuyn
i hc S phm H Ni, 1999-2002
12
3. THUT TON QUAY LUI
Thut ton quay lui dng gii bi ton lit k cc cu hnh. Mi cu hnh c xy dng
bng cch xy dng tng phn t, mi phn t c chn bng cch th tt c cc kh nng.
Gi thit cu hnh cn lit k c dng (x
1
, x
2
,, x
n
). Khi thut ton quay lui thc hin qua cc
bc sau:
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
, x
2
, .., x
n
) bng cch th cho x
1
nhn ln lt cc gi tr c th. Vi mi gi tr th gn cho x
1
li
lit k tip cu hnh n - 1 phn t (x
2
, x
3
, , x
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 Try(i: Integer);
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)>;
Try(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 Try(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
, x
2
, , x
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
program BinaryStrings;
const
Bi ton lit k
L Minh Hong
13
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
max = 30;
var
x: array[1..max] of Integer;
n: Integer;
f: Text;

procedure PrintResult; {In cu hnh tm c, do th tc tm quy Try gi khi tm ra mt cu hnh}
var
i: Integer;
begin
for i := 1 to n do Write(f, x[i]);
WriteLn(f);
end;

procedure Try(i: Integer); {Th cc cch chn x
i
}
var
j: Integer;
begin
for j := 0 to 1 do {Xt cc gi tr c th gn cho x
i
, vi mi gi tr }
begin
x[i] := j; {Th t x
i
}
if i = n then PrintResult {Nu i = n th in kt qu}
else Try(i + 1); {Nu i cha phi l phn t cui th tm tip x
i+1
}
end;
end;

begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n); {Nhp d liu}
Close(f);
Assign(f, OutputFile); Rewrite(f);
Try(1); {Th cc cch chn gi tr x
1
}
Close(f);
end.
V d: Khi n = 3, cy tm kim quay lui nh sau:
Try(1)
Try(2)
Try(2)
Try(3) Try(3) Try(3) Try(3)
000 001 010 011 100 101 110 111
Result
X
1
=0
X
1
=1
X
2
=0 X
2
=1 X
2
=0 X
2
=1
X
3
=0
X
3
=1
X
3
=0
X
3
=1
X
3
=0 X
3
=1
X
3
=0 X
3
=1

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
Chuyn
i hc S phm H Ni, 1999-2002
14
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
,
x
2
, , x
k
) 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
program Combination;
const
InputFile = 'SUBSET.INP';
OutputFile = 'SUBSET.OUT';
max = 30;
var
x: array[0..max] of Integer;
n, k: Integer;
f: Text;

procedure PrintResult; (*In ra tp con {x
1
, x
2
, , x
k
}*)
var
i: Integer;
begin
Write(f, '{');
for i := 1 to k - 1 do Write(f, x[i], ', ');
WriteLn(f, x[k], '}');
end;

procedure Try(i: Integer); {Th cc cch chn gi tr cho x[i]}
var
j: Integer;
begin
for j := x[i - 1] + 1 to n - k + i do
begin
x[i] := j;
if i = k then PrintResult
else Try(i + 1);
end;
end;

begin
Assign(f, InputFile); Reset(F);
ReadLn(f, n, k);
Close(f);
Assign(f, OutputFile); Rewrite(f);
x[0] := 0;
Try(1);
Close(f);
end.
Bi ton lit k
L Minh Hong
15

Nu chng trnh trn v chng trnh lit k dy nh phn di n, ta thy v c bn chng
ch khc nhau th tc Try(i) - chn th cc gi tr cho 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
, x
2
, , x
k
) y cc x
i
S v khc nhau i mt.
Nh vy th tc Try(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
, c
2
, , c
n
mang kiu logic. 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 xi+1: ta t gi tr j va gn cho xi l b chn c ngha l t c
j
:=
FALSE cc th tc Try(i + 1), Try(i + 2) gi sau ny khng chn phi gi tr j na
Sau khi gi quy tm x
i+1
: c ngha l sp ti ta s th gn mt gi tr khc cho xi th ta s t gi
tr j va th thnh t do (cj := TRUE), bi khi xi nhn mt gi tr khc ri th cc phn t
ng sau: xi+1, xi+2 hon ton c th nhn li gi tr j . iu ny hon ton hp l trong php
xy dng chnh hp khng lp: x1 c n cch chn, x2 c n - 1 cch chn, Lu rng khi th tc
Try(i) c i = k th ta khng cn phi nh du g c v tip theo ch c in kt qu ch khng cn phi
chn thm phn t no na.
Input: file vn bn ARRANGE.INP cha hai s nguyn dng n, k (1 k n 20) cch nhau t
nht mt du cch
Output: file vn bn ARRANGE.OUT ghi cc chnh hp khng lp chp k ca tp {1, 2, , n}
ARRANGE.INP
3 2

ARRANGE.OUT
1 2
1 3
2 1
2 3
3 1
3 2
P_1_03_3.PAS * Thut ton quay lui lit k cc chnh hp khng lp chp k
Chuyn
i hc S phm H Ni, 1999-2002
16
program Arrangement;
const
InputFile = 'ARRANGES.INP';
OutputFile = 'ARRANGES.OUT';
max = 20;
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 Try(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}
Try(i + 1); {Th tc ny ch xt nhng gi tr cn t do gn cho x
i+1
, tc l s khng chn phi j}
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}
Try(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
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
.
Bi ton lit k
L Minh Hong
17
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 Try(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 Try(i) th cc gi tr cho x
i
c th m t 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 30
Output: file vn bn ANALYSE.OUT ghi cc cch phn tch s n.
ANALYSE.INP
6

ANALYSE.OUT
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+1+3
6 = 1+1+2+2
6 = 1+1+4
6 = 1+2+3
6 = 1+5
6 = 2+2+2
6 = 2+4
6 = 3+3
6 = 6
P_1_03_4.PAS * Thut ton quay lui lit k cc cch phn tch s
program Analyses;
const
InputFile = 'ANALYSE.INP';
OutputFile = 'ANALYSE.OUT';
max = 30;
var
n: Integer;
x: array[0..max] of Integer;
t: array[0..max] of Integer;
f: Text;

Chuyn
i hc S phm H Ni, 1999-2002
18
procedure Init; {Khi to}
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
x[0] := 1;
t[0] := 0;
end;

procedure PrintResult(k: Integer);
var
i: Integer;
begin
Write(f, n, ' = ');
for i := 1 to k - 1 do Write(f, x[i], '+');
WriteLn(f, x[k]);
end;

procedure Try(i: Integer);
var
j: Integer;
begin
for j := x[i - 1] to (n - T[i - 1]) div 2 do {Trng hp cn chn tip x
i+1
}
begin
x[i] := j;
t[i] := t[i - 1] + j;
Try(i + 1);
end;
x[i] := n - T[i - 1]; {Nu x
i
l phn t cui th n bt buc phi l v in kt qu}
PrintResult(i);
end;

begin
Init;
Assign(f, OutputFile); Rewrite(f);
Try(1);
Close(f);
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:
Bi ton lit k
L Minh Hong
19

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.
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
1
2
3
4
5
6
7
8
N
S
W E
N
S
W E

Hnh 3: ng cho B-TN mang ch s 10 v ng cho N-TB mang ch s 0
Ci t:
Chuyn
i hc S phm H Ni, 1999-2002
20
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:
o 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.
o Sau khi gi quy tm cch t qun hu th i + 1, c ngha l sp ti ta li th mt
cch t khc cho qun hu th i, ta b nh du ct v 2 ng cho b qun hu
va th t khng ch (a
j
= b
i+j
= c
i-j
:= TRUE) tc l ct v 2 ng cho li
thnh t do, bi khi t qun hu i sang v tr khc ri th ct v 2 ng cho
hon ton c th gn cho mt qun hu khc
Hy xem li trong cc chng trnh lit k chnh hp khng lp v hon v v k thut nh du.
y ch khc vi lit k hon v l: lit k hon v ch cn mt mng nh du xem gi tr c t do
khng, cn bi ton xp hu th cn phi nh du c 3 thnh phn: Ct, ng cho B-TN,
ng cho N- TB. Trng hp n gin hn: Yu cu lit k cc cch t n qun xe ln bn c
nxn sao cho khng qun no n qun no chnh l bi ton lit k hon v
Input: file vn bn QUEENS.INP cha s nguyn dng n 12
Output: file vn bn QUEENS.OUT, mi dng ghi mt cch t n qun hu
Bi ton lit k
L Minh Hong
21
QUEENS.INP
5

QUEENS.OUT
(1, 1); (2, 3); (3, 5); (4, 2); (5, 4);
(1, 1); (2, 4); (3, 2); (4, 5); (5, 3);
(1, 2); (2, 4); (3, 1); (4, 3); (5, 5);
(1, 2); (2, 5); (3, 3); (4, 1); (5, 4);
(1, 3); (2, 1); (3, 4); (4, 2); (5, 5);
(1, 3); (2, 5); (3, 2); (4, 4); (5, 1);
(1, 4); (2, 1); (3, 3); (4, 5); (5, 2);
(1, 4); (2, 2); (3, 5); (4, 3); (5, 1);
(1, 5); (2, 2); (3, 4); (4, 1); (5, 3);
(1, 5); (2, 3); (3, 1); (4, 4); (5, 2);
P_1_03_5.PAS * Thut ton quay lui gii bi ton xp hu
program n_Queens;
const
InputFile = 'QUEENS.INP';
OutputFile = 'QUEENS.OUT';
max = 12;
var
n: Integer;
x: array[1..max] of Integer;
a: array[1..max] of Boolean;
b: array[2..2 * max] of Boolean;
c: array[1 - max..max - 1] of Boolean;
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 Try(i: Integer); {Th cc cch t qun hu th i vo hng i}
var
j: Integer;
begin
for j := 1 to n do
if a[j] and b[i + j] and c[i - j] then {Ch xt nhng ct j m (i, j) cha b khng ch}
begin
x[i] := j; {Th t qun hu i vo ct j}
if i = n then PrintResult
else
begin
a[j] := False; b[i + j] := False; c[i - j] := False; {nh du}
Try(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
Chuyn
i hc S phm H Ni, 1999-2002
22
Init;
Assign(f, OutputFile); Rewrite(f);
Try(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
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
, x
2
, , x
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
Bi ton lit k
L Minh Hong
23
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.

Chuyn
i hc S phm H Ni, 1999-2002
24
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 2
n
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 Try(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>;
Try(i + 1); {Gi quy, chn tip x
i+1
}
<B ghi nhn vic th cho x
i
= V (nu cn)>;
end;
Bi ton lit k
L Minh Hong
25
end;
end;

begin
Init;
Try(1);
<Thng bo cu hnh ti u BESTCONFIG>
end.
K thut nhnh cn thm vo cho thut ton quay lui kh nng nh gi theo tng bc, nu ti
bc th i, gi tr th gn cho x
i
khng c hi vng tm thy cu hnh tt hn cu hnh
BESTCONFIG th th gi tr khc ngay m khng cn phi gi quy tm tip hay ghi nhn kt
qu lm g. Nghim ca bi ton s c lm tt dn, bi khi tm ra mt cu hnh mi (tt hn
BESTCONFIG - tt nhin), ta khng in kt qu ngay m s cp nht BESTCONFIG bng cu hnh
mi va tm c
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
ij
= C
ji
= Chi ph i on ng trc tip t
thnh ph i n thnh ph j. Gi thit rng C
ii
= 0 vi i, C
ij
= + 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
= 1, x
2
, , x
n
, 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
ij
+) v ngoi tr thnh ph 1, khng thnh ph
no c lp li hai ln. C ngha l dy (x
1
, x
2
, , x
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
Chuyn
i hc S phm H Ni, 1999-2002
26
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 khng c li
gii, cn nu chi ph ca BestConfig < + th in ra cu hnh BestConfig - l hnh trnh t tn
km nht tm c
Input: file vn bn TOURISM.INP
Dng 1: Cha s thnh ph n (1 n 20) v s tuyn ng m trong mng li giao thng
m dng tip theo, mi dng ghi s hiu hai thnh ph c ng i trc tip v chi ph i trn
qung ng (chi ph ny l s nguyn dng 100)
Output: file vn bn TOURISM.OUT, ghi hnh trnh tm c.
1 2
3 4
1
2
1
3
4
2

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

P_1_04_1.PAS * K thut nhnh cn dng cho bi ton ngi du lch
program TravellingSalesman;
const
InputFile = 'TOURISM.INP';
OutputFile = 'TOURISM.OUT';
max = 20;
maxC = 20 * 100 + 1;{+}
var
C: array[1..max, 1..max] of Integer; {Ma trn chi ph}
X, BestWay: array[1..max + 1] of Integer; {X th cc kh nng, BestWay ghi nhn nghim}
T: array[1..max + 1] of Integer; {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}
Bi ton lit k
L Minh Hong
27
begin
FillChar(Free, n, True);
Free[1] := False; {Cc thnh ph l cha i qua ngoi tr thnh ph 1}
X[1] := 1; {Xut pht t thnh ph 1}
T[1] := 0; {Chi ph ti thnh ph xut pht l 0}
MinSpending := maxC;
end;

procedure Try(i: Integer); {Th cc cch chn xi}
var
j: Integer;
begin
for j := 2 to n do {Th cc thnh ph t 2 n n}
if Free[j] then {Nu gp thnh ph cha i qua}
begin
X[i] := j; {Th i}
T[i] := T[i - 1] + C[x[i - 1], j]; {Chi ph := Chi ph bc trc + chi ph ng i trc tip}
if T[i] < MinSpending then {Hin nhin nu c iu ny th C[x[i - 1], j] < + ri}
if i < n then {Nu cha n c x
n
}
begin
Free[j] := False; {nh du thnh ph va th}
Try(i + 1); {Tm cc kh nng chn x
i+1
}
Free[j] := True; {B nh du}
end
else
if T[n] + C[x[n], 1] < MinSpending then {T x
n
quay li 1 vn tn chi ph t hn trc}
begin {Cp nht BestConfig}
BestWay := X;
MinSpending := T[n] + C[x[n], 1];
end;
end;
end;

procedure PrintResult;
var
i: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if MinSpending = maxC then WriteLn(f, 'NO SOLUTION')
else
for i := 1 to n do Write(f, BestWay[i], '->');
WriteLn(f, 1);
WriteLn(f, 'Cost: ', MinSpending);
Close(f);
end;

begin
Enter;
Init;
Try(2);
PrintResult;
end.
Trn y l mt gii php nhnh cn cn rt th s gii bi ton ngi du lch, trn thc t ngi ta
cn c nhiu cch nh gi nhnh cn cht hn na. Hy tham kho cc ti liu khc tm hiu v
nhng phng php .
Chuyn
i hc S phm H Ni, 1999-2002
28
4.5. DY ABC
Cho trc mt s nguyn dng N (N 100), hy tm mt xu ch gm cc k t A, B, C tho mn
3 iu kin:
C di N
Hai on con bt k lin nhau u khc nhau (on con l mt dy k t lin tip ca xu)
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
X
2
X
n
tho mn 2 on con bt k lin nhau u khc nhau, th trong 4 k t lin tip
bt k bao gi cng phi c 1 k t "C". Nh vy vi mt dy con gm k k t lin tip ca dy X
th s k t C trong dy con bt buc phi k div 4.
Ti bc th chn X
i
, nu ta c T
i
k t "C" trong on chn t X
1
n X
i
, th cho d cc
bc quy tip sau lm tt nh th no chng na, s k t "C" s phi chn thm bao gi cng
(n - i) div 4. Tc l nu theo phng n chn X
i
nh th ny th s k t "C" trong dy kt qu (khi
chn n X
n
) cho d c lm tt n u cng T
i
+ (n - i) div 4. Ta dng con s ny nh gi
nhnh cn, nu n nhiu hn s k t "C" trong BestConfig th chc chn c lm tip cng ch c
mt cu hnh ti t hn, ta b qua ngay cch chn ny v th phng n khc.
Input: file vn bn ABC.INP cha s nguyn dng n 100
Output: file vn bn ABC.OUT ghi xu tm c
ABC.INP
10

ABC.OUT
ABACABCBAB
"C" Letter Count : 2
P_1_04_2.PAS * Dy ABC
program ABC_STRING;
const
InputFile = 'ABC.INP';
OutputFile = 'ABC.OUT';
max = 100;
var
N, MinC: Integer;
X, Best: array[1..max] of 'A'..'C';
T: array[0..max] of Integer; {T
i
cho bit s k t "C" trong on t X
1
n X
i
}
f: Text;

{Hm Same(i, l) cho bit xu gm l k t kt thc ti X
i
c trng vi xu l k t lin trc n khng ?}
function Same(i, l: Integer): Boolean;
var
j, k: Integer;
begin
j := i - l; {j l v tr cui on lin trc on }
for k := 0 to l - 1 do
if X[i - k] <> X[j - k] then
begin
Same := False; Exit;
end;
Same := True;
Bi ton lit k
L Minh Hong
29
end;

{Hm Check(i) cho bit X
i
c lm hng tnh khng lp ca dy X
1
X
2
X
i
hay khng}
function Check(i: Integer): Boolean;
var
l: Integer;
begin
for l := 1 to i div 2 do {Th cc di l}
if Same(i, l) then {Nu c xu di l kt thc bi 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 Try(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 Try(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}
Try(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 Try trn s th ln lt cc gi tr 'A', 'B',
Chuyn
i hc S phm H Ni, 1999-2002
30
ri mi n 'C'. C ngha ngay trong cch tm, n tit kim s dng k t 'C' nht nn trong phn
ln cc b d liu n nhanh chng tm ra li gii hn so vi bi ton tng ng tm xu t k t 'B'
nht. Chnh v vy m nu nh bi yu cu t k t 'B' nht ta c lp chng trnh lm yu cu t
k t 'C' nht, ch c iu khi in kt qu, ta i vai tr 'B', 'C' cho nhau. y l mt v d cho thy
sc mnh ca thut ton quay lui khi kt hp vi k thut nhnh cn, nu vit quay lui thun tu
hoc nh gi nhnh cn khng tt th vi N = 100, ti cng khng kin nhn i chng
trnh cho kt qu (ch bit rng > 3 gi). Trong khi khi N = 100, vi chng trnh trn ch chy
ht hn 3 giy cho kt qu l xu 27 k t 'C'.
Ni chung, t khi ta gp bi ton m ch cn s dng mt thut ton, mt m hnh k thut ci t l
c th gii c. Thng thng cc bi ton thc t i hi phi c s tng hp, pha trn nhiu
thut ton, nhiu k thut mi c c mt li gii tt. Khng c lm dng mt k thut no v
cng khng xem thng mt phng php no khi bt tay vo gii mt bi ton tin hc. Thut ton
quay lui cng khng phi l ngoi l, ta phi bit phi hp mt cch uyn chuyn vi cc thut ton
khc th khi n mi thc s l mt cng c mnh.
Bi tp:
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
Bi ton lit k
L Minh Hong
31
Cch 2: dng bn mt : s dng mt li vung kch thc mxn, trn ti (i, j) ghi mt
s trong khong t 0 n 8 cho bit tng s mn trong cc ln cn vi (i, j) ( ln cn vi (i, j)
l c chung vi (i, j) t nht 1 nh).
Gi thit rng hai bn c ghi chnh xc theo tnh trng mn trn hin trng.
V 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 MINE.OUT
10 15
0 3 2 3 3 3 5 3 4 4 5 4 4 4 3
1 4 3 5 5 4 5 4 7 7 7 5 6 6 5
1 4 3 5 4 3 5 4 4 4 4 3 4 5 5
1 4 2 4 4 5 4 2 4 4 3 2 3 5 4
1 3 2 5 4 4 2 2 3 2 3 3 2 5 2
2 3 2 3 3 5 3 2 4 4 3 4 2 4 1
2 3 2 4 3 3 2 3 4 6 6 5 3 3 1
2 6 4 5 2 4 1 3 3 5 5 5 6 4 3
4 6 5 7 3 5 3 5 5 6 5 4 4 4 3
2 4 4 4 2 3 1 2 2 2 3 3 3 4 2
80
1 0 1 1 1 1 0 1 1 1 1 1 1 1 1
0 0 1 0 0 1 1 1 0 1 1 1 0 1 1
0 0 1 0 0 1 0 0 1 1 1 0 0 1 1
1 0 1 1 1 0 0 1 0 0 0 0 0 1 1
1 0 0 0 1 1 1 0 0 1 0 0 1 0 1
0 0 0 0 1 0 0 0 0 1 1 0 1 0 0
0 1 1 0 0 1 0 0 1 1 0 0 1 0 0
1 0 1 0 1 0 1 0 1 1 1 1 0 1 0
0 1 1 0 1 0 0 0 0 0 1 1 1 1 1
1 1 1 1 1 0 1 1 1 1 0 0 0 0 1



P PH H N N 2 2. . C C U U T TR R C C D D L LI I U U V V
G GI I I I T TH HU U T T
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.

Chuyn
i hc S phm H Ni, 1999-2002
34
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
Cu trc d liu v Gii thut
L Minh Hong
35
nhng cch t chc d liu khc th s km hiu qu hoc khng th thc hin c. Chnh v
vy nn bc xy dng cu trc d liu khng th tch ri bc tm kim thut ton gii
quyt vn .
Cc tiu chun khi la chn cu trc d liu
Cu trc d liu trc ht phi biu din c y cc thng tin nhp v xut ca bi ton
Cu trc d liu phi ph hp vi cc thao tc ca thut ton m ta la chn gii quyt bi
ton.
Cu trc d liu phi ci t c trn my tnh vi ngn ng lp trnh ang s dng
i vi mt s bi ton, trc khi t chc d liu ta phi vit mt on chng trnh nh
kho st xem d liu cn lu tr ln ti mc no.
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 nh
mi bc ca thut ton, cc thao tc phi ht sc r rng, khng gy nn s nhp nhng,
ln xn, tu tin, a ngha. Thc hin ng cc bc ca thut ton th vi mt d liu vo,
ch cho duy nht mt kt qu ra.
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.
Chuyn
i hc S phm H Ni, 1999-2002
36
1.3.5. Tnh kh thi
a) Kch thc phi nh: V d: Mt thut ton s c tnh hiu qu bng 0 nu lng b nh
m n yu cu vt qu kh nng lu tr ca h thng my tnh.
b) Thut ton phi c my tnh thc hin trong thi gian cho php, iu ny khc vi li
gii ton (Ch cn chng minh l kt thc sau hu hn bc). V d nh xp thi kho biu
cho mt hc k th khng th cho my tnh chy ti hc k sau mi ra c.
c) Phi d hiu v d ci t.
V d:
Input: 2 s nguyn t nhin a v b khng ng thi bng 0
Output: c s chung ln nht ca a v b
Thut ton s tin hnh c m t nh sau: (Thut ton Euclide)
Bc 1 (Input): Nhp a v b: S t nhin
Bc 2: Nu b 0 th chuyn sang bc 3, nu khng th b qua bc 3, i lm bc 4
Bc 3: t r := a mod b; t a := b; t b := r; Quay tr li bc 2.
Bc 4 (Output): Kt lun c s chung ln nht phi tm l gi tr ca a. Kt thc thut ton.
Begin
Input: a, b
b > 0 ?
r := a mod b;
a := b;
b := r
Output a;
End
No
Yes

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.
Tnh ng n ca nhng m-un thuc ta khng cn phi quan tm na m tp trung gii
quyt cc phn khc.
Cu trc d liu v Gii thut
L Minh Hong
37
1.4. LP TRNH
Sau khi c thut ton, ta phi tin hnh lp trnh th hin thut ton . Mun lp trnh t
hiu qu cao, cn phi c k thut lp trnh tt. K thut lp trnh tt th hin k nng vit
chng trnh, kh nng g ri v thao tc nhanh. Lp trnh tt khng phi ch cn nm vng
ngn ng lp trnh l , phi bit cch vit chng trnh uyn chuyn, khn kho v pht
trin dn dn chuyn cc tng ra thnh chng trnh hon chnh. Kinh nghim cho thy
mt thut ton hay nhng do ci t vng v nn khi chy li cho kt qu sai hoc tc
chm.
Thng thng, ta khng nn c th ho ngay ton b chng trnh m nn tin hnh theo
phng php tinh ch tng bc (Stepwise refinement):
Ban u, chng trnh c th hin bng ngn ng t nhin, th hin thut ton vi cc bc
tng th, mi bc nu ln mt cng vic phi thc hin.
Mt cng vic n gin hoc l mt on chng trnh c hc thuc th ta tin hnh vit
m lnh ngay bng ngn ng lp trnh.
Mt cng vic phc tp th ta li chia ra thnh nhng cng vic nh hn li tip tc vi
nhng cng vic nh hn .
Trong qu trnh tinh ch tng bc, ta phi a ra nhng biu din d liu. Nh vy cng vi
s tinh ch cc cng vic, d liu cng c tinh ch dn, c cu trc hn, th hin r hn
mi lin h gia cc d liu.
Phng php tinh ch tng bc l mt th hin ca t duy gii quyt vn t trn xung,
gip cho ngi lp trnh c c mt nh hng th hin trong phong cch vit chng trnh.
Trnh vic m mm, xo i vit li nhiu ln, bin chng trnh thnh t giy nhp.
1.5. KIM TH
1.5.1. Chy th v tm li
Chng trnh l do con ngi vit ra, m l con ngi th ai cng c th nhm ln. Mt
chng trnh vit xong cha chc chy c ngay trn my tnh cho ra kt qu mong
mun. K nng tm li, sa li, iu chnh li chng trnh cng l mt k nng quan trng
ca ngi lp trnh. K nng ny ch c c bng kinh nghim tm v sa cha li ca chnh
mnh.
C ba loi li:
Li c php: Li ny hay gp nht nhng li d sa nht, ch cn nm vng ngn ng lp
trnh l . Mt ngi c coi l khng bit lp trnh nu khng bit sa li c php.
Li ci t: Vic ci t th hin khng ng thut ton nh, i vi li ny th phi xem
li tng th chng trnh, kt hp vi cc chc nng g ri sa li cho ng.
Chuyn
i hc S phm H Ni, 1999-2002
38
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.
Cu trc d liu v Gii thut
L Minh Hong
39
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.
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
Chuyn
i hc S phm H Ni, 1999-2002
40
2. PHN TCH THI GIAN THC HIN GII THUT
2.1. PHC TP TNH TON CA GII THUT
Vi mt bi ton khng ch c mt gii thut. Chn mt gii thut a ti kt qu nhanh nht
l mt i hi thc t. Nh vy cn c mt cn c no ni rng gii thut ny nhanh
hn gii thut kia ?.
Thi gian thc hin mt gii thut bng chng trnh my tnh ph thuc vo rt nhiu yu t.
Mt yu t cn ch nht l kch thc ca d liu a vo. D liu cng ln th thi gian
x l cng chm, chng hn nh thi gian sp xp mt dy s phi chu nh hng ca s
lng cc s thuc dy s . Nu gi n l kch thc d liu a vo th thi gian thc hin
ca mt gii thut c th biu din mt cch tng i nh mt hm ca n: T(n).
Phn cng my tnh, ngn ng vit chng trnh v chng trnh dch ngn ng y u nh
hng ti thi gian thc hin. Nhng yu t ny khng ging nhau trn cc loi my, v vy
khng th da vo chng khi xc nh T(n). Tc l T(n) khng th biu din bng n v thi
gian gi, pht, giy c. Tuy nhin, khng phi v th m khng th so snh c cc gii
thut v mt tc . Nu nh thi gian thc hin mt gii thut l T
1
(n) = n
2
v thi gian thc
hin ca mt gii thut khc l T
2
(n) = 100n th khi n ln, thi gian thc hin ca gii thut
T
2
r rng nhanh hn gii thut T
1
. Khi , nu ni rng thi gian thc hin gii thut t l
thun vi n hay t l thun vi n
2
cng cho ta mt cch nh gi tng i v tc thc hin
ca gii thut khi n kh ln. Cch nh gi thi gian thc hin gii thut c lp vi my
tnh v cc yu t lin quan ti my tnh nh vy s dn ti khi nim gi l phc tp tnh
ton ca gii thut.
Cho f v g l hai hm xc nh dng vi mi n. Hm f(n) c gi l O(g(n)) nu tn ti mt
hng s c > 0 v mt gi tr n
0
sao cho:
f(n) c.g(n) vi n n
0

Ngha l nu xt nhng gi tr n n
0
th hm f(n) s b chn trn bi mt hng s nhn vi
g(n). Khi , nu f(n) l thi gian thc hin ca mt gii thut th ta ni gii thut c cp l
g(n), k hiu: O(g(n))
(*)
hay (g(n)).
2.2. XC NH PHC TP TNH TON CA GII THUT
Vic xc nh phc tp tnh ton ca mt gii thut bt k c th rt phc tp. Tuy nhin,
trong thc t, i vi mt s gii thut ta c th phn tch bng mt s quy tc n gin:

(*)
K php O(.) c gi l k php ch O ln (big O notation)
Cu trc d liu v Gii thut
L Minh Hong
41
2.2.1. Quy tc cng
Nu on chng trnh P
1
c thi gian thc hin T
1
(n) =O(f(n)) v on chng trnh P
2
c
thi gian thc hin l T
2
(n) = O(g(n)) th thi gian thc hin P
1
ri n P
2
tip theo s l
T
1
(n) + T
2
(n) = O(max(f(n), g(n)))
Chng minh:
T
1
(n) = O(f(n)) nn n
1
v c
1
T
1
(n) c
1
.f(n) vi n n
1
.
T
2
(n) = O(g(n)) nn n
2
v c
2
T
2
(n) c
2
.g(n) vi n n
2
.
Chn n
0
= max(n
1
, n
2
) v c = max(c
1
, c
2
) ta c:
Vi n n
0
:
T
1
(n) + T
2
(n) c
1
.f(n) + c
2
.g(n) c.f(n) + c.g(n) c.(f(n) + g(n)) 2c.(max(f(n), g(n))).
Vy T
1
(n) + T
2
(n) = O(max(f(n), g(n))).
2.2.2. Quy tc nhn
Nu on chng trnh P c thi gian thc hin l T(n) = O(f(n)). Khi , nu thc hin k(n)
ln on chng trnh P vi k(n) = O(g(n)) th phc tp tnh ton s l O(g(n).f(n))
Chng minh:
Thi gian thc hin k(n) ln on chng trnh P s l k(n)T(n). Theo nh ngha:
c
k
0 v n
k
k(n) c
k
(g(n)) vi n n
k

c
T
0 v n
T
T(n) c
T
(f(n)) vi n n
T

Vy vi n max(n
T
, n
k
) ta c k(n).T(n) c
T
.c
k
(g(n).f(n))
2.2.3. Mt s tnh cht
Theo nh ngha v phc tp tnh ton ta c mt s tnh cht:
a) Vi P(n) l mt a thc bc k th O(P(n)) = O(n
k
). V th, mt thut ton c phc tp
cp a thc, ngi ta thng k hiu l O(n
k
)
b) Vi a v b l hai c s tu v f(n) l mt hm dng th log
a
f(n) = log
a
b.log
b
f(n). Tc l:
O(log
a
f(n)) = O(log
b
f(n)). Vy vi mt thut ton c phc tp cp logarit ca f(n), ngi ta
k hiu l O(logf(n)) m khng cn ghi c s ca logarit.
c) Nu mt thut ton c phc tp l hng s, tc l thi gian thc hin khng ph thuc
vo kch thc d liu vo th ta k hiu phc tp tnh ton ca thut ton l O(1).
d) Mt gii thut c cp l cc hm nh 2
n
, n!, n
n
c gi l mt gii thut c phc tp
hm m. Nhng gii thut nh vy trn thc t thng c tc rt chm. Cc gii thut c
cp l cc hm a thc hoc nh hn hm a thc th thng chp nhn c.
e) Khng phi lc no mt gii thut cp O(n
2
) cng tt hn gii thut cp O(n
3
). Bi nu nh
gii thut cp O(n
2
) c thi gian thc hin l 1000n
2
,
cn gii thut cp O(n
3
) li ch cn thi
Chuyn
i hc S phm H Ni, 1999-2002
42
gian thc hin l n
3
, th vi n < 1000, r rng gii thut O(n
3
) tt hn gii thut O(n
2
). Trn
y l xt trn phng din tnh ton l thuyt nh ngha gii thut ny "tt" hn gii
thut kia, khi chn mt thut ton gii mt bi ton thc t phi c mt s mm do nht
nh.
f) Cng theo nh ngha v phc tp tnh ton
Mt thut ton c cp O(1) cng c th vit l O(logn)
Mt thut ton c cp O(logn) cng c th vit l O(n)
Mt thut ton c cp O(n) cng c th vit l O(n.logn)
Mt thut ton c cp O(n.logn) cng c th vit l O(n
2
)
Mt thut ton c cp O(n
2
) cng c th vit l O(n
3
)
Mt thut ton c cp O(n
3
) cng c th vit l O(2
n
)
Vy phc tp tnh ton ca mt thut ton c nhiu cch k hiu, thng thng ngi ta
chn cp thp nht c th, tc l chn k php O(f(n)) vi f(n) l mt hm tng chm nht
theo n.
Di y l mt s hm s hay dng k hiu phc tp tnh ton v bng gi tr ca
chng tin theo di s tng ca hm theo i s n.
log
2
n n nlog
2
n n
2
n
3
2
n

0 1 0 1 1 2
1 2 2 4 8 4
2 4 8 16 64 16
3 8 24 64 512 256
4 16 64 256 4096 65536
5 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 O(1).
Vng lp dng 3 lp n ln php gn S := S + i, nn thi gian tnh ton t l thun vi n. Tc
l phc tp tnh ton l O(n).
Vy phc tp tnh ton ca thut ton trn l O(n).
Cn nu vit theo s nh sau:
Input n;
S := n * (n - 1) div 2;
Output S;
Th phc tp tnh ton ca thut ton trn l O(1), thi gian tnh ton khng ph thuc vo
n.
Cu trc d liu v Gii thut
L Minh Hong
43
2.2.4. Php ton tch cc
Da vo nhng nhn xt nu trn v cc quy tc khi nh gi thi gian thc hin gii
thut, ta ch cn ch n mt php ton m ta gi l php ton tch cc trong mt on
chng trnh. l mt php ton trong mt on chng trnh m s ln thc hin
khng t hn cc php ton khc.
Xt hai on chng trnh tnh e
x
bng cng thc gn ng:

=
= + + + +
n
i
i n
x
i
x
n
x x x
e
0
2
! !
...
! 2 ! 1
1 vi x v n cho trc.
{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 O(n
2
)
Ta c th coi php ton tch cc y l php
p := p * x / i.
S ln thc hin php ton ny l n.
Vy phc tp tnh ton ca thut ton l O(n).
2.3. PHC TP TNH TON VI TNH TRNG D LIU VO
C nhiu trng hp, thi gian thc hin gii thut khng phi ch ph thuc vo kch thc
d liu m cn ph thuc vo tnh trng ca d liu na. Chng hn thi gian sp xp mt
dy s theo th t tng dn m dy a vo cha c th t s khc vi thi gian sp xp mt
dy s sp xp ri hoc sp xp theo th t ngc li. Lc ny, khi phn tch thi gian
thc hin gii thut ta s phi xt ti trng hp tt nht, trng hp trung bnh v trng
hp xu nht. Khi kh khn trong vic xc nh phc tp tnh ton trong trng hp trung
bnh (bi vic xc nh T(n) trung bnh thng phi dng ti nhng cng c ton phc tp),
ngi ta thng ch nh gi phc tp tnh ton trong trng hp xu nht.
2.4. CHI PH THC HIN THUT TON
Khi nim phc tp tnh ton t ra l nh gi chi ph thc hin mt gii thut v mt
thi gian. Nhng chi ph thc hin gii thut cn c rt nhiu yu t khc na: khng gian b
nh phi s dng l mt v d. Tuy nhin, trn phng din phn tch l thuyt, ta ch c th
Chuyn
i hc S phm H Ni, 1999-2002
44
xt ti vn thi gian bi vic xc nh cc chi ph khc nhiu khi rt m h v phc tp.
i vi ngi lp trnh th khc, mt thut ton vi phc tp d rt thp cng s l v dng
nu nh khng th ci t c trn my tnh, chnh v vy khi bt tay ci t mt thut ton,
ta phi bit cch t chc d liu mt cch khoa hc, trnh lng ph b nh khng cn thit. C
mt quy lut tng i khi t chc d liu: Tit kim c b nh th thi gian thc hin
thng s chm hn v ngc li. Bit cn i, dung ho hai yu t l mt k nng cn
thit ca ngi lp trnh.

Bi tp
Bi 1
Chng minh mt cch cht ch: Ti sao vi P(n) l a thc bc k th mt gii thut cp O(P(n))
cng c th coi l cp O(n
k
)
Bi 2
Xc nh phc tp tnh ton ca nhng gii thut sau bng k php ch O ln:
a) on chng trnh tnh tng hai a thc:
P(x) = a
m
x
m
+ a
m-1
x
m-1
+ + a
1
x + a
0
v Q(x) = b
n
x
n
+ a
n-1
x
n-1
+ + b
1
x + b
0

c a thc
R(x) = cpxp + cp
-1
xp
-1
+ + c
1
x + c
0

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) = a
m
x
m
+ a
m-1
x
m-1
+ + a
1
x + a
0
v Q(x) = b
n
x
n
+ a
n-1
x
n-1
+ + b
1
x + b
0

c a thc
R(x) = c
p
x
p
+ c
p-1
x
p-1
+ + c
1
x + c
0

p := m + n;
for i := 0 to p do c[i] := 0;
for i := 0 to m do
for j := 0 to n do
c[i + j] := c[i + j] + a[i] * b[j];


Cu trc d liu v Gii thut
L Minh Hong
45
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.
Chuyn
i hc S phm H Ni, 1999-2002
46
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:
1) Cc con th khng bao gi cht
2) Hai thng sau khi ra i, mi cp th mi s sinh ra mt cp th con (mt c, mt ci)
3) Khi sinh con ri th c mi thng tip theo chng li sinh c mt cp con mi
Gi s t u thng 1 c mt cp mi ra i th n gia thng th n s c bao nhiu cp.
V d, n = 5, ta thy:
Gia thng th 1: 1 cp (ab) (cp ban u)
Gia thng th 2: 1 cp (ab) (cp ban u vn cha )
Gia thng th 3: 2 cp (AB)(cd) (cp ban u ra thm 1 cp con)
Gia thng th 4: 3 cp (AB)(cd)(ef) (cp ban u tip tc )
Gia thng th 5: 5 cp (AB)(CD)(ef)(gh)(ik) (c cp (AB) v (CD) cng )
By gi, ta xt ti vic tnh s cp th thng th n: F(n)
Nu mi cp th thng th n - 1 u sinh ra mt cp th con th s cp th thng th n s
l:
F(n) = 2 * F(n - 1)
Cu trc d liu v Gii thut
L Minh Hong
47
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;
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}
Chuyn
i hc S phm H Ni, 1999-2002
48

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:
1. C th nh ngha c bi ton di dng phi hp ca nhng bi ton cng loi nhng
nh hn hay khng ? Khi nim "nh hn" l th no ?
2. Trng hp c bit no ca bi ton s c coi l trng hp tm thng v c th gii
ngay c a vo phn neo ca php gii quy
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.
Cu trc d liu v Gii thut
L Minh Hong
49
1
2 3

Hnh 5: 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).
Chuyn
i hc S phm H Ni, 1999-2002
50
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 2
n
-1:
R rng l tnh cht ny ng vi n = 1, bi ta cn 2
1
- 1 = 1 ln chuyn a thc hin yu
cu
Vi n > 1; Gi s rng chuyn n - 1 a gia hai cc ta cn 2
n-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 (2
n-1
- 1) + 1 + (2
n-1
- 1) = 2
n
- 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
Cu trc d liu v Gii thut
L Minh Hong
51
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
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
Vit mt hm quy tnh
k
n
C theo cng thc truy hi sau:
1 C C
n
n
0
n
= =
Vi 0 < k < n:
k
1 n
1 k
1 n
k
n
C C C

+ =
Chng minh rng hm cho ra ng gi tr
)! k n ( ! k
! n
C
k
n

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

Chuyn
i hc S phm H Ni, 1999-2002
52
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:
A B C D E F G H I J K L
p

Nu mun chn mt phn t V vo mng ti v tr p, ta phi:
Dn tt c cc phn t t v tr p ti ti v tr n v sau mt v tr:
A B C D E F
p
G H I J K L

t gi tr V vo v tr p:
A B C D E F
p
V G H I J K L

Tng n ln 1
Xo phn t khi mng
Mng ban u:
A B C D E F G H I J K L
p

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:
Cu trc d liu v Gii thut
L Minh Hong
53
A B C D E F H I J K L
p

Gim n i 1
A B C D E F H I J K L
p

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 6: 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
A B C D E
Head

Hnh 7: Danh sch ni n
Chn phn t vo danh sch ni n:
Danh sch ban u:
A B C D E
Head
q p

Mun chn thm mt nt cha gi tr V vo v tr ca nt p, ta phi:
Chuyn
i hc S phm H Ni, 1999-2002
54
a) To ra mt nt mi NewNode cha gi tr V:
V

b) Tm nt q l nt ng trc nt p trong danh sch (nt c lin kt ti p).
b
1
) Nu tm thy th chnh li lin kt: q lin kt ti NewNode, NewNode lin kt ti p
A
Head
B C
V
q
D
p
E

b
2
) Nu khng c nt ng trc nt p trong danh sch th tc l p = Head, ta chnh
li lin kt: NewNode lin kt ti Head (c) v t li Head = NewNode
Xo phn t khi danh sch ni n:
Danh sch ban u:
A B C D E
Head
q p

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

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:
Cu trc d liu v Gii thut
L Minh Hong
55
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.
Data Gi tr
Lin kt trc
Lin kt sau

Hnh 8: 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
A B C D E
First
Last

Hnh 9: 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.
A B C D E

Hnh 10: Danh sch ni vng mt hng
Chuyn
i hc S phm H Ni, 1999-2002
56
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.
A B C D E

Hnh 11: 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.
Cu trc d liu v Gii thut
L Minh Hong
57
Bi 2
C n ngi nh s t 1 ti n ngi quanh mt vng trn (n 10000), cng chi mt tr chi:
Mt ngi no m 1, ngi k tip, theo chiu kim ng h m 2 c nh vy cho ti
ngi m n mt s nguyn t th phi ra khi vng trn, ngi k tip li m bt u t 1:
Hy lp chng trnh
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)
Chuyn
i hc S phm H Ni, 1999-2002
58
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;
Last: Integer;

procedure StackInit; {Khi to Stack rng}
begin
Last := 0;
end;

procedure Push(V: Integer); {y mt gi tr V vo Stack}
begin
if Last = max then WriteLn('Stack is full') {Nu Stack y th khng y c thm vo na}
else
begin
Inc(Last); Stack[Last] := V; {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 Last = 0 then WriteLn('Stack is empty') {Stack ang rng th khng ly c}
else
begin
Pop := Stack[Last]; Dec(Last); {Ly phn t cui ra khi mng}
end;
end;

begin
StackInit;
<Test>; {a mt vi lnh kim tra hot ng ca Stack}
Cu trc d liu v Gii thut
L Minh Hong
59
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
Last: PNode; {Con tr nh Stack}

procedure StackInit; {Khi to Stack rng}
begin
Last := nil;
end;

procedure Push(V: Integer); {y gi tr V vo Stack thm nt mi cha V v ni nt vo danh sch}
var
P: PNode;
begin
New(P); P^.Value := V; {To ra mt nt mi}
P^.Link := Last; Last := P; {Mc nt vo danh sch}
end;

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

begin
StackInit;
<Test>; {a mt vi lnh kim tra hot ng ca Stack}
Chuyn
i hc S phm H Ni, 1999-2002
60
end.
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 First v Last, First lu ch s phn t u Queue
cn Last lu ch s cui Queue, khi to Queue rng: First := 1 v Last := 0;
thm mt phn t vo Queue, ta tng Last ln 1 v a gi tr vo phn t th Last.
loi mt phn t khi Queue, ta ly gi tr v tr First v tng First ln 1.
Khi Last tng ln ht khong ch s ca mng th mng y, khng th y thm phn t
vo na.
Khi First > Last th tc l Queue ang rng
Nh vy ch mt phn ca mng t v tr First ti Last c s dng lm Queue.
program QueueByArray;
const
max = 10000;
var
Queue: array[1..max] of Integer;
First, Last: Integer;

procedure QueueInit; {Khi to mt hng i rng}
begin
First := 1; Last := 0;
end;

procedure Push(V: Integer); {y V vo hng i}
begin
if Last = max then WriteLn('Overflow')
else
begin
Inc(Last);
Queue[Last] := V;
end;
end;

function Pop: Integer; {Ly mt gi tr khi hng i, tr v trong kt qu hm}
begin
if First > Last then WriteLn('Queue is Empty')
else
begin
Pop := Queue[First];
Inc(First);
end;
end;

begin
Cu trc d liu v Gii thut
L Minh Hong
61
QueueInit;
<Test>; {a mt vi lnh kim tra hot ng ca Queue}
end.
Xem li chng trnh ci t Stack bng mt mng kch thc ti a 10000 phn t, ta thy
rng nu nh ta lm 6000 ln Push ri 6000 ln Pop ri li 6000 ln Push th vn khng c
vn g xy ra. L do l v ch s Last lu nh ca Stack s c tng ln 6000 ri li gim
n 0 ri li tng tr li ln 6000. Nhng i vi cch ci t Queue nh trn th s gp thng
bo li trn mng, bi mi ln Push, ch s cui hng i Last cng tng ln v khng bao gi
b gim i c. chnh l nhc im m ta ni ti khi ci t: Ch c cc phn t t v tr
First ti Last l thuc Queue, cc phn t t v tr 1 ti First - 1 l v ngha.
khc phc iu ny, ta m t Queue bng mt danh sch vng (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 First ti v tr Last l cc phn t ca Queue. C
thm mt bin n lu s phn t trong Queue. Vic thm mt phn t vo Queue tng ng
vi vic ta dch ch s Last theo 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 First ri dch ch s First
theo vng.
First
Last



Hnh 12: 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 First v
Last 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, First, Last: Integer;

procedure QueueInit; {Khi to Queue rng}
begin
First := 0; Last := 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
Chuyn
i hc S phm H Ni, 1999-2002
62
begin
Last := (Last + 1) mod max; {Last chy theo vng trn}
Queue[Last] := V;
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[First];
First := (First + 1) mod max; {First chy theo vng trn}
Dec(n);
end;
end;

begin
QueueInit;
<Test>; {a mt vi lnh kim tra hot ng ca Queue}
end.
5.2.2. M t Queue bng danh sch ni n kiu FIFO
Tng t nh ci t Stack bng danh sch ni n kiu LIFO, ta cng khng kim tra Queue
trn trong trng hp m t Queue bng danh sch ni n kiu FIFO.
program QueueByLinkedList;
type
PNode = ^TNode; {Kiu con tr ti mt nt ca danh sch}
TNode = record {Cu trc mt nt ca danh sch}
Value: Integer;
Link: PNode;
end;
var
First, Last: PNode; {Hai con tr ti nt u v nt cui ca danh sch}

procedure QueueInit; {Khi to Queue rng}
begin
First := 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 First = nil then First := P {Mc nt vo danh sch}
else Last^.Link := P;
Last := P; {Nt mi tr thnh nt cui, cp nht li con tr Last}
end;

function Pop: Integer; {Ly gi tr khi Queue, tr v trong kt qu hm}
var
P: PNode;
begin
if First = nil then WriteLn('Queue is empty')
else
begin
Pop := First^.Value; {Gn kt qu hm}
P := First^.Link; {Gi li nt tip theo First^ (Nt c y vo danh sch ngay sau First^)}
Cu trc d liu v Gii thut
L Minh Hong
63
Dispose(First); First := P; {Gii phng b nh cp cho First^, cp nht li First mi}
end;
end;

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 3
Hnh 13 l c cu ng tu ti mt ga xe la
1
A
B
C
2 n

Hnh 13: 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 4
Tng t nh bi 3, nhng vi s ng ray sau:
1
A
B
C
2 n

Hnh 14: Di chuyn toa tu (2)

Chuyn
i hc S phm H Ni, 1999-2002
64
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 n
1
, n
2
, , n
k
ln lt l gc ca cc cy T
1
, T
2
, , T
k
; cc cy
ny i mt khng c nt chung. Th nu cho nt n tr thnh cha ca cc nt n
1
, n
2
, ,
n
k
ta s c mt cy mi T. Cy ny c nt n l gc cn cc cy T
1
, T
2
, , T
k
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 15:
A
B C D
E F G H I
J K

Hnh 15: 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 15 c ch ra trong Hnh 16:
Cu trc d liu v Gii thut
L Minh Hong
65
A
B C D
E F G H I
J K
1
2
3
4

Hnh 16: 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.
*
+ -
D E / C
A B
(A / B + C) * (D - E)

Hnh 17: 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
Chuyn
i hc S phm H Ni, 1999-2002
66
Cc cy nh phn trong Hnh 18Error! Reference source not found. 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.
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
a) b) c) d)

Hnh 18: Cc dng cy nh phn suy bin
Cc cy trong Hnh 19 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.
2
4 5 6 7
3
1
4 5 5
2
4 5 6 7
3
1
e)
f)

Hnh 19: 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 2
i-1
, ti thiu l 1

(i 1).
S lng ti a cc nt trn mt cy nh phn c chiu cao h l 2
h
-1, ti thiu l h (h 1).
Cy nh phn hon chnh, khng y , c n nt th chiu cao ca n l h = [log
2
(n + 1)] + 1.
Cu trc d liu v Gii thut
L Minh Hong
67
Cy nh phn y c n nt th chiu cao ca n l h = log
2
(n + 1)
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.
B
C D F G
E
A
1
2 3
4 5 6 7

Hnh 20: 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 20 th khi lu tr bng mng, ta s c mng nh sau:
A
11
B
22
E
33
C
44
D
55
F
66
G
77

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
Chuyn
i hc S phm H Ni, 1999-2002
68
A
B
C
D
E
A B C D E
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
...

Hnh 21: Nhc im ca phng php biu din cy bng mng
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 22: 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.
Cu trc d liu v Gii thut
L Minh Hong
69
A
B C
D E G F
H I J K L

Hnh 23: 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:
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 23, nu ta duyt theo th t trc th cc gi tr s ln lt c lit k theo
th t:
A B D H I E J C F K G L
Chuyn
i hc S phm H Ni, 1999-2002
70
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 23, nu ta duyt theo th t gia th cc gi tr s ln lt c lit k theo
th t:
H D I B E J A K F C G L
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).
Cng vi cy Hnh 23, nu ta duyt theo th t sau th cc gi tr s ln lt c lit k
theo th t:
H I D J E B K F L G C A
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.
Cu trc d liu v Gii thut
L Minh Hong
71
Theo cch nh s ny, nt con th j ca nt i l: i * K + j. Nt cha ca nt x l nt (x - 1) div
K. Ta c th dng mt mng T nh s t 0 lu cc gi tr trn cc nt: Gi tr ti nt th i
c lu tr phn t T[i].
A
B
F
J
C
D
E
G H I
K
L
M
0
1
2
3
4
5
6
7 8 9
10
11
12
A
00
B
11
F
22
J
33
C
44
D
55
E
66
G
77
H
88
I
99
K
10 10
L
11 11
M
12 12

Hnh 24: 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.
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
Chuyn
i hc S phm H Ni, 1999-2002
72
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.
Gi li ch s ca nt gc.
V d:
A
B
F
I
C
D
E J
K
L
G H
1
2
3
4
5
6
7 8
9
10
11
12
B
11
F
22
C
33
I
44
D
55
E
66
G
77
H
88
A
99
J
10 10
K
11 11
L
12 12
Info:
3
11
5
22
6
33
7
44
8
55
10
66
11
77
12
88
1
99
2
10 10
4
11 11
Children:
1 (B) 2 (F) 4 (I) 9 (A)
0
11
3
22
5
33
5
44
8
55
8
66
8
77
8
88
8
99
11
10 10
11
11 11
11
12 12
Head:
11
13 13

Hnh 25: Biu din cy tng qut bng mng
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.
Cu trc d liu v Gii thut
L Minh Hong
73
INFO
FirstChild
Sibling

Hnh 26: 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.

Chuyn
i hc S phm H Ni, 1999-2002
74
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)
*
+ -
7 4 / 3
6 2

Hnh 27: 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 27,
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.
Cu trc d liu v Gii thut
L Minh Hong
75
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
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 ng mt Stack rng
Bc 2: c ln lt cc phn t ca biu thc RPN t tri qua phi (phn t ny c th l
hng, bin hay ton t) vi mi phn t , ta kim tra:
Nu phn t ny l mt ton hng th y gi tr ca n vo Stack.
Nu phn t ny l mt ton t , ta ly t Stack ra hai gi tr (y v x) sau p dng ton t
vo hai gi tr va ly ra, y kt qu tm c (x y) vo Stack (ra hai vo mt).
Chuyn
i hc S phm H Ni, 1999-2002
76
Bc 3: Sau khi kt thc bc 2 th ton b biu thc c c xong, trong Stack ch cn
duy nht mt phn t, phn t chnh l gi tr ca biu thc.

V d: Tnh biu thc 10 2 / 3 + 7 4 - * (tng ng vi biu thc (10 / 2 + 3) * (7 - 4)
c X l Stack
10 y vo Stack 10
2 y vo Stack 10, 2
/ Ly 2 v 10 khi Stack, Tnh c 10 / 2 = 5, y 5 vo Stack 5
3 y vo Stack 5, 3
+ Ly 3 v 5 khi Stack, tnh c 5 + 3 = 8, y 8 vo Stack 8
7 y vo Stack 8, 7
4 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. Chng trnh s
nhn Input l biu thc RPN gm cc s thc v cc ton t + - * / v cho Output l kt qu
biu thc .
Quy nh khun dng bt buc l hai s lin nhau trong biu thc RPN phi vit cch nhau t
nht mt du cch. qu trnh c mt phn t trong biu thc RPN c d dng hn, sau
bc nhp liu, ta c th hiu chnh i cht biu thc RPN v khun dng d c nht.
Chng hn nh thm v bt mt s du cch trong Input mi phn t (ton hng, ton t)
u cch nhau ng mt du cch, thm mt du cch vo cui biu thc RPN. Khi qu
trnh c ln lt cc phn t trong biu thc RPN c th lm nh sau:

T := '';
for p := 1 to Length(RPN) do {Xt cc k t trong biu thc RPN t tri qua phi}
if RPN[p] ' ' then T := T + RPN[p] {Nu RPN[p] khng phi du cch th ni k t vo T}
else {Nu RPN[p] l du cch th phn t ang c c xong, tip theo s l phn t khc}
begin
<X l phn t T>
T := ''; {Chun b c phn t mi}
end;

n gin, chng trnh khng kim tra li vit sai biu thc RPN, vic ch l thao tc t
m ch khng phc tp lm, ch cn xem li thut ton v ci thm cc m-un bt li ti mi
bc.

V d v Input / Output ca chng trnh:
Enter RPN Expression: 10 2/3 + 4 7 -*
10 2 / 3 + 4 7 - * = 24.0000
P_2_07_1.PAS * Tnh gi tr biu thc RPN
{$N+,E+}
program CalculateRPNExpression;
const
Opt = ['+', '-', '*', '/'];
Cu trc d liu v Gii thut
L Minh Hong
77
var
T, RPN: String;
Stack: array[1..255] of Extended;
p, Last: Integer;
{Cc thao tc i vi Stack}
procedure StackInit;
begin
Last := 0;
end;

procedure Push(V: Extended);
begin
Inc(Last); Stack[Last] := V;
end;

function Pop: Extended;
begin
Pop := Stack[Last]; Dec(Last);
end;

procedure Refine(var S: String); {Hiu chnh biu thc RPN v khun dng d c nht}
var
i: Integer;
begin
S := S + ' ';
for i := Length(S) - 1 downto 1 do {Thm nhng du cch gia ton hng v ton t}
if (S[i] in Opt) or (S[i + 1] in Opt) then
Insert(' ', S, i + 1);
for i := Length(S) - 1 downto 1 do {Xo nhng du cch tha}
if (S[i] = ' ') and (S[i + 1] = ' ') then Delete(S, i + 1, 1);
end;

procedure Process(T: String); {X l phn t T c c t biu thc RPN}
var
x, y: Extended;
e: Integer;
begin
if not (T[1] in Opt) then {T l ton hng}
begin
Val(T, x, e); Push(x); {i T thnh s v y gi tr vo Stack}
end
else {T l ton t}
begin
y := Pop; x := Pop; {Ra hai}
case T[1] of
'+': x := x + y;
'-': x := x - y;
'*': x := x * y;
'/': x := x / y;
end;
Push(x); {Vo mt}
end;
end;

begin
Write('Enter RPN Expression: '); ReadLn(RPN);
Refine(RPN);
StackInit;
T := '';
for p := 1 to Length(RPN) do {Xt cc k t ca biu thc RPN t tri qua phi}
if RPN[p] <> ' ' then T := T + RPN[p] {nu khng phi du cch th ni n vo sau xu T}
else {Nu gp du cch}
begin
Process(T); {X l phn t va c xong}
Chuyn
i hc S phm H Ni, 1999-2002
78
T := ''; {t li T chun b c phn t mi}
end;
WriteLn(RPN, ' = ', Pop:0:4); {In gi tr biu thc RPN c lu trong Stack}
end.
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 (2 * 3 + 7 / 8) * (5 - 1)
c X l Stack Output
( y vo Stack (
2 Hin th ( 2
* php "*" c u tin hn phn t nh Stack l "(", y "*"
vo Stack
(*
3 Hin th (* 2 3
+ php "+" u tin khng cao hn phn t nh Stack l "*", ly
ra v hin th "*". So snh tip, thy php "+" c u tin cao
hn phn t nh Stack l "(", y "+" vo Stack
(+ 2 3 *
7 Hin th (+ 2 3 * 7
Cu trc d liu v Gii thut
L Minh Hong
79
c X l Stack Output
/ php "/" c u tin hn phn t nh Stack l "+", y "/"
vo Stack
(+/
8 Hin th (+/ 2 3 * 7 8
) Ly ra v hin th cc phn t trong Stack ti khi ly phi du
ngoc m

2 3 * 7 8 / +
* Stack ang l rng, y * vo Stack *
( y vo Stack *(
5 Hin th *( 2 3 * 7 8 / + 5
- php "-" c u tin hn phn t nh Stack l "(", y "-"
vo Stack
*(-
1 Hin th *(- 2 3 * 7 8 / + 5 1
) Ly ra v hin th cc phn t nh Stack cho ti khi ly phi
du ngoc m
* 2 3 * 7 8 / + 5 1 -
Ht Ly ra v hin th ht cc phn t cn li trong Stack 2 3 * 7 8 / + 5 1 - *
Di y l chng trnh chuyn biu thc vit dng trung t sang dng RPN. Biu thc
trung t u vo s c hiu chnh sao cho mi thnh phn ca n c cch nhau ng mt
du cch, v thm mt du cch vo cui cho d tch cc phn t ra x l. V Stack ch
dng cha cc ton t v du ngoc m nn c th m t Stack di dng xu k t cho
n gin.
V d v Input / Output ca chng trnh:
Infix: (10*3 + 7 /8) * (5-1)
Refined: ( 10 * 3 + 7 / 8 ) * ( 5 - 1 )
RPN: 10 3 * 7 8 / + 5 1 - *
P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN
program ConvertInfixToRPN;
const
Opt = ['(', ')', '+', '-', '*', '/'];
var
T, Infix, Stack: String; {Stack dng cha ton t v du ngoc m nn dng String cho tin}
p: Integer;

{Cc thao tc i vi Stack}
procedure StackInit;
begin
Stack := '';
end;

procedure Push(V: Char);
begin
Stack := Stack + V;
end;

function Pop: Char;
begin
Pop := Stack[Length(Stack)];
Dec(Stack[0]);
end;

function Get: Char;
begin
Get := Stack[Length(Stack)];
end;

procedure Refine(var S: String); {Hiu chnh biu thc trung t v khun dng d c nht}
var
i: Integer;
begin
Chuyn
i hc S phm H Ni, 1999-2002
80
S := S + ' ';
for i := Length(S) - 1 downto 1 do {Thm nhng du cch trc v sau mi ton t v du ngoc}
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;

function Priority(Ch: Char): Integer; {Hm ly mc u tin ca Ch}
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];
if not (c in Opt) then Write(T, ' ')
else
case c of
'(': Push(c);
')': repeat
x := Pop;
if x <> '(' then Write(x, ' ');
until x = '(';
'+', '-', '*', '/':
begin
while (Stack <> '') and (Priority(c) <= Priority(Get)) do
Write(Pop, ' ');
Push(c);
end;
end;
end;

begin
Write('Infix = '); ReadLn(Infix);
Refine(Infix);
WriteLn('Refined: ', Infix);
Write('RPN: ');
T := '';
for p := 1 to Length(Infix) do
if Infix[p] <> ' ' then T := T + Infix[p]
else
begin
Process(T);
T := '';
end;
while Stack <> '' do Write(Pop, ' ');
WriteLn;
end.
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
Cu trc d liu v Gii thut
L Minh Hong
81
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 sang dng RPN, biu thc trung t c c nhng
php ton mt ngi: Php ly s i (-x), php lu tha x
y
(x^y), li gi hm s hc (sqrt, exp,
abs v.v)
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
c) A * (B + -C) d) A - (B + C)
d/e

e) A and B or C f) A and (B or not C)
g) (A or B) and (C or (D and not E)) h) (A = B) or (C = D)
i) (A < 9) and (A > 3) or not (A > 0)
j) ((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.
Chuyn
i hc S phm H Ni, 1999-2002
82
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
1 A100 Nguyn Vn A 20
2 B200 Trn Th B 25
3 X150 Phm Vn C 18
4 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
Cu trc d liu v Gii thut
L Minh Hong
83
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 1
25 2
18 3
21 4

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

lt th i, ta chn trong dy kho k
i
, k
i+1
, , kn 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
.
Cu trc d liu v Gii thut
L Minh Hong
85
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 t k
i
ti k
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, ta 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 cp l O(n
2
)
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, phn t 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 s k
i-1
, ,k
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, ta 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 cp l O(n
2
). Bt k tnh trng d liu vo nh th
no.
8.4. THUT TON SP XP KIU CHN
Xt dy kho k
1
, k
2
, , k
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
Chuyn
i hc S phm H Ni, 1999-2002
86
th t sp xp. Mt cch tng qut, ta s sp xp dy k
1
, k
2
, , k
i
trong iu kin dy k
1
,
k
2
, , k
i-1
sp xp ri bng cch chn k
i
vo dy ti v tr ng khi sp xp.
procedure InsertionSort;
var
i, j: Integer;
tmp: TKey; {Bin gi li gi tr kho chn}
begin
for i := 2 to n do {Chn gi tr k
i
vo dy k
1
,, k
i-1
ton on k
1
, k
2
,, k
i
tr thnh sp xp}
begin
tmp := k
i
; {Gi li gi tr k
i
}
j := i - 1;
while (j > 0) and (tmp < k
j
) do {So snh gi tr cn chn vi ln lt cc kho k
j
(i-1j0)}
begin
k
j+1
:= k
j
; {y li gi tr k
j
v pha sau mt v tr, to ra "khong trng" ti v tr j}
j := j - 1;
end;
k
j+1
:= tmp; {a gi tr chn vo "khong trng" mi to ra}
end;
end;
i vi thut ton sp xp kiu chn, th chi ph thi gian thc hin thut ton ph thuc vo
tnh trng dy kho ban u. Nu coi php ton tch cc y l php so snh tmp < k
j
th:
Trng hp tt nht ng vi dy kho sp xp ri, mi lt ch cn 1 php so snh, v nh
vy tng s php so snh c thc hin l n - 1.
Trng hp ti t nht ng vi dy kho c th t ngc vi th t cn sp th lt th i,
cn c i - 1 php so snh v tng s php so snh l:
(n - 1) + (n - 2) + + 1 = n * (n - 1) / 2.
Trng hp cc gi tr kho xut hin mt cch ngu nhin, ta c th coi xc sut xut hin
mi kho l ng kh nng, th c th coi lt th i, thut ton cn trung bnh i / 2 php so
snh v tng s php so snh l:
(1 / 2) + (2 / 2) + + (n / 2) = (n + 1) * n / 4.
Nhn v kt qu nh gi, ta c th thy rng thut ton sp xp kiu chn t ra tt hn so vi
thut ton sp xp chn v sp xp ni bt. Tuy nhin, chi ph thi gian thc hin ca thut
ton sp xp kiu chn vn cn kh ln. V xt trn phng din tnh ton l thuyt th cp
ca thut ton sp xp kiu chn vn l O(n
2
).
C th ci tin thut ton sp xp chn nh nhn xt: Khi dy kho k
1
, k
2
, , k
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
tt hn cp phc tp ca thut ton bi trong trng hp xu nht, ta phi mt n - 1 ln
chn v ln chn th i ta phi dch li i kho to ra khong trng trc khi y gi tr kho
chn vo ch trng .
Cu trc d liu v Gii thut
L Minh Hong
87
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 phn t t k
inf
ti k
i-1
li sau mt v tr>
k
inf
:= tmp; {a gi tr tmp vo "khong trng" mi to ra}
end;
end;
8.5. SHELLSORT
Nhc im ca thut ton sp xp kiu chn th hin khi m ta lun phi chn mt kha vo
v tr gn u dy. Trong trng hp , ngi ta s dng phng php ShellSort.
Xt dy kho: k
1
, k
2
, , k
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: 4 6 7 2 3 5 1 9 8
Dy con 1: 4 2 1
Dy con 2: 6 3 9
Dy con 3: 7 5 8
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
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.
Chuyn
i hc S phm H Ni, 1999-2002
88
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;
8.6. THUT TON SP XP KIU PHN ON (QUICKSORT)
8.6.1. T tng ca QuickSort
QuickSort 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 khng c mt thut ton sp xp no
nhanh hn QuickSort v mt tc trung bnh (theo ti bit). Ngi sng lp ra n l C.A.R.
Hoare mnh dn t tn cho n l sp xp "NHANH".
tng ch o ca phng php c th tm tt nh sau: Sp xp dy kho k
1
, k
2
, , k
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 1 phn t th khng cn phi lm g c, cn nu on c
t nht 2 phn t, ta chn mt kho ngu nhin no ca on lm "cht" (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.
Cu trc d liu v Gii thut
L Minh Hong
89
procedure QuickSort;

procedure Partition(L, H: Integer); {Sp xp on t k
L
, k
L+1
, , k
H
}
var
i, j: Integer;
Pivot: TKey; {Bin lu gi tr kho cht}
begin
if L H then Exit; {Nu on ch c 1 phn t th khng phi lm g c}
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.
k
L
k
i
k
j
k
H
Kho cht Kho cht

Hnh 28: 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 trc kho k
j

th li o gi tr ca chng, cho i tin v cui mt bc v j li v u mt bc. Vy th qu
trnh hon chuyn phn t trong vng lp 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 29).
Chuyn
i hc S phm H Ni, 1999-2002
90
k
L
k
j
k
i
k
H
Kho cht
Kho cht

Hnh 29: 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 ti t nht, l khi chn kho cht, ta chn phi kho nh nht hay ln nht trong
on, khi php phn on s chia thnh mt on gm n - 1 phn t v on cn li ch c
1 phn t. C th chng minh trong trng hp ny, thi gian thc hin gii thut T(n) = O(n
2
)
Trng hp tt nht, php phn on ti mi bc s chia c thnh hai on bng nhau.
Tc l khi chn kho cht, ta chn ng trung v ca dy kho. C th chng minh trong
trng hp ny, thi gian thc hin gii thut T(n) = O(nlog
2
n)
Trng hp cc kho c phn b ngu nhin, th trung bnh thi gian thc hin gii thut
cng l T(n) = O(nlog
2
n).
Vic tnh ton chi tit, c bit l khi xc nh T(n) trung bnh, phi dng cc cng c ton
phc tp, ta ch cng nhn nhng kt qu trn.
8.6.2. Vi ci tin ca QuickSort
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. Mt ci tin
sau c th khc phc c hin tng trn ngn xp nhng cng ht sc chm trong trng
hp xu, k thut ny khi phn c [L, H] c hai on con [L, j] v [i, H] th ch gi
quy tip tc i vi on ngn, v lp li qu trnh phn on i vi on di.
Cu trc d liu v Gii thut
L Minh Hong
91
procedure QuickSort;

procedure Partition(L, H: Integer); {Sp xp on t k
L
, k
L+1
, , k
H
}
var
i, j: Integer;
begin
repeat
if L H then Exit;
<Phn on [L, H] c hai on con [L, j] v [i, H]>
if <on [L, j] ngn hn on [i, H]> then
begin
Partition(L, j); L := i;
end
else
begin
Partition(i, H); H := j;
end;
until False;
end;

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

Hnh 30: Heap
8.7.2. Vun ng
Trong bi hc v cy, ta bit mt dy kho k
1
, k
2
, , k
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.
Cu trc d liu v Gii thut
L Minh Hong
93
4
10 9
7 8 6 1
3 5 2
10
8 9
7 4 6 1
3 5 2

Hnh 31: Vun ng
8.7.3. T tng ca HeapSort
u tin, dy kho k
1
, k
2
, , k
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
tnh ti k
n
na (Hnh 32). Cn li dy kho k
1
, k
2
, , k
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 33).
V d:
10
8 9
7 4 6 1
3 5 2
2
8 9
7 4 6 1
3 5 10

Hnh 32: o gi tr k
1
cho k
n
v xt phn cn li
Chuyn
i hc S phm H Ni, 1999-2002
94
8 6
7 4 2 1
3 5
9
8 6
7 4 2 1
3 9
5

Hnh 33: 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 phn t theo tng trn:
procedure HeapSort;
var
r, i: Integer;

procedure Adjust(root, endnode: Integer); {Vun cy gc Root thnh ng}
var
c: Integer;
Key: TKey; {Bin lu gi tr kho nt Root}
begin
Key := 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 khng qu [log2(n + 1)] + 1. C cho l trong trng hp xu nht th tc Adjust phi
thc hin tm ng i t nt gc ti nt l xa nht th ng i tm c cng ch di bng
chiu cao ca cy v phc tp ca mt ln gi Adjust l O(log2n). T c th suy ra,
trong trng hp xu nht, phc tp ca HeapSort cng ch l O(nlog
2
n). Vic nh gi
Cu trc d liu v Gii thut
L Minh Hong
95
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(nlog
2
n).
C th nhn xt thm l QuickSort quy cn thm khng gian nh cho Stack, cn HeapSort
ngoi mt nt nh ph thc hin vic i ch, n khng cn dng thm g khc. HeapSort
tt hn QuickSort v phng din l thuyt bi khng c trng hp ti t no HeapSort c
th mc phi. Cng nh c HeapSort m gi y khi gii mi bi ton c cha m-un sp
xp, ta c th ni rng phc tp ca th tc sp xp khng qu O(nlog
2
n).
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
, k
2
, , k
n
l cc s
nguyn nm trong khong t 0 ti M (TKey = 0..M).
Ta dng dy c
0
, c
1
, , c
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:
0 0 1 1 1 2 2 3 3 3
Tc l sau khi sp xp:
Gi tr 0 ng trong on t v tr 1 ti v tr 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
1
+ + c
v-1
+ 1 ti v tr c
0
+ c
1
+ c
2
+ + 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 x1, x2, , xn. Sau duyt li
dy kho k, mi khi gp kho mang gi tr V ta a gi tr vo kho xc
v
v gim cv i 1.
for i := n downto 1 do
begin
V := k
i
;
X
c
V
:= k
i
; c
V
:= c
V
- 1;
end;
Chuyn
i hc S phm H Ni, 1999-2002
96
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}
x: 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
;
x
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(max(M, n)). Nhc im ca php m
phn phi l khi M qu ln th cho d n nh cng khng th lm c.
C th c thc mc ti sao trong thao tc dng dy kho x, php duyt dy kho k theo th t
no th kt qu sp xp cng nh vy, vy ti sao ta li chn php duyt ngc t di ln?.
tr li cu hi ny, ta phi phn tch thm mt c trng ca cc thut ton sp xp:
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,
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
Cu trc d liu v Gii thut
L Minh Hong
97
anh ta trong danh sch. Trong thut ton sp xp c p dng, c ch no cn so snh hai
sinh vin A v B xem anh no phi ng trc, trc ht ta quan tm ti im s: Nu im
ca A khc im ca B th anh no im cao hn s ng trc, nu im s bng nhau th
anh no c Index nh hn s ng trc.
Trong mt s bi ton, tnh n nh ca thut ton sp xp quyt nh ti c tnh ng n ca
ton thut ton ln. Chnh tnh "nhanh" ca 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 (RADIXSORT)
Bi ton t ra l: Cho dy kho l cc s t nhin k
1
, k
2
, , k
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 (Exchange RadixSort)
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:
1 0 1 1
3 2 1 0
11 =
bit
(z = 4)

Hnh 34: nh s cc bit
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:
Chuyn
i hc S phm H Ni, 1999-2002
98
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

Trc ht ta chia on da vo bit 2 (bit cao nht):
001 011 011 010 101 110 111 100 100 101 110 111

Sau chia tip hai on to ra da vo bit 1:
001 011 011 010 101 101 100 100 111 110 110 111

Cui cng, chia tip nhng on to ra da vo bit 0:
001 010 011 011 100 100 101 101 110 110 111 111

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 phn t cn li, nhng vic chia on khng bao gi b ri vo qu trnh quy v hn
bi nhng ln quy tip theo s phn on da vo bit b - 1, b - 2 v nu xt n bit 0 s
phi dng li. Cng vic cn li l c gng hiu on chng trnh sau v phn tch xem ti
sao n hot ng ng:
Cu trc d liu v Gii thut
L Minh Hong
99
procedure ExchangeRadixSort;
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 RadixSort, 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 RadixSort l O(n.z). V phc tp trung bnh ca RadixSort l O(n.min(z,
log
2
n)).
Ni chung, RadixSort ci t nh trn ch th hin tc ti a trn cc h thng cho php x
l trc tip trn cc bit: H thng phi cho php ly mt bit ra d dng v thao tc vi thi
gian nhanh hn hn so vi thao tc trn Byte v Word. Khi RadixSort 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 RadixSort. 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 RadixSort)
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

Chuyn
i hc S phm H Ni, 1999-2002
100
Trc ht, ta sp xp dy kho ny theo th t tng dn ca ch s hng n v bng mt
thut ton sp xp khc, c dy kho:
570 821 742 563 744 925 166 817 638 639

Sau , ta sp xp dy kho mi to thnh theo th t tng dn ca ch s hng chc bng
mt thut ton sp xp n nh, c dy kho:
817 821 925 638 639 742 744 563 166 570

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

Lp lun tng t nh trn da vo tnh n nh ca php sp xp, dy kho thu c s c
th t tng dn v gi tr to thnh bi c ba ch s, l dy kho sp.
Nhn xt:
Ta hon ton c th coi s ch s ca mi kho l bng nhau, nh v d trn nu c s 15
trong dy kho th ta c th coi n l 015.
Cng t v d, ta c th thy rng s lt thao tc sp xp phi p dng ng bng s ch s
to thnh mt kho. Vi mt h c s ln, biu din mt gi tr kho s phi dng t ch s
hn. V d s 12345 trong h thp phn phi dng ti 5 ch s, cn trong h c s 1000 ch
cn dng 2 ch s AB m thi, y A l ch s mang gi tr 12 cn B l ch s mang gi tr
345.
Tc ca sp xp c s trc tip ph thuc rt nhiu vo thut ton sp xp n nh ti mi
bc. Khng c mt la chn no khc tt hn php m phn phi. Tuy nhin, php m
phn phi c th khng ci t c hoc km hiu qu nu nh tp gi tr kho qu rng,
khng cho php dng ra dy cc bin m hoc phi s dng dy bin m qu di (iu ny
xy ra nu chn h c s qu ln).
Mt la chn khn ngoan l nn chn h c s thch hp cho tng trng hp c th dung
ho ti mc ti u nht ba mc tiu:
Vic ly ra mt ch s ca mt s c thc hin d dng
S dng t ln gi php m phn phi.
Php m phn phi thc hin nhanh
Cu trc d liu v Gii thut
L Minh Hong
101
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 radix
p
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.
Chuyn
i hc S phm H Ni, 1999-2002
102
8.11. THUT TON SP XP TRN (MERGESORT)
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 Dy 2 Kho nh nht trong 2 dy Min sp xp
(1, 3, 10, 11) (2, 4, 9) 1 (1)
(3, 10, 11) (2, 4, 9) 2 (1, 2)
(3, 10, 11) (4, 9) 3 (1, 2, 3)
(10, 11) (4, 9) 4 (1, 2, 3, 4)
(10, 11) (9) 9 (1, 2, 3, 4, 9)
(10, 11)
Dy 2 l , a nt dy 1 vo min sp
xp
(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
, k
2
, , k
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 35)
3 6 5 4 9 8 1 0 2 7
3 6 4 5 8 9 0 1 2 7
3 4 5 6 0 1 8 9 2 7
0 1 3 4 5 6 8 9 2 7
0 1 2 3 4 5 6 7 8 9

Hnh 35: Thut ton sp xp trn
tin hnh thut ton sp xp trn hai ng trc tip, ta vit cc th tc:
Th tc Merge(var x, y: TArray; a, b, c: Integer); th tc ny trn mch x
a
, x
a+1
, , x
b
vi
mch x
b+1
, x
b+2
, x
c
c mch y
a
, y
a+1
, , y
c
.
Cu trc d liu v Gii thut
L Minh Hong
103
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
x
len
v x
len+1
x
2len
thnh mch y
1
y
2len
.
Trn mch x
2len+1
x
3len
v x
3len+1
x
4len
thnh mch y
2len+1
y
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
, t
2
, , t
n
. Trc ht ta
gi MergeByLength(k, t, 1) trn hai phn t lin tip ca k thnh mt mch trong t, sau
li gi MergeByLength(t, k, 2) trn hai mch lin tip trong t thnh mt mch trong k, ri
li gi MergeByLength(k, t, 4) trn hai mch lin tip trong k thnh mt mch trong
t Nh vy k v t c s dng vi vai tr lun phin: mt dy cha cc mch v mt dy
dng trn cc cp mch lin tip c mch ln hn.
Chuyn
i hc S phm H Ni, 1999-2002
104
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
X
b
v X
b+1
X
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 phn t 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
, Y
p+1
, , Yc) := (X
i
,

X
i+1
, , X
b
) {Mch 2 ht trc, a phn cui ca mch 1 vo min sp xp}
else (Y
p
, Y
p+1
, , Yc) := (X
j
,

X
j+1
, , X
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
x
b
v x
b+1
x
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
, Y
a+1
, , Y
n
) := (X
a
, X
a+1,
, X
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 phn t trong
dy kho c chuyn hon ton sang min sp xp, nn phc tp ca th tc
MergeByLength l O(n). Th tc MergeSort c vng lp thc hin khng qu log2n + 1 li
gi MergeByLength bi bin len s c tng theo cp s nhn cng bi 2. T suy ra
phc tp ca MergeSort l O(nlog
2
n) bt chp trng thi d liu vo.
Cu trc d liu v Gii thut
L Minh Hong
105
Cng l nhng thut ton sp xp tng qut vi phc tp trung bnh nh nhau, nhng
khng ging nh QuickSort hay HeapSort, MergeSort c tnh n nh. Nhc im ca
MergeSort l n phi dng thm mt vng nh cha dy kho ph c kch thc bng dy
kho ban u.
Ngi ta cn c th li dng c trng thi d liu vo khin MergeSort chy nhanh hn:
ngay t u, ta khng coi mi phn t ca dy kho l mt mch m coi nhng on c
sp trong dy kho l mt mch. Bi mt dy kho bt k c th coi l gm cc mch sp
xp nm lin tip nhau. Khi ngi ta gi phng php ny l phng php trn hai
ng t nhin.
Tng qut hn na, thay v php trn hai mch, ngi ta c th s dng php trn k mch, khi
ta c thut ton sp xp trn k ng.
8.12. CI T
Ta s ci t tt c cc thut ton sp xp nu trn, vi d liu vo c t trong file vn bn
SORT.INP cha khng nhiu hn 15000 kho v gi tr mi kho l s t nhin khng qu
15000. Kt qu c ghi ra file vn bn SORT.OUT cha dy kho c sp, mi kho trn
mt dng.
SORT.INP
1 4 3 2 5
7 9 8
10 6
SORT.OUT
1
2
3
4
5
6
7
8
9
10
Chng trnh c giao din di dng menu, mi chc nng tng ng vi mt thut ton sp
xp. Ti mi thut ton sp xp, ta thm mt vi lnh o thi gian thc t ca n (ch o thi
gian thc hin gii thut, khng tnh thi gian nhp liu v in kt qu).
thut ton sp xp bng c s theo cch hon v phn t, ta chn h nh phn. thut ton
sp xp bng c s trc tip, ta s dng h c s 256, khi mt gi tr s t nhin x 15000
s c biu din bng hai ch s trong h 256:
Ch s hng n v l x mod 256 = x mod 2
8
= x and 255 = x and $FF;
Ch s cn li (= ch s hng cao nht) l x div 256 = x div 2
8
= x shr 8;
P_2_08_1.PAS * Cc thut ton sp xp
{$M 65520 0 655360}
program SortingAlgorithmsDemo;
uses crt;
const
InputFile = 'SORT.INP';
OutputFile = 'SORT.OUT';
Chuyn
i hc S phm H Ni, 1999-2002
106
max = 15000;
maxV = 15000;
Interval = 1193180 / 65536; {Tn s ng h 18.2 ln / giy}
nMenu = 12;
SMenu: array[0..nMenu] of String =
(
' 0. Display Input',
' 1. SelectionSort',
' 2. BubbleSort',
' 3. InsertionSort',
' 4. InsertionSort with binary searching',
' 5. ShellSort',
' 6. QuickSort',
' 7. HeapSort',
' 8. Distribution Counting',
' 9. Exchange RadixSort',
' 10. Straight RadixSort',
' 11. MergeSort',
' 12. Exit'
);
type
TArr = array[1..max] of Integer;
TCount = array[0..maxV] of Integer;
var
k: TArr;
n: Integer;
selected: Integer;
StTime: LongInt;
Time: LongInt absolute 0:$46C; {Bin m nhp ng h}

procedure Enter; {Trc mi thut ton sp xp, gi th tc ny nhp liu}
var
f: Text;
begin
Assign(f, InputFile); Reset(f);
n := 0;
while not SeekEof(f) do
begin
Inc(n); Read(f, k[n]);
end;
Close(f);
StTime := Time; {Nhp xong bt u tnh thi gian ngay}
end;

procedure PrintInput; {In d liu}
var
i: Integer;
begin
Enter;
for i := 1 to n do Write(k[i]:8);
Write('Press any key to return to menu');
ReadKey
end;

procedure PrintResult; {In kt qu ca mi thut ton sp xp}
var
f: Text;
i: Integer;
ch: Char;
begin
{Trc ht in ra thi gian thc thi}
WriteLn('Running Time = ', (Time - StTime) / Interval:1:10, ' (s)');
Assign(f, OutputFile); Rewrite(f);
for i := 1 to n do WriteLn(f, k[i]);
Cu trc d liu v Gii thut
L Minh Hong
107
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); {Th tc o gi tr hai tham bin x, y}
var
t: Integer;
begin
t := x; x := y; y := t;
end;

(** SELECTIONSORT *************************************************)
procedure SelectionSort;
var
i, j, jmin: Integer;
begin
Enter;
for i := 1 to n - 1 do
begin
jmin := i;
for j := i + 1 to n do
if k[j] < k[jmin] then jmin := j;
if jmin <> i then Swap(k[i], k[jmin]);
end;
PrintResult;
end;

(** BUBBLESORT ****************************************************)
procedure BubbleSort;
var
i, j: Integer;
begin
Enter;
for i := 2 to n do
for j := n downto i do
if k[j - 1] > k[j] then Swap(k[j - 1], k[j]);
PrintResult;
end;

(** INSERTIONSORT *************************************************)
procedure InsertionSort;
var
i, j, tmp: Integer;
begin
Enter;
for i := 2 to n do
begin
tmp := k[i]; j := i - 1;
while (j > 0) and (tmp < k[j]) do
begin
k[j + 1] := k[j];
Dec(j);
end;
k[j + 1] := tmp;
end;
PrintResult;
Chuyn
i hc S phm H Ni, 1999-2002
108
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 *****************************************************)
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
Cu trc d liu v Gii thut
L Minh Hong
109
if i < j then Swap(k[i], k[j]);
Inc(i); Dec(j);
end;
until i > j;
Partition(L, j); Partition(i, H);
end;

begin
Enter;
Partition(1, n);
PrintResult;
end;

(** HEAPSORT ******************************************************)
procedure HeapSort;
var
r, i: Integer;

procedure Adjust(root, endnode: Integer);
var
key, c: Integer;
begin
key := k[root];
while root shl 1 <= endnode do
begin
c := root shl 1;
if (c < endnode) and (k[c] < k[c + 1]) then Inc(c);
if k[c] <= key then Break;
k[root] := k[c]; root := c;
end;
k[root] := key;
end;

begin
Enter;
for r := n shr 1 downto 1 do Adjust(r, n);
for i := n downto 2 do
begin
Swap(k[1], k[i]);
Adjust(1, i - 1);
end;
PrintResult;
end;

(** DISTRIBUTION COUNTING ******************************************)
procedure DistributionCounting;
var
x: TArr;
c: TCount;
i, V: Integer;
begin
Enter;
FillChar(c, SizeOf(c), 0);
for i := 1 to n do Inc(c[k[i]]);
for V := 1 to MaxV do c[V] := c[V - 1] + c[V];
for i := n downto 1 do
begin
V := k[i];
x[c[V]] := k[i];
Dec(c[V]);
end;
k := x;
PrintResult;
end;
Chuyn
i hc S phm H Ni, 1999-2002
110

(** EXCHANGE RADIXSORT ********************************************)
procedure RadixSort;
const
MaxBit = 13;
var
MaskBit: array[0..MaxBit] of Integer;
MaxValue, i: Integer;

procedure Partition(L, H, BIndex: Integer);
var
i, j, Mask: Integer;
begin
if L >= H then Exit;
i := L; j := H; Mask := MaskBit[BIndex];
repeat
while (i < j) and (k[i] and Mask = 0) do Inc(i);
while (i < j) and (k[j] and Mask <> 0) do Dec(j);
Swap(k[i], k[j]);
until i = j;
if k[j] and Mask = 0 then Inc(j);
if BIndex > 0 then
begin
Partition(L, j - 1, BIndex - 1); Partition(j, H, BIndex - 1);
end;
end;

begin
Enter;
for i := 0 to MaxBit do MaskBit[i] := 1 shl i;
maxValue := k[1];
for i := 2 to n do
if k[i] > MaxValue then maxValue := k[i];
i := 0;
while (i < MaxBit) and (MaskBit[i + 1] <= MaxValue) do Inc(i);
Partition(1, n, i);
PrintResult;
end;

(** STRAIGHT RADIXSORT ********************************************)
procedure StraightRadixSort;
const
Radix = 256;
nDigit = 2;
var
t: TArr;
p: Integer;
Flag: Boolean;

function GetDigit(key, p: Integer): Integer;
begin
if p = 0 then GetDigit := key and $FF
else GetDigit := key shr 8;
end;

procedure DCount(var x, y: TArr; p: Integer);
var
c: array[0..Radix - 1] of Integer;
i, d: Integer;
begin
FillChar(c, SizeOf(c), 0);
for i := 1 to n do
begin
d := GetDigit(x[i], p); Inc(c[d]);
Cu trc d liu v Gii thut
L Minh Hong
111
end;
for d := 1 to Radix - 1 do c[d] := c[d - 1] + c[d];
for i := n downto 1 do
begin
d := GetDigit(x[i], p);
y[c[d]] := x[i];
Dec(c[d]);
end;
end;

begin
Enter;
Flag := True;
for p := 0 to nDigit - 1 do
begin
if Flag then DCount(k, t, p)
else DCount(t, k, p);
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;

(** MERGESORT *****************************************************)
procedure MergeSort;
var
t: TArr;
Flag: Boolean;
len: Integer;

procedure Merge(var Source, Dest: TArr; a, b, c: Integer);
var
i, j, p: Integer;
begin
p := a; i := a; j := b + 1;
while (i <= b) and (j <= c) do
begin
if Source[i] <= Source[j] then
begin
Dest[p] := Source[i]; Inc(i);
end
else
begin
Dest[p] := Source[j]; Inc(j);
end;
Inc(p);
end;
if i <= b then
Move(Source[i], Dest[p], (b - i + 1) * SizeOf(Source[1]))
else
Move(Source[j], Dest[p], (c - j + 1) * SizeOf(Source[1]));
end;

procedure MergeByLength(var Source, Dest: TArr; len: Integer);
var
a, b, c: Integer;
begin
a := 1; b := len; c := len shl 1;
while c <= n do
begin
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)
Chuyn
i hc S phm H Ni, 1999-2002
112
else
Move(Source[a], Dest[a], (n - a + 1) * SizeOf(Source[1]));
end;

begin
Enter;
len := 1; Flag := True;
FillChar(t, SizeOf(t), 0);
while len < n do
begin
if Flag then MergeByLength(k, t, len)
else MergeByLength(t, k, len);
len := len shl 1;
Flag := not Flag;
end;
if not Flag then k := t;
PrintResult;
end;
(*******************************************************************)

function MenuSelect: Integer;
var
ch: Integer;
begin
Clrscr;
WriteLn('Sorting Algorithms Demos; Input: SORT.INP; Output: SORT.OUT');
for ch := 0 to nMenu do WriteLn(SMenu[ch]);
Write('Enter your choice: '); ReadLn(ch);
MenuSelect := ch;
end;

begin
repeat
selected := MenuSelect;
WriteLn(SMenu[selected]);
case selected of
0: PrintInput;
1: SelectionSort;
2: BubbleSort;
3: InsertionSort;
4: AdvancedInsertionSort;
5: ShellSort;
6: QuickSort;
7: HeapSort;
8: DistributionCounting;
9: RadixSort;
10: StraightRadixSort;
11: MergeSort;
12: Halt;
end;
until False;
end.

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. Tuy vy, vic o thi gian thc thi ca
tng thut ton sp xp vn cn thit nu ta mun so snh tc ca cc thut ton cng cp
phc tp bi cc tnh ton trn l thuyt i khi b lch so vi thc t v nhiu l do khc nhau.
Cu trc d liu v Gii thut
L Minh Hong
113
C mt vn t ra l ngoi nhng thut ton sp xp cp O(n
2
), rt kh c th o c tc
trung bnh ca nhng thut ton sp xp cn li khi m chng u chy khng ti mt nhp
ng h thi gian thc (u cho thi gian chy bng 0 do khng kp o thi gian). Mt cch
gii quyt l cho mi thut ton QuickSort, RadixSort, thc hin c ln (c l mt s nguyn
ln) trn cc b d liu ngu nhin ri ly thi gian tng chia cho c, hay c th tng kch
thc d liu (iu ny c th dn n vic phi sa li mt vi ch trong chng trnh hoc
thm ch phi thay i mi trng lp trnh).
Ti vit li chng trnh ny trn Borland Delphi a vo mt s ci tin:
C th chy vi kch thc d liu ln hn rt nhiu (hng triu kha)
Thit k da trn kin trc a lung (MultiThreads) cho php chy ng thi ( )
hai hay nhiu thut ton sp xp so snh tc , hin th qu trnh sp xp trc quan
trn mn hnh.
Cng cho php chy tun t ( ) cc thut ton sp xp o thi gian thc hin
chnh xc ca chng.
Ch : chng trnh khng b nh hng bi cc phn mm khc ang chy, khi bm
hoc 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, s khng th i n khi cc threads kt thc v s phi tt my khi ng li.
Hnh 36 l giao din ca chng trnh, bn c th tham kho m ngun chng trnh km
theo:
Chuyn
i hc S phm H Ni, 1999-2002
114

Hnh 36: Ci t cc thut ton sp xp vi d liu ln
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(n
2
) 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(n
2
),
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 phn t nh nht c th thc hin d dng ch khng cn phi sp xp li ton b nh
sp xp chn.
Thut ton m phn phi v thut ton sp xp bng c s nn c tn dng trong trng
hp cc kho sp xp l s t nhin (hay l mt kiu d liu c th quy ra thnh cc s t
nhin) bi nhng thut ton ny c tc rt cao. Thut ton sp xp bng c s cng c th
sp xp dy kho c s thc hay s m nhng ta phi bit c cch thc lu tr cc kiu d
liu trn my tnh th mi c th lm c.
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.
Cu trc d liu v Gii thut
L Minh Hong
115
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 phn t 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 tt, m lnh n gin v lng b nh cn huy ng rt t. Tuy
nhin, nhng nhc im ca bn phng php ny qu nh so vi u im chung ca chng
l nhanh. Hn na, chng c nh gi cao khng ch v tnh tng qut v tc nhanh, m
cn l kt qu ca nhng cch tip cn khoa hc i vi bi ton sp xp.
Nhng thut ton trn khng ch n thun l cho ta hiu thm v mt cch sp xp mi, m
k thut ci t chng (vi m lnh ti u) cng dy cho chng ta nhiu iu: K thut s
dng s ngu nhin, k thut "chia tr", k thut dng cc bin vi vai tr lun phin
v.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
Vit thut ton QuickSort khng quy
Bi 2
Hy vit nhng thut ton sp xp nu trn vi danh sch nhng xu k t gm 3 ch ci
thng, sp xp chng theo th t t in.
Bi 3
Hy vit li tt c nhng thut ton nu trn vi phng php sp xp bng ch s trn mt
dy s cn sp khng tng (gim dn).
Bi 5
Cho mt danh sch th sinh gm n ngi, mi ngi cho bit tn v im thi, hy chn ra m
ngi im cao nht. Gii quyt bng thut ton c phc tp tnh ton trung bnh O(n)
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)
Chuyn
i hc S phm H Ni, 1999-2002
116
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
, r
2
, , r
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 (successful).
Khng tm c bn ghi no c kho tm kim bng X c, php tm kim tht bi
(unsuccessful).
Tng t nh sp xp, ta coi kho ca mt bn ghi l i din cho bn ghi . V trong mt
s thut ton s trnh by di y, ta coi kiu d liu cho mi kho cng c tn gi l TKey.
const
n = ; {S kho trong dy kho, c th khai di dng bin s nguyn tu bin hn}
type
TKey = ; {Kiu d liu mt kho}
TArray = array[1..n] of TKey;
var
k: TArray; {Dy kho}
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
, 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. 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 cng l O(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
.
Cu trc d liu v Gii thut
L Minh Hong
117
Gi s ta cn tm trong on k
inf
, k
inf+1
, , k
sup
vi kho tm kim l X, trc ht ta xt kho
nm gia dy k
median
vi median = (inf + sup) div 2;
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(log
2
n) v trong trng hp trung
bnh cng l O(log
2
n). 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
, k
2
, , k
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
Chuyn
i hc S phm H Ni, 1999-2002
118
4
2 6
1 3 5 7
9

Hnh 37: 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
, k
2
, , k
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.
Cu trc d liu v Gii thut
L Minh Hong
119
{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 38).
4
2 6
1 3 5 7
9
4
2 6
1 3 7
9

Hnh 38: 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 39)
Chuyn
i hc S phm H Ni, 1999-2002
120
4
2
6
1 3
5
7
9
4
2
6 1 3
7
9

Hnh 39. 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:
o 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 40)
4
2
6
1 3
5
7
9
3
2
1
6
5
7
9

Hnh 40: Xa nt c c hai nhnh con trn cy BST thay bng nt cc phi ca cy con tri
o 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
6
1 3
5
7
9
2
6 1 3
5
7
9

Hnh 41: Xa nt c c hai nhnh con trn cy BST thay bng nt cc tri ca cy con phi
Cu trc d liu v Gii thut
L Minh Hong
121
{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(log
2
n). 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(nlog
2
n).
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.
Chuyn
i hc S phm H Ni, 1999-2002
122
9.5. PHP BM (HASH)
T tng ca php bm l da vo gi tr cc kho k1, k2, , kn, chia cc kho ra thnh
cc nhm. Nhng kho thuc cng mt nhm c mt c im chung v c im ny
khng c trong cc nhm khc. Khi c mt kho tm kim X, trc ht ta xc nh xem nu X
thuc vo dy kho cho th n phi thuc nhm no v tin hnh tm kim trn nhm .
Mt v d l trong cun t in, cc bn sinh vin thng dn vo 26 mnh giy nh vo cc
trang nh du trang no l trang khi u ca mt on cha cc t c cng ch ci u.
khi tra t ch cn tm trong cc trang cha nhng t c cng ch ci u vi t cn tm.
A
B


Z

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.
Cu trc d liu v Gii thut
L Minh Hong
123
i vi bi ton sp xp, ta khng th a vic sp xp mt dy kho bt k v vic sp xp
trn mt dy kho s l m ca cc kho. Bi quan h th t trn cc con s c th khc
vi th t cn sp ca cc kho.
Nhng i vi bi ton tm kim th khc, vi mt kho tm kim, Cu tr li hoc l "Khng
tm thy" hoc l "C tm thy v ch " nn ta hon ton c th thay cc kho bng cc
m s ca n m khng b sai lm, ch lu mt iu l: hai kho khc nhau phi m ho
thnh hai s khc nhau m thi.
Ni nh vy c ngha l vic nghin cu nhng thut ton tm kim trn cc dy kho s rt
quan trng, v di y ta s trnh by mt s phng php .
9.7. CY TM KIM S HC (DIGITAL SEARCH TREE - DST)
Xt dy kho k
1
, k
2
, , k
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:
1 0 1 1
3 2 1 0
11 =
bit
(z = 4)

Hnh 42: 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
43).
Chuyn
i hc S phm H Ni, 1999-2002
124
6
5 8
2 7
4
10 12
11
6 = 0110
5 = 0101
2 = 0010
7 = 0111
8 = 1000
10 = 1010
12 = 1100
11 = 1011
4 = 0100
0 1
0 1
0
1 0
1

Hnh 43: Cy tm kim s hc
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
, k
2
, , k
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
Cu trc d liu v Gii thut
L Minh Hong
125
{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;
Chuyn
i hc S phm H Ni, 1999-2002
126
V mt trung bnh, cc thao tc tm kim, chn, xo trn cy tm kim s hc u c phc
tp l O(log
2
n) 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 44).
2 4 5 7 12 8 10 11
0
0
0 0
0
0
0
0 0 0
1
1
0 1
1
1
1
1
1
0010
1
0100 0101
0111 1000 1010 1011 1100

Hnh 44: 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.
Cu trc d liu v Gii thut
L Minh Hong
127
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, n 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:
2 4 5
010 101 101
1
1
1
0
0 0
0
2 4 5
010 101 101
1
1
1
0
0 0
0
7
1
1
111

Hnh 45: Vi di dy bit z = 3, cy tm kim c s gm cc kho 2, 4, 5 v sau khi thm gi tr 7
Chuyn
i hc S phm H Ni, 1999-2002
128
{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 46).
2 4 5
010 101 101
1
1
1
0
0 0
0
2 4 5
010 101 101
1
1
1
0
0 0
0
7
1
1
111

Hnh 46: 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
Cu trc d liu v Gii thut
L Minh Hong
129
{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.
Chuyn
i hc S phm H Ni, 1999-2002
130
2 4 5 7 12 8 10 11
0
0
0 0
0
0
0
0 0 0
1
1
0 1
1
1
1
1
1
1
2
7
4 5
12
8
10 11
0
0
0
0
0
0
0
1
1
1
1
1
1
1
a)
b)

Hnh 47: 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.
Cu trc d liu v Gii thut
L Minh Hong
131
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 ngoi, cu trc ca cc B_cy
Bi 3
Tm hiu cc phng php tm kim chui, thut ton BRUTE-FORCE, thut ton KNUTH-
MORRIS-PRATT, thut ton BOYER-MOORE v thut ton RABIN-KARP
Tuy gi l chuyn v "Cu trc d liu v gii thut" nhng thc ra, ta mi ch tm hiu
qua v hai dng cu trc d liu hay gp l danh sch v cy, cng vi mt s thut ton m
"u cng phi c" l tm kim v sp xp. Khng mt ti liu no c th cp ti mi cu
trc d liu v gii thut bi chng qu phong ph v lin tc c b sung. Nhng cu trc
d liu v gii thut khng "ph thng" lm nh l thuyt th, hnh hc, v.v s c tch
ra v s c ni k hn trong mt chuyn khc.
Vic i su nghin cu nhng cu trc d liu v gii thut, d ch l mt phn nh hp cng
ny sinh rt nhiu vn hay v kh, nh cc vn l thuyt v phc tp tnh ton, vn
NP_y v.v l cng vic ca nhng nh khoa hc my tnh. Nhng trc khi tr
thnh mt nh khoa hc my tnh th iu kin cn l phi bit lp trnh. Vy nn khi tm
hiu bt c cu trc d liu hay gii thut no, nht thit ta phi c gng ci t bng c.
Mi tng hay s ch l b i nu nh khng bin thnh hiu qu, thc t l nh vy.



P PH H N N 3 3. . Q QU UY Y H HO O C CH H N NG G
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.

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

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
program Analyse1; {Bi ton phn tch s}
const
max = 100;
var
F: array[0..max, 0..max] of LongInt;
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(F[0], SizeOf(F[0]), 0); {Khi to dng 0 ca bng F ton s 0}
F[0, 0] := 1; {Duy ch c F[0, 0] = 1}
for m := 1 to n do {Dng cng thc tnh cc dng theo th t t trn xung di}
for v := 0 to n do {Cc phn t trn mt dng th tnh theo th t t tri qua phi}
if v < m then F[m, v] := F[m - 1, v]
else F[m, v] := F[m - 1, v] + F[m, v - m];
WriteLn(F[n, n], ' Analyses'); {Cui cng F[n, n] l s cch phn tch}
end.
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
Chuyn
i hc S phm H Ni, 1999-2002
136
lu dng k tip, u tin mng Current c gn cc gi tr tng ng trn dng 0. Sau
dng mng Current tnh mng Next, mng Next sau khi tnh s mang cc gi tr tng ng
trn dng 1. Ri li gn mng Current := Next v tip tc dng mng Current tnh mng Next,
mng Next s gm cc gi tr tng ng trn dng 2 v.v Vy ta c ci t ci tin sau:
P_3_01_2.PAS * m s cch phn tch s n
program Analyse2;
const
max = 100;
var
Current, Next: array[0..max] of LongInt;
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(Current, SizeOf(Current), 0);
Current[0] := 1; {Khi to mng Current tng ng vi dng 0 ca bng F}
for m := 1 to n do
begin {Dng dng hin thi Current tnh dng k tip Next Dng dng m - 1 tnh dng m ca bng F}
for v := 0 to n do
if v < m then Next[v] := Current[v]
else Next[v] := Current[v] + Next[v - m];
Current := Next; {Gn Current := Next tc l Current by gi li lu cc phn t trn dng m ca bng F}
end;
WriteLn(Current[n], ' Analyses');
end.
Cch lm trn tit kim c kh nhiu khng gian lu tr, nhng n hi chm hn
phng php u tin v php gn mng (Current := Next). C th ci tin thm cch lm ny
nh sau:
P_3_01_3.PAS * m s cch phn tch s n
program Analyse3;
const
max = 100;
var
B: array[1..2, 0..max] of LongInt;{Bng B ch gm 2 dng thay cho 2 dng lin tip ca bng phng n}
n, m, v, x, y: Integer;
begin
Write('n = '); ReadLn(n);
{Trc ht, dng 1 ca bng B tng ng vi dng 0 ca bng phng n F, c in c s quy hoch ng}
FillChar(B[1], SizeOf(B[1]), 0);
B[1][0] := 1;
x := 1; {Dng B[x] ng vai tr l dng hin thi trong bng phng n}
y := 2; {Dng B[y] ng vai tr l dng k tip trong bng phng n}
for m := 1 to n do
begin
{Dng dng x tnh dng y Dng dng hin thi trong bng phng n tnh dng k tip}
for v := 0 to n do
if v < m then B[y][v] := B[x][v]
else B[y][v] := B[x][v] + B[y][v - m];
x := 3 - x; y := 3 - y; {o gi tr x v y, tnh xoay li}
end;
WriteLn(B[x][n], ' Analyses');
end.
Quy hoch ng
L Minh Hong
137
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
program Analyse4;
const
max = 100;
var
L: array[0..max] of LongInt; {Ch cn lu 1 dng}
n, m, v: Integer;
begin
Write('n = '); ReadLn(n);
FillChar(L, SizeOf(L), 0);
L[0] := 1; {Khi to mng 1 chiu L lu dng 0 ca bng}
for m := 1 to n do {Dng L tnh li chnh n}
for v := m to n do
L[v] := L[v] + L[v - m];
WriteLn(L[n], ' Analyses');
end.
1.4. CI T QUY
Xem li cng thc truy hi tnh F[m, v] = F[m - 1, v] + F[m, v - m], ta nhn thy rng tnh
F[m, v] ta phi bit c chnh xc F[m - 1, v] v F[m, v - m]. Nh vy vic xc nh th t
tnh cc phn t trong bng F (phn t no tnh trc, phn t no tnh sau) l quan trng. Tuy
nhin ta c th tnh da trn mt hm quy m khng cn phi quan tm ti th t tnh ton.
Vic vit mt hm quy tnh cng thc truy hi kh n gin, nh v d ny ta c th vit:
P_3_01_5.PAS * m s cch phn tch s n dng quy
program Analyse5;
var
n: Integer;

function GetF(m, v: Integer): LongInt;
begin
if m = 0 then {Phn neo ca hm quy}
if v = 0 then GetF := 1
else GetF := 0
else {Phn quy}
if m > v then GetF := GetF(m - 1, v)
else GetF := GetF(m - 1, v) + GetF(m, v - m);
end;

begin
Write('n = '); ReadLn(n);
WriteLn(GetF(n, n), ' Analyses');
end.
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
Chuyn
i hc S phm H Ni, 1999-2002
138
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
program Analyse6;
const
max = 100;
var
n: Integer;
F: array[0..max, 0..max] of LongInt;

function GetF(m, v: Integer): LongInt;
begin
if F[m, v] = -1 then {Nu F[m, v] cha bit th i tnh F[m, v]}
begin
if m = 0 then {Phn neo ca hm quy}
if v = 0 then F[m, v] := 1
else F[m, v] := 0
else {Phn quy}
if m > v then F[m, v] := GetF(m - 1, v)
else F[m, v] := GetF(m - 1, v) + GetF(m, v - m);
end;
GetF := F[m, v]; {Gn kt qu hm bng F[m, v]}
end;

begin
Write('n = '); ReadLn(n);
FillChar(f, SizeOf(f), $FF); {Khi to mng F bng gi tr -1}
WriteLn(GetF(n, n), ' Analyses');
end.

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

Quy hoch ng
L Minh Hong
139
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 : x
2
+ y
2
1.
Xt trong mt phng to , nhng cp (x, y) tho mn x
2
+ y
2
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:
2 = + y x . Tip im )
2
1
,
2
1
( tng ng vi nghim ti u ca bi ton cho.
0
x
y
2 = + y x
1
1
2
1
= = y x

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
Chuyn
i hc S phm H Ni, 1999-2002
140
bi ton con. i vi nhiu thut ton quy chng ta tm hiu, nguyn l chia tr
(divide and conquer) thng ng vai tr ch o trong vic thit k thut ton. gii quyt
mt bi ton ln, ta chia n lm nhiu bi ton con cng dng vi n c th gii quyt c
lp. Trong phng php quy hoch ng, nguyn l ny cng c th hin r: Khi khng
bit cn phi gii quyt nhng bi ton con no, ta s i gii quyt tt c cc bi ton con v
lu tr nhng li gii hay p s ca chng vi mc ch s dng li theo mt s phi
hp no gii quyt nhng bi ton tng qut hn. chnh l im khc nhau gia Quy
hoch ng v php phn gii quy v cng l ni dung phng php quy hoch ng:
Php phn gii quy bt u t bi ton ln phn r thnh nhiu bi ton con v i gii
tng bi ton con . Vic gii tng bi ton con li a v php phn r tip thnh nhiu bi
ton nh hn v li i gii tip bi ton nh hn bt k n c gii hay cha.
Quy hoch ng bt u t vic gii tt c cc bi ton nh nht ( bi ton c s) t
tng bc gii quyt nhng bi ton ln hn, cho ti khi gii c bi ton ln nht (bi ton
ban u).
Ta xt mt v d n gin:
V d: Dy Fibonacci l dy s nguyn dng c nh ngha nh sau:
F
1
= F
2
= 1;
i: 3 i: F
i
= F
i-1
+ F
i-2

Hy tnh F
6

Xt hai cch ci t chng trnh:
Cch 1 Cch 2
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.

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.

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

Hnh 48: 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: (nh k)
Gii tt c cc bi ton c s (thng thng rt d), lu cc li gii vo bng phng n.
Dng cng thc truy hi phi hp nhng li gii ca nhng bi ton nh lu trong bng
phng n tm li gii ca nhng bi ton ln hn v lu chng vo bng phng n. Cho
ti khi bi ton ban u tm c li gii.
Da vo bng phng n, truy vt tm ra nghim ti u.
Chuyn
i hc S phm H Ni, 1999-2002
142

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"

Quy hoch ng
L Minh Hong
143
3. MT S BI TON QUY HOCH NG
3.1. DY CON N IU TNG DI NHT
Cho dy s nguyn A = a
1
, a
2
, , a
n
. (n 5000, -10000 a
i
10000). Mt dy con ca A l
mt cch chn ra trong A mt s phn t gi nguyn th t. Nh vy A c 2
n
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], L[i + 2], , L[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
Chuyn
i hc S phm H Ni, 1999-2002
144
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 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.
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 0. T[0] l phn t u tin c chn,
T[T[0]] l phn t th hai c chn,
T[T[T[0]]] l phn t th ba c chn Qu trnh truy vt c th din t nh sau:
i := T[0];
while i <> n + 1 do {Chng no cha duyt n s 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:
11 10 9 8 11 6 7 4 3 8 2 ] i [ T
1 2 3 4 5 2 3 6 7 8 5 9 ] i [ L
8 7 6 5 10 9 4 3 2 5 a
11 10 9 8 7 6 5 4 3 2 1 0 i
i
+
Calculating
Tracing

Hnh 49: Tnh ton v truy vt
P_3_03_1.PAS * Tm dy con n iu tng di nht
program LongestSubSequence;
const
InputFile = 'INCSEQ.INP';
OutputFile = 'INCSEQ.OUT';
max = 5000;
var
a, L, T: array[0..max + 1] of Integer;
n: Word;

procedure Enter;
var
i: Word;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
for i := 1 to n do Read(f, a[i]);
Close(f);
end;
Quy hoch ng
L Minh Hong
145

procedure Optimize; {Quy hoch ng}
var
i, j, jmax: Word;
begin
a[0] := -32768; a[n + 1] := 32767; {Thm hai phn t canh hai u dy a}
L[n + 1] := 1; {in c s quy hoach ng vo bng phng n}
for i := n downto 0 do {Tnh bng phng n}
begin
{Chn trong cc ch s j ng sau i tho mn a
j
> a
i
ra ch s jmax c L[jmax] ln nht}
jmax := n + 1;
for j := i + 1 to n + 1 do
if (a[j] > a[i]) and (L[j] > L[jmax]) then jmax := j;
L[i] := L[jmax] + 1; {Lu di dy con tng di nht bt u ti a
i
}
T[i] := jmax; {Lu vt: phn t ng lin sau a
i
trong dy con tng di nht l a
jmax
}
end;
end;

procedure Result;
var
f: Text;
i: Integer;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, L[0] - 2); {Chiu di dy con tng di nht}
i := T[0]; {Bt u truy vt tm nghim}
while i <> n + 1 do
begin
WriteLn(f, 'a[', i, '] = ', a[i]);
i := T[i];
end;
Close(f);
end;

begin
Enter;
Optimize;
Result;
end.
Nhn xt: Cng thc truy hi tnh cc L[.] c th tm tt l:

= + =
= +
<
+ <
) n , 0 i ( 1 ] j [ L max : ] i [ L
0 : ] 1 n [ L
j i
a a
1 n j i

v tnh ht cc L[.], ta phi mt mt on chng trnh vi phc tp tnh ton l O(n
2
).
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[n + 1] := 1;
StartOf[1] := n + 1;
m := 1; {m l di dy con n iu tng di nht ca dy a
i
, a
i+1
, , a
n+1
( bc khi to ny i = n + 1)}
for i := n downto 0 do
begin
Chuyn
i hc S phm H Ni, 1999-2002
146
<Tnh L[i]; t k := L[i]>;
if k > m then {Nu dy con tng di nht bt u ti a[i] c di > m}
begin
m := k; {Cp nht li m}
StartOf[k] := i; {Gn gi tr cho StartOf[m]}
end
else
if a[i] > a[StartOf[k]] then {Nu c nhiu dy n iu tng di nht di k th}
StartOf[k] := i; {ch ghi nhn li dy c phn t bt u ln nht}
end;
Khi bt u vo mt ln lp vi mt gi tr i, ta bit c:
m: di dy con n iu tng di nht ca dy a
i+1
, a
i+2
, , a
n+1

StartOf[k] (1 k m): Phn t a
StartOf[k]
l phn t ln nht trong s cc phn t a
i+1
, a
i+2
, ,
a
n+1
tho mn: Dy con n iu tng di nht bt u t a
StartOf[k]
c di k. Do th t tnh
ton c p t nh trong s trn, ta d dng nhn thy rng: a
StartOf[k]
< a
StartOf[k - 1]

<<a
StartOf[1]
.
iu kin c dy con n iu tng di p+1 bt u ti a
i
chnh l a
StartOf[p]
> a
i
(v theo
th t tnh ton th khi bt u mt ln lp vi gi tr i, a
StartOf[p]
lun ng sau a
i
). Mt khc
nu em a
i
ghp vo u dy con n iu tng di nht bt u ti a
StartOf[p]
m thu c dy
tng th em a
i
ghp vo u dy con n iu tng di nht bt u ti a
StartOf[p - 1]
ta cng thu
c dy tng. Vy tnh L[i], ta c th tm s p ln nht tho mn a
StartOf[p]
> a
i
bng thut
ton tm kim nh phn ri t L[i] := p + 1 (v sau T[i] := StartOf[p], tt nhin)
P_3_03_2.PAS * Ci tin thut ton tm dy con n iu tng di nht
program LongestSubSequence;
const
InputFile = 'INCSEQ.INP';
OutputFile = 'INCSEQ.OUT';
const
max = 5000;
var
a, L, T, StartOf: array[0..max + 1] of Integer;
n, m: Integer;

procedure Enter;
var
i: Word;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
for i := 1 to n do Read(f, a[i]);
Close(f);
end;

procedure Init;
begin
a[0] := -32768;
a[n + 1] := 32767;
m := 1;
L[n + 1] := 1;
StartOf[1] := n + 1;
end;

Quy hoch ng
L Minh Hong
147
{Hm Find, tm v tr j m nu em a
i
ghp vo u dy con n iu tng di nht bt u t a
j
s c dy n
iu tng di nht bt u ti a
i
}
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 a
StartOf[inf]
> a
i
a
StartOf[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;
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.
Chuyn
i hc S phm H Ni, 1999-2002
148
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
3 3
4 4
5 4
9 10
4 4
BAG.OUT
11
5 2 1

Cch gii:
Nu gi F[i, j] l gi tr ln nht c th c bng cch chn trong cc gi {1, 2, , i} vi gii
hn trng lng j. Th gi tr ln nht khi c chn trong s n gi vi gii hn trng lng
M chnh l F[n, M].
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
]
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.
Quy hoch ng
L Minh Hong
149
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.
n
... ... ... ... ... ...
2
1
0 ... 0 ... 0 0 0 0
M ...... 2 1 0 F

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
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
FillChar(F[0], SizeOf(F[0]), 0); {in c s quy hoch ng}
Chuyn
i hc S phm H Ni, 1999-2002
150
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.
Quy hoch ng
L Minh Hong
151
STR.INP
PBBCEFATZQABCDABEFA
STR.OUT
7
PBBCEFATZ -> Delete(9) -> PBBCEFAT
PBBCEFAT -> Delete(8) -> PBBCEFA
PBBCEFA -> Insert(4, B) -> PBBCBEFA
PBBCBEFA -> Insert(4, A) -> PBBCABEFA
PBBCABEFA -> Insert(4, D) -> PBBCDABEFA
PBBCDABEFA -> Replace(2, A) -> PABCDABEFA
PABCDABEFA -> Replace(1, Q) -> QABCDABEFA
Cch gii:
i vi xu k t th vic xo, chn s lm cho cc phn t pha sau v tr bin i b nh ch
s li, gy kh khn cho vic qun l v tr. khc phc iu ny, ta s tm mt th t bin
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
X
2
X
i
thnh xu gm j k t u ca xu Y: Y
1
Y
2
Y
j
.
Quan st hai dy X v Y
X
1
X
2
X
m-1
X
m
Y
1
Y
2
Y
n-1
Y
n

Ta nhn thy:
Nu X
m
= Y
n
th ta ch cn bin on X
1
X
2
X
m-1
thnh Y
1
Y
2
Y
n-1

X
1
X
2
X
m-1
X
m
=Y
n
Y
1
Y
2
Y
n-1
Y
n
=X
m

Tc l trong trng hp ny: F[m, n] = F[m - 1, n - 1]

Nu X
m
Y
n
th ti v tr X
m
ta c th s dng mt trong 3 php bin i:
a) Hoc chn vo sau v tr m ca X, mt k t ng bng Y
n
:
X
1
X
2
X
m-1
X
m
Y
1
Y
2
Y
n-1
Y
n
Y
n

Chuyn
i hc S phm H Ni, 1999-2002
152
Th khi F[m, n] s bng 1 php chn va ri cng vi s php bin i bin dy
X1Xm thnh dy Y1Yn-1: F[m, n] = 1 + F[m, n - 1]
b) Hoc thay v tr m ca X bng mt k t ng bng Y
n
:
X
1
X
2
X
m-1
X
m
:=Y
n
Y
1
Y
2
Y
n-1
Y
n

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

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

thnh dy Y
1
Y
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.
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:
Quy hoch ng
L Minh Hong
153
2 3 4 4 4 4
2 2 3 3 3 3
2 1 2 2 2 2
3 2 1 1 1 1
4 3 2 1 0 0
4 3 2 1 0 F

Hnh 50: 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
program StrOpt;
const
InputFile = 'STR.INP';
OutputFile = 'STR.OUT';
max = 100;
var
X, Y: String[2 * max];
F: array[-1..max, -1..max] of Integer;
m, n: Integer;

procedure Enter;
var
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, X); ReadLn(fi, Y);
Close(fi);
m := Length(X); n := Length(Y);
end;

function Min3(x, y, z: Integer): Integer; {Cho gi tr nh nht trong 3 gi tr x, y, z}
var
t: Integer;
begin
if x < y then t := x else t := y;
if z < t then t := z;
Min3 := t;
end;

procedure Optimize;
var
i, j: Integer;
begin
{Khi to vin cho bng phng n}
for i := 0 to m do F[i, -1] := max + 1;
for j := 0 to n do F[-1, j] := max + 1;
{Lu c s quy hoch ng}
for j := 0 to n do F[0, j] := j;
for i := 1 to m do F[i, 0] := i;
{Dng cng thc truy hi tnh ton bng phng n}
for i := 1 to m do
for j := 1 to n do
if X[i] = Y[j] then F[i, j] := F[i - 1, j - 1]
else F[i, j] := Min3(F[i, j - 1], F[i - 1, j - 1], F[i - 1, j]) + 1;
end;

Chuyn
i hc S phm H Ni, 1999-2002
154
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.
Bi ny gii vi cc xu 100 k t, nu lu bng phng n di dng mng cp pht ng
th c th lm vi cc xu 255 k t. (Tt hn nn lu mi dng ca bng phng n l mt
mng cp pht ng 1 chiu). Hy t gii thch ti sao khi gii hn di d liu l 100, li
phi khai bo X v Y l String[200] ch khng phi l String[100] ?.
3.4. DY CON C TNG CHIA HT CHO K
Cho mt dy gm n (1 n 1000) s nguyn dng A
1
, A
2
, , A
n
v s nguyn dng k (k
50). Hy tm dy con gm nhiu phn t nht ca dy cho sao cho tng cc phn t ca
dy con ny chia ht cho k.
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
Quy hoch ng
L Minh Hong
155
Output: file vn bn SUBSEQ.OUT
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
bi yu cu chn ra mt s ti a cc phn t trong dy A c mt dy c tng chia
ht cho k, ta c th gii bi ton bng phng php duyt t hp bng quay lui c nh gi
nhnh cn nhm gim bt chi ph trong k thut vt cn. Di y ta trnh by phng php
quy hoch ng:
Nhn xt 1: Khng nh hng n kt qu cui cng, ta c th t:
A
i
:= A
i
mod k vi i: 1 i n
Nhn xt 2: Gi S l tng cc phn t trong mng A, ta c th thay i cch tip cn bi ton:
thay v tm xem phi chn ra mt s ti a nhng phn t c tng chia ht cho k, ta s chn
ra mt s ti thiu cc phn t c tng ng d vi S theo modul k. Khi ch cn loi b
nhng phn t ny th nhng phn t cn li s l kt qu.
Nhn xt 3: S phn t ti thiu cn loi b bao gi cng nh hn k
Tht vy, gi s s phn t t nht cn loi b l m v cc phn t cn loi b l A
i
1
, Ai
2
, ,
Ai
m
. Cc phn t ny c tng ng d vi S theo m-un k. Xt cc dy sau
Dy 0 := () = Dy rng (Tng 0 (mod k))
Dy 1 := (Ai
1
)
Dy 2 := (A
i
1
, Ai
2
)
Dy 3 := (A
i
1
, Ai
2
, Ai
3
)

Dy m := (Ai
1
, Ai
2
, , Ai
m
)
Nh vy c m + 1 dy, nu m k th theo nguyn l Dirichlet s tn ti hai dy c tng ng
d theo m-un k. Gi s l hai dy:
A
i
1
+ Ai
2
+ + Ai
p
Ai
1
+ Ai
2
+ + Ai
p
+ A
i
p+1
+ + A
i
q
(mod k)
Chuyn
i hc S phm H Ni, 1999-2002
156
Suy ra A
i
p+1
+ + A
i
q
chia ht cho k. Vy ta c th xo ht cc phn t ny trong dy
chn m vn c mt dy c tng ng d vi S theo modul k, mu thun vi gi thit l
dy chn c s phn t ti thiu.
Cng thc truy hi:
Nu ta gi F[i, t] l s phn t ti thiu phi chn trong dy A
1
, A
2
, , A
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,
i
A t ] (
i
A t y hiu l php tr
trn cc lp ng d mod k. V d khi k = 7 th 5 3 1 = )
T trn suy ra F[i, t] = min (F[i - 1, t], 1 + F[i - 1, t - A
i
]).
Cn tt nhin, c s quy hoch ng: F(0, 0) = 0; F(0, i) = + (vi i: 1 i < k).
Bng phng n F c kch thc [0..n, 0.. k - 1] ti a l 1001x50 phn t kiu Byte.
P_3_03_5.PAS * Dy con c tng chia ht cho k
program SubSequence;
const
InputFile = 'SUBSEQ.INP';
OutputFile = 'SUBSEQ.OUT';
maxN = 1000;
maxK = 50;
var
a: array[1..maxN] of Integer;
f: array[0..maxN, 0..maxK - 1] of Byte;
n, k: Integer;

procedure Enter;
var
fi: Text;
i: Integer;
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
FillChar(f, SizeOf(f), $FF); {Khi to cc phn t f[0, .] u bng 255 (+)}
f[0, 0] := 0; {Ngoi tr f[0, 0] := 0}
Quy hoch ng
L Minh Hong
157
for i := 1 to n do
for t := 0 to k - 1 do {Tnh f[i, t] := min (f[i - 1, t], f[i - 1, Sub(t, a
i
)] + 1}
if f[i - 1, t] < f[i - 1, Sub(t, a[i])] + 1 then
f[i, t] := f[i - 1, t]
else
f[i, t] := f[i - 1, Sub(t, a[i])] + 1;
end;

procedure Result;
var
fo: Text;
i, t: Integer;
SumAll, Sum: LongInt;
begin
SumAll := 0;
for i := 1 to n do SumAll := SumAll + a[i];
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, n - f[n, SumAll mod k]); {n - s phn t b i = s phn t gi li}
i := n; t := SumAll mod k;
Sum := 0;
for i := n downto 1 do
if f[i, t] = f[i - 1, t] then {Nu phng n ti u khng b a
i
, tc l c chn a
i
}
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.
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, nu c phng n chn ra nhiu phn t nht trong cc lp t 0 ti i
c tng chia k d t th phng n ny c th chn j phn t ca lp i (0 j Count[i]), 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 j * i t . T suy ra cng thc truy hi:
Chuyn
i hc S phm H Ni, 1999-2002
158
) j ] i * j t , 1 i [ f ( max arg ] t , i [ Trace
) j ] i * j t , 1 i [ f ( max ] t , i [ f
1 ) i * j t , 1 i [ Trace
] i [ Count j 0
1 ) i * j t , 1 i [ Trace
] i [ Count j 0
+ =
+ =





P_3_03_6.PAS * Dy con c tng chia ht cho k
program SubSequence;
const
InputFile = 'SUBSEQ.INP';
OutputFile = 'SUBSEQ.OUT';
maxN = 1000;
maxK = 50;
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
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 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;
Quy hoch ng
L Minh Hong
159

procedure Result;
var
fo: Text;
i, t, j: Integer;
Sum: LongInt;
begin
t := 0;
{Tnh li cc Count[i] := S phn t phng n ti u s chn trong lp i}
for i := k - 1 downto 0 do
begin
j := Trace[i, t];
t := Sub(t, j * i);
Count[i] := j;
end;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, f[k - 1, 0]);
Sum := 0;
for i := 1 to n do
begin
t := a[i] mod k;
if Count[t] > 0 then
begin
WriteLn(fo, 'a[', i, '] = ', a[i]);
Dec(Count[t]);
Sum := Sum + a[i];
end;
end;
WriteLn(fo, 'Sum = ', Sum);
Close(fo);
end;

begin
Enter;
Optimize;
Result;
end.
Cch gii th hai tt hn cch gii th nht v n c th thc hin vi n ln. V d ny cho
thy mt bi ton quy hoch ng c th c nhiu cch t cng thc truy hi gii.
3.5. PHP NHN T HP DY MA TRN
Vi ma trn A kch thc pxq v ma trn B kch thc qxr. Ngi ta c php nhn hai ma
trn c ma trn C kch thc pxr. Mi phn t ca ma trn C c tnh theo cng
thc:
r j 1 p, i 1 ; B . A C
q
1 k
kj ik ij
=

=

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

33 164 41 22 54
21 100 25 14 34
9 36 9 6 14
1 1 1 1 1
1 6 1 0 3
1 5 0 1 0
0 4 2 0 1
x
12 11 10 9
8 7 6 5
4 3 2 1

Chuyn
i hc S phm H Ni, 1999-2002
160
thc hin php nhn hai ma trn A(mxn) v B(nxp) ta c th lm nh on chng trnh
sau:
for i := 1 to p do
for j := 1 to r do
begin
c
ij
:= 0;
for k := 1 to q do c
ij
:= c
ij
+ a
ik
* b
kj
;
end;
Ph tn thc hin php nhn ny c th nh gi qua s php nhn, nhn hai ma trn
A(pxq) v B(qxr) ta cn thc hin p.q.r php nhn s hc.
Php nhn ma trn khng c tnh cht giao hon nhng c tnh cht kt hp
(A * B) * C = A * (B * C)
Vy nu A l ma trn cp 3x4, B l ma trn cp 4x10 v C l ma trn cp 10x15 th:
tnh (A * B) * C, ta thc hin (A * B) trc, c ma trn X kch thc 3x10 sau 3.4.10 =
120 php nhn s. Sau ta thc hin X * C c ma trn kt qu kch thc 3x15 sau
3.10.15 = 450 php nhn s. Vy tng s php nhn s hc phi thc hin s l 570.
tnh A * (B * C), ta thc hin (B * C) trc, c ma trn Y kch thc 4x15 sau 4.10.15
= 600 php nhn s. Sau ta thc hin A * Y c ma trn kt qu kch thc 3x15 sau
3.4.15 = 180 php nhn s. Vy tng s php nhn s hc phi thc hin s l 780.
Vy th trnh t thc hin c nh hng ln ti chi ph. Vn t ra l tnh s ph tn t nht
khi thc hin php nhn mt dy cc ma trn:
M
1
* M
2
* * M
n

Vi :
M
1
l ma trn kch thc a
1
x a
2

M
2
l ma trn kch thc a
2
x a
3


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
3 2 3 1 2 2 3
MULTMAT.OUT
31
((M[1] * (M[2] * M[3])) * ((M[4] * M[5]) * M[6]))

Quy hoch ng
L Minh Hong
161
Trc ht, nu dy ch c mt ma trn th chi ph bng 0, tip theo ta nhn thy nhn mt
cp ma trn th khng c chuyn kt hp g y c, chi ph cho php nhn l tnh c
ngay. Vy th ph tn cho php nhn hai ma trn lin tip trong dy l hon ton c th ghi
nhn li c. S dng nhng thng tin ghi nhn ti u ho ph tn nhn nhng b ba
ma trn lin tip C tip tc nh vy cho ti khi ta tnh c ph tn nhn n ma trn lin
tip.
3.5.1. Cng thc truy hi:
Gi F[i, j] l s php nhn ti thiu cn thc hin nhn on ma trn lin tip:
M
i
*M
i+1
**M
j
. Th khi F[i, i] = 0 vi i.
tnh M
i
* M
i+1
* * M
j
, ta c th c nhiu cch kt hp:
M
i
* M
i+1
* * M
j
= (M
i
* M
i+1
* * M
k
) * (M
k+1
* M
k+2
* * M
j
) (Vi i k < j)
Vi mt cch kt hp (ph thuc vo cch chn v tr k), chi ph ti thiu phi thc hin bng:
Chi ph thc hin php nhn M
i
* M
i+1
* * M
k
= F[i, k]
Cng vi chi ph thc hin php nhn M
k+1
* M
k+2
* * M
j
= F[k + 1, j]
Cng vi chi ph thc hin php nhn hai ma trn cui cng: ma trn to thnh t php nhn
(M
i
* M
i+1
* * M
k
) c kch thc a
i
x a
k+1
v ma trn to thnh t php nhn (M
k+1
* M
k+2

* * M
j
) c kch thc a
k+1
x a
j+1
, vy chi ph ny l a
i
* a
k+1
* a
j+1
.
T suy ra: do c nhiu cch kt hp, m ta cn chn cch kt hp c chi ph t nht nn
ta s cc tiu ho F[i, j] theo cng thc:
) a * a * a ] j , 1 k [ F ] k , i [ F ( min ] j , i [ F
1 j 1 k i
j k i
+ +
<
+ + + =
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. Tc l ban u ta in c s quy hoch ng
vo ng cho chnh ca bng(F[i, i] = 0), t tnh cc gi tr thuc ng cho nm pha
trn (Tnh cc F[i, i + 1]), ri li tnh cc gi tr thuc ng cho nm pha trn na (F[i, i +
2]) n khi tnh c F[1, n] th dng li
3.5.3. Tm cch kt hp ti u
Ti mi bc tnh F[i, j], ta ghi nhn li im k m cch tnh (M
i
* M
i+1
* * M
k
) * (M
k+1
*
M
k+2
* * M
j
) cho s php nhn s hc nh nht, chng hn ta t T[i, j] = k.
Khi , mun in ra php kt hp ti u nhn on M
i
* M
i+1
* * M
k
* M
k+1
* M
k+2
*
* M
j
, ta s in ra cch kt hp ti u nhn on M
i
* M
i+1
* * M
k
v cch kt hp ti u
Chuyn
i hc S phm H Ni, 1999-2002
162
nhn on M
k+1
* M
k+2
* * M
j
(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
program MatrixesMultiplier;
const
InputFile = 'MULTMAT.INP';
OutputFile = 'MULTMAT.OUT';
max = 100;
MaxLong = 1000000000;
var
a: array[1..max + 1] of Integer;
F: array[1..max, 1..max] of LongInt;
T: array[1..max, 1..max] of Byte;
n: Integer;
fo: Text;

procedure Enter; {Nhp d liu t thit b nhp chun}
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;
var
i, j, k, len: Integer;
x, p, q, r: LongInt;
begin
for i := 1 to n do
for j := i to n do
if i = j then F[i, j] := 0
else F[i, j] := MaxLong; {Khi to bng phng n: ng cho chnh = 0, cc khc = +}
for len := 2 to n do {Tm cch kt hp ti u nhn on gm len ma trn lin tip}
for i := 1 to n - len + 1 do
begin
j := i + len - 1; {Tnh F[i, j]}
for k := i to j - 1 do {Xt mi v tr phn hoch k}
begin {Gi s ta tnh M
i
* * M
j
= (M
i
* * M
k
) * (M
k+1
* * M
j
)}
p := a[i]; q := a[k + 1]; r := a[j + 1]; {Kch thc 2 ma trn s nhn cui cng}
x := F[i, k] + F[k + 1, j] + p * q * r; {Chi ph nu phn hoch theo k}
if x < F[i, j] then {Nu php phn hoch tt hn F[i, j] th ghi nhn li}
begin
F[i, j] := x;
T[i, j] := k;
end;
end;
end;
end;

procedure Trace(i, j: Integer); {In ra php kt hp nhn on M
i
* M
i+1
* * M
j
}
var
k: Integer;
begin
if i = j then Write(fo, 'M[', i, ']') {Nu on ch gm 1 ma trn th in lun}
else {Nu on gm t 2 ma trn tr ln}
begin
Write(fo, '('); {M ngoc}
Quy hoch ng
L Minh Hong
163
k := T[i, j]; {Ly v tr phn hoch ti u on M
i
M
j
}
Trace(i, k); {In ra php kt hp nhn on u}
Write(fo, ' * '); {Du nhn}
Trace(k + 1, j); {In ra php kt hp nhn on sau}
Write(fo, ')'); {ng ngoc}
end;
end;

begin
Enter;
Optimize;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, F[1, n]); {S php nhn cn thc hin}
Trace(1, n); {Truy vt bng quy}
Close(fo);
end.
3.6. BI TP LUYN TP
3.6.1. Bi tp c gi 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 ?
Gi :
Cu a: Ta s m s cc s c ng n ch s m tng cc ch s (TCCS) bng k, ch c iu
cc s ca ta cho php c th bt u bng 0. V d: ta coi 0045 l s c 4 ch s m TCCS l
9. Gi F[n, k] l s cc s c n ch s m TCCS bng k. Cc s c dng
n
x x x ...
2 1
; x1,
x2, xn y l cc ch s 09 v x1 + x2 + + xn = k. Nu c nh x1 = t th ta nhn
thy
n
x x ...
2
lp thnh mt s c n - 1 ch s m TCCS bng k - t. Suy ra do x1 c th nhn
cc gi tr t 0 ti 9 nn v mt s lng: F[n, k] =

=

9
0
] , 1 [
t
t k n F . y l cng thc 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 > 10
9
th ta t li
phn t l 10
9
+ 1 trnh b trn s do cng hai s qu ln. Kt thc qu trnh tnh ton,
nu F[n, k] = 10
9
+ 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 nu k 10 th F[1, k] = 0 cn nu 0
k 9 th F[1, k] = 1.
Cu b: Da vo bng phng n F[0..n, 0..k],
Chuyn
i hc S phm H Ni, 1999-2002
164
F[n - 1, k] = s cc s c n - 1 CS m TCCS bng k = s cc s c n CS, bt u l 0, TCCS bng k.
F[n - 1, k - 1] = s cc s c n - 1 CS m TCCS bng k - 1 = s cc s c n CS, bt u l 1, TCCS bng k.
F[n - 1, k - 2] = s cc s c n - 1 CS m TCCS bng k - 2 = s cc s c n CS, bt u l 2, TCCS bng k.

F[n - 1, k - 9] = s cc s c n - 1 CS m TCCS bng k - 9 = s cc s c n CS, bt u l 9, TCCS bng k.
T ta c th bit c s th p (theo th t tng dn) cn tm s c ch s u tin l ch
s no, tng t ta s tm c ch s th hai, th ba v.v ca s .
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 .
Gi : 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. Ta s xy dng b[V]
nh sau:
tin ni, ta t k = b[V]. V k l b nht c th, nn nu c cch chn trong s cc gi ko
t gi 1 n gi k c s ko V th chc chn phi chn gi k. M chn gi k ri th
trong s cc gi ko t 1 n k - 1, phi chn ra c mt s gi c s ko l V - A
k
.
Tc l b[V - A
k
] k - 1 < k. Vy th 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, sau
gn b[V] := k. y chnh l cng thc truy hi tnh bng phng n.
Sau khi tnh b[1], b[2], , b[M]. Nu b[M] vn bng + th c ngha l khng c phng
n chn. Nu khng th s chn gi p
1
= b[M], tip theo s chn gi p
2
= b[M - A
p
1
], ri li
chn gi p3 = b[M - Ap
1
- Ap
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
Gi :
Gi S l tng s ko v M l na tng s ko, p dng cch gii nh bi 2. Sau
Tm s nguyn dng T tho mn:
T M
Tn ti mt cch chn ra mt s gi ko c tng s ko l T (b[T] +)
T ln nht c th
Quy hoch ng
L Minh Hong
165
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.
6 7 8 7 4
2 4 3 2 1
7 6 5 6 7
9 7 6 2 1
A =

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

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
Bi ton ci ti vi kch thc nh nu trn l khng thc t, chng c siu th no c 100
gi hng c. Hy lp chng trnh gii bi ton ci ti vi n 10000; M 1000.
Bi 2
Xu k t S gi l xu con ca xu k t T nu c th xo bt mt s k t trong xu T
c xu S. Lp chng trnh nhp vo hai xu k t S
1
, S
2
. Tm xu S
3
c di ln nht l
xu con ca c S
1
v S
2
. V d: S
1
= 'abcdefghi123'; S
2
= 'abc1def2ghi3' th S
3
l 'abcdefghi3'.
Bi 3
Mt xu k t X gi l cha xu k t Y nu nh c th xo bt mt s k t trong xu X
c xu Y: V d: Xu '1a2b3c45d' cha xu '12345'. Mt xu k t gi l i xng nu
Chuyn
i hc S phm H Ni, 1999-2002
166
n khng thay i khi ta vit cc k t trong xu theo th t ngc li: V d:
'abcABADABAcba', 'MADAM' l cc xu i xng.
Nhp mt xu k t S c di khng qu 128, hy tm xu k t T tho mn c 3 iu kin:
1. i xng
2. Cha xu S
3. C t k t nht (c di ngn nht)
Nu c nhiu xu T tho mn ng thi 3 iu kin trn th ch cn cho bit mt. Chng hn
vi S = 'a_101_b' th chn T = 'ab_101_ba' hay T = 'ba_101_ab' u ng.
V d:
S T
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:
6
1
3
1
1
4
1
4
6
0
1
6
1 2 3 4 5 6

Bit rng 1 n 100 v 0 a
i
, b
i
6 vi i: 1 i n. Cho php lt ngc cc qun -mi-n.
Khi mt qun -mi-n th i b lt, n s c s ghi trn l b[i] v s ghi di l a[i].
Vn t ra l hy tm cch lt cc qun -mi-n sao cho chnh lch gia tng cc s
ghi hng trn v tng cc s ghi hng dii l ti thiu. Nu c nhiu phng n lt tt
nh nhau, th ch ra phng n phi lt t qun nht.
Nh v d trn th s lt hai qun -mi-n th 5 v th 6. Khi :
Tng cc s hng trn = 1 + 1 + 4 + 4 + 6 + 1 = 17
Tng cc s hng di = 6 + 3 + 1 + 1 + 0 + 6 = 17
Bi 6
Xt bng H kch thc 4x4, cc hng v cc ct c nh ch s A, B, C, D. Trn 16 ca
bng, mi ghi 1 k t A hoc B hoc C hoc D.
Quy hoch ng
L Minh Hong
167
D D D B D
A B C B C
B A D C B
B B A A A
D C B A

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.



P PH H N N 4 4. . C C C C T TH HU U T T T TO O N N T TR R N N
T TH H
Trn thc t c nhiu bi ton lin quan ti mt tp cc
i tng v nhng mi lin h gia chng, i hi
ton hc phi t ra mt m hnh biu din mt cch
cht ch v tng qut bng ngn ng k hiu, l
th. Nhng tng c bn ca n c a ra t th k
th XVIII bi nh ton hc Thu S Leonhard Euler,
ng dng m hnh th gii bi ton v nhng cy cu
Konigsberg ni ting.
Mc d L thuyt th c khoa hc pht trin t rt lu nhng
li c nhiu ng dng hin i. c bit trong khong vi mi nm
tr li y, cng vi s ra i ca my tnh in t v s pht trin
nhanh chng ca Tin hc, L thuyt th cng c quan tm n
nhiu hn. c bit l cc thut ton trn th c nhiu ng dng
trong nhiu lnh vc khc nhau nh: Mng my tnh, L thuyt m,
Ti u ho, Kinh t hc v.v 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.

Leonhard Euler
(1707-1783)
Chuyn
i hc S phm H Ni, 1999-2002
170
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 51: 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:
Cc thut ton trn th
L Minh Hong
171
V hng C hng V hng C hng
n th a th

Hnh 52: 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.

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:
m 2 ) v deg(
V v
=


Chng minh: Khi ly tng tt c cc bc nh tc l mi cnh e = (u, v) bt k s c tnh mt ln
trong deg(u) v mt ln trong deg(v). T suy ra kt qu.
H qu: Trong th v hng, s nh bc l l s chn

i vi th c hng G = (V, E). Xt mt cung e E, nu e = (u, v) th ta ni u ni ti v v v
ni t u, cung e l i ra khi nh u v i vo nh v. nh u khi c gi l nh u, nh v
c gi l nh cui ca cung e.
Vi mi nh v trong th c hng, ta nh ngha: Bn bc ra ca v k hiu deg+(v) l s cung
i ra khi n; bn bc vo k hiu deg-(v) l s cung i vo nh
Chuyn
i hc S phm H Ni, 1999-2002
172
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:


+

= =
V v V v
m ) v ( deg ) v ( deg
Chng minh: Khi ly tng tt c cc bn bc ra hay bn bc vo, mi cung (u, v) bt k s c
tnh ng 1 ln trong deg
+
(u) v cng c tnh ng 1 ln trong deg
-
(v). T suy ra kt qu

Mt s tnh cht ca th c hng khng ph thuc vo hng ca cc cung. Do tin trnh
by, trong mt s trng hp ta c th khng quan tm n hng ca cc cung v coi cc cung
l cc cnh ca th v hng. V th v hng c gi l th v hng nn ca th
c hng ban u.


Cc thut ton trn th
L Minh Hong
173
2. BIU DIN TH TRN MY TNH
2.1. MA TRN LIN K (MA TRN K)
Gi s G = (V, E) l mt n th c s nh (k hiu V) l n, Khng mt tnh tng qut c
th coi cc nh c nh s 1, 2, , n. Khi ta c th biu din th bng mt ma trn vung
A = [a
ij
] cp n. Trong :
a
ij
= 1 nu (i, j) E
a
ij
= 0 nu (i, j) E
Quy c a
ii
= 0 vi i;
i vi a th th vic biu din cng tng t trn, ch c iu nu nh (i, j) l cnh th khng
phi ta ghi s 1 vo v tr a
ij
m l ghi s cnh ni gia nh i v nh j.
V d:
1
2
3 4
5

A=

0 0 1 1 0
0 0 0 1 1
1 0 0 0 1
1 1 0 0 0
0 1 1 0 0

1
2
3 4
5

A=

0 0 0 1 0
0 0 0 0 1
1 0 0 0 0
0 1 0 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
ij
= a
ji
), 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
ij
= TRUE nu (i, j) E v a
ij
= 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
uv
0.
Nhc im ca ma trn k:
Chuyn
i hc S phm H Ni, 1999-2002
174
Bt k s cnh ca th l nhiu hay t, ma trn k lun lun i hi n
2
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
uv
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
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 53:
1 2
3 4
5

Hnh 53
Ci t trn mng:
(1, 2) (1, 3) 1, 5) (2, 3) (3, 4) (4, 5)
1 2 3 4 5 6

Ci t trn danh sch mc ni:
(1, 2) (1, 3) 1, 5) (2, 3) (4, 5) (3, 4)

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

Hnh 54
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 54, danh sch k s l mt mng A gm 12 phn t:
2
1
3
2
5
3
1
4
3
5
1
6
2
7
4
8
3
9
5
10
1
11
4
12
I II
III IV V

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)
Trong mng A, on t v tr Head[i] + 1 n 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 54, cc danh sch mc ni s l:
2 3 5 List 1:
1 3 List 2:
1 2 4 List 3:
3 5 List 4:
1 4 List 5:

u im ca danh sch k:
Chuyn
i hc S phm H Ni, 1999-2002
176
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. Tuy
nhin i vi nhng thut ton m ta s kho st, danh sch k tt hn hn so vi hai phng php
biu din trc. Ch c iu, trong trng hp c th m ma trn k hay danh sch cnh khng th
hin nhc im th ta nn dng ma trn k (hay danh sch cnh) bi ci t danh sch k c phn
di dng hn.
2.4. NHN XT
Trn y l nu cc cch biu din th trong b nh ca my tnh, cn nhp d liu cho th th
c nhiu cch khc nhau, dng cch no th tu. Chng hn nu biu din bng ma trn k m cho
nhp d liu c ma trn cp n x n (n l s nh) th khi nhp t bn phm s rt mt thi gian, ta cho
nhp kiu danh sch cnh cho nhanh. Chng hn mng A (nxn) l ma trn k ca mt th v
hng th ta c th khi to ban u mng A gm ton s 0, sau cho ngi s dng nhp cc
cnh bng cch nhp cc cp (i, j); chng trnh s tng A[i, j] v A[j, i] ln 1. Vic nhp c th cho
kt thc khi ngi s dng nhp gi tr i = 0. V d:
program Nhap_Do_Thi;
var
A: array[1..100, 1..100] of Integer; {Ma trn k ca th}
n, i, j: Integer;
begin
Write('Number of vertices'); ReadLn(n);
FillChar(A, SizeOf(A), 0);
repeat
Write('Enter edge (i, j) (i = 0 to exit) ');
ReadLn(i, j); {Nhp mt cp (i, j) tng nh l nhp danh sch cnh}
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.
Cc thut ton trn th
L Minh Hong
177
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 l t nh u n nh v
l dy (u = x
0
, x
1
, , x
l
= v) tho mn (x
i
, x
i+1
) E vi i: (0 i < l).
ng i ni trn cn c th biu din bi dy cc cnh: (u = x
0
, x
1
), (x
1
, x
2
), , (x
l-1
, x
l
= v)
nh u c gi l nh u, nh v c gi l nh cui ca ng i. ng i c nh u trng
vi nh cui gi l chu trnh (Circuit), ng i khng c cnh no i qua hn 1 ln gi l ng
i n, tng t ta c khi nim chu trnh n.
V d: Xt mt th v hng v mt th c hng trong Hnh 55:
1
2 3
4
5 6
1
2 3
4
5 6

Hnh 55: 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.
Lu :
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.
D liu v th s c nhp t file vn bn GRAPH.INP. Trong :
Dng 1 cha s nh n ( 100), s cnh m ca th, nh xut pht S, nh kt thc F cch nhau
mt du cch.
m dng tip theo, mi dng c dng hai s nguyn dng u, v cch nhau mt du cch, th hin c
cnh ni nh u v nh v trong th.
Kt qu ghi ra file vn bn PATH.OUT
Danh sch cc nh c th n c t S
Chuyn
i hc S phm H Ni, 1999-2002
178
ng i t S ti F

2
3
1
4
5
6
7
8

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

PATH.OUT
From 1 you can visit:
1, 2, 3, 5, 4, 6,
Path from 1 to 5:
5<-3<-2<-1


3.2. THUT TON TM KIM THEO CHIU SU (DEPTH FIRST SEARCH)
3.2.1. Ci t quy
T tng ca thut ton c th trnh by nh sau: Trc ht, mi nh x k vi S tt nhin s n c
t S. Vi mi nh x k vi S th tt nhin nhng nh y k vi x cng n c t S iu gi
cho ta vit mt th tc quy DFS(u) m t vic duyt t nh u bng cch thng bo thm nh u v
tip tc qu trnh duyt DFS(v) vi v l mt nh cha thm k vi u.
khng mt nh no b lit k ti hai ln, ta s dng k thut nh du, mi ln thm mt nh,
ta nh du nh li cc bc duyt quy k tip khng duyt li nh na
lu li ng i t nh xut pht S, trong th tc DFS(u), trc khi gi quy DFS(v) vi v l
mt nh k vi u m cha nh du, ta lu li vt ng i t u ti v bng cch t TRACE[v] :=
u, tc l TRACE[v] lu li nh lin trc v trong ng i t S ti v. Khi qu trnh tm kim theo
chiu su kt thc, ng i t S ti F s l:
F p
1
= Trace[F] p
2
= Trace[p
1
] S.
procedure DFS(uV);
begin
< 1. Thng bo ti c u >;
< 2. nh du u l thm (c th ti c t S)>;
< 3. Xt mi nh v k vi u m cha thm, vi mi nh v >;
begin
Trace[v] := u; {Lu vt ng i, nh m t ti v l u}
DFS(v); {Gi quy duyt tng t i vi v}
end;
end;

begin {Chng trnh chnh}
< Nhp d liu: th, nh xut pht S, nh ch F >;
< Khi to: Tt c cc nh u cha b nh du >;
DFS(S);
< Nu F cha b nh du th khng th c ng i t S ti F >;
< Nu F b nh du th truy theo vt tm ng i t S ti F >;
end.
P_4_03_1.PAS * Thut ton tm kim theo chiu su
program Depth_First_Search_1;
const
InputFile = 'GRAPH.INP';
Cc thut ton trn th
L Minh Hong
179
OutputFile = 'PATH.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 thm n}
Trace: array[1..max] of Integer; {Trace[v] = nh lin trc v trn ng i t S ti v}
n, S, F: Integer;
fo: Text;

procedure Enter; {Nhp d liu}
var
i, u, v, m: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(a, SizeOf(a), False); {Khi to th cha c cnh no}
ReadLn(fi, n, m, S, F); {c dng 1 ra 4 s n, m, S v F}
for i := 1 to m do {c m dng tip ra danh sch cnh}
begin
ReadLn(fi, u, v);
a[u, v] := True;
a[v, u] := True;
end;
Close(fi);
end;

procedure DFS(u: Integer); {Thut ton tm kim theo chiu su bt u t nh u}
var
v: Integer;
begin
Write(fo, u, ', '); {Thng bo ti c u}
Free[u] := False; {nh du u thm}
for v := 1 to n do
if Free[v] and a[u, v] then {Vi mi nh v cha thm k vi u}
begin
Trace[v] := u; {Lu vt ng i: nh lin trc v trong ng i t S ti v l u}
DFS(v); {Tip tc tm kim theo chiu su bt u t v}
end;
end;

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

begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 'From ', S, ' you can visit: ');
FillChar(Free, n, True);
DFS(S);
Result;
Chuyn
i hc S phm H Ni, 1999-2002
180
Close(fo);
end.
Ch :
V c k thut nh du, nn th tc DFS s c gi n ln (n l s nh)
ng i t S ti F c th c nhiu, trn ch l mt trong s cc ng i. C th l ng i c
th t t in nh nht.
C th chng cn dng mng nh du Free, ta khi to mng lu vt Trace ban u ton 0, mi ln
t nh u thm nh v, ta c thao tc gn vt Trace[v] := u, khi Trace[v] s khc 0. Vy vic kim
tra mt nh v l cha c thm ta c th kim tra Trace[v] = 0. Ch : ban u khi to
Trace[S] := -1 (Ch l cho khc 0 thi).
procedure DFS(u: Integer); {Ci tin}
var
v: Integer;
begin
Write(u, ', ');
for v := 1 to n do
if (Trace[v] = 0) and A[u, v] then {Trace[v] = 0 thay v Free[v] = True}
begin
Trace[v] := u; {Lu vt cng l nh du lun}
DFS(v);
end;
end;
V d: Vi th sau y, nh xut pht S = 1: qu trnh duyt quy c th v trn cy tm kim
DFS sau (Mi tn uv ch thao tc quy: DFS(u) gi DFS(v)).
2
3
1
4
5
6
7
8
2
3
1
4
5
6
7
8
1
st
2
nd
3
rd
5
th
4
th
6
th

Hnh 56: Cy DFS
Hi: nh 2 v 3 u k vi nh 1, nhng ti sao DFS(1) ch gi quy ti DFS(2) m khng gi DFS(3) ?.
Tr li: ng l c 2 v 3 u k vi 1, nhng DFS(1) s tm thy 2 trc v gi DFS(2). Trong DFS(2) s xt tt c cc
nh k vi 2 m cha nh du th d nhin trc ht n tm thy 3 v gi DFS(3), khi 3 b nh du nn khi kt
thc qu trnh quy gi DFS(2), li v DFS(1) th nh 3 c thm ( b nh du) nn DFS(1) s khng gi
DFS(3) na.
Hi: Nu F = 5 th ng i t 1 ti 5 trong chng trnh trn s in ra th no ?.
Tr li: DFS(5) do DFS(3) gi nn Trace[5] = 3. DFS(3) do DFS(2) gi nn Trace[3] = 2. DFS(2) do DFS(1) gi nn
Trace[2] = 1. Vy ng i l: 5 3 2 1.
Vi cy th hin qu trnh quy DFS trn, ta thy nu dy chuyn quy l: DFS(S) DFS (u
1
)
DFS(u
2
) Th th tc DFS no gi cui dy chuyn s c thot ra u tin, th tc DFS(S)
Cc thut ton trn th
L Minh Hong
181
gi u dy chuyn s c thot cui cng, t y ta c tng m phng dy chuyn quy
bng mt ngn xp (Stack).
3.2.2. Ci t khng quy
Khi m t qu trnh quy bng mt ngn xp, ta lun lun cho ngn xp lu li dy chuyn
duyt su t nt gc (nh xut pht S).
<Thm S, nh du S thm>;
<y S vo ngn xp>; {Dy chuyn quy ban u ch c mt nh S}
repeat
<Ly u khi ngn xp>; {ang ng nh u}
if <u c nh k cha thm> then
begin
<Ch chn ly 1 nh v, l nh u tin k u m cha c thm>;
<Thng bo thm v>;
<y u tr li ngn xp>; {Gi li a ch quay lui}
<y tip v vo ngn xp>; {Dy chuyn duyt su c "ni" thm v na}
end;
{Cn nu u khng c nh k cha thm th ngn xp s ngn li, tng ng vi s li v ca dy chuyn DFS}
until <Ngn xp rng>;
P_4_03_2.PAS * Thut ton tm kim theo chiu su khng quy
program Depth_First_Search_2;
const
InputFile = 'GRAPH.INP';
OutputFile = 'PATH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer;
Stack: array[1..max] of Integer;
n, S, F, Last: Integer;
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, 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 Init; {Khi to}
begin
FillChar(Free, n, True); {Cc nh u cha nh du}
Last := 0; {Ngn xp rng}
end;

procedure Push(V: Integer); {y mt nh V vo ngn xp}
begin
Inc(Last);
Chuyn
i hc S phm H Ni, 1999-2002
182
Stack[Last] := V;
end;

function Pop: Integer; {Ly mt nh khi ngn xp, tr v trong kt qu hm}
begin
Pop := Stack[Last];
Dec(Last);
end;

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

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

begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 'From ', S, ' you can visit: ');
Init;
DFS;
Result;
Close(fo);
end.
V d: Vi th di y (S = 1), Ta th theo di qu trnh thc hin th tc tm kim theo chiu
su dng ngn xp v i snh th t cc nh c thm vi th t t 1st n 6th trong cy tm
kim ca th tc DFS dng quy.
Cc thut ton trn th
L Minh Hong
183
2
3
1
4
5
6
7
8

Trc ht ta thm nh 1 v y n vo ngn xp.
Bc lp Ngn xp u v Ngn xp sau mi bc Gii thch
1 (1) 1 2 (1, 2) Tin su xung thm 2
2 (1, 2) 2 3 (1, 2, 3) Tin su xung thm 3
3 (1, 2, 3) 3 5 (1, 2, 3, 5) Tin su xung thm 5
4 (1, 2, 3, 5) 5 Khng c (1, 2, 3) Li li
5 (1, 2, 3) 3 Khng c (1, 2) Li li
6 (1, 2) 2 4 (1, 2, 4) Tin su xung thm 4
7 (1, 2, 4) 4 6 (1, 2, 4, 6) Tin su xung thm 6
8 (1, 2, 4, 6) 6 Khng c (1, 2, 4) Li li
9 (1, 2, 4) 4 Khng c (1, 2) Li li
10 (1, 2) 2 Khng c (1) Li li
11 (1) 1 Khng c Li ht dy chuyn, Xong
Trn y l phng php da vo tnh cht ca th tc quy tm ra phng php m phng n.
Tuy nhin, trn m hnh th th ta c th c mt cch vit khc tt hn cng khng quy: Th
nhn li cch thm nh ca DFS: T mt nh u, chn ly mt nh v k n m cha thm ri tin
su xung thm v. Cn nu mi nh k u u thm th li li mt bc v lp li qu trnh tng
t, vic li li ny c th thc hin d dng m khng cn dng Stack no c, bi vi mi nh u
c mt nhn Trace[u] (l nh m t m ta ti thm u), khi quay lui t u s li v .
Vy nu ta ang ng nh u, th nh k tip phi thm ti s c tm nh trong hm FindNext
di y:
function FindNext(uV): V; {Tm nh s thm sau nh u, tr v 0 nu mi nh ti c t S u thm}
begin
repeat
for (v K(u)) do
if <v cha thm> then {Nu u c nh k cha thm th chn nh k u tin cha thm thm tip}
begin
Trace[v] := u; {Lu vt}
FindNext := v;
Exit;
end;
u := Trace[u]; {Nu khng, li v mt bc. Lu l Trace[S] c gn bng n + 1}
until u = n + 1;
FindNext := 0; { trn khng Exit c tc l mi nh ti c t S duyt xong}
end;

begin {Thut ton duyt theo chiu su}
Trace[S] := n + 1;
<Khi to cc nh u l cha thm>
u := S;
repeat
<Thng bo thm u, nh du u thm>;
Chuyn
i hc S phm H Ni, 1999-2002
184
u := FindNext(u);
until u = 0;
end;

3.3. THUT TON TM KIM THEO CHIU RNG (BREADTH FIRST
SEARCH)
3.3.1. Ci t bng hng i
C s ca phng php ci t ny l "lp lch" duyt cc nh. Vic thm mt nh s ln lch
duyt cc nh k n sao cho th t duyt l u tin chiu rng (nh no gn S hn s c duyt
trc). V d: Bt u ta thm nh S. Vic thm nh S s pht sinh th t duyt nhng nh (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
x
1
x
2
x
p

u
1
u
2
u
q
Phi duyt sau x
p

Hnh 57: Cy BFS
Gi s ta c mt danh sch cha nhng nh ang "ch" thm. Ti mi bc, ta thm mt nh u
danh sch v cho nhng nh cha "xp hng" k vi n xp hng thm vo cui danh sch. Chnh
v nguyn tc nn danh sch cha nhng nh ang ch s c t chc di dng hng i
(Queue)
M hnh ca gii thut c th vit nh sau:
Bc 1: Khi to:
Cc nh u trng thi cha nh du, ngoi tr nh xut pht S l nh du
Mt hng i (Queue), ban u ch c mt phn t l S. Hng i dng cha cc nh s c
duyt theo th t u tin chiu rng
Bc 2: Lp cc bc sau n khi hng i rng:
Ly u khi hng i, thng bo thm u (Bt u vic duyt nh u)
Xt tt c nhng nh v k vi u m cha c nh du, vi mi nh v :
nh du v.
Ghi nhn vt ng i t u ti v (C th lm chung vi vic nh du)
y v vo hng i (v s ch c duyt ti nhng bc sau)
Cc thut ton trn th
L Minh Hong
185
Bc 3: Truy vt tm ng i.
P_4_03_3.PAS * Thut ton tm kim theo chiu rng dng hng i
program Breadth_First_Search_1;
const
InputFile = 'GRAPH.INP';
OutputFile = 'PATH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean; {Free[v] v cha c xp vo hng i ch thm}
Trace: array[1..max] of Integer;
Queue: array[1..max] of Integer;
n, S, F, First, Last: Integer;
fo: Text;

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 Init; {Khi to}
begin
FillChar(Free, n, True); {Cc nh u cha nh du}
Free[S] := False; {Ngoi tr nh S}
Queue[1] := S; {Hng i ch gm c mt nh S}
Last := 1;
First := 1;
end;

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

function Pop: Integer; {Ly mt nh khi hng i, tr v trong kt qu hm}
begin
Pop := Queue[First];
Inc(First);
end;

procedure BFS; {Thut ton tm kim theo chiu rng}
var
u, v: Integer;
begin
repeat
u := Pop; {Ly mt nh u khi hng i}
Write(fo, u, ', '); {Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then {Xt nhng nh v cha nh du k u}
Chuyn
i hc S phm H Ni, 1999-2002
186
begin
Push(v); {a v vo hng i ch thm}
Free[v] := False; {nh du v}
Trace[v] := u; {Lu vt ng i: nh lin trc v trong ng i t S l u}
end;
until First > Last; {Cho ti khi hng i rng}
end;

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

begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 'From ', S, ' you can visit: ');
Init;
BFS;
Result;
Close(fo);
end.

V d: Xt th di y, nh xut pht S = 1.
2
3
1
4
5
6
7
8

Hng i nh u
(ly ra t hng i)
Hng i
(sau khi ly u ra)
Cc nh v k u m
cha ln lch
Hng i sau khi y
nhng nh v vo
(1) 1 2, 3 (2, 3)
(2, 3) 2 (3) 4 (3, 4)
(3, 4) 3 (4) 5 (4, 5)
(4, 5) 4 (5) 6 (5, 6)
(5, 6) 5 (6) Khng c (6)
(6) 6 Khng c
th t cc phn t ly ra khi hng i, ta thy trc ht l 1; sau n 2, 3; ri mi ti 4, 5;
cui cng l 6. R rng l nh gn S hn s c duyt trc. V nh vy, ta c nhn xt: nu kt
Cc thut ton trn th
L Minh Hong
187
hp lu vt tm ng i th ng i t S ti F s l ng i ngn nht (theo ngha qua t cnh
nht)
3.3.2. Ci t bng thut ton loang
Cch ci t ny s dng hai tp hp, mt tp "c" cha nhng nh "ang xt", mt tp "mi"
cha nhng nh "s xt". Ban u tp "c" ch gm mi nh xut pht, ti mi bc ta s dng tp
"c" tnh tp "mi", tp "mi" s gm nhng nh cha c thm m k vi mt nh no ca
tp "c". Lp li cng vic trn (sau khi gn tp "c" bng tp "mi") cho ti khi tp c l rng:
2
3
1
4
5
6
C
Mi
2
3
1
4
5
6
Mi C
2
3
1
4
5
6
Mi
C

Hnh 58: Thut ton loang
Gii thut loang c th dng nh sau:
Bc 1: Khi to
Cc nh khc S u cha b nh du, nh S b nh du, tp "c" Old := {S}
Bc 2: Lp cc bc sau n khi Old =
t tp "mi" New = , sau dng tp "c" tnh tp "mi" nh sau:
Xt cc nh u Old, vi mi nh u :
Thng bo thm u
Xt tt c nhng nh v k vi u m cha b nh du, vi mi nh v :
nh du v
Lu vt ng i, nh lin trc v trong ng i Sv l u
a v vo tp New
Gn tp "c" Old := tp "mi" New v lp li (c th lun phin vai tr hai tp ny)
Bc 3: Truy vt tm ng i.
P_4_03_4.PAS * Thut ton tm kim theo chiu rng dng phng php loang
program Breadth_First_Search_2;
const
InputFile = 'GRAPH.INP';
OutputFile = 'PATH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer;
Old, New: set of Byte;
n, S, F: Byte;
Chuyn
i hc S phm H Ni, 1999-2002
188
fo: Text;

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 Init;
begin
FillChar(Free, n, True);
Free[S] := False; {Cc nh u cha nh du, ngoi tr nh S nh du}
Old := [S]; {Tp "c" khi to ban u ch c mi S}
end;

procedure BFS; {Thut ton loang}
var
u, v: Byte;
begin
repeat {Lp: dng Old tnh New}
New := [];
for u := 1 to n do
if u in Old then {Xt nhng nh u trong tp Old, vi mi nh u :}
begin
Write(fo, u, ', '); {Thng bo thm u}
for v := 1 to n do
if Free[v] and a[u, v] then {Qut tt c nhng nh v cha b nh du m k vi u}
begin
Free[v] := False; {nh du v v lu vt ng i}
Trace[v] := u;
New := New + [v]; {a v vo tp New}
end;
end;
Old := New; {Gn tp "c" := tp "mi" v lp li}
until Old = []; {Cho ti khi khng loang c na}
end;

procedure Result; {In ng i t S ti F}
begin
WriteLn(fo); {Vo dng th hai ca Output file}
WriteLn(fo, 'Path from ', S, ' to ', F, ': ');
if Free[F] then {Nu F cha nh du thm tc l khng c ng}
WriteLn(fo,'not found')
else {Truy vt ng i, bt u t F}
begin
while F <> S do
begin
Write(fo, F, '<-');
F := Trace[F];
end;
WriteLn(fo, S);
end;
end;
Cc thut ton trn th
L Minh Hong
189

begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
WriteLn(fo, 'From ', S, ' you can visit: ');
Init;
BFS;
Result;
Close(fo);
end.

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 + n
2
) = O(n
2
).
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
M cung hnh ch nht kch thc m x n gm cc vung n v. Trn mi k t:
O: Nu an ton
X: Nu c cm by
E: Nu l c mt nh thm him ang ng.
Duy nht ch c 1 ghi ch E. Nh thm him c th t mt i sang mt trong s cc chung
cnh vi ang ng. Mt cch i thot khi m cung l mt hnh trnh i qua cc an ton ra mt
bin. Hy ch gip cho nh thm him mt hnh trnh thot ra khi m cung
Chuyn
i hc S phm H Ni, 1999-2002
190
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).
G
1
G
2
G
3

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.

*
th G = (V, E) l con ca th G' = (V', E') nu G l th c VV' v E E'
Cc thut ton trn th
L Minh Hong
191
G gi l lin thng mnh (Strongly connected) nu lun tn ti ng i (theo cc cung nh
hng) gia hai nh bt k ca th, g gi l lin thng yu (weakly connected) nu th v
hng nn ca n l lin thng

Hnh 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 Duyt(u)
begin
<Dng BFS hoc DFS lit k v nh du nhng nh c th n c t u>
end;
begin
for v V do <khi to v cha nh du>;
Count := 0;
for u := 1 to n do
if <u cha nh du> then
begin
Count := Count + 1;
WriteLn('Thnh phn lin thng th ', Count, ' gm cc nh : ');
Duyt(u);
end;
end.
Vi thut ton lit k cc thnh phn lin thng nh th ny, th phc tp tnh ton ca n ng
bng phc tp tnh ton ca thut ton tm kim trn th trong th tc Duyt.
4.3. TH Y V THUT TON WARSHALL
4.3.1. nh ngha:
th y vi n nh, k hiu K
n
, l mt n th v hng m gia hai nh bt k ca n
u c cnh ni.
Chuyn
i hc S phm H Ni, 1999-2002
192
th y K
n
c ng:
2
) 1 n .( n
C
2
n

= cnh v bc ca mi nh u bng n - 1.
K
3
K
4
K
5

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:
Cc thut ton trn th
L Minh Hong
193
T ma trn k A ca n th v hng G (a
ij
= True nu (i, j) l cnh ca G) ta s sa i A
n tr thnh ma trn k ca bao ng bng cch: Vi mi nh k xt theo th t t 1 ti n, ta xt
tt c cc cp nh (u, v): nu c cnh ni (u, k) (a
uk
= True) v c cnh ni (k, v) (a
kv
= True)
th ta t ni thm cnh (u, v) nu n cha c (t a
uv
:= True). T tng ny da trn mt quan
st n gin nh sau: Nu t u c ng i ti k v t k li c ng i ti v th tt nhin t u s c
ng i ti v.
Vi n l s nh ca th, ta c th vit thut ton Warshall nh sau:
for k := 1 to n do
for u := 1 to n do
if a[u, k] then
for v := 1 to n do
if a[k, v] then a[u, v] := True;
hoc
for k := 1 to n do
for u := 1 to n do
for v := 1 to n do
a[u, v] := a[u, v] or a[u, k] and a[k, v];
Vic chng minh tnh ng n ca thut ton i hi phi lt li cc l thuyt v bao ng bc cu
v quan h lin thng, ta s khng trnh by y. C nhn xt rng tuy thut ton Warshall rt d
ci t nhng phc tp tnh ton ca thut ton ny kh ln (O(n
3
)).
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
1
v
u

Input: file vn bn GRAPH.INP
Dng 1: Cha s nh n ( 100) v s cnh m ca th cch nhau t nht mt du cch
m dng tip theo, mi dng cha mt cp s u v v cch nhau t nht mt du cch tng
trng cho mt cnh (u, v)
Output: file vn bn CONNECT.OUT, lit k cc thnh phn lin thng
Chuyn
i hc S phm H Ni, 1999-2002
194
1
3
5
4
2
6 7
8
9
10 11
12

GRAPH.INP
12 9
1 3
1 4
1 5
2 4
6 7
6 8
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,


P_4_04_1.PAS * Thut ton Warshall lit k cc thnh phn lin thng
program Connectivity;
const
InputFile = 'GRAPH.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
Cc thut ton trn th
L Minh Hong
195
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 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: (u, v)E) do
if <v khng thuc cy DFS> then Visit(v);
end;

begin
<Thm vo th nh x v cc cung nh hng (x, v) vi mi v>;
<Khi to cy tm kim DFS := >;
Visit(x);
end.
th tc thm nh quy Visit(u). Th tc ny xt tt c nhng nh v ni t u, nu v cha
c thm th i theo cung thm v, tc l b sung cung (u, v) vo cy tm kim DFS. Nu v
thm th c ba kh nng xy ra i vi v tr ca u v v trong cy tm kim DFS:
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).
Chuyn
i hc S phm H Ni, 1999-2002
196
5
th
u
v
1
st
2
nd
3
rd
4
th
6
th
7
th
5
th
u
v
1
st
2
nd
3
rd
4
th
6
th
7
th
v
u
1
st
2
nd
3
rd
4
th
5
th
6
th
7
th
v
u
1
st
2
nd
3
rd
4
th
5
th
6
th
7
th
v
u
1
st
2
nd
3
rd
4
th
5
th
6
th
7
th
v
u
1
st
2
nd
3
rd
4
th
5
th
6
th
7
th
TH1: v l tin bi ca u
(u, v) l cung ngc
TH2: v l hu du ca u
(u, v) l cung xui
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
Cc thut ton trn th
L Minh Hong
197
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 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
Chuyn
i hc S phm H Ni, 1999-2002
198
thnh phn lin thng mnh th ba, th t, v.v C th hnh dung thut ton Tarjan "b" cy DFS
ti v tr cc cht c cc nhnh ri rc, mi nhnh l mt thnh phn lin thng mnh.
1
2
3
4
5
6
7
8
9 10
11
1
2
3
4
5
6
7
8
9 10
11

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
Cc thut ton trn th
L Minh Hong
199
DFS gc u cha mt cht u' khc th u' phi duyt xong trc u v c nhnh DFS gc u' b loi
b ri. Hn na cn c th chng minh c rng, khi thut ton tin hnh nh trn th nu nh t
mt nh v ca mt nhnh DFS gc r c mt cung cho i ti mt nhnh khc th r khng l
cht.
chng t iu ny, ta da vo tnh cht ca cy DFS: cung cho s ni t mt nhnh ti nhnh
thm trc , ch khng bao gi c cung cho i ti nhnh thm sau. Gi s c cung cho (v, v')
i t v nhnh DFS gc r ti v' nhnh DFS gc r, gi r' l cht ca thnh phn lin thng cha v'.
Theo tnh cht trn, v' phi thm trc r, suy ra r' cng phi thm trc r. C hai kh nng xy ra:
Nu r' thuc nhnh DFS duyt trc r th r' s c duyt xong trc khi thm r, tc l khi thm
r v c sau ny khi thm v th nhnh DFS gc r' b hu, cung cho (v, v') s khng c tnh n
na.
Nu r' l tin bi ca r th ta c r' n c r, v nm trong nhnh DFS gc r nn r n c v, v
n c v' v (v, v') l cung, v' li n c r' bi r' l cht ca thnh phn lin thng mnh cha
v'. Ta thit lp c chu trnh (r'rvv'r'), suy ra r' v r thuc cng mt thnh phn lin thng
mnh, r' l cht nn r khng th l cht na.
T ba nhn xt v cch ci t chng trnh nh trong nhn xt 3, Ta c: nh r l cht nu v ch
nu khng tn ti cung ngc hoc cung cho ni mt nh thuc nhnh DFS gc r vi mt nh
ngoi nhnh , hay ni cch khc: r l cht nu v ch nu khng tn ti cung ni t mt nh
thuc nhnh DFS gc r ti mt nh thm trc r.
Di y l mt ci t ht sc thng minh, ch cn sa i mt cht th tc Visit trn l ta c
ngay phng php ny. Ni dung ca n l nh s th t cc nh t nh c thm u tin n
nh thm sau cng. nh ngha Numbering[u] l s th t ca nh u theo cch nh s . Ta tnh
thm Low[u] l gi tr Numbering nh nht trong cc nh c th n c t mt nh v no
ca nhnh DFS gc u bng mt cung (vi gi thit rng u c mt cung gi ni vi chnh u).
C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u v khi gn
Low[u] := Numbering[u] (u c cung ti chnh u)
Xt tt c nhng nh v ni t u:
Nu v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u]
mi
:= min(Low[u]
c
, Numbering[v]).
Nu v cha thm th ta gi quy i thm v, sau cc tiu ho Low[u] theo cng thc:
Low[u]
mi
:= min(Low[u]
c
, Low[v])
D dng chng minh c tnh ng n ca cng thc tnh.
Khi duyt xong mt nh u (chun b thot khi th tc Visit(u). Ta so snh Low[u] v
Numbering[u]. Nu nh Low[u] = Numbering[u] th u l cht, bi khng c cung ni t mt nh
Chuyn
i hc S phm H Ni, 1999-2002
200
thuc nhnh DFS gc u ti mt nh thm trc u. Khi ch vic lit k cc nh thuc thnh phn
lin thng mnh cha u l nhnh DFS gc u.
cng vic d dng hn na, ta nh ngha mt danh sch L c t chc di dng ngn xp v
dng ngn xp ny ly ra cc nh thuc mt nhnh no . Khi thm ti mt nh u, ta y ngay
nh u vo ngn xp, th khi duyt xong nh u, mi nh thuc nhnh DFS gc u s c y
vo ngn xp L ngay sau u. Nu u l cht, ta ch vic ly cc nh ra khi ngn xp L cho ti khi ly
ti nh u l s c nhnh DFS gc u cng chnh l thnh phn lin thng mnh cha u.
procedure Visit(uV);
begin
Count := Count + 1; Numbering[u] := Count; {Trc ht nh s u}
Low[u] := Numbering[u];
<a u vo cy DFS>;
<y u vo ngn xp L>;
for (v: (u, v)E) do
if <v thm> then
Low[u] := min(Low[u], Numbering[v])
else
begin
Visit(v);
Low[u] := min(Low[u], Low[v]);
end;
if Numbering[u] = Low[u] then {Nu u l cht}
begin
<Thng bo thnh phn lin thng mnh vi cht u gm c cc nh:>;
repeat
<Ly t ngn xp L ra mt nh v>;
<Output v>;
<Xo nh v khi th>;
until v = u;
end;
end;

begin
<Thm vo th mt nh x v cc cung (x, v) vi mi v>;
<Khi to mt bin m Count := 0>;
<Khi to mt ngn xp L := >;
<Khi to cy tm kim DFS := >;
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(n
2
) trong trng hp
biu din bng ma trn k v l O(n.m) trong trng hp biu din bng danh sch cnh.
Mi th sn sng, di y l ton b chng trnh. Trong chng trnh ny, ta s dng:
Ma trn k A biu din th.
Mng Free kiu Boolean, Free[u] = True nu u cha b lit k vo thnh phn lin thng no, tc
l u cha b loi khi th.
Mng Numbering v Low vi cng dng nh trn, quy c Numbering[u] = 0 nu nh u cha
c thm.
Cc thut ton trn th
L Minh Hong
201
Mng Stack, th tc Push, hm Pop m t cu trc ngn xp.
Input: file vn bn GRAPH.INP:
Dng u: Ghi s nh n ( 100) v s cung m ca th cch nhau mt du cch
m dng tip theo, mi dng ghi hai s nguyn u, v cch nhau mt du cch th hin c cung (u, v)
trong th
Output: file vn bn GRAPH.OUT, lit k cc thnh phn lin thng mnh
1
2
3
4
5
6
7
8
9 10
11


GRAPH.INP
11 15
1 2
1 8
2 3
3 4
4 2
4 5
5 6
6 7
7 5
8 9
9 4
9 10
10 8
10 11
11 8

SCONNECT.OUT
Component 1:
7, 6, 5,
Component 2:
4, 3, 2,
Component 3:
11, 10, 9, 8,
Component 4:
1,

P_4_04_2.PAS * Thut ton Tarjan lit k cc thnh phn lin thng mnh
program Strong_connectivity;
const
InputFile = 'GRAPH.INP';
OutputFile = 'GRAPH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
Free: array[1..max] of Boolean;
Numbering, Low, Stack: array[1..max] of Integer;
n, Count, ComponentCount, Last: Integer;
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(Numbering, SizeOf(Numbering), 0); {Mi nh u cha thm}
FillChar(Free, SizeOf(Free), True); {Cha nh no b loi}
Last := 0; {Ngn xp rng}
Chuyn
i hc S phm H Ni, 1999-2002
202
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(Last);
Stack[Last] := v;
end;

function Pop: Integer; {Ly mt nh khi ngn xp, tr v trong kt qu hm}
begin
Pop := Stack[Last];
Dec(Last);
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); Numbering[u] := Count; {Trc ht nh s cho u}
Low[u] := Numbering[u]; {Coi u c cung ti u, nn c th khi gn Low[u] th ny ri sau cc tiu ho dn}
Push(u); {y u vo ngn xp}
for v := 1 to n do
if Free[v] and a[u, v] then {Xt nhng nh v k u}
if Numbering[v] <> 0 then {Nu v thm}
Low[u] := Min(Low[u], Numbering[v]) {Cc tiu ho Low[u] theo cng thc ny}
else {Nu v cha thm}
begin
Visit(v); {Tip tc tm kim theo chiu su bt u t v}
Low[u] := Min(Low[u], Low[v]); {Ri cc tiu ho Low[u] theo cng thc ny}
end;
{n y th nh u c duyt xong, tc l cc nh thuc nhnh DFS gc u u thm}
if Numbering[u] = Low[u] then {Nu u l cht}
begin {Lit k thnh phn lin thng mnh c cht u}
Inc(ComponentCount);
WriteLn(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}
{sau ny phi hu b thnh phn lin thng gm mi mt nh gi }
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
end;

begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
Cc thut ton trn th
L Minh Hong
203
Init;
Solve;
Close(fo);
end.

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

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

Cc thut ton trn th
L Minh Hong
205
5. VI NG DNG CA CC THUT TON TM KIM TRN TH
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:
T l cy
T khng cha chu trnh n v c n - 1 cnh
T lin thng v mi cnh ca n u l cu
Gia hai nh bt k ca T u tn ti 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.
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 = (v
1
, v
2
, ,
v
k
) l mt ng i di nht (qua nhiu cnh nht) trong T. nh v
1
khng th c cnh ni vi nh
no trong s cc nh v
3
, v
4
, , v
k
. Bi nu c cnh (v
1
, v
p
) (3 p k) th ta s thit lp c chu
trnh n (v
1
, v
2
, , v
p
, v
1
). Mt khc, nh v
1
cng khng th c cnh ni vi nh no khc ngoi
cc nh trn P trn bi nu c cnh (v
1
, v
0
) (v
0
P) th ta thit lp c ng i (v
0
, v
1
, v
2
, , v
k
)
di hn ng i P. Vy nh v
1
ch c ng mt cnh ni vi v
2
hay v
1
l nh treo. Loi b v
1
v
cnh (v
1
, v
2
) 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 T
1
, T
2
, , T
k
. V T khng cha chu trnh n nn cc thnh
phn lin thng ca T cng khng cha chu trnh n, tc l cc T
1
, T
2
, , T
k
u l cy. Gi n
1
,
n
2
, , n
k
ln lt l s nh ca T
1
, T
2
, , T
k
th cy T
1
c n
1
- 1 cnh, cy T
2
c n
2
- 1 cnh, cy
Chuyn
i hc S phm H Ni, 1999-2002
206
T
k
c n
k
- 1 cnh. Cng li ta c s cnh ca T l n
1
+ n
2
+ + n
k
- k = n - k cnh. Theo gi thit,
cy T c n - 1 cnh, suy ra k = 1, th ch c mt thnh phn lin thng l th lin thng.
By gi khi T lin thng, nu b i mt cnh ca T th T s cn n - 2 cnh v s khng lin
thng bi nu T vn lin thng th do T khng c chu trnh nn T s l cy v c n - 1 cnh. iu
chng t mi cnh ca T u l cu.
34: "T lin thng v mi cnh ca n u l cu""Gia hai nh bt k ca T c ng
mt ng i n"
Gi x v y l 2 nh bt k trong T, v T lin thng nn s c mt ng i n t x ti y. Nu tn
ti mt ng i n khc t x ti y th nu ta b i mt cnh (u, v) nm trn ng i th nht
nhng khng nm trn ng i th hai th t u vn c th n c v bng cch: i t u i theo
chiu ti x theo cc cnh thuc ng th nht, sau i t x ti y theo ng th hai, ri li i t
y ti v theo cc cnh thuc ng i th nht. iu ny mu thun vi gi thit (u, v) l cu.
45: "Gia hai nh bt k ca T c ng mt ng i n""T khng cha chu trnh
n nhng h c thm vo mt cnh ta thu c mt chu trnh n"
Th nht T khng cha chu trnh n v nu T cha chu trnh n th chu trnh qua t nht hai
nh u, v. R rng dc theo cc cnh trn chu trnh th t u c hai ng i n ti v. V l.
Gia hai nh u, v bt k ca T c mt ng i n ni u vi v, vy khi thm cnh (u, v) vo
ng i ny th s to thnh chu trnh.
56: "T khng cha chu trnh n nhng h c thm vo mt cnh ta thu c mt chu
trnh n""T lin thng v c n - 1 cnh"
Gi u v v l hai nh bt k trong T, thm vo T mt cnh (u, v) na th theo gi thit s to thnh
mt chu trnh cha cnh (u, v). Loi b cnh ny i th phn cn li ca chu trnh s l mt ng
i t u ti v. Mi cp nh ca T u c mt ng i ni chng tc l T lin thng, theo gi thit T
khng cha chu trnh n nn T l cy v c n - 1 cnh.
61: "T lin thng v c n - 1 cnh""T l cy"
Gi s T khng l cy th T c chu trnh, hu b mt cnh trn chu trnh ny th T vn lin thng,
nu th mi nhn c vn c chu trnh th li hu mt cnh trong chu trnh mi. C nh th cho
ti khi ta nhn c mt th lin thng khng c chu trnh. th ny l cy nhng li c < n - 1
cnh (v l). Vy T l cy
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).
Cc thut ton trn th
L Minh Hong
207
G T
1
T
2 T
3

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

Hnh 68: Cy khung DFS (a) v cy khung BFS (b) (Mi tn ch chiu i thm cc nh)
Chuyn
i hc S phm H Ni, 1999-2002
208
5.2. TP CC CHU TRNH C BN CA TH
Xt mt th v hng lin thng G = (V, E); gi T = (V, F) l mt cy khung ca n. Cc cnh
ca cy khung c gi l cc cnh trong, cn cc cnh khc l cc cnh ngoi.
Nu thm mt cnh ngoi eE \ F vo cy khung T, th ta c ng mt chu trnh n trong T, k
hiu chu trnh ny l C
e
. Tp cc chu trnh:
= {C
e
eE \ F}
c gi l tp cc chu trnh c s ca th G.
Cc tnh cht quan trng ca tp cc chu trnh c s:
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.
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. NH CHIU TH V BI TON LIT K CU
Bi ton t ra l cho mt th v hng lin thng G = (V, E), hy thay mi cnh ca th bng
mt cung nh hng c mt th c hng lin thng mnh. Nu c phng n nh chiu
nh vy th G c gi l th nh chiu c. Bi ton nh chiu th c ng dng r nht
trong s giao thng ng b. Chng hn nh tr li cu hi: Trong mt h thng ng ph,
Cc thut ton trn th
L Minh Hong
209
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.
5.3.1. Php nh chiu DFS
Xt m hnh duyt th bng thut ton tm kim theo chiu su bt u t nh 1. V th l v
hng lin thng nn qu trnh tm kim s thm c ht cc nh.
procedure Visit(u V);
begin
<Thng bo thm u v nh du u thm>;
for (v: (u, v) E) do
if <v cha thm> then Visit(v);
end;

begin
<nh du mi nh u cha thm>;
Visit(1);
end;
Coi mt cnh ca th tng ng vi hai cung c hng ngc chiu nhau. Thut ton tm
kim theo chiu su theo m hnh trn s duyt qua ht cc nh ca th v tt c cc cung na.
Qu trnh duyt cho ta mt cy tm kim DFS. Ta c cc nhn xt sau:
Nhn xt 1:
Qu trnh duyt s khng c cung cho (cung i t mt nhnh DFS thm sau ti nhnh DFS thm
trc). Tht vy, nu qu trnh duyt xt ti mt cung (u, v):
Nu u thm trc v c ngha l khi Visit(u) c gi th v cha thm, v th tc Visit(u) s xy
dng nhnh DFS gc u gm nhng nh cha thm n c t u, suy ra v nm trong nhnh DFS
gc u v l hu du ca u, hay (u, v) l cung DFS hoc cung xui.
Nu u thm sau v (v thm trc u), tng t trn, ta suy ra u nm trong nhnh DFS gc v, v l tin
bi ca u (u, v) l cung ngc.
Nhn xt 2:
Trong qu trnh duyt th theo chiu su, nu c duyt qua cung (u, v) no th ta b i cung (v, u).
(Tc l h duyt qua cung (u, v) th ta nh chiu lun cnh (u, v) theo chiu t u ti v), ta c mt
php nh chiu th gi l php nh chiu DFS.
Chuyn
i hc S phm H Ni, 1999-2002
210
1
2
3
4
6
9
10
5
7 8
1
2
3
4
6
9
10
5
7 8

Hnh 69: Php nh chiu DFS
Nhn xt 3:
Vi php nh chiu nh trn, th s ch cn cc cung trn cy DFS v cung ngc, khng cn li
cung xui. Bi trn th v hng ban u, nu ta coi mt cnh l hai cung c hng ngc chiu
nhau th vi mt cung xui ta c cung ngc chiu vi n l cung ngc. Do tnh cht DFS, cung
ngc c duyt trc cung xui tng ng, nn khi nh chiu cnh theo cung ngc th cung
xui s b hu v khng b xt ti na.
Nhn xt 4:
Trong th v hng ban u, cnh b nh hng thnh cung ngc chnh l cnh ngoi ca cy
khung DFS. Chnh v vy, mi chu trnh c s trong th v hng ban u vn s l chu
trnh trong th c hng to ra. (y l mt phng php hiu qu lit k cc chu trnh c s
ca cy khung DFS: Va duyt DFS va nh chiu, nu duyt phi cung ngc (u, v) th truy vt
ng i ca DFS tm ng t v n u, sau ni thm cung ngc (u, v) c mt chu
trnh c s).
nh l: iu kin cn v mt th v hng lin thng c th nh chiu c l mi
cnh ca th nm trn t nht mt chu trnh n (Hay ni cch khc mi cnh ca th u
khng phi l cu).
Chng minh:
Gi G = (V, E) l mt th v hng lin thng.
""
Nu G l nh chiu c th sau khi nh hng s c th lin thng mnh G'. Vi mt cnh
c nh chiu thnh cung (u, v) th s tn ti mt ng i n trong G' theo cc cnh nh
hng t v v u. ng i ni thm cung (u, v) s thnh mt chu trnh n c hng trong G'.
Tc l trn th ban u, cnh (u, v) nm trn mt chu trnh n.
""
Cc thut ton trn th
L Minh Hong
211
Nu mi cnh ca G u nm trn mt chu trnh n, ta s chng minh rng: php nh chiu DFS
s to ra th G' lin thng mnh.
Trc ht ta chng minh rng nu (u, v) l cnh ca G th s c mt ng i t u ti v trong G'.
Tht vy, v (u, v) nm trong mt chu trnh n, m mi cnh ca mt chu trnh n u phi thuc
mt chu trnh c s no , nn s c mt chu trnh c s cha c u v v. Chu trnh c s qua php
nh chiu DFS vn l chu trnh trong G' nn i theo cc cnh nh hng ca chu trnh , ta c th
i t u ti v v ngc li.
Nu u v v l 2 nh bt k ca G th do G lin thng, tn ti mt ng i (u=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'.
5.3.2. Ci t
Vi nhng kt qu chng minh trn, ta cn suy ra c: Nu th lin thng v mi cnh ca
n nm trn t nht mt chu trnh n th php nh chiu DFS s cho mt th lin thng mnh.
Cn nu khng, th php nh chiu DFS s cho mt th nh hng c t thnh phn lin thng
mnh nht, mt cnh khng nm trn mt chu trnh n no (cu) ca th ban u s c nh
hng thnh cung ni gia hai thnh phn lin thng mnh.
Ta s ci t mt thut ton vi mt th v hng: lit k cc cu v nh chiu cc cnh
c mt th mi c t thnh phn lin thng mnh nht:
nh s cc nh theo th t thm DFS, gi Numbering[u] l s th t ca nh u theo cch nh
s . Trong qu trnh tm kim DFS, duyt qua cnh no nh chiu lun cnh . nh ngha
thm Low[u] l gi tr Numbering nh nht ca nhng nh n c t nhnh DFS gc u bng mt
cung ngc. Tc l nu nhnh DFS gc u c nhiu cung ngc hng ln trn pha gc cy th ta
ghi nhn li cung ngc hng ln cao nht. Nu nhnh DFS gc u khng cha cung ngc th ta
cho Low[u] = +. C th cch cc tiu ho Low[u] nh sau:
Trong th tc Visit(u), trc ht ta nh s th t thm cho nh u (Numbering[u]) v khi gn
Low[u] = +.
Sau , xt tt c nhng nh v k u, nh chiu cnh (u, v) thnh cung (u, v). C hai kh nng xy
ra:
v cha thm th ta gi Visit(v) thm v v cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]
c
, Low[v])
v thm th ta cc tiu ho Low[u] theo cng thc:
Low[u] := min(Low[u]
c
, Numbering[v])
Chuyn
i hc S phm H Ni, 1999-2002
212
D thy cch tnh nh vy l ng n bi nu v cha thm th nhnh DFS gc v nm trong nhnh
DFS gc u v nhng cung ngc trong nhnh DFS gc v cng l cung ngc trong nhnh DFS gc u.
Cn nu v thm th (u, v) s l cung ngc.
1
2
3
5
4
6
7
8
9
10
11
1
2
3
4
5
9
6
10
11
7
8
1
1
1
5
4
4
5
4
4
5
6
th v hng th nh chiu
Gi tr Numbering[.] ghi trong vng trn
Gi tr Low[.] ghi bn cnh

Hnh 70: Php nh s v ghi nhn cung ngc ln cao nht
Nu t nh u ti thm nh v, (u, v) l cung DFS. Khi nh v c duyt xong, li v th tc
Visit(u), ta so snh Low[v] v Numbering[u]. Nu Low[v] > Numbering[u] th tc l nhnh DFS
gc v khng c cung ngc thot ln pha trn v. Tc l cnh (u, v) khng thuc mt chu trnh c
s no c, tc cnh l cu.
{ th G = (V, E)}
procedure Visit(uV);
begin
<nh s th t thm cho nh u (Numbering[u]); Khi gn Low[u] := +>;
for (v: (u, v)E) do
begin
<nh chiu cnh (u, v) thnh cung (u, v) Loi b cung (v, u)>;
if <v cha thm> then
begin
Visit(v);
if Low[v] > Numbering[u] then <In ra cu (u, v)>;
Low[u] := Min(Low[u], Low[v]); {Cc tiu ho Low[u] theo Low[v]}
end
else {v thm}
Low[u] := Min(Low[u], Numbering[v]); {Cc tiu ho Low[u] theo Numbering[v]}
end;
end;

begin
for (uV) do
if <u cha thm> then Visit(u);
<In ra cch nh chiu>;
end.

Input: file vn bn GRAPH.INP
Dng 1 ghi s nh n (n 100) v s cnh m ca th cch nhau t nht mt du cch
Cc thut ton trn th
L Minh Hong
213
m dng tip theo, mi dng ghi hai s nguyn dng u, v cch nhau t nht mt du cch,
cho bit th c cnh ni nh u vi nh v
Output: file vn bn BRIDGES.OUT
Thng bo cc cu v php nh chiu c t thnh phn lin thng mnh nht
1
2
3
5
4
6
7
8
9
10
11

GRAPH.INP
11 14
1 2
1 3
2 3
2 5
4 5
4 7
4 10
5 6
5 9
6 8
7 10
7 11
8 9
10 11

BRIDGES.OUT
Bridges:
(5, 4)
(2, 5)
Directed Edges:
1 -> 2
2 -> 3
2 -> 5
3 -> 1
4 -> 7
5 -> 4
5 -> 6
6 -> 8
7 -> 10
8 -> 9
9 -> 5
10 -> 4
10 -> 11
11 -> 7

P_4_05_1.PAS * Php nh chiu DFS v lit k cu
program Directivity_and_Bridges;
const
InputFile = 'GRAPH.INP';
OutputFile = 'BRIDGES.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th}
Numbering, Low: array[1..max] of Integer;
n, Count: Integer;
fo: Text;

procedure Enter;
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 Init;
begin
FillChar(Numbering, SizeOf(Numbering), 0); {Numbering[u] = 0 u cha thm}
Count := 0;
end;

Chuyn
i hc S phm H Ni, 1999-2002
214
procedure Visit(u: Integer);
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; {nh s th t thm cho nh u, u tr thnh thm}
Low[u] := n + 1; {Khi gn Low[u] bng mt gi tr ln hn tt c Numbering}
for v := 1 to n do
if a[u, v] then {Xt mi nh v k u}
begin
a[v, u] := False; {nh chiu cnh (u, v) thnh cung (u, v)}
if Numbering[v] = 0 then {Nu v cha thm}
begin
Visit(v); {i thm v}
if Low[v] > Numbering[u] then {(u, v) l cu}
WriteLn(fo, '(', u, ', ', v, ')');
if Low[u] > Low[v] then Low[u] := Low[v]; {Cc tiu ho Low[u] }
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
end;
end;

procedure Solve;
var
u, v: Integer;
begin
WriteLn(fo, 'Bridges: '); {Dng DFS nh chiu th v lit k cu}
for u := 1 to n do
if Numbering[u] = 0 then Visit(u);
WriteLn(fo, 'Directed Edges: '); {Qut li ma trn k in ra cc cnh nh hng}
for u := 1 to n do
for v := 1 to n do
if a[u, v] then WriteLn(fo, u, ' -> ', v);
end;

begin
Enter;
Assign(fo, OutputFile); Rewrite(fo);
Init;
Solve;
Close(fo);
end.
5.4. LIT K KHP
Trong th v hng, Mt nh C c gi l khp, nu nh ta b i nh C v cc cnh lin
thuc vi n th s lm tng s thnh phn lin thng ca th. Bi ton t ra l phi lit k ht
cc khp ca th.
R rng theo cch nh ngha trn, cc nh treo v nh c lp s khng phi l khp. th lin
thng c 3 nh, khng c khp (cho d b i nh no th vn lin thng) c gi l th
song lin thng. Gia hai nh phn bit ca th song lin thng, tn ti t nht 2 ng i khng
c nh trung gian no chung.
Coi mi cnh ca th ban u l hai cung c hng ngc chiu nhau v dng php duyt th
theo chiu su:

{ th G = (V, E)}
Cc thut ton trn th
L Minh Hong
215
procedure Visit(u V): V;
begin
<Thng bo thm u v nh du u thm>;
for (v: (u, v) E) do
if <v cha thm> then Visit(v);
end;

begin
<nh du mi nh u cha thm>;
for (uV) do
if <u cha thm> then Visit(u);
end;
Qu trnh duyt cho mt rng cc cy DFS. Cc cung duyt qua c ba loi: cung DFS, cung ngc
v cung xui, khng b ri hnh, ta ch u tin v cung DFS hoc cung ngc:
1
3
6 7
2
4
5
8
11 12
9
10
13
1
3
6 7
2
4
5
8
11 12
9
10
13

Hnh 71 Duyt DFS, xc nh cy DFS v cc cung ngc
Hy nhnh DFS gc nh r no
Nu mi nhnh con ca nhnh DFS gc r u c mt cung ngc ln ti mt tin bi ca r th r
khng l khp. Bi nu trong th ban u, ta b r i th t mi nh bt k ca nhnh con, ta vn
c th i ln mt tin bi ca r, ri i sang nhnh con khc hoc i sang tt c nhng nh cn li
ca cy. S thnh phn lin thng ca th khng thay i.
Nu r khng phi l gc ca mt cy DFS, v tn ti mt nhnh con ca nhnh DFS gc r khng c
cung ngc ln mt tin bi ca r th r l khp. Bi khi , tt c nhng cung xut pht t nhnh
con ch i ti nhng nh ni b trong nhnh DFS gc r m thi, trn th ban u, khng tn
ti cnh ni t nhng nh thuc nhnh con ti mt tin bi ca r. Vy t nhnh mun i ln mt
tin bi ca r, tt phi i qua r. Hu r khi th s lm mt tt c cc ng i , tc l lm tng
s thnh phn lin thng ca th.
Nu r l gc ca mt cy DFS, th r l khp khi v ch khi r c t nht hai nhnh con. Bi khi r c 2
nhnh con th ng i gia hai nh thuc hai nhnh con tt phi i qua r.
Vy th thut ton lit k khp li l nhng k thut quen thuc, duyt DFS, nh s, ghi nhn
cnh ngc ln cao nht t mt nhnh con, ch thm vo mt thao tc nh: Nu t nh u gi
quy thm nh v ((u, v) l cung DFS) th sau khi duyt xong nh v, li v th tc Visit(u), ta
so snh Low[v] v Numbering[u] kim tra xem t nhnh con gc v c cnh ngc no ln
tin bi ca u hay khng, nu khng c th tm thi nh du u l khp. Cui cng phi kim
Chuyn
i hc S phm H Ni, 1999-2002
216
tra li iu kin: nu u l gc cy DFS th n l khp khi v ch khi n c t nht 2 nhnh con,
nu khng tho mn iu kin th nh du li u khng l khp.
Input: file vn bn GRAPH.INP vi khun dng nh bi ton lit k cu
Output: file vn bn CUTV.OUT ghi cc khp ca th
1
3
6 7
2
4
5
8
11 12
9
10
13

GRAPH.INP
13 15
1 3
2 4
2 5
3 6
3 7
4 8
4 11
5 9
5 10
6 7
8 11
8 12
9 10
9 13
11 12

CUTV.OUT
Cut vertices:
2, 3, 4, 5, 9,

P_4_05_2.PAS * Lit k cc khp ca th
program CutVertices;
const
InputFile = 'GRAPH.INP';
OutputFile = 'CUTV.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean; {Ma trn k ca th}
Numbering, Low, nC: array[1..max] of Integer; {nC[u]: S nhnh con ca nhnh DFS gc u}
Mark: array[1..max] of Boolean; {Mark[u] = True u l khp}
n, Count: Integer;

procedure LoadGraph;
var
i, m, u, v: 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;

procedure Visit(u: Integer); {Tm kim theo chiu su bt u t u}
var
v: Integer;
begin
Inc(Count);
Numbering[u] := Count; Low[u] := n + 1; nC[u] := 0;
Mark[u] := False;
for v := 1 to n do
if a[u, v] then {Xt mi v k u}
Cc thut ton trn th
L Minh Hong
217
if Numbering[v] = 0 then {Nu v cha thm}
begin
Inc(nc[u]); {Tng bin m s con ca u ln 1}
Visit(v); {Thm v}
{Nu nhnh DFS gc v khng c cung ngc ln mt tin bi ca u tc l Low[v] Numbering[u]}
Mark[u] := Mark[u] or (Low[v] >= Numbering[u]); {Tm nh du u l khp}
if Low[u] > Low[v] then Low[u] := Low[v]; {Cc tiu ho Low[u] }
end
else
if Low[u] > Numbering[v] then Low[u] := Numbering[v]; {Cc tiu ho Low[u] }
end;

procedure Solve;
var
u: Integer;
begin
FillChar(Numbering, SizeOf(Numbering), 0); {nh s = 0 nh cha thm}
FillChar(Mark, SizeOf(Mark), False); {Mng nh du khp cha c g}
Count := 0;
for u := 1 to n do
if Numbering[u] = 0 then {Xt mi nh u cha thm}
begin
Visit(u); {Thm u, xy dng cy DFS gc u}
if nC[u] < 2 then {Nu u c t hn 2 con}
Mark[u] := False; {Th u khng phi l khp}
end;
end;

procedure Result; {Da vo mng nh du lit k cc khp}
var
i: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Cut vertices:');
for i := 1 to n do
if Mark[i] then Write(f, i, ', ');
Close(f);
end;

begin
LoadGraph;
Solve;
Result;
end.
Chuyn
i hc S phm H Ni, 1999-2002
218
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 ?.
A
B
C
D

Hnh 72: 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.
R rng mt th Euler th phi l na Euler nhng iu ngc li th khng phi lun ng
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.
Cc thut ton trn th
L Minh Hong
219
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 73:
1
2
3
4
5
6
7
8

Hnh 73
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 74 bng nt
lin, cc cnh b xo c v bng nt t.
1
2
3
4
5
6
7
8

Hnh 74
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).
Chuyn
i hc S phm H Ni, 1999-2002
220
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 2
3 4

EULER.INP
5
1 2 1
1 3 2
1 4 1
2 3 1
3 4 1
EULER.OUT
1 2 3 1 3 4 1

P_4_06_1.PAS * Thut ton Fleury tm chu trnh Euler
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);
FillChar(a, SizeOf(a), 0);
ReadLn(f, n);
Cc thut ton trn th
L Minh Hong
221
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}
First, Last: Integer; {First: Ch s u hng i, Last: Ch s cui hng i}
u, v: Integer;
Free: array[1..max] of Boolean; {Mng nh du}
begin
Dec(a[x, y]); Dec(a[y, x]); {Th xo mt cnh (x, y) S cnh ni (x, y) gim 1}
FillChar(Free, n, True); {sau p dng BFS xem t y c quay li x c khng ?}
Free[y] := False;
First := 1; Last := 1;
Queue[1] := y;
repeat
u := Queue[First]; Inc(First);
for v := 1 to n do
if Free[v] and (a[u, v] > 0) then
begin
Inc(Last);
Queue[Last] := v;
Free[v] := False;
if Free[x] then Break;
end;
until First > Last;
CanGoBack := not Free[x];
Inc(a[x, y]); Inc(a[y, x]); { trn th xo cnh th gi phi phc hi}
end;

procedure FindEulerCircuit; {Thut ton Fleury}
var
Current, Next, v, count: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
Current := 1;
Write(f, 1, ' '); {Bt u t nh Current = 1}
count := 1;
repeat
Next := 0;
for v := 1 to n do
if a[Current, v] > 0 then
begin
Next := v;
if CanGoBack(Current, Next) then Break;
end;
if Next <> 0 then
begin
Dec(a[Current, Next]);
Dec(a[Next, Current]); {Xo b cnh va i qua}
Write(f, Next, ' '); {In kt qu i ti Next}
Inc(count);
if count mod 16 = 0 then WriteLn; {In ra ti a 16 nh trn mt dng}
Current := Next; {Li tip tc vi nh ang ng l Next}
end;
until Next = 0; {Cho ti khi khng i tip c na}
Chuyn
i hc S phm H Ni, 1999-2002
222
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>;
<M t cc phng thc Push (y vo) v Pop(ly ra) mt nh t ngn xp Stack, phng thc Get cho bit phn t nm
nh Stack. Khc vi Pop, phng thc Get ch cho bit phn t nh Stack ch khng ly phn t ra>;
while Stack do
begin
x := Get;
if <Tn ti nh y m (x, y)E> then {T x cn i hng khc c}
begin
Push(y);
<Loi b cnh (x, y) khi th>;
end
else {T x khng i tip c ti u na}
begin
x := Pop;
<In ra nh x trn ng i Euler>;
end;
end;
Thut ton trn c th dng tm chu trnh Euler trong th c hng lin thng yu, mi nh
c bn bc ra bng bn bc vo. Tuy nhin th t cc nh in ra b ngc so vi cc cung nh
hng, ta c th o ngc hng cc cung trc khi thc hin thut ton c th t ng.
Thut ton hot ng vi hiu qu cao, d ci t, nhng trng hp xu nht th Stack s phi cha
ton b danh sch nh trn chu trnh Euler chnh v vy m khi a th c s cnh qu ln th s
khng khng gian nh m t Stack (Ta c th vi th ch gm 2 nh nhng gia hai nh
c ti 10
6
cnh ni s thy ngay). L do thut ton ch c th p dng trong trng hp s cnh c
gii hn bit trc nh l nh vy.
Cc thut ton trn th
L Minh Hong
223
P_4_06_2.PAS * Thut ton hiu qu tm chu trnh Euler
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, last: 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(last);
Stack[last] := v;
end;

function Pop: Integer; {Ly mt nh khi ngn xp, tr v trong kt qu hm}
begin
Pop := Stack[last];
Dec(last);
end;

function Get: Integer; {Tr v phn t nh (Top) ngn xp}
begin
Get := Stack[last];
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}
last := 1;
count := 0;
while last <> 0 do {Chng no ngn xp cha rng}
begin
u := Get; {Xc nh u l phn t nh ngn xp}
for v := 1 to n do
if a[u, v] > 0 then {Xt tt c cc cnh lin thuc vi u, nu thy}
begin
Dec(a[u, v]); Dec(a[v, u]); {Xo cnh khi th}
Push(v); {y nh tip theo vo ngn xp}
Chuyn
i hc S phm H Ni, 1999-2002
224
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.
A
C
D
B
F
G H
I
J K
L
M
N
M D A B C M F G N L I J K N H E M
E

Cc thut ton trn th
L Minh Hong
225
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 1 i < j n
ng i (x
1
, x
2
, , x
n
) c gi l ng i Hamilton nu x
i
x
j
vi 1 i < j n
C th pht biu mt cch hnh thc: Chu trnh Hamilton l chu trnh xut pht t 1 nh, i thm
tt c nhng nh cn li mi nh ng 1 ln, cui cng quay tr li nh xut pht. ng i
Hamilton l ng i qua tt c cc nh ca th, mi nh ng 1 ln. Khc vi khi nim chu
trnh Euler v ng i Euler, mt chu trnh Hamilton khng phi l ng i Hamilton bi c nh
xut pht c thm ti 2 ln.
V d: Xt 3 n th G
1
, G
2
, G
3
nh trong Hnh 75:
a
b
e
c
d
a
d
b
c
a
d
b
c
e
f g
G
1
G
2
G
3

Hnh 75
th G
1
c chu trnh Hamilton (a, b, c, d, e, a). G
2
khng c chu trnh Hamilton v deg(a) = 1
nhng c ng i Hamilton (a, b, c, d). G
3
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.
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
Chuyn
i hc S phm H Ni, 1999-2002
226
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
4 3
5 2

HAMILTON.INP
5 6
1 2
1 3
2 4
3 5
4 1
5 2
HAMILTON.OUT
1 3 5 2 4 1
1 4 2 5 3 1
P_4_07_1.PAS * Thut ton quay lui lit k chu trnh Hamilton
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;

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]);
Cc thut ton trn th
L Minh Hong
227
end;

procedure Try(i: Integer); {Th cc cch chn nh th i trong hnh trnh}
var
j: Integer;
begin
for j := 1 to n do {nh th i (X[i]) c th chn trong nhng nh}
if Free[j] and a[x[i - 1], j] then {k vi X[i - 1] v cha b i qua }
begin
x[i] := j; {Th mt cch chn X[i]}
if i < n then {Nu cha th chn n X[n]}
begin
Free[j] := False; {nh du nh j l i qua}
Try(i + 1); { cc bc th k tip khng chn phi nh j na}
Free[j] := True; {S th phng n khc cho X[i] nn s b nh du nh va th}
end
else {Nu th chn n X[n]}
if a[j, X[1]] then PrintResult; {v nu X[n] li k vi X[1] th ta c chu trnh Hamilton}
end;
end;

begin
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);
Try(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 Pc-xy v An-r-nt c 2n hip s. Mi hip s c khng qu n - 1 k th.
Hy gip Ca-xi--b, m ca An-r-nt xp 2n hip s ngi quanh mt bn trn sao cho khng c
hip s no phi ngi cnh k th ca mnh. Mi hip s s cho bit nhng k th ca mnh khi h
n sn rng.
Bi 3
Gray code: Mt hnh trn c chia thnh 2
n
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:
100
101
111
110 010
011
001
000

Chuyn
i hc S phm H Ni, 1999-2002
228
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 (X1, Y1) c th di chuyn sang
(X2, Y2) nu X1-X2.Y1-Y2 = 2 (Xem hnh v).

Hy tm mt hnh trnh ca qun m t xut pht, i qua tt c cc ca bn c, mi
ng 1 ln.
V d:
Vi n = 8, xut pht (3, 3)
53 24 27 12 55 62 29 14
26 11 54 63 28 13 56 61
23 52 25 38 57 64 15 30
10 39 58 49 32 37 60 47
51 22 33 40 59 48 31 16
6 9 50 19 36 1 46 43
21 34 7 4 41 44 17 2
8 5 20 35 18 3 42 45

Vi n = 10, xut pht (6, 5)
4 7 30 55 58 9 32 13 38 11
29 54 5 8 31 56 59 10 33 14
6 3 52 57 60 77 34 37 12 39
53 28 61 2 65 92 75 78 15 36
48 51 66 91 76 1 82 35 40 79
27 62 49 64 89 74 93 80 83 16
50 47 90 67 94 81 84 73 96 41
23 26 63 88 85 68 95 98 17 72
46 87 24 21 44 99 70 19 42 97
55 22 45 86 69 20 43 100 71 18

Gi : Nu coi cc ca bn c l cc nh ca th v cc cnh l ni gia hai nh tng ng
vi hai m giao chn th d thy rng hnh trnh ca qun m cn tm s l mt ng i
Cc thut ton trn th
L Minh Hong
229
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).
Chuyn
i hc S phm H Ni, 1999-2002
230
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 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:
Cc thut ton trn th
L Minh Hong
231
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 F
1
F sao cho:
d[S, F] = d[S, F
1
] + c[F
1
, F]
( di ng i ngn nht S->F = di ng i ngn nht S->F
1
+ Chi ph i t F
1
ti F)
nh F
1
l nh lin trc F trong ng i ngn nht t S ti F. Nu F
1
S 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 F
1
. V ta li tm c mt nh F
2
khc F v F
1
:
d[S, F
1
] = d[S, F
2
] + c[F
2
, F
1
]
C tip tc nh vy, sau mt s hu hn bc, ta suy ra rng dy F, F
1
, F
2
, khng cha nh lp
li v kt thc S. Lt ngc th t dy cho ta ng i ngn nht t S ti F.
S

F
2
F
1
F

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. Lu rng cc thut ton di y s lun
lun tm c ng i ngn nht l ng i c bn.
Input: file vn bn MINPATH.INP
Dng 1: Cha s nh n ( 100), s cung m ca th, nh xut pht S, nh ch F cch
nhau t nht 1 du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht 1 du cch, th hin
(u, v) l mt cung E v trng s ca cung l c[u,v] (c[u, v] l s nguyn c gi tr tuyt
i 100)
Output: file vn bn MINPATH.OUT ghi ng i ngn nht t S ti F v di ng i
Chuyn
i hc S phm H Ni, 1999-2002
232
1
2 3
4
5 6
1
2
3
4
5
20
20

MINPATH.INP
6 7 1 4
1 2 1
1 6 20
2 3 2
3 6 3
3 4 20
5 4 5
6 5 4

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.
Tnh dng 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. Do tnh cht: 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
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.
Cc thut ton trn th
L Minh Hong
233
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]);
Do s ti u bc cu (dng d[u] ti u d[v] ri li c th dng d[v] ti u d[w] na) ch lm tc
ti u nhn d[v] tng nhanh hn nn s bc lp ti u nhn vn s khng qu n - 1 bc
P_4_08_1.PAS * Thut ton Ford-Bellman
program Shortest_Path_by_Ford_Bellman;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
n, S, F: Integer;

procedure LoadGraph; {Nhp th, 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;
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;
Chuyn
i hc S phm H Ni, 1999-2002
234
{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, 'Path from ', S, ' to ', F, ' not found')
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 nhn theo
cng thc: d[v] := min(d[v], d[u] + c[u, v]) vi u, v V. Nh vy nu nh ta dng nh u sa
nhn nh v, sau nu ta li ti u c d[u] thm na th ta cng phi sa li nhn d[v] dn ti
vic d[v] c th phi chnh i chnh li rt nhiu ln. Vy nn chng, ti mi bc khng phi ta
xt mi cp nh (u, v) dng nh u sa nhn nh v m s chn nh u l nh m khng th
ti u nhn d[u] thm c na.
Thut ton Dijkstra (E.Dijkstra - 1959) c th m t nh sau:
Bc 1: Khi to
Vi nh v V, gi nhn d[v] l di ng i ngn nht t S ti v. Ta s tnh cc d[v]. Ban u
d[v] c khi gn 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.
Cc thut ton trn th
L Minh Hong
235
lm iu ny ta c th s dng k thut nh du: Free[v] = TRUE hay FALSE tu theo d[v] t
do hay c nh. Ban u cc nhn u t do.
Bc 2: Lp
Bc lp gm c hai thao tc:
1. C nh nhn: Chn trong cc nh c nhn t do, ly ra nh u l nh c d[u] nh
nht, v c nh nhn nh u.
2. Sa nhn: Dng nh u, xt tt c nhng nh v v sa li cc d[v] theo cng thc:
d[v] := min(d[v], d[u] + c[u, v])
Bc lp s kt thc khi m nh ch F c c nh nhn (tm c ng i ngn nht t
S ti F); hoc ti thao tc c nh nhn, tt c cc nh t do u c nhn l + (khng tn ti
ng i).
C th t cu hi, thao tc 1, ti sao nh u nh vy c c nh nhn, gi s d[u] cn c th ti
u thm c na th tt phi c mt nh t mang nhn t do sao cho d[u] > d[t] + c[t, u]. Do trng
s c[t, u] khng m nn d[u] > d[t], tri vi cch chn d[u] l nh nht. Tt nhin trong ln lp u
tin th S l nh c c nh nhn do d[S] = 0.
Bc 3: Kt hp vi vic lu vt ng i trn tng bc sa nhn, thng bo ng i ngn nht
tm c hoc cho bit khng tn ti ng i (d[F] = +).
P_4_08_2.PAS * Thut ton Dijkstra
program Shortest_Path_by_Dijkstra;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Trace: array[1..max] of Integer;
Free: array[1..max] of Boolean;
n, S, F: Integer;

procedure LoadGraph; {Nhp th, trng s cc cung phi l s khng m}
var
i, m, 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
Chuyn
i hc S phm H Ni, 1999-2002
236
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}
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
if d[F] = maxC then
WriteLn(fo, 'Path from ', S, ' to ', F, ' not found')
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.
Cc thut ton trn th
L Minh Hong
237
8.5. THUT TON DIJKSTRA V CU TRC HEAP
Nu th c nhiu nh, t cnh, ta c th s dng danh sch k km trng s biu din th,
tuy nhin tc ca thut ton DIJKSTRA vn kh chm v trong trng hp xu nht, n cn n
ln c nh nhn v mi ln tm nh c nh nhn s mt mt on chng trnh vi phc tp
O(n). tng tc , ngi ta thng s dng cu trc d liu Heap lu cc nh cha c nh
nhn. Heap y l mt cy nh phn hon chnh tho mn: Nu u l nh lu nt cha v v l
nh lu nt con th d[u] d[v]. (nh r lu gc Heap l nh c d[r] nh nht).
Ti mi bc lp ca thut ton Dijkstra c hai thao tc: Tm nh c nh nhn v Sa nhn.
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 5000 nh,
10000 cnh, trng s mi cnh 10000.
P_4_08_3.PAS * Thut ton Dijkstra v cu trc Heap
program Shortest_Path_by_Dijkstra_and_Heap;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 5000;
maxE = 10000;
maxC = 1000000000;
type
TAdj = array[1..maxE] of Integer;
TAdjCost = array[1..maxE] of LongInt;
THeader = array[1..max + 1] of Integer;
var
adj: ^TAdj; {Danh sch k dng mng}
adjCost: ^TAdjCost; {Km trng s}
h: ^THeader; {Mng nh du cc on trong mng adj^ cha danh sch k}
d: array[1..max] of LongInt;
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
Chuyn
i hc S phm H Ni, 1999-2002
238
{c file ln 1, xc nh cc on}
Assign(fi, InputFile); Reset(fi);
ReadLn(fi, n, m, S, F);
New(h);
New(adj); New(adjCost);
{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);
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;
var
r, c, v: Integer;
Cc thut ton trn th
L Minh Hong
239
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(1);
repeat
u := Pop; {Chn nh t do c nhn nh nht}
if u = F then Break; {Nu nh l F th dng ngay}
Free[u] := False; {C nh nhn nh }
for iv := h^[u] + 1 to h^[u + 1] do {Xt danh sch k}
begin
v := adj^[iv];
if Free[v] and (d[v] > d[u] + adjCost^[iv]) then
begin
d[v] := d[u] + adjCost^[iv]; {Ti u ho nhn ca cc nh t do k vi u}
Trace[v] := u; {Lu vt ng i}
Update(v); {T chc li Heap}
end;
end;
until nHeap = 0; {Khng cn nh no mang nhn t do}
end;

procedure PrintResult;
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
if d[F] = maxC then
WriteLn(fo, 'Path from ', S, ' to ', F, ' not found')
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;
Chuyn
i hc S phm H Ni, 1999-2002
240
Init;
Dijkstra;
PrintResult;
end.
8.6. TRNG HP TH KHNG C CHU TRNH - TH T T P
Ta c nh l sau: Gi s G = (V, E) l th khng c chu trnh (c hng - tt nhin). Khi cc
nh ca n c th nh s sao cho mi cung ca n ch ni t nh c ch s nh hn n nh c
ch s ln hn.
1 2
3 4
5
7
6
1 2
7 5
6
4
3

Hnh 76: Php nh li ch s theo th t tp
Thut ton nh s li cc nh ca th c th m t nh sau:
Trc ht ta chn mt nh khng c cung i vo v nh ch s 1 cho nh . Sau xo b nh
ny cng vi tt c nhng cung t u i ra, ta c mt th mi cng khng c chu trnh, v li
nh ch s 2 cho mt nh v no khng c cung i vo, ri li xo nh v cng vi cc cung t v
i ra Thut ton s kt thc nu nh hoc ta nh ch s c ht cc nh, hoc tt c cc
nh cn li u c cung i vo. Trong trng hp tt c cc nh cn li u c cung i vo th s
tn ti chu trnh trong th v khng nh thut ton tm ng i ngn nht trong mc ny khng
p dng c. (Thut ton nh s ny c th ci tin bng cch dng mt hng i v cho nhng
nh khng c cung i vo ng ch ln lt trong hng i , ln lt rt cc nh khi hng i
v nh s cho n, ng thi hu nhng cung i ra khi nh va nh s, lu sau mi ln loi b
cung (u, v), nu thy bn bc vo ca v = 0 th y v vo ch trong hng i, nh vy mt cng
duyt tm nhng nh c bn bc vo = 0)
Nu cc nh c nh s sao cho mi cung phi ni t mt nh ti mt nh khc mang ch s
ln hn th thut ton tm ng i ngn nht c th m t rt n gin:
Gi d[v] l di ng i ngn nht t S ti v. Khi to d[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 S ti nh kt thc F. Bi h
u chy ti u th nhn d[u] l khng th cc tiu ho thm na.
Cc thut ton trn th
L Minh Hong
241
P_4_08_4.PAS * ng i ngn nht trn th khng c chu trnh
program Critical_Path;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
List, d, Trace: array[1..max] of Integer; {List l danh sch cc nh theo cch nh s mi}
n, S, F, count: Integer;

procedure LoadGraph; {Nhp d liu, th khng c c chu trnh}
var
i, m, 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 Number; {Thut ton nh s cc nh}
var
deg: array[1..max] of Integer;
u, v: Integer;
front: Integer;
begin
{Trc ht, tnh bn bc vo ca cc nh (deg
-
)}
FillChar(deg, SizeOf(deg), 0);
for u := 1 to n do
for v := 1 to n do
if (v <> u) and (c[v, u] < maxC) then Inc(deg[u]);
{a nhng nh c bn bc vo = 0 vo danh sch List}
count := 0;
for u := 1 to n do
if deg[u] = 0 then
begin
Inc(count); List[count] := u;
end;
{front: Ch s phn t ang xt, count: S phn t trong danh sch}
front := 1;
while front <= count do {Chng no cha xt ht cc phn t trong danh sch}
begin
{Xt phn t th front trong danh sch, y con tr front sang phn t k tip}
u := List[front]; Inc(front);
for v := 1 to n do
if c[u, v] <> maxC then {Xt nhng cung (u, v) v "loi" khi th deg
-
(v) gim 1}
begin
Dec(deg[v]);
if deg[v] = 0 then {Nu v tr thnh nh khng c cung i vo}
begin {a tip v vo danh sch List}
Inc(count);
List[count] := v;
end;
end;
end;
end;

Chuyn
i hc S phm H Ni, 1999-2002
242
procedure Init;
var
i: Integer;
begin
for i := 1 to n do d[i] := maxC;
d[S] := 0;
end;

procedure FindPath; {Thut ton quy hoch ng tm ng i ngn nht trn th khng chu trnh}
var
i, j, u, v: Integer;
begin
for i := 1 to n - 1 do
for j := i + 1 to n do
begin
u := List[i]; v := List[j]; {Dng List[i] ti u nhn List[j] vi i < j}
if d[v] > d[u] + c[u, v] then
begin
d[v] := d[u] + c[u, v];
Trace[v] := u;
end
end;
end;

procedure PrintResult; {In ng i t S ti F}
var
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
if d[F] = maxC then
WriteLn(fo, 'Path from ', S, ' to ', F, ' not found')
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;
Number;
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
Cc thut ton trn th
L Minh Hong
243
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 c
0
[u, v] = c[u, v] (ng i ngn nht l ng i trc tip).
Gi s ta tnh c cc c
k-1
[u, v] th c
k
[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
c
k
[u, v] = c
k-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}.
c
k
[u, v] = c
k-1
[u, k] + c
k-1
[k, v].
V ta mun c
k
[u, v] l cc tiu nn suy ra: c
k
[u, v] = min(c
k-1
[u, v], c
k-1
[u, k] + c
k-1
[k, v]).
V cui cng, ta quan tm ti c
n
[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 c
k
[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
program Shortest_Path_by_Floyd;
const
InputFile = 'MINPATH.INP';
OutputFile = 'MINPATH.OUT';
max = 100;
maxC = 10000;
var
c: array[1..max, 1..max] of Integer;
Trace: array[1..max, 1..max] of Integer; {Trace[u, v] = nh lin sau u trn ng i t u ti v}
n, S, F: Integer;

procedure LoadGraph; {Nhp d liu, th khng c c chu trnh m}
Chuyn
i hc S phm H Ni, 1999-2002
244
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
then WriteLn(fo, 'Path from ', S, ' to ', F, ' not found')
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.
Cc thut ton trn th
L Minh Hong
245
8.8. NHN XT
Bi ton ng i di nht trn th trong mt s trng hp c th gii quyt bng cch i du
trng s tt c cc cung ri tm ng i ngn nht, nhng hy cn thn, c th xy ra trng hp
c chu trnh m.
Trong tt c cc ci t trn, v s dng ma trn trng s ch khng s dng danh sch cnh hay
danh sch k c trng s, nn ta u a v th y v em trng s + gn cho nhng
cnh khng c trong th ban u. Trn my tnh th khng c khi nim tru tng + nn ta
s phi chn mt s dng ln thay. Nh th no l ln? s phi ln hn tt c
trng s ca cc ng i c bn cho d ng i tht c ti t n u vn tt hn ng i
trc tip theo cnh tng tng ra . Vy nn nu th cho s nh cng nh trng s cc cnh
vo c 300 chng hn th gi tr khng th chn trong phm vi Integer hay Word. Ma trn c
s phi khai bo l ma trn LongInt v gi tr hng s maxC trong cc chng trnh trn phi i
li l 300 * 299 + 1 - iu c th gy ra nhiu phin toi, chng hn nh vn lng ph b nh.
khc phc, ngi ta c th ci t bng danh sch k km trng s hoc s dng nhng k thut
nh du kho lo trong tng trng hp c th. Tuy nhin c mt iu chc chn: khi th cho s
nh cng nh trng s cc cnh vo khong 300 th cc trng s c[u, v] trong thut ton Floyd
v cc nhn d[v] trong ba thut ton cn li chc chn khng th khai bo l Integer c.
Xt v phc tp tnh ton, nu ci t nh trn, thut ton Ford-Bellman c phc tp l O(n
3
),
thut ton Dijkstra l O(n
2
), thut ton ti u nhn theo th t tp l O(n
2
) cn thut ton Floyd l
O(n
3
). 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
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:
Chuyn
i hc S phm H Ni, 1999-2002
246
1
2 3
4
2
2
2
4

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], A[2], , A[n] (n 10000; 1 A[i] 10000). Hy tm mt dy con
gm nhiu nht cc phn t ca dy cho m tng ca hai phn t lin tip l s nguyn t.
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 .
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.
Cc thut ton trn th
L Minh Hong
247
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.
Input: file vn bn MINTREE.INP:
Dng 1: Ghi hai s s nh n ( 100) v s cnh m ca th cch nhau t nht 1 du cch
m dng tip theo, mi dng c dng 3 s u, v, c[u, v] cch nhau t nht 1 du cch th hin
th c cnh (u, v) v trng s cnh l c[u, v]. (c[u, v] l s nguyn c gi tr tuyt i
khng qu 100).
Output: file vn bn MINTREE.OUT ghi cc cnh thuc cy khung v trng s cy khung
1
2 3
4 5 6
1
1
2
2 2
1
1
1 1

MINTREE.INP
6 9
1 2 1
1 3 1
2 4 1
2 3 2
2 5 1
3 5 1
3 6 1
4 5 2
5 6 2
MINTREE.OUT
Minimal spanning tree:
(2, 4) = 1
(3, 6) = 1
(2, 5) = 1
(1, 3) = 1
(1, 2) = 1
Weight = 5
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:
Chuyn
i hc S phm H Ni, 1999-2002
248
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 r
1
v cy gc r
2
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 r
1
v cy gc r
2
, ta ch vic coi r
1
l nt cha ca r
2
trong cy bng cch t:
Lab[r
2
] := r
1
.
r
1
r
2
v
u
r
1
r
2
v
u

Hnh 77: Hai cy gc r
1
v r
2
v cy mi khi hp nht chng
Cc thut ton trn th
L Minh Hong
249
Tuy nhin, thut ton lm vic hiu qu, trnh trng hp cy to thnh b suy bin khin cho
hm GetRoot hot ng chm, ngi ta thng nh gi: hp hai cy li thnh mt, th gc cy
no t nt hn s b coi l con ca gc cy kia.
Thut ton hp nht cy gc r
1
v cy gc r
2
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 r
1
vi cy gc r
2
}
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; {r
2
l cha ca r
1
}
Lab[r2] := x; {r
2
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; {r
1
l gc cy mi, -Lab[r1] gi y l s nt trong cy mi}
Lab[r2] := r1; {cha ca r
2
s l r
1
}
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
program Minimal_Spanning_Tree_by_Kruskal;
const
InputFile = 'MINTREE.INP';
OutputFile = 'MINTREE.OUT';
maxV = 100;
maxE = (maxV - 1) * maxV div 2;
type
TEdge = record {Cu trc mt cnh}
u, v, c: Integer; {Hai nh v trng s}
Chuyn
i hc S phm H Ni, 1999-2002
250
Mark: Boolean; {nh du c c kt np vo cy khung hay khng}
end;
var
e: array[1..maxE] of TEdge; {Danh sch cnh}
Lab: array[1..maxV] of Integer; {Lab[v] l nh cha ca v, nu v l gc th Lab[v] = - s con cy gc v}
n, m: Integer;
Connected: Boolean;

procedure LoadGraph;
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;
Cc thut ton trn th
L Minh Hong
251
e[root] := e[child];
root := child;
end;
e[root] := Key;
end;

procedure Kruskal;
var
i, r1, r2, Count, a: Integer;
tmp: TEdge;
begin
Count := 0;
Connected := False;
for i := m div 2 downto 1 do AdjustHeap(i, m);
for i := m - 1 downto 0 do
begin
tmp := e[1]; e[1] := e[i + 1]; e[i + 1] := tmp;
AdjustHeap(1, i);
r1 := GetRoot(e[i + 1].u); r2 := GetRoot(e[i + 1].v);
if r1 <> r2 then {Cnh e[i + 1] ni hai cy khc nhau}
begin
e[i + 1].Mark := True; {Kt np cnh vo cy}
Inc(Count); {m s cnh}
if Count = n - 1 then {Nu s th thnh cng}
begin
Connected := True;
Exit;
end;
Union(r1, r2); {Hp nht hai cy thnh mt cy}
end;
end;
end;

procedure PrintResult;
var
i, Count, W: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
if not Connected then
WriteLn(f, 'Error: Graph is not connected')
else
begin
WriteLn(f, 'Minimal spanning tree: ');
Count := 0;
W := 0;
for i := 1 to m do {Duyt danh sch cnh}
with e[i] do
begin
if Mark then {Lc ra nhng cnh kt np vo cy khung}
begin
WriteLn(f, '(', u, ', ', v, ') = ', c);
Inc(Count);
W := W + c;
end;
if Count = n - 1 then Break; {Cho ti khi n - 1 cnh}
end;
WriteLn(f, 'Weight = ', W);
end;
Close(f);
end;

begin
LoadGraph;
Chuyn
i hc S phm H Ni, 1999-2002
252
Init;
Kruskal;
PrintResult;
end.
Xt v phc tp tnh ton, ta c th chng minh c rng thao tc GetRoot c phc tp l
O(log
2
n), 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(mlog
2
n), 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(mlog
2
m). Vy
phc tp tnh ton ca thut ton l O(mlog
2
m) 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 lm nh sau:
S dng mng nh du Free. Free[v] = TRUE nu nh nh v cha b kt np vo T.
Gi d[v] l khong cch t v ti T. Ban u khi to d[1] = 0 cn d[2] = d[3] = = d[n] = +. Ti
mi bc chn nh a vo T, ta s chn nh u no ngoi T v c d[u] nh nht. Khi kt np u
vo T ri th r rng cc nhn d[v] s thay i: d[v]
mi
:= min(d[v]
c
, c[u, v]). Vn ch c vy
(chng trnh rt ging thut ton Dijkstra, ch khc cng thc ti u nhn).
P_4_09_2.PAS * Thut ton Prim
program Minimal_Spanning_Tree_by_Prim;
const
InputFile = 'MINTREE.INP';
OutputFile = 'MINTREE.OUT';
max = 100;
maxC = 10000;
Cc thut ton trn th
L Minh Hong
253
var
c: array[1..max, 1..max] of Integer;
d: array[1..max] of Integer;
Free: array[1..max] of Boolean;
Trace: array[1..max] of Integer; {Vt, Trace[v] l nh cha ca v trong cy khung nh nht}
n, m: Integer;
Connected: Boolean;

procedure LoadGraph; {Nhp th}
var
i, u, v: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n, m);
for u := 1 to n do
for v := 1 to n do
if u = v then c[u, v] := 0 else c[u, v] := maxC; {Khi to ma trn trng s}
for i := 1 to m do
begin
ReadLn(f, u, v, c[u, v]);
c[v, u] := c[u, v];
end;
Close(f);
end;

procedure Init;
var
v: Integer;
begin
d[1] := 0; {nh 1 c nhn khong cch l 0}
for v := 2 to n do d[v] := maxC; {Cc nh khc c nhn khong cch +}
FillChar(Free, SizeOf(Free), True); {Cy T ban u l rng}
end;

procedure Prim;
var
k, i, u, v, min: Integer;
begin
Connected := True;
for k := 1 to n do
begin
u := 0; min := maxC; {Chn nh u cha b kt np c d[u] nh nht}
for i := 1 to n do
if Free[i] and (d[i] < min) then
begin
min := d[i];
u := i;
end;
if u = 0 then {Nu khng chn c u no c d[u] < + th th khng lin thng}
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;

Chuyn
i hc S phm H Ni, 1999-2002
254
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(n
2
). Tng t thut ton Dijkstra,
nu kt hp thut ton Prim vi cu trc Heap s c mt thut ton vi phc tp
O((m+n)logn). Tuy nhin, nu th c nh ln v s cnh nh, 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
). Cho php ni thm cc dy cp mng ni gia tng cp my tnh. Chi ph ni mt dy
cp mng t l thun vi khong cch gia hai my cn ni. Hy tm cch ni thm cc dy cp
mng cho cc my tnh trong ton mng l lin thng v chi ph ni mng l nh nht.
Bi 3
Tng t nh bi 2, nhng ban u c sn mt s cp my ni ri, cn cho bit cch ni thm t
chi ph nht.
Bi 4
H thng in trong thnh ph c cho bi n trm bin th v cc ng dy in ni gia cc cp
trm bin th. Mi ng dy in e c an ton l p(e). y 0 < p(e) 1. an ton ca c
li in l tch an ton trn cc ng dy. V d nh c mt ng dy nguy him: p(e) = 1%
th cho d cc ng dy khc l tuyt i an ton ( an ton = 100%) th an ton ca mng
Cc thut ton trn th
L Minh Hong
255
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.
Bi 5
Hy th ci t thut ton Prim vi cu trc d liu Heap cha cc nh ngoi cy, tng t nh i
vi thut ton Dijkstra.

Chuyn
i hc S phm H Ni, 1999-2002
256
10. BI TON LUNG CC I TRN MNG
Ta gi mng (network) l mt th c hng G = (V, E), trong c duy nht mt nh A khng
c cung i vo gi l im pht (source), duy nht mt nh B khng c cung i ra gi l nh thu
(sink) v mi cung e = (u, v) E c gn vi mt s khng m c(e) = c[u, v] gi l kh nng
thng qua ca cung (capacity). thun tin cho vic trnh by, ta qui c rng nu khng c
cung (u, v) th kh nng thng qua c[u, v] ca n c gn bng 0.
Nu c mng G = (V, E). Ta gi lung (flow) f trong mng G l mt php gn cho mi cung e = (u,
v) E mt s thc khng m f(e) = f[u, v] gi l lung trn cung e, tho mn cc iu kin sau:
Lung trn mi cung khng vt qu kh nng thng qua ca n: 0 f[u, v] c[u, v] ( (u, v) E)
Vi mi nh v khng trng vi nh pht A v nh thu B, tng lung trn cc cung i vo v bng
tng lung trn cc cung i ra khi v:

+

=
) v ( w ) v ( u
] w , v [ f ] v , u [ f . Trong :

-
(v) = {uV(u, v) E}
+(v) = {wV(v, w) E}
Gi tr ca mt lung l tng lung trn cc cung i ra khi nh pht = tng lung trn cc cung
i vo nh thu.
2
1
3
4
5
6
5
5
6
6
6
1
3
3
2
1
3
4
5
6
5
2
5
6
1
1
0
1

Hnh 78: Mng vi cc kh nng thng qua (1 pht, 6 thu) v mt lung ca n vi gi tr 7
10.1. BI TON
Cho mng G = (V, E). Hy tm lung f* trong mng vi gi tr lung ln nht. Lung nh vy gi
l lung cc i trong mng v bi ton ny gi l bi ton tm lung cc i trn mng.
10.2. LT CT, NG TNG LUNG, NH L FORD - FULKERSON
10.2.1. nh ngha:
Ta gi lt ct (X, Y) l mt cch phn hoch tp nh V ca mng thnh hai tp ri nhau X v Y,
trong X cha nh pht v Y cha nh thu. Kh nng thng qua ca lt ct (X, Y) l tng tt c
cc kh nng thng qua ca cc cung (u, v) c u X v v Y. Lt ct vi kh nng thng qua nh
nht gi l lt ct hp nht.
Cc thut ton trn th
L Minh Hong
257
10.2.2. nh l Ford-Fulkerson:
Gi tr lung cc i trn mng ng bng kh nng thng qua ca lt ct hp nht. Vic chng
minh nh l Ford- Fulkerson xy dng c mt thut ton tm lung cc i trn mng:
Gi s f l mt lung trong mng G = (V, E). T mng G = (V, E) ta xy dng th c trng s G
f

= (V, E
f
) nh sau:
Xt nhng cnh e = (u, v) E (c[u, v] > 0):
Nu f[u, v] < c[u, v] th ta thm cung (u, v) vo E
f
vi trng s c[u, v] - f[u, v], cung gi l cung
thun. V ngha, trng s cung ny cho bit cn c th tng lung f trn cung (u, v) mt lng
khng qu trng s .
Xt tip nu nh f[u, v] > 0 th ta thm cung (v, u) vo E
f
vi trng s f[u, v], cung gi l cung
nghch. V ngha, trng s cung ny cho bit cn c th gim lung f trn cung (u, v) mt lng
khng qu trng s .
th G
f
c gi l th tng lung.
2
1
3
4
5
6
5(5)
5(2)
1(1)
3(1)
3(0)
6(5)
6(6)
6(1)
2
1
3
4
5
6
5
2
1
1
3
5
6
1
3
2
5
1

Hnh 79: Mng G, lung trn cc cung (1 pht, 6 thu) v th tng lung tng ng
Gi s P l mt ng i c bn t nh pht A ti nh thu B. Gi l gi tr nh nht ca cc
trng s ca cc cung trn ng i P. Ta s tng gi tr ca lung f bng cch t:
f[u, v] := f[u, v] + , nu (u, v) l cung trong ng P v l cung thun
f[v, u] := f[v, u] - , nu (u, v) l cung trong ng P v l cung nghch
Cn lung trn nhng cung khc gi nguyn
C th kim tra lung f mi xy dng vn l lung trong mng v gi tr ca lung f mi c tng
thm so vi gi tr lung f c. Ta gi thao tc bin i lung nh vy l tng lung dc ng P,
ng i c bn P t A ti B c gi l ng tng lung.
V d: vi th tng lung Gf nh trn, gi s chn ng i (1, 3, 4, 2, 5, 6). Gi tr nh nht ca
trng s trn cc cung l 2, vy th ta s tng cc gi tr f[1, 3]), f[3, 4], f[2, 5], f[5, 6] ln 2, (do cc
cung l cung thun) v gim gi tr f[2, 4] i 2 (do cung (4, 2) l cung nghch). c lung mi
mang gi tr 9.
Chuyn
i hc S phm H Ni, 1999-2002
258
2
1
3
4
5
6
5
2
1
1
0
5
6
1
2
1
3
4
5
6
5
4
1
3
2
3
6
3

Hnh 80: Lung trn mng G trc v sau khi tng
n y ta c th hnh dung ra c thut ton tm lung cc i trn mng: khi to mt lung bt
k, sau c tng lung dc theo ng tng lung, cho ti khi khng tm c ng tng
lung na
Vy cc bc ca thut ton tm lung cc i trn mng c th m t nh sau:
Bc 1: Khi to:
Mt lung bt k trn mng, chng hn nh lung 0 (lung trn cc cung u bng 0), sau :
Bc 2: Lp hai bc sau:
Tm ng tng lung P i vi lung hin c Tm ng i c bn t A ti B trn th tng
lung, nu khng tm c ng tng lung th bc lp kt thc.
Tng lung dc theo ng P
Bc 3: Thng bo gi tr lung cc i tm c.
10.3. CI T
Input: file vn bn MAXFLOW.INP. Trong :
Dng 1: Cha s nh n ( 100), s cnh m ca th, nh pht A, nh thu B theo ng
th t cch nhau t nht mt du cch
m dng tip theo, mi dng c dng ba s u, v, c[u, v] cch nhau t nht mt du cch th
hin c cung (u, v) trong mng v kh nng thng qua ca cung l c[u, v] (c[u, v] l s
nguyn dng khng qu 100)
Output: file vn bn MAXFLOW.OUT, ghi lung trn cc cung v gi tr lung cc i tm c
2
1
3
4
5
6
5
5
6
6
6
1
3
3

MAXFLOW.INP
6 8 1 6
1 2 5
1 3 5
2 4 6
2 5 3
3 4 3
3 5 1
4 6 6
5 6 6
MAXFLOW.OUT
f(1, 2) = 5
f(1, 3) = 4
f(2, 4) = 3
f(2, 5) = 2
f(3, 4) = 3
f(3, 5) = 1
f(4, 6) = 6
f(5, 6) = 3
Max Flow: 9

Cc thut ton trn th
L Minh Hong
259
Ch rng ti mi bc c nhiu phng n chn ng tng lung, hai cch chn khc nhau c
th cho hai lung cc i khc nhau nhng v mt gi tr th tt c cc lung xy dng c theo
cch trn s c cng gi tr cc i.
Ci t chng trnh tm lung cc i di y rt chn phng, t ma trn nhng kh nng thng
qua c v lung f hin c (khi to f l lung 0), n xy dng th tng lung Gf bng cch xy
dng ma trn cf nh sau:
cf[u, v] = trng s cung (u, v) trn th G
f
nu nh (u, v) l cung thun
cf[u, v] = - trng s cung (u, v) trn th G
f
nu nh (u, v) l cung nghch
cf[u, v] = + nu nh (u, v) khng phi cung ca G
f

cf gn ging nh ma trn trng s ca G
f
, ch c iu ta i du trng s nu nh gp cung nghch.
Cu hi t ra l nu nh mng cho c nhng ng hai chiu (c c cung (u, v) v cung (v, u) -
iu ny xy ra rt nhiu trong mng li giao thng) th th tng lung rt c th l a th
(gia u, v c th c nhiu cung t u ti v). Ma trn cf cng gp nhc im nh ma trn trng s:
khng th biu din c a th, tc l nu nh c nhiu cung ni t u ti v trong th tng
lung th ta nh chp nhn b bt m ch gi li mt cung. Rt may cho chng ta l iu
khng lm sai lch i mc ch xy dng th tng lung: ch l tm mt ng i t nh pht A
ti nh thu B m thi, cn ng no th khng quan trng.
Sau chng trnh tm ng i t nh pht A ti nh thu B trn th tng lung bng thut
ton tm kim theo chiu rng, nu tm c ng i th s tng lung dc theo ng tng
lung
P_4_10_1.PAS * Thut ton tm lung cc i trn mng
program Max_Flow;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 100;
maxC = 10000;
var
c, f, cf: array[1..max, 1..max] of Integer; {c: kh nng thng, f: Lung}
Trace: array[1..max] of Integer;
n, A, B: Integer;

procedure Enter; {Nhp mng}
var
m, i, u, v: Integer;
fi: Text;
begin
Assign(fi, InputFile); Reset(fi);
FillChar(c, SizeOf(c), 0);
ReadLn(fi, n, m, A, B);
for i := 1 to m do
ReadLn(fi, u, v, c[u, v]);
Close(fi);
end;

procedure CreateGf; {Tm th tng lung, tc l xy dng cf t c v f}
var
Chuyn
i hc S phm H Ni, 1999-2002
260
u, v: Integer;
begin
for u := 1 to n do
for v := 1 to n do cf[u, v] := maxC;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then {Nu u, v l cung trong mng}
begin
if f[u, v] < c[u, v] then cf[u, v] := c[u, v] - f[u, v]; {t cung thun}
if f[u, v] > 0 then cf[v, u] := -f[u, v]; {t cung nghch}
end;
end;

{Th tc ny tm mt ng i t A ti B bng BFS, tr v TRUE nu c ng, FALSE nu khng c ng}
function FindPath: Boolean;
var
Queue: array[1..max] of Integer; {Hng i dng cho BFS}
Free: array[1..max] of Boolean;
u, v, First, Last: Integer;
begin
FillChar(Free, SizeOf(Free), True);
First := 1; Last := 1; Queue[1] := A; {Queue ch gm mt nh pht A}
Free[A] := False; {nh du A}
repeat
u := Queue[First]; Inc(First); {Ly u khi Queue}
for v := 1 to n do
if Free[v] and (cf[u, v] <> maxC) then {Xt v cha nh du k vi u}
begin
Trace[v] := u; {Lu vt ng i A u v}
if v = B then {v = B th ta c ng i t A ti B, thot th tc}
begin
FindPath := True; Exit;
end;
Free[v] := False; {nh du v}
Inc(Last);
Queue[Last] := v; {Queue v}
end;
until First > Last; {Queue rng}
FindPath := False; { trn khng Exit c th tc l khng c ng}
end;

{Th tc tng lung dc theo ng tng lung tm c trong FindPath}
procedure IncFlow;
var
u, v, IncValue: Integer;
begin
{Trc ht d ng theo vt tm trng s nh nht ca cc cung trn ng}
IncValue := maxC;
v := B;
while v <> A do
begin
u := Trace[v]; { rng cf[u, v] l trng s ca cung (u, v) trn th tng lung}
if Abs(cf[u, v]) < IncValue then IncValue := Abs(cf[u, v]);
v:= u;
end;
{D li ng ln th hai, ln ny tng lung}
v := B;
while v <> A do
begin
u := Trace[v];
if cf[u, v] > 0 then f[u, v] := f[u, v] + IncValue {Nu (u, v) l cung thun trn Gf}
else f[v, u] := f[v, u] - IncValue; {Nu (u, v) l cung nghch trn Gf}
v := u;
end;
Cc thut ton trn th
L Minh Hong
261
end;

procedure PrintResult; {In lung cc i tm c}
var
u, v, 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 c[u, v] > 0 then {Nu c cung (u, v) trn mng th in ra gi tr lung f gn cho cung }
begin
WriteLn(fo, 'f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v]; {Gi tr lung cc i = tng lung pht ra t A}
end;
WriteLn(fo, 'Max Flow: ', m);
Close(fo);
end;

begin
Enter; {Nhp d liu}
FillChar(f, SizeOf(f), 0); {Khi to lung 0}
repeat {Bc lp}
CreateGf; {Dng th tng lung}
if not FindPath then Break; {Nu khng tm c ng tng lung th thot ngay}
IncFlow; {Tng lung dc ng tng lung}
until False;
PrintResult;
end.
By gi ta th xem cch lm trn c ch no v cha hay ch no ?
Trc ht, thut ton tm ng bng Breadth First Search l kh tt, ngi ta chng minh rng
nu nh ng tng lung c tm bng BFS s lm gim ng k s bc lp tng lung so vi
DFS.
Nhng c th thy rng vic xy dng tng minh c th G
f
thng qua vic xy dng ma trn
cf ch lm mi mt vic tm ng l lng ph, ch cn da vo ma trn kh nng thng qua c v
lung f hin c l ta c th bit c (u, v) c phi l cung trn th tng lung G
f
hay khng.
Th hai, ti bc tng lung, ta phi d li hai ln ng i, mt ln tm trng s nh nht ca
cc cung trn ng, mt ln tng lung. Trong khi vic tm trng s nh nht ca cc cung trn
ng c th kt hp lm ngay trong th tc tm ng bng cch sau:
t Delta[v] l trng s nh nht ca cc cung trn ng i t A ti v, khi to Delta[A] = +.
Ti mi bc t nh u thm nh v trong BFS, th Delta[v] c th c tnh bng gi tr nh nht
trong hai gi tr Delta[u] v trng s cung (u, v) trn th tng lung. Khi tm c ng i t A
ti B th Delta[B] cho ta trng s nh nht ca cc cung trn ng tng lung.
Th ba, ngay trong bc tm ng tng lung, ta c th xc nh ngay cung no l cung thun,
cung no l cung nghch. V vy khi t nh u thm nh v trong BFS, ta c th vn lu vt ng
i Trace[v] := u, nhng sau s i du Trace[v] nu nh (u, v) l cung nghch.
Nhng ci tin cho ta mt cch ci t hiu qu hn, l:
Chuyn
i hc S phm H Ni, 1999-2002
262
10.4. THUT TON FORD - FULKERSON (L.R.FORD & D.R.FULKERSON
- 1962)
Mi nh v c gn nhn (Trace[v], Delta[v]). Trong Trace[v] l nh lin trc v trong
ng i t A ti v, Trace[v] m hay dng tu theo (Trace[v], v) l cung nghch hay cung
thun trn th tng lung, Delta[v] l trng s nh nht ca cc cung trn ng i t A ti v trn
th tng lung.
Bc lp s tm ng i t A ti B trn th tng lung ng thi tnh lun cc nhn (Trace[v],
Delta[v]). Sau tng lung dc theo ng tng lung nu tm thy.
P_4_10_2.PAS * Thut ton Ford-Fulkerson
program Max_Flow_by_Ford_Fulkerson;
const
InputFile = 'MAXFLOW.INP';
OutputFile = 'MAXFLOW.OUT';
max = 100;
maxC = 10000;
var
c, f: array[1..max, 1..max] of Integer;
Trace: array[1..max] of Integer;
Delta: array[1..max] of Integer;
n, A, B: Integer;

procedure Enter; {Nhp 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, A, B);
for i := 1 to m do
ReadLn(fi, u, v, c[u, v]);
Close(fi);
end;

function Min(X, Y: Integer): Integer;
begin
if X < Y then Min := X else Min := Y;
end;

function FindPath: Boolean;
var
u, v: Integer;
Queue: array[1..max] of Integer;
First, Last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[v] = 0 ng ngha vi v cha nh du}
First := 1; Last := 1; Queue[1] := A;
Trace[A] := n + 1; {Ch cn n khc 0 nh du m thi, s dng no cng c c}
Delta[A] := maxC; {Khi to nhn}
repeat
u := Queue[First]; Inc(First); {Ly u khi Queue}
for v := 1 to n do
if Trace[v] = 0 then {Xt nhng nh v cha nh du thm}
begin
if f[u, v] < c[u, v] then {Nu (u, v) l cung thun trn Gf v c trng s l c[u, v] - f[u, v]}
Cc thut ton trn th
L Minh Hong
263
begin
Trace[v] := u; {Lu vt, Trace[v] mang du dng}
Delta[v] := min(Delta[u], c[u, v] - f[u, v]);
end
else
if f[v, u] > 0 then {Nu (u, v) l cung nghch trn Gf v c trng s l f[v, u]}
begin
Trace[v] := -u; {Lu vt, Trace[v] mang du m}
Delta[v] := min(Delta[u], f[v, u]);
end;
if Trace[v] <> 0 then {Trace[v] khc 0 tc l t u c th thm v}
begin
if v = B then {C ng tng lung t A ti B}
begin
FindPath := True; Exit;
end;
Inc(Last); Queue[Last] := v; {a v vo Queue}
end;
end;
until First > Last; {Hng i Queue rng}
FindPath := False; { trn khng Exit c tc l khng c ng}
end;

procedure IncFlow; {Tng lung dc ng tng lung}
var
IncValue, u, v: Integer;
begin
IncValue := Delta[B]; {Nhn Delta[B] chnh l trng s nh nht trn cc cung ca ng tng lung}
v := B; {Truy vt ng i, tng lung dc theo ng i}
repeat
u := Trace[v]; {Xt cung (u, v) trn ng tng lung}
if u > 0 then f[u, v] := f[u, v] + IncValue {(|u|, v) l cung thun th tng f[u, v]}
else
begin
u := -u;
f[v, u] := f[v, u] - IncValue; {(|u|, v) l cung nghch th gim f[v, |u|]}
end;
v := u;
until v = A;
end;

procedure PrintResult; {In kt qu}
var
u, v, m: Integer;
fo: Text;
begin
Assign(fo, OutputFile); Rewrite(fo);
m := 0;
for u := 1 to n do
for v := 1 to n do
if c[u, v] > 0 then
begin
WriteLn(fo, 'f(', u, ', ', v, ') = ', f[u, v]);
if u = A then m := m + f[A, v];
end;
WriteLn(fo, 'Max Flow: ', m);
Close(fo);
end;

begin
Enter;
FillChar(f, SizeOf(f), 0);
repeat
if not FindPath then Break;
Chuyn
i hc S phm H Ni, 1999-2002
264
IncFlow;
until False;
PrintResult;
end.
nh l v lung cc i trong mng v lt ct hp nht:
Lung cc i trong mng bng kh nng thng qua ca lt ct hp nht. Khi tm c lung cc
i th theo thut ton trn s khng c ng i t A ti B trn th tng lung. Nu t tp X
gm nhng nh n c t nh pht A trn th tng lung (tt nhin AX) v tp Y gm
nhng nh cn li (tt nhin BY) th (X, Y) l lt ct hp nht . C th c nhiu lt ct hp nht,
v d nu t tp Y gm nhng nh n c nh thu B trn th tng lung (tt nhin B Y) v
tp X gm nhng nh cn li th (X, Y) cng l mt lt ct hp nht.
nh l v tnh nguyn:
Nu tt c cc kh nng thng qua l s nguyn th thut ton trn lun tm c lung cc i vi
lung trn cung l cc s nguyn. iu ny c th chng minh rt d bi ban u khi to lung 0
th tc cc lung trn cung l nguyn. Mi ln tng lung ln mt lng bng trng s nh nht trn
cc cung ca ng tng lung cng l s nguyn nn cui cng lung cc i tt s phi c lung
trn cc cung l nguyn.
nh l v chi ph thi gian thc hin gii thut:
Trong phng php Ford-Fulkerson, nu dng ng i ngn nht (qua t cnh nht) t nh pht
ti nh thu trn th tng lung th cn t hn n.m ln chn ng i tm ra lung cc i.
Edmonds v Karp chng minh tnh cht ny v ngh mt phng php ci tin: Ti mi bc,
ta nn tm ng tng lung sao cho gi tr tng lung c gia tng nhiu nht.
Ni chung i vi thut ton Ford-Fulkerson, cc nh gi l thuyt b lch rt nhiu so vi thc t,
mc d vi s phn tch trong trng hp xu, chi ph thi gian thc hin ca thut ton l kh ln.
Nhng trn thc t th thut ton ny hot ng rt nhanh v hiu qu.
Bi tp:
Bi 1
Mng vi nhiu im pht v nhiu im thu: Cho mt mng gm n nh vi p im pht A1,
A2, , Ap v q im thu B1, B2, , Bq. Mi cung ca mng c gn kh nng thng qua l s
nguyn. Cc nh pht ch c cung i ra v cc nh thu ch c cung i vo. Mt lung trn mng
ny l mt php gn cho mi cung mt s thc gi l lung trn cung khng vt qu kh nng
thng qua v tho mn vi mi nh khng phi nh pht hay nh thu th tng lung i vo bng
tng lung i ra. Gi tr lung bng tng lung i ra t cc nh pht = tng lung i vo cc nh
thu. Hy tm lung cc i trn mng.
Bi 2
Mng vi kh nng thng qua ca cc nh v cc cung: Cho mt mng vi nh pht A v nh
thu B. Mi cung (u, v) c gn kh nng thng qua c[u, v]. Mi nh v khc vi A v B c gn
Cc thut ton trn th
L Minh Hong
265
kh nng thng qua d[v]. Mt lung trn mng c nh ngha nh trc v thm iu kin: tng
lung i vo nh v khng c vt qu kh nng thng qua d[v] ca nh . Hy tm lung cc
i trn mng.
Bi 3
Lt ct hp nht: 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.
Bi 4
Mt lp hc c n bn nam, n bn n. Cho m mn qu lu nim, (n m). Mi bn c s thch v
mt s mn qu no . Hy tm cch phn cho mi bn nam tng mt mn qu cho mt bn n
tho mn:
Mi bn nam ch tng qu cho ng mt bn n
Mi bn n ch nhn qu ca ng mt bn nam
Bn nam no cng i tng qu v bn n no cng c nhn qu, mn qu phi hp s thch
ca c hai ngi.
Mn qu no c mt bn nam chn th bn nam khc khng c chn na.


Chuyn
i hc S phm H Ni, 1999-2002
266
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 (XY, E) v gi mt tp (chng hn tp X) l tp
cc nh tri v tp cn li l tp cc nh phi ca th hai pha G. Cc nh thuc X cn gi l
cc X_nh, cc nh thuc Y gi l cc Y_nh.
X
Y

Hnh 81: 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 (XY ) or (X v Y l ti i - khng b sung c na);
if XY then < Khng phi th hai pha >
else <y l th hai pha, X l tp cc nh tri: cc nh n c t v qua mt s chn cnh, Y l tp cc nh phi:
cc nh n c t v qua mt s l cnh>;
th hai pha gp rt nhiu m hnh trong thc t. Chng hn quan h hn nhn gia tp nhng
ngi n ng v tp nhng ngi n b, vic sinh vin chn trng, thy gio chn tit dy trong
thi kho biu v.v
11.2. BI TON GHP I KHNG TRNG V CC KHI NIM
Cho mt th hai pha G = (XY, E) y X l tp cc nh tri v Y l tp cc nh phi ca G
Mt b ghp (matching) ca G l mt tp hp cc cnh ca G i mt khng c nh chung.
Bi ton ghp i (matching problem) l tm mt b ghp ln nht (ngha l c s cnh ln nht)
ca G
Xt mt b ghp M ca G.
Cc nh trong M gi l cc nh ghp (matched vertices), cc nh khc l cha ghp.
Cc cnh trong M gi l cc cnh ghp, cc cnh khc l cha ghp
Cc thut ton trn th
L Minh Hong
267
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 82 v b ghp M = {(X1, Y1), (X2, Y2)}
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.
1
2
3
1
2
3
X Y

Hnh 82: 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:
Bt u t mt b ghp bt k M (thng thng b ghp c khi gn bng b ghp rng hay
c tm bng cc thut ton tham lam)
Sau i tm mt ng m, nu tm c th m rng b ghp M nh sau: Trn ng m, loi
b nhng cnh ghp khi M v thm vo M nhng cnh cha ghp. Nu khng tm c ng
m th b ghp hin thi l ln nht.
<Khi to 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, nh x v y tr thnh ghp, s
cnh ghp tng ln 1>;
Nh v d trn, vi b ghp hai cnh M = {(X1, Y1), (X2, Y2)} v ng m tm c gm cc
cnh:
(X
3
, Y
2
) M
Chuyn
i hc S phm H Ni, 1999-2002
268
(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 = (XY, E) c cc X_nh k hiu l X[1], X[2], , X[m] v cc Y_nh
k hiu l Y[1], Y[2], , Y[n]. Ta s biu din th hai pha ny bng ma trn A c mxn. Trong
:
A[i, j] = TRUE c cnh ni nh X[i] vi nh Y[j].
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 nh thuc tp Y ghp vi nh X[i]
matchY[j] l nh thuc tp X ghp vi nh Y[j].
Tc l nu nh cnh (X[i], Y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c rng:
Nu nh X[i] cha ghp vi nh no ca tp Y th matchX[i] = 0
Nu nh Y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.
thm mt cnh (X[i], Y[j]) vo b ghp th ta ch vic t matchX[i] := j v matchY[j] := i;
loi mt cnh (X[i], Y[j]) khi b ghp th ta ch vic t matchX[i] := 0 v matchY[j] := 0;
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
Cc thut ton trn th
L Minh Hong
269
Y_nh cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh j Y ghp,
da vo s kin: t j ch c th ti c matchY[j] theo duy nht mt cnh ghp nh hng
ngc t Y v X, nn ta c th nh du thm j, thm lun c matchY[j], v y vo Queue
phn t matchY[j] X (Thm lin 2 bc).
Input: file vn bn MATCH.INP
Dng 1: cha hai s m, n (m, n 100) theo th t l s X_nh v s Y_nh cch nhau t
nht mt du cch
Cc dng tip theo, mi dng ghi hai s i, j cch nhau t nht mt du cch th hin c cnh
ni hai nh (X[i], Y[j]) .
Output: file vn bn MATCH.OUT, ghi b ghp cc i tm c
1
2
3
4
1
2
3
4
5
X Y

MATCH.INP
4 5
1 1
1 4
2 1
2 2
2 4
3 2
3 3
4 2
4 3
MATCH.OUT
Match:
1) X[1] - Y[1]
2) X[2] - Y[4]
3) X[3] - Y[3]
4) X[4] - Y[2]
P_4_11_1.PAS * Thut ton ng m tm b ghp cc i
program MatchingProblem;
const
InputFile = 'MATCH.INP';
OutputFile = 'MATCH.OUT';
max = 100;
var
m, n: Integer;
a: array[1..max, 1..max] of Boolean;
matchX, matchY: array[1..max] of Integer;
Trace: array[1..max] of Integer;

procedure Enter;
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
Chuyn
i hc S phm H Ni, 1999-2002
270
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
end;

{Tm ng m, nu thy tr v mt Y_nh cha ghp l nh kt thc ng m, nu khng thy tr v 0}
function FindAugmentingPath: Integer;
var
Queue: array[1..max] of Integer;
i, j, first, last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[j] = X_nh lin trc Y[j] trn ng m}
last := 0; {Khi to hng i rng}
for i := 1 to m do {y tt c nhng X_nh cha ghp vo hng i}
if matchX[i] = 0 then
begin
Inc(last);
Queue[last] := i;
end;
{Thut ton tm kim theo chiu rng}
first := 1;
while first <= last do
begin
i := Queue[first]; Inc(first); {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(last); {y lun matchY[j] vo hng i}
Queue[last] := matchY[j];
end;
end;
FindAugmentingPath := 0; { trn khng Exit c tc l khng cn ng m}
end;

{Ni rng b ghp bng ng m kt thc fY}
procedure Enlarge(f: Integer);
var
x, next: Integer;
begin
repeat
x := Trace[f];
next := matchX[x];
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}
f
x
next
start
f
x
next
start
Cc thut ton trn th
L Minh Hong
271
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 A v cho thm m cung t A ti tt c nhng nh ca tp X, thm mt nh B
v ni thm n cung t tt c cc nh ca Y ti B. Ta c mt mng vi nh pht A v nh thu B.
1
2
3
4
1
2
3
4
X Y
A B

Hnh 83: M hnh lung ca bi ton tm b ghp cc i trn th hai pha
Nu t kh nng thng qua ca cc cung u l 1 sau tm lung cc i trn mng bng thut
ton Ford-Fulkerson th theo nh l v tnh nguyn, lung tm c trn cc cung u phi l s
nguyn (tc l bng 1 hoc 0). Khi d thy rng nhng cung c lung 1 t tp X ti tp Y s cho
ta mt b ghp ln nht. chng minh thut ton ng m tm c b ghp ln nht sau hu
hn bc, ta s chng minh rng s b ghp tm c bng thut ton ng m s bng gi tr
lung cc i ni trn, iu cng rt d bi v nu k mt cht th ng m chng qua l
ng tng lung trn th tng lung m thi, ngay ci tn augmenting path cho ta bit iu
ny. V vy thut ton ng m trng hp ny l mt cch ci t hiu qu trn mt dng
th c bit, n lm cho chng trnh sng sa hn nhiu so vi phng php tm b ghp da trn
bi ton lung v thut ton Ford-Fulkerson thun ty.
Chuyn
i hc S phm H Ni, 1999-2002
272
Ngi ta chng minh c chi ph thi gian thc hin gii thut ny trong trng hp xu nht
s l O(n
3
) 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 n cng vic (n 100), mi th thc hin c t nht mt vic. Nh vy mt th c th
lm c nhiu vic, v mt vic c th c nhiu th lm c. Hy phn cng n th thc hin n
vic sao cho mi th phi lm ng 1 vic hoc thng bo rng khng c cch phn cng no
tho mn iu trn.
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 cc th lm cc cng vic sao cho mi th phi lm t nht 2 vic v s vic thc hin
c l nhiu nht.
Bi 3
C n th v m cng vic (n, m 100). Mi th cho bit mnh c th lm c nhng vic no, hy
phn cng thc hin cc cng vic sao cho s cng vic phn cho ngi th lm nhiu nht thc
hin l cc tiu.
Cc thut ton trn th
L Minh Hong
273
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 = (XY, E) vi X l tp m ngi, Y l tp n vic v (u, v) E vi trng s
c[u, v] nu nh ngi u lm c cng vic v. Bi ton a v tm b ghp nhiu cnh nht ca G
c trng s nh nht.
Gi k = max(m, n). B sung vo tp X v Y mt s nh gi X=Y= k.
Gi M l mt s dng ln hn chi ph ca mi php phn cng c th. Vi mi cp nh (u, v):
u X v v Y. Nu (u, v) E th ta b sung cnh (u, v) vo E vi trng s l M.
Khi ta c G l mt th hai pha y ( th hai pha m gia mt nh bt k ca X v
mt nh bt k ca Y u c cnh ni). V nu nh ta tm c b ghp y k cnh mang
trng s nh nht th ta ch cn loi b khi b ghp nhng cnh mang trng s M va
thm vo th s c k hoch phn cng 1 ngi 1 vic cn tm. iu ny d hiu bi b ghp
y mang trng s nh nht tc l phi t cnh trng s M nht, tc l s php phn cng l
nhiu nht, v tt nhin trong s cc phng n ghp t cnh trng s M nht th y l phng n
trng s nh nht, tc l tng chi ph trn cc php phn cng l t nht.
12.2. PHN TCH
Vo: th hai pha y G = (XY, E); X=Y= k. c cho bi ma trn vung C c kxk,
c[i,

j] = trng s cnh ni nh X
i
vi Y
j
. Gi thit c[i, j] 0. vi mi i, j.
Ra: B ghp y trng s nh nht.
Hai nh l sau y tuy rt n gin nhng l nhng nh l quan trng to c s cho thut ton s
trnh by:
nh l 1: Loi b khi G nhng cnh trng s > 0. Nu nhng cnh trng s 0 cn li to ra b
ghp k cnh trong G th y l b ghp cn tm.
Chng minh: Theo gi thit, cc cnh ca G mang trng s khng m nn bt k b ghp no trong
G cng c trng s khng m, m b ghp trn mang trng s 0, nn tt nhin l b ghp y
trng s nh nht.
Chuyn
i hc S phm H Ni, 1999-2002
274
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 mt nh no c mt th mi vn c
cc cnh trng s khng m, m cc cnh trng s 0 ca th mi cha mt b ghp y
k cnh.
V d: Bin i ma trn trng s ca th hai pha 3 nh tri, 3 nh phi:

9 8 0
7 1 0
0 0 0
-1
-1
+1

8 7 0
6 0 0
0 0 1
X
1
- Y
3
X
2
- Y
2
X
3
- Y
1

Hnh 84: 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 nh sau: Nhng 0_cnh cha ghp cho hng t tp X sang tp
Y, nhng 0_cnh ghp cho hng t tp Y v tp X. Khi :
ng pha (Alternating Path) l mt ng i c bn xut pht t mt X_nh cha ghp i theo
cc 0_cnh nh hng trn. Nh vy dc trn ng pha, cc 0_cnh cha ghp v nhng
Cc thut ton trn th
L Minh Hong
275
0_cnh ghp xen k nhau. V ng pha ch l ng i c bn trn th nh hng nn vic
xc nh nhng nh no c th n c t x X bng mt ng pha c th s dng cc thut
ton tm kim trn th (BFS hoc DFS). Nhng nh v nhng cnh c duyt qua to thnh
mt cy pha gc x
Mt ng m (Augmenting Path) l mt ng pha i t mt X_nh cha ghp ti mt Y_nh
cha ghp. Nh vy:
ng i trc tip t mt X_nh cha ghp ti mt Y_nh cha ghp qua mt 0_cnh cha ghp
cng l mt ng m.
Dc trn ng m, s 0_cnh cha ghp nhiu hn s 0_cnh ghp ng 1 cnh.
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
*
nh sau.
Bt u t nh x
*
cha ghp, th tm ng m bt u x
*
bng thut ton tm kim trn th
(BFS hoc DFS - thng thng nn dng BFS tm ng qua t cnh nht) c hai kh nng xy
ra:
Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v thm
vo M nhng cnh cha ghp, ta c mt b ghp mi nhiu hn b ghp c 1 cnh v nh x
*

tr thnh ghp.
Hoc khng tm c ng m th do ta s dng thut ton tm kim trn th nn c th xc
nh c hai tp:
VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
Gi l trng s nh nht ca cc cnh ni gia mt nh thuc VisitedX vi mt nh khng
thuc VisitedY. D thy > 0 bi nu = 0 th tn ti mt 0_cnh (x, y) vi xVisitedX v
yVisitedY. V x
*
n c x bng mt ng pha v (x, y) l mt 0_cnh nn x
*
cng n c y
bng mt ng pha, dn ti y VisitedY, iu ny v l.
Bin i th G nh sau: Vi x VisitedX, tr vo trng s nhng cnh lin thuc vi x, Vi
y VisitedY, cng vo trng s nhng cnh lin thuc vi y.
Lp li th tc tm kim trn th th tm ng m xut pht x
*
cho ti khi tm ra ng m.
Bc 3: Sau bc 2 th mi X_nh u c ghp, in kt qu v b ghp tm c.

M hnh ci t ca thut ton c th vit nh sau:
<Khi to: M := >;
Chuyn
i hc S phm H Ni, 1999-2002
276
for (x
*
X) do
begin
repeat
<Tm ng m xut pht x
*
>;
if <Khng tm thy ng m> then <Bin i th G: Chn := >;
until <Tm thy ng m>;
<Dc theo ng m, loi b nhng cnh ghp khi M
v thm vo M nhng cnh cha ghp>;
end;
<Kt qu>;
V d minh ho:
khng b ri hnh, ta hiu nhng cnh khng ghi trng s l nhng 0_cnh, nhng cnh khng
v mang trng s rt ln trong trng hp ny khng cn thit phi tnh n. Nhng cnh nt m
l nhng cnh ghp, nhng cnh nt thanh l nhng cnh cha ghp.
1
2
3
4
1
2
3
4
1
2
9
1
2
3
4
1
2
3
4
1
2
9
X
*
= X
1
, tm thy ng m
X
1
Y
1
Tng cp


1
2
3
4
1
2
3
4
1
2
9
X
*
= X
2
, tm thy ng m
X
2
Y
1
X
1
Y
2
Tng cp
1
2
3
4
1
2
3
4
1
2
9


1
2
3
4
1
2
3
4
1
2
9
X
*
= X
3
, tm thy ng m
X
3
Y
3
Tng cp
1
2
4
1
2
4
1
2
9
3 3


Cc thut ton trn th
L Minh Hong
277
1
2
3
4
1
2
3
4
1=
2
9
X
*
= X
4
, khng thy ng
m
VisitedX = {X
3
, X
4
}
VisitedY = {Y
3
}
Gi tr xoay = 1 (=c[3,2])
Tr trng s nhng cnh
lin thuc vi {X
3
,X
4
} i 1
Cng trng s nhng cnh
lin thuc vi {Y
3
} ln 1
1
2
4
1
2
4
0
2
8
3 3 -1 +1
-1

1
2
3
4
1
2
3
4
2=
8
X
*
= X
4
, khng thy ng
m
VisitedX = {X
1
, X
2
, X
3
, X
4
}
VisitedY = {Y
1
, Y
2
, Y
3
}
Gi tr xoay = 2 (=c[3,4])
Tr trng s nhng cnh lin
thuc vi {X
1
, X
2
, X
3
, X
4
} i 2
Cng trng s nhng cnh
lin thuc vi {Y
1
, Y
2
, Y
3
} ln 2
1
2
4
1
2
4
0
6
3 3 -2
-2
-2
-2
+2
+2
+2

1
2
3
4
1
2
3
4
8
X
*
= X
4
, Tm thy ng m
X
4
Y
3
X
3
Y
2
X
1
Y
1
X
2
Y
4
.
Tng cp
Xong
1
2
4
1
2
4
6
3 3

Hnh 85: 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 (Th hin ch: tp VisitedY s
rng hn trc t nht 1 phn t). V tp cc Y_ nh ghp l hu hn nn sau khng qu k bc,
s c mt Y_nh cha ghp VisitedY, tc l tm ra ng m
Trn thc t, chng trnh hot ng nhanh hn, trong bc khi to, ngi ta c th thm mt
thao tc:
Vi mi nh x X, xc nh trng s nh nht ca cc cnh lin thuc vi x, sau tr tt c
trng s cc cnh lin thuc vi x i trng s nh nht . Lm tng t nh vy vi cc Y_nh.
Chuyn
i hc S phm H Ni, 1999-2002
278
iu ny tng ng vi vic tr tt c cc phn t trn mi hng ca ma trn C i gi tr nh
nht trn hng , ri li tr tt c cc phn t trn mi ct ca ma trn C i phn t nh nht trn
ct . Khi s 0_cnh ca th l kh nhiu, c th cha ngay b ghp y hoc ch cn qua
t bc bin i l s cha b ghp y k cnh.
tng nh hai nh ton hc Knig v Egervary, nhng ngi t c s l thuyt u tin cho
phng php, ngi ta ly tn ca t nc sinh ra hai nh ton hc ny t tn cho thut ton.
Mc d sau ny c mt s ci tin nhng tn gi Thut ton Hungari (Hungarian Algorithm) vn
c dng ph bin.
12.4. CI T
12.4.1. Phng php i ngu Kuhn-Munkres (Khng lm bin i ma trn C ban u)
Phng php Kuhn-Munkres i tm hai dy s Fx[1..k] v Fy[1..k] tho mn:
c[i, j] - Fx[i] - Fy[j] 0
Tp cc cnh (X[i], Y[j]) tho mn c[i, j] - Fx[i] - Fy[j] = 0 cha trn mt b ghp y k cnh,
y chnh l b ghp cn tm.
Chng minh:
Nu tm c hai dy s tho mn trn th ta ch vic thc hin hai thao tc:
Vi mi nh X[i], tr tt c trng s ca nhng cnh lin thuc vi X[i] i Fx[i]
Vi mi nh Y[j], tr tt c trng s ca nhng cnh lin thuc vi Y[j] i Fy[j]
(Hai thao tc ny tng ng vi vic tr tt c trng s ca cc cnh (X[i], Y[j]) i mt lng
Fx[i] + Fy[j] tc l c[i, j] := c[i, j] - Fx[i] - Fy[j])
Th d thy th mi to thnh s gm c cc cnh trng s khng m v nhng 0_cnh ca
th cha trn mt b ghp y .
1 2 3 4
1 0 0 M M Fx[1] = 2
2 0 M M 2 Fx[2] = 2
3 M 1 0 M Fx[3] = 3
4 M M 0 9 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
Cc thut ton trn th
L Minh Hong
279
vi gim Fy[j] i . Khi cn bit trng s cnh (X[i], Y[j]) l bao nhiu sau cc bc bin i, thay
v vit c[i, j], ta vit c[i, j] - Fx[i] - Fy[j].
V d: Th tc tm ng m trong thut ton Hungari i hi phi xc nh c cnh no l
0_cnh, khi ci t bng phng php Kuhn-Munkres, vic xc nh cnh no l 0_cnh c th
kim tra bng ng thc: c[i, j] - Fx[i] - Fy[j] = 0 hay c[i, j] = Fx[i] + Fy[j].

S ci t phng php Kuhn-Munkres c th vit nh sau:
Bc 1: Khi to:
M := ;
Vic khi to cc Fx, Fy c th c nhiu cch chng hn Fx[i] := 0; Fy[j] := 0 vi i, j.
Hoc: Fx[i] := ]) j , i [ c ( min
k j 1
vi i. Sau t Fy[j] := ]) i [ Fx ] j , i [ c ( min
k i 1


vi j.
(Min sao c[i, j] - Fx[i] - Fy[j] 0)
Bc 2: Vi mi nh x
*
X, ta tm cch ghp x
*
nh sau:
Bt u t nh x
*
, th tm ng m bt u x
*
bng thut ton tm kim trn th (BFS hoc
DFS). Lu rng 0_cnh l cnh tho mn c[i, j] = Fx[i] + Fy[j]. C hai kh nng xy ra:
Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v thm
vo M nhng cnh cha ghp.
Hoc khng tm c ng m th xc nh c hai tp:
VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
t := min{c[i, j] - Fx[i] - Fy[j] X[i] VisitedX; Y[j] VisitedY}
Vi X[i] VisitedX: Fx[i] := Fx[i] + ;
Vi Y[j] VisitedY: Fy[j] := Fy[j] - ;
Lp li th tc tm ng m xut pht ti x
*
cho ti khi tm ra ng m.
ng lu phng php Kuhn-Munkres l n khng lm thay i ma trn C ban u. iu
thc s hu ch trong trng hp trng s ca cnh (X[i], Y[j]) khng c cho mt cch tng
minh bng gi tr C[i, j] m li cho bng hm c(i, j): trong trng hp ny, vic tr hng/cng ct
trc tip trn ma trn chi ph C l khng th thc hin c.
12.4.2. 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 nh thuc tp Y ghp vi nh X[i]
matchY[j] l nh thuc tp X ghp vi nh Y[j].
Chuyn
i hc S phm H Ni, 1999-2002
280
Tc l nu nh cnh (X[i], Y[j]) thuc b ghp th matchX[i] = j v matchY[j] = i.
Quy c rng:
Nu nh X[i] cha ghp vi nh no ca tp Y th matchX[i] = 0
Nu nh Y[j] cha ghp vi nh no ca tp X th matchY[j] = 0.
thm mt cnh (X[i], Y[j]) vo b ghp th ch vic t matchX[i] := j v matchY[j] := i;
loi mt cnh (X[i], Y[j]) khi b ghp th ch vic t matchX[i] := 0 v matchY[j] := 0;
b) Tm ng m nh th no
Ta s tm ng m v xy dng hai tp VisitedX v VisitedY bng thut ton tm kim theo chiu
rng ch xt ti nhng nh v nhng 0_cnh nh hng nh ni trong phn u:
Khi to mt hng i (Queue) ban u ch c mt nh x
*
. Thut ton tm kim theo chiu rng
lm vic theo nguyn tc ly mt nh v khi Queue v li y Queue nhng ni t v cha c
thm. Nh vy nu thm ti mt Y_nh cha ghp th tc l ta tm ng m kt thc Y_nh
cha ghp , qu trnh tm kim dng ngay. Cn nu ta thm ti mt nh y Y ghp, da vo
s kin: t y ch c th ti c matchY[y] theo duy nht mt 0_cnh nh hng, nn ta c th
nh du thm y, thm lun c matchY[y], v y vo Queue phn t matchY[y] X.
Input: file vn bn ASSIGN.INP
Dng 1: Ghi hai s m, n theo th t l s th v s vic cch nhau 1 du cch (m, n 100)
Cc dng tip theo, mi dng ghi ba s i, j, c[i, j] cch nhau 1 du cch th hin th i lm
c vic j v chi ph lm l c[i, j] (1 i m; 1 j n; 0 c[i, j] 100).
Output: file vn bn ASSIGN.OUT, m t php phn cng ti u tm c.

1 1
2 2
3 3
4 4
5 5
6
1 2
9
19
X Y

ASSIGN.INP
5 6
1 1 0
1 2 0
2 1 0
2 4 2
3 2 1
3 3 0
4 3 0
4 4 9
5 4 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

P_4_12_1.PAS * Thut ton Hungari
program AssignmentProblemSolve;
const
InputFile = 'ASSIGN.INP';
OutputFile = 'ASSIGN.OUT';
max = 100;
maxC = 10001;
var
Cc thut ton trn th
L Minh Hong
281
c: array[1..max, 1..max] of Integer;
Fx, Fy, matchX, matchY, Trace: array[1..max] of Integer;
m, n, k, start, finish: Integer; {ng m s bt u t startX v kt thc finishY}

procedure Enter;
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}
var
i, j: Integer;
begin
{B ghp rng}
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
{Fx[i] := Trng s nh nht ca cc cnh lin thuc vi X[i]}
for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
end;
{Fy[j] := Trng s nh nht ca cc cnh lin thuc vi Y[j]}
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do {Lu l trng s cnh (x[i], y[j]) by gi l c[i, j] - Fx[i] ch khng cn l c[i, j] na}
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
{Vic khi to cc Fx v Fy nh th ny ch n gin l cho s 0_cnh tr nn cng nhiu cng tt m thi}
{Ta hon ton c th khi gn cc Fx v Fy bng gi tr 0}
end;
{Hm cho bit trng s cnh (X[i], Y[j]) }
function GetC(i, j: Integer): Integer;
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;

procedure FindAugmentingPath; {Tm ng m bt u start}
var
Queue: array[1..max] of Integer;
i, j, first, last: Integer;
begin
FillChar(Trace, SizeOf(Trace), 0); {Trace[j] = X_nh lin trc Y[j] trn ng m}
{Thut ton BFS}
Queue[1] := start; {y start vo hng i}
first := 1; last := 1;
repeat
i := Queue[first]; Inc(first); {Ly mt nh X[i] khi hng i}
for j := 1 to k do {Duyt nhng Y_nh cha thm k vi X[i] qua mt 0_cnh cha ghp}
if (Trace[j] = 0) and (GetC(i, j) = 0) then
begin
Trace[j] := i; {Lu vt ng i, cng vi vic nh du (0) lun}
if matchY[j] = 0 then {Nu j cha ghp th ghi nhn ni kt thc ng m v thot lun}
Chuyn
i hc S phm H Ni, 1999-2002
282
begin
finish := j;
Exit;
end;
Inc(last); Queue[last] := matchY[j]; {y lun matchY[j] vo Queue}
end;
until first > last; {Hng i rng}
end;

procedure SubX_AddY; {Xoay cc trng s cnh}
var
i, j, t, Delta: Integer;
VisitedX, VisitedY: set of Byte;
begin
(* Ch :
VisitedY = {y | Trace[y] 0}
VisitedX = {start} match(VisitedY) = {start} {matchY[y] | Trace[y] 0}
*)
VisitedX := [start];
VisitedY := [];
for j := 1 to k do
if Trace[j] <> 0 then
begin
Include(VisitedX, matchY[j]);
Include(VisitedY, j);
end;
{Sau khi xc nh c VisitedX v VisitedY, ta tm l trng s nh nht ca cnh ni t VisitedX ra Y\VisitedY}
Delta := maxC;
for i := 1 to k do
if i in VisitedX then
for j := 1 to k do
if not (j in VisitedY) and (GetC(i, j) < Delta) then
Delta := GetC(i, j);
{Xoay trng s cnh}
for t := 1 to k do
begin
{Tr trng s nhng cnh lin thuc vi VisitedX i Delta}
if t in VisitedX then Fx[t] := Fx[t] + Delta;
{Cng trng s nhng cnh lin thuc vi VisitedY ln Delta}
if t in VisitedY then Fy[t] := Fy[t] - Delta;
end;
end;
{Ni rng b ghp bi ng m tm c}
procedure Enlarge;
var
x, next: Integer;
begin
repeat
x := Trace[finish];
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;

procedure Solve; {Thut ton Hungari}
var
x, y: Integer;
begin
for x := 1 to k do
begin
start := x; finish := 0; {Khi gn ni xut pht ng m, finish = 0 ngha l cha tm thy ng m}
f
x
next
start
f
x
next
start
Cc thut ton trn th
L Minh Hong
283
repeat
FindAugmentingPath; {Th tm ng m}
if finish = 0 then SubX_AddY; {Nu khng thy th xoay cc trng s cnh v lp li}
until finish <> 0; {Cho ti khi tm thy ng m}
Enlarge; {Tng cp da trn ng m tm c}
end;
end;

procedure Result;
var
x, y, Count, W: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do {In ra php phn cng th ch cn xt n m, khng cn xt n k}
begin
y := matchX[x];
{Nhng cnh c trng s maxC tng ng vi mt th khng c giao vic v mt vic khng c phn cng}
if c[x, y] < maxC then
begin
Inc(Count);
WriteLn(f, Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]);
W := W + c[x, y];
end;
end;
WriteLn(f, 'Cost: ', W);
Close(f);
end;

begin
Enter;
Init;
Solve;
Result;
end.
Nhn xt:
Nu ci t nh trn th cho d th c cnh mang trng s m, chng trnh vn tm c b
ghp cc i vi trng s cc tiu. L do: Ban u, ta tr tt c cc phn t trn mi hng ca ma
trn C i gi tr nh nht trn hng , ri li tr tt c cc phn t trn mi ct ca ma trn C i gi
tr nh nht trn ct (Php tr y lm gin tip qua cc Fx, Fy ch khng phi tr trc tip
trn ma trn C). Nn sau bc ny, tt c cc cnh ca th s c trng s khng m bi phn t
nh nht trn mi ct ca C chc chn l 0.
Sau khi kt thc thut ton, tng tt c cc phn t hai dy Fx, Fy bng trng s cc tiu ca b
ghp y tm c trn th ban u.
Mt vn na phi ht sc cn thn trong vic c lng ln ca cc phn t Fx v Fy. Nu
nh gi thit cho cc trng s khng qu 500 th ta khng th da vo bt ng thc Fx(x) + Fy(y)
c(x, y) m khng nh cc phn t trong Fx v Fy cng 500. Hy t tm v d hiu r hn
bn cht thut ton.
Chuyn
i hc S phm H Ni, 1999-2002
284
12.5. BI TON TM B GHP CC I VI TRNG S CC I TRN
TH HAI PHA
Bi ton tm b ghp cc i vi trng s cc i cng c th gii nh phng php Hungari bng
cch i du tt c cc phn t ma trn chi ph (Nh nhn xt 1).
Khi ci t, ta c th sa li i cht trong chng trnh trn gii bi ton tm b ghp cc i
vi trng s cc i m khng cn i du trng s. C th nh sau:
Bc 1: Khi to:
M := ;
Khi to hai dy Fx v Fy tho mn: i, j: Fx[i] + Fy[j] c[i, j]; Chng hn ta c th t Fx[i] :=
Phn t ln nht trn dng i ca ma trn C v t cc Fy[j] := 0.
Bc 2: Vi mi nh x
*
X, ta tm cch ghp x
*
nh sau:
Vi cch hiu 0_cnh l cnh tho mn c[i, j] = Fx[i] + Fy[j]. Bt u t nh x
*
, th tm ng m
bt u x
*
. C hai kh nng xy ra:
Hoc tm c ng m th dc theo ng m, ta loi b nhng cnh ghp khi M v thm
vo M nhng cnh cha ghp.
Hoc khng tm c ng m th xc nh c hai tp:
VisitedX = {Tp nhng X_nh c th n c t x* bng mt ng pha}
VisitedY = {Tp nhng Y_nh c th n c t x* bng mt ng pha}
t := min{Fx[i] + Fy[j] - c[i, j] X[i] VisitedX; Y[j] VisitedY}
Vi X[i] VisitedX: Fx[i] := Fx[i] - ;
Vi Y[j] VisitedY: Fy[j] := Fy[j] + ;
Lp li th tc tm ng m xut pht ti x
*
cho ti khi tm ra ng m.
Bc 3: Sau bc 2 th mi X_nh u ghp, ta c mt b ghp y k cnh vi trng s
ln nht.
D dng chng minh c tnh ng n ca phng php, bi nu ta t:
c'[i, j] = - c[i, j]; F'x[i] := - Fx[i]; F'y[j] = - Fy[j].
Th bi ton tr thnh tm cp ghp y trng s cc tiu trn th hai pha vi ma trn trng s
c'[1..k, 1..k]. Bi ton ny c gii quyt bng cch tnh hai dy i ngu F'x v F'y. T bng
nhng bin i i s c bn, ta c th kim chng c tnh tng ng gia cc bc ca
phng php nu trn vi cc bc ca phng php Kuhn-Munkres mc trc.
12.6. 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:
Cc thut ton trn th
L Minh Hong
285
Thut ton tm kim theo chiu rng c s dng tm ng m c phc tp O(k
2
), mi ln
xoay trng s cnh mt mt chi ph thi gian c O(k
2
). 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(k
3
). Thut ton cn k ln tng
cp nn phc tp tnh ton trn l thuyt ca phng php ny c O(k
4
).
C th ci tin m hnh ci t c mt thut ton vi phc tp O(k
3
) da trn nhng nhn
xt sau:
12.6.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 86):
Y
Y
Y
X
-

X
-
X
-
X
Y
0
0
Tm thy ng m
-
+ +
- -

+ + +

Hnh 86: Cy pha "mc" ln hn sau mi ln xoay trng s cnh v tm ng
Nhn xt 2
Vic xc nh trng s nh nht ca cnh ni mt X_nh trong cy pha vi mt Y_nh ngoi cy
pha c th kt hp ngay trong bc dng cy pha m khng lm tng cp phc tp tnh ton.
thc hin iu ny, ta s dng k thut nh trong thut ton Prim:
Vi mi yY, gi d[y] := khong cch t y n cy pha gc x
*
. Ban u d[y] c khi to bng
trng s cnh (x
*
, y) = c[x
*
,
y] - Fx[x
*
] - Fy[y] (cy pha ban u ch c ng mt nh x
*
).
Trong bc tm ng bng BFS, mi ln rt mt nh x ra khi Queue, ta xt nhng nh yY
cha thm v t li d[y]
mi
:= min(d[y]
c
, trng s cnh (x, y)) sau mi kim tra xem (x, y) c
phi l 0_cnh hay khng tip tc cc thao tc nh trc. Nu qu trnh BFS khng tm ra ng
m th gi tr xoay chnh l gi tr nh nht trong cc d[y] dng. Ta bt c mt on chng
trnh tm gi tr xoay c phc tp O(k
2
). Cng vic ti mi bc xoay ch l tm gi tr nh nht
trong cc d[y] dng v thc hin php cng, tr trn hai dy i ngu Fx v Fy, n c phc tp
Chuyn
i hc S phm H Ni, 1999-2002
286
tnh ton O(k), ti a c k ln xoay tm ng m nn tng chi ph thi gian thc hin cc ln
xoay cho ti khi tm ra ng m c O(k
2
). Lu rng th ang xt l th hai pha y nn
sau khi xoay cc trng s cnh bng gi tr xoay , tt c cc cnh ni t X_nh trong cy pha ti
Y_nh ngoi cy pha u b gim trng s i , chnh v vy ta phi tr tt c cc d[y] > 0 i
gi c tnh hp l ca cc d[y].
Nhn xt 3:
Ta c th tn dng kt qu ca qu trnh tm kim theo chiu rng bc trc ni rng cy pha
cho bc sau (grow alternating tree) m khng phi tm li t u (BFS li bt u t x
*
).
Khi khng tm thy ng m, qu trnh tm kim theo chiu rng s nh du c nhng nh
thm (thuc cy pha) v hng i cc X_nh trong qu trnh tm kim tr thnh rng. Tip theo l
phi xc nh c = trng s nh nht ca cnh ni mt X_nh thm vi mt Y_nh cha
thm v xoay cc trng s cnh nhng cnh ny tr thnh 0_cnh. Ti y ta s dng k thut
sau: Thm lun nhng nh yY cha thm to vi mt X_nh thm mt 0_cnh (nhng
Y_nh cha thm c d[y] = 0), nu tm thy ng m th dng ngay, nu khng thy th y tip
nhng nh matchY[y] vo hng i v lp li thut ton tm kim theo chiu rng bt u t nhng
nh ny. Vy nu xt tng th, mi ln tng cp ta ch thc hin mt ln dng cy pha, tc l tng
chi ph thi gian ca nhng ln thc hin gii thut tm kim trn th sau mi ln tng cp ch
cn l O(k
2
).
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(k
3
) bi n cn k ln tng cp v chi ph cho mi ln l O(k
2
).
P_4_12_2.PAS * Ci t phng php Kuhn-Munkres O(n
3
)
program AssignmentProblemSolve;
const
InputFile = 'ASSIGN.INP';
OutputFile = 'ASSIGN.OUT';
max = 100;
maxC = 10001;
var
c: array[1..max, 1..max] of Integer;
Fx, Fy, matchX, matchY: array[1..max] of Integer;
Trace, Queue, d, arg: array[1..max] of Integer;
first, last: 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;
Cc thut ton trn th
L Minh Hong
287
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 hai dy i ngu Fx, Fy}
var
i, j: Integer;
begin
FillChar(matchX, SizeOf(matchX), 0);
FillChar(matchY, SizeOf(matchY), 0);
for i := 1 to k do
begin
Fx[i] := maxC;
for j := 1 to k do
if c[i, j] < Fx[i] then Fx[i] := c[i, j];
end;
for j := 1 to k do
begin
Fy[j] := maxC;
for i := 1 to k do
if c[i, j] - Fx[i] < Fy[j] then Fy[j] := c[i, j] - Fx[i];
end;
end;

function GetC(i, j: Integer): Integer; {Hm tr v trng s cnh (X[i], Y[j])}
begin
GetC := c[i, j] - Fx[i] - Fy[j];
end;

procedure InitBFS; {Th tc khi to trc khi tm cch ghp startX}
var
y: Integer;
begin
{Hng i ch gm mi mt nh Start cy pha khi to ch c 1 nh start}
first := 1; last := 1;
Queue[1] := start;
{Khi to cc Y_nh u cha thm Trace[y] = 0, y}
FillChar(Trace, SizeOf(Trace), 0);
{Khi to cc d[y]}
for y := 1 to k do
begin
d[y] := GetC(start, y); {d[y] l khong cch t y ti cy pha gc start}
arg[y] := start; {arg[y] l X_nh thuc cy pha to ra khong cch }
end;
finish := 0;
end;

procedure Push(v: Integer); {y mt nh vX vo hng i}
begin
Inc(last); Queue[last] := v;
end;

function Pop: Integer; {Rt mt X_nh khi hng i, tr v trong kt qu hm}
begin
Pop := Queue[first]; Inc(first);
end;

procedure FindAugmentingPath; {Th tc tm ng m}
var
i, j, w: Integer;
begin
Chuyn
i hc S phm H Ni, 1999-2002
288
repeat
i := Pop; {Rt mt nh X[i] khi hng i}
for j := 1 to k do {Qut nhng Y_nh cha thm}
if Trace[j] = 0 then
begin
w := GetC(i, j); {xt cnh (X[i], Y[j])}
if w = 0 then {Nu l 0_cnh}
begin
Trace[j] := i; {Lu vt ng i}
if matchY[j] = 0 then {Nu j cha ghp th ghi nhn ni kt thc ng m v thot}
begin
finish := j;
Exit;
end;
Push(matchY[j]); {Nu j ghp th y tip matchY[j] vo hng i}
end;
if d[j] > w then {Cp nht li khong cch d[j] nu thy cnh (X[i], Y[j]) ngn hn khong cch ny}
begin
d[j] := w;
arg[j] := i;
end;
end;
until first > last;
end;

{Xoay cc trng s cnh}
procedure SubX_AddY;
var
Delta: Integer;
x, y: Integer;
begin
{Trc ht tnh = gi tr nh nht trng s cc d[y], vi yY cha thm (y khng thuc cy pha)}
Delta := maxC;
for y := 1 to k do
if (Trace[y] = 0) and (d[y] < Delta) then Delta := d[y];
{Tr trng s nhng cnh lin thuc vi startX i }
Fx[start] := Fx[start] + Delta;
for y := 1 to k do {Xt cc nh yY}
if Trace[y] <> 0 then {Nu y thuc cy pha}
begin
x := matchY[y]; {Th x = matchY[y] cng phi thuc cy pha}
Fy[y] := Fy[y] - Delta; {Cng trng s nhng cnh lin thuc vi y ln }
Fx[x] := Fx[x] + Delta; {Tr trng s nhng cnh lin thuc vi x i }
end
else
d[y] := d[y] - Delta; {Nu y cy pha th sau bc xoay, khong cch t y n cy pha s gim }
{Chun b tip tcBFS}
for y := 1 to k do
if (Trace[y] = 0) and (d[y] = 0) then {Thm lun nhng nh yY to vi cy pha mt 0_cnh}
begin
Trace[y] := arg[y]; {Lu vt ng i}
if matchY[y] = 0 then {Nu y cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
finish := y;
Exit;
end;
Push(matchY[y]); {Nu y ghp th y lun matchY[y] vo hng i ch loang tip}
end;
end;

procedure Enlarge; {Ni rng b ghp bng ng m kt thc finish}
var
x, next: Integer;
Cc thut ton trn th
L Minh Hong
289
begin
repeat
x := Trace[finish];
next := matchX[x];
matchX[x] := finish;
matchY[finish] := x;
finish := Next;
until finish = 0;
end;

procedure Solve;
var
x, y: Integer;
begin
for x := 1 to k do {Vi mi X_nh: }
begin
start := x; {t ni khi u ng m}
InitBFS; {Khi to cy pha}
repeat
FindAugmentingPath; {Tm ng m}
if finish = 0 then SubX_AddY; {Nu khng thy th xoay cc trng s cnh }
until finish <> 0; {Cho ti khi tm ra ng m}
Enlarge; {Ni rng b ghp bi ng m tm c}
end;
end;

procedure Result;
var
x, y, Count, W: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
WriteLn(f, 'Optimal assignment:');
W := 0; Count := 0;
for x := 1 to m do {Vi mi X_nh, xt cp ghp tng ng}
begin
y := matchX[x];
if c[x, y] < maxC then {Ch quan tm n nhng cp ghp c trng s < maxC}
begin
Inc(Count);
WriteLn(f, Count:5, ') X[', x, '] - Y[', y, '] ', c[x, y]);
W := W + c[x, y];
end;
end;
WriteLn(f, 'Cost: ', W);
Close(f);
end;

begin
Enter;
Init;
Solve;
Result;
end.
f
x
next
start
f
x
next
start
Chuyn
i hc S phm H Ni, 1999-2002
290
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 87:
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.
1 2
3 4
5 6
8
9
7
ghp
Cha ghp

Hnh 87: th G v mt b ghp M
Ta d dng suy ra c cc tnh cht sau
ng m cng nh Blossom u l ng i di l vi s cnh nht nhiu hn s cnh m
ng 1 cnh.
Cc thut ton trn th
L Minh Hong
291
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 87, 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;
>
Result: M l b ghp cc i trn G
iu kh nht trong thut ton Edmonds l phi xy dng thut ton tm ng m xut pht t
mt nh cha ghp. Thut ton c xy dng bng cch kt hp mt thut ton tm kim trn
th vi php chp Blossom.
Xt nhng ng pha xut pht t mt nh x cha ghp. Nhng nh c th n c t x bng
mt ng pha kt thc l cnh nht c gn nhn "nht", nhng nh c th n c t x bng
mt ng pha kt thc l cnh m c gn nhn "m".
Vi mt Blossom, ta nh ngha php chp (shrink) l php thay th cc nh trong Blossom bng
mt nh duy nht. Nhng cnh ni gia mt nh thuc Blossom ti mt nh v no khng
thuc Blossom c thay th bng cnh ni gia nh chp ny vi v v gi nguyn tnh m/nht.
D thy rng sau mi php chp, cc cnh m vn c m bo l b ghp trn th mi:
Chuyn
i hc S phm H Ni, 1999-2002
292

= nh c s ca blossom

Shrink Shrink
= nh chp t blossom
Blossom
Blossom

Hnh 88: Php chp Blossom
Thut ton tm ng m c th pht biu nh sau.
Trc ht nh xut pht x c gn nhn m.
Tip theo l thut ton tm kim trn th bt u t x, theo nguyn tc: t nh m ch c
php i tip theo cnh nht v t nh nht ch c i tip theo cnh m. Mi khi thm ti mt
nh, ta gn nhn m/nht cho nh v tip tc thao tc tm kim trn th nh bnh thng.
Cng trong qu trnh tm kim, mi khi pht hin thy mt cnh nht ni hai nh m, ta dng li
ngay v nu gn nhn tip s gp tnh trng mt nh c c hai nhn m/nht, trong trng hp ny,
Blossom c pht hin (xem tnh cht ca Blossom) v b chp thnh mt nh, thut ton c
bt u li vi th mi cho ti khi tr li c cu hi: "c tn ti ng m xut pht t x hay
khng?"
Nu ng m tm c khng i qua nh chp no th ta ch vic tng cp dc theo ng m.
Nu ng m c i qua mt nh chp th ta li n nh chp ra thnh Blossom thay nh
chp ny trn ng m bng mt on ng xuyn qua Blossom:

Expand Expand

Hnh 89: N Blossom d ng xuyn qua Blossom
Cc thut ton trn th
L Minh Hong
293
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(n
4
).
Di y ta s trnh by mt phng php ci t hiu qu hn vi phc tp O(n
3
), phng php
ny ci t khng phc tp, nhng yu cu phi hiu rt r bn cht thut ton.
13.3. PHNG PHP LAWLER (1973)
Trong phng php Edmonds, sau khi chp mi Blossom thnh mt nh th nh hon ton li
c th nm trn mt Blossom mi v b chp tip. Phng php Lawler ch quan tm n nh chp
cui cng, i din cho Blossom ngoi nht (Outermost Blossom), nh chp cui cng ny c
nh danh (nh s) bng nh c s ca Blossom ngoi nht.
Cng chnh v thao tc chp/n ni trn m ta cn m rng khi nim Blossom, c th coi mt
Blossom l mt tp nh n ra t mt nh chp ch khng n thun ch l mt chu trnh pha
c bn na.
Xt mt Blossom B c nh c s l nh r. Vi vB, v r, ta lu li hai ng pha t r ti v,
mt ng kt thc bng cnh m v mt ng kt thc bng cnh nht, nh vy c hai loi vt
gn cho mi nh v (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:
Chuyn
i hc S phm H Ni, 1999-2002
294
Nu v l nh cha ghp Tm thy ng m kt thc v, dng
Nu v l nh ghp thm v thm lun match[v] v y match[v] vo Queue.
Sau mi ln thm, ch vic lu vt (hai nhn S v T)
Nu v thm
Nu v l nh nht hoc b[v] = b[u] b qua
Nu v l nh m v b[v] b[u] ta pht hin c blossom mi cha u v v, khi :
Pht hin nh c s: Truy vt ng i ngc t hai nh m u v v theo hai ng pha
v nt gc, chn ly nh a l nh m chung gp u tin trong qu trnh truy vt ngc.
Khi Blossom mi pht hin s c nh c s l a.
Gn li vt: Gi (a = i1, i2, , ip = u) v (a = j1, j2, , jq = v) ln lt l hai ng pha
dn t a ti u v v. Khi (a = i1, i2, , ip = u, jq = v, jq-1, , j1 = a) l mt chu trnh
pha i t a ti u v v ri quay tr v a. Bng cch i dc theo chu trnh ny theo hai hng
ngc nhau, ta c th gn li tt c cc nhn S v T ca nhng nh trn chu trnh. Lu
rng khng c gn li nhn S v T cho nhng nh k m b[k] = a, v vi nhng nh k
c b[k] a th bt buc phi gn li nhn S v T theo chu trnh ny bt k S[k] v T[k]
trc c hay cha.
Chp Blossom: Xt nhng nh v m b[v]{b[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.
Nu qu trnh ny ch thot khi hng i rng th tc l khng tn ti ng m bt u t x.

Sau y l mt s v d v cc trng hp t nh m u xt cnh nht (u, v):
Trng hp 1: v cha thm v cha ghp:
u
1 2 x
T:1
S:2
v u
1 2
3 4
x
T:1
v
S:2 T:3
3 4

Tm thy ng m
Trng hp 2: v cha thm v ghp
Cc thut ton trn th
L Minh Hong
295
u
1 2 x
T:1
S:2
v
u
1 2
3 4
x
T:1
v
S:2 T:3
3 4 5 5
S:4

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
u
1 2 x
T:1
v
3
5
6
S:2
T:3
S:5
T:7
S:4
T:5
S:6
T:3
S:7
b[.] = 3
7
4

Khng xt, b qua
Trng hp 4: v thm, l nh m v b[u] b[v]
1 2 x
T:1
3
S:2
4
6
8
T:3 S:4
S:6 T:3
5
7
1 2 x
T:1
3
S:2
4
6
8
T:3
S:5
T:7
S:4
T:5
S:6
T:3
S:7
5
7
a

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:
Chuyn
i hc S phm H Ni, 1999-2002
296
Input: file vn bn GMATCH.INP
Dng 1: Cha hai s n, m ln lt l s cnh v s nh ca th cch nhau t nht mt du
cch (n 100)
m dng tip theo, mi dng cha hai s u, v tng trng cho mt cnh (u, v) ca th
Output: file vn bn GMATCH.OUT, ghi b ghp cc i tm c
1 2
5
4
6
3
9
7 8
10

GMATCH.INP
10 11
1 2
1 6
2 4
2 8
3 4
3 6
5 6
5 9
5 10
7 8
7 9
GMATCH.OUT
1) 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 v = x hoc match[v] l mt nh nht
Nu v l nh m th S[v] = match[v]
Vy th ta khng cn phi s dng ring mt mng nhn S[v], ti mi bc sa vt, ta ch cn sa
nhn vt T[v] m thi. kim tra mt nh v x c phi nh m hay khng, ta c th kim tra
bng iu kin: match[v] c l nh nht hay khng, hay T[match[v]] c khc 0 hay khng.
Chng trnh s dng cc bin vi vai tr nh sau:
match[v] l nh ghp vi nh v
b[v] l nh c s ca Blossom cha v
T[v] l nh lin trc v trn ng pha t nh xut pht ti v kt thc bng cnh nht, T[v] = 0
nu qu trnh BFS cha xt ti nh nht v.
InQueue[v] l bin Boolean, InQueue[v] = True v l nh m c y vo Queue ch
duyt.
start v finish: Ni bt u v kt thc ng m.
P_4_13_1.PAS * Phng php Lawler p dng cho thut ton Edmonds
program MatchingInGeneralGraph;
const
InputFile = 'GMATCH.INP';
OutputFile = 'GMATCH.OUT';
max = 100;
var
a: array[1..max, 1..max] of Boolean;
match, Queue, b, T: array[1..max] of Integer;
InQueue: array[1..max] of Boolean;
n, first, last, start, finish: Integer;

procedure Enter;
var
Cc thut ton trn th
L Minh Hong
297
i, m, u, v: 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;

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}
first := 1; last := 1;
Queue[1] := start;
FillChar(InQueue, SizeOf(InQueue), False);
InQueue[start] := True;
{Cc nhn T c khi gn = 0}
FillChar(T, SizeOF(T), 0);
{Nt c s ca outermost blossom cha i chnh l i}
for i := 1 to n do b[i] := i;
finish := 0; {finish = 0 ngha l cha tm thy ng m}
end;

procedure Push(v: Integer); {y mt nh m v vo hng i}
begin
Inc(last);
Queue[last] := v;
InQueue[v] := True;
end;

function Pop: Integer; {Ly mt nh m khi hng i, tr v trong kt qu hm}
begin
Pop := Queue[first];
Inc(first);
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 }
Chuyn
i hc S phm H Ni, 1999-2002
298
if p = start then Break; {Nu truy v n ni xut pht th dng}
p := T[match[p]]; {Nu cha v n start th truy li tip hai bc, theo cnh m ri theo cnh nht}
until False;
repeat {Truy vt t q, tng t nh i vi p}
q := b[q];
if InPath[q] then Break; {Tuy nhin nu chm vo ng pha ca p th dng ngay}
q := T[match[q]];
until False;
FindCommonAncestor := q; {Ghi nhn nh c s mi}
end;

procedure ResetTrace(x: Integer); {Gn li nhn vt dc trn ng pha t start ti x}
var
u, v: Integer;
begin
v := x;
while b[v] <> NewBase do {Truy vt ng pha t start ti nh m x}
begin
u := match[v];
Mark[b[v]] := True; {nh du nhn blossom ca cc nh trn ng i}
Mark[b[u]] := True;
v := T[u];
if b[v] <> NewBase then T[v] := u; {Ch t li vt T[v] nu b[v] khng phi nt c s mi}
end;
end;

begin {BlossomShrink}
FillChar(Mark, SizeOf(Mark), False); {Tt c cc nhn b[v] u cha b nh du}
NewBase := FindCommonAncestor(p, q); {xc nh nt c s}
{Gn li nhn}
ResetTrace(p); ResetTrace(q);
if b[p] <> NewBase then T[p] := q;
if b[q] <> NewBase then T[q] := p;
{Chp blossom gn li cc nhn b[i] nu blossom b[i] b nh du}
for i := 1 to n do
if Mark[b[i]] then b[i] := NewBase;
{Xt nhng nh m i cha c a vo Queue nm trong Blossom mi, y i v Queue ch duyt tip ti cc bc sau}
for i := 1 to n do
if not InQueue[i] and (b[i] = NewBase) then
Push(i);
end;

{Th tc tm ng m}
procedure FindAugmentingPath;
var
u, v: Integer;
begin
InitBFS; {Khi to}
repeat {BFS}
u := Pop;
{Xt nhng nh v cha duyt, k vi u, khng nm cng Blossom vi u, d nhin T[v] = 0 th (u, v) l cnh nht ri}
for v := 1 to n do
if (T[v] = 0) and (a[u, v]) and (b[u] <> b[v]) then
begin
if match[v] = 0 then {Nu v cha ghp th ghi nhn nh kt thc ng m v thot ngay}
begin
T[v] := u;
finish := v;
Exit;
end;
{Nu v l nh m th gn li vt, chp Blossom }
if (v = start) or (T[match[v]] <> 0) then
BlossomShrink(u, v)
else {Nu khng th ghi vt ng i, thm v, thm lun c match[v] v y tip match[v] vo Queue}
Cc thut ton trn th
L Minh Hong
299
begin
T[v] := u;
Push(match[v]);
end;
end;
until first > last;
end;

procedure Enlarge; {Ni rng b ghp bi ng m bt u t start, kt thc finish}
var
v, next: Integer;
begin
repeat
v := T[finish];
next := match[v];
match[v] := finish;
match[finish] := v;
finish := next;
until finish = 0;
end;

procedure Solve; {Thut ton Edmonds}
var
u: Integer;
begin
for u := 1 to n do
if match[u] = 0 then
begin
start := u; {Vi mi nh cha ghp start}
FindAugmentingPath; {Tm ng m bt u t start}
if finish <> 0 then Enlarge; {Nu thy th ni rng b ghp theo ng m ny}
end;
end;

procedure Result; {In b ghp tm c}
var
u, count: Integer;
f: Text;
begin
Assign(f, OutputFile); Rewrite(f);
count := 0;
for u := 1 to n do
if match[u] > u then {Va trnh s trng lp (u, v) v (v, u), va loi nhng nh khng ghp c (match=0)}
begin
Inc(count);
WriteLn(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
Chuyn
i hc S phm H Ni, 1999-2002
300
O(n
2
). Phng php Lawler cn khng qu n ln gi th tc FindAugmentingPath nn c phc
tp tnh ton l O(n
3
).
Cho n nay, phng php tt nht gii bi ton tm b ghp tng qut trn th c bit n
l ca Micali v Varizani (1980), n c phc tp tnh ton l ) m . n ( O . Bn c th tham kho
trong cc ti liu khc.


T TI I L LI I U U C C T TH H M M
[1] Christian Charras, Thierry Lecroq. Handbook of Exact String-Matching Algorithms.
Gn 20 thut ton tm kim chui, c din gii y .
[2] Reinhard Diestel. Graph Theory. Mt cun sch chuyn v L thuyt th.
[3] Johan Hstad. Advanced Algorithms.
[4] Andrew J. Manson. Speaker Matching. Bi bo ni v cc thut ton tm b ghp trn
th tng qut, c trong trng hp th c trng s
[5] Eva Milkov. Graph Theory and Information Technology. Mt s thut ton v bi
ton cy bao trm ti tiu.
[6] Dave Mount. Design and Analysis of Computer Algorithms.
[7] Nguyn Xun My, Trn Hng, L S Quang. Mt s vn chn lc trong tin hc.
Cun sch rt ph hp cho hc sinh ph thng trung hc yu thch vic gii cc bi ton
tin hc
[8] Nguyn c Ngha, Nguyn T Thnh. Ton ri rc. Mt cun sch rt cn bn dnh
cho sinh vin ngnh tin hc.
[9] Kenneth H. Rosen. Discrete Mathematics and its Applications (Bn dch ting Vit:
Ton hc ri rc ng dng trong tin hc). Cun sch vit di dng gio trnh rt d
hiu, c h thng bi tp c sp xp rt khoa hc.
[10] Robert Sedgewick. Algorithms (Bn dch ting Vit: Cm Nang Thut Ton). Mt
cun sch rt tin li cho tra cu, y cc thut ton kinh in












In memory of committed teachers and excellent students.
Le Minh Hoang.

You might also like