Bài giải Cấu trúc dữ liệu và giải thuật. Các bạn sẽ tìm được đầy đủ thông tin và cách giải tại đây
Trang 1LÊ MINH HOÀNG
Bài gi ng chuyên đ
i h c S ph m Hà N i, 1999-2002
Trang 2Try not to become a man of success but rather to become a man of value
Albert Einstein
Trang 3M C L C
PH N 1 BÀI TOÁN LI T KÊ 1
§1 NH C L I M T S KI N TH C I S T H P 2
1.1 CH NH H P L P 2
1.2 CH NH H P KHÔNG L P 2
1.3 HOÁN V 2
1.4 T H P 3
§2 PH NG PHÁP SINH (GENERATION) 4
2.1 SINH CÁC DÃY NH PHÂN DÀI N 5
2.2 LI T KÊ CÁC T P CON K PH N T 6
2.3 LI T KÊ CÁC HOÁN V 8
§3 THU T TOÁN QUAY LUI 12
3.1 LI T KÊ CÁC DÃY NH PHÂN DÀI N 12
3.2 LI T KÊ CÁC T P CON K PH N T 13
3.3 LI T KÊ CÁC CH NH H P KHÔNG L P CH P K 15
3.4 BÀI TOÁN PHÂN TÍCH S 16
3.5 BÀI TOÁN X P H U 18
§4 K THU T NHÁNH C N 24
4.1 BÀI TOÁN T I U 24
4.2 S BÙNG N T H P 24
4.3 MÔ HÌNH K THU T NHÁNH C N 24
4.4 BÀI TOÁN NG I DU L CH 25
4.5 DÃY ABC 27
PH N 2 C U TRÚC D LI U VÀ GI I THU T 33
§1 CÁC B C C B N KHI TI N HÀNH GI I CÁC BÀI TOÁN TIN H C 34
1.1 XÁC NH BÀI TOÁN 34
1.2 TÌM C U TRÚC D LI U BI U DI N BÀI TOÁN 34
1.3 TÌM THU T TOÁN 35
1.4 L P TRÌNH 37
1.5 KI M TH 37
1.6 T I U CH NG TRÌNH 38
§2 PHÂN TÍCH TH I GIAN TH C HI N GI I THU T 40
2.1 GI I THI U 40
2.2 CÁC KÝ PHÁP ÁNH GIÁ PH C T P TÍNH TOÁN 40
2.3 XÁC NH PH C T P TÍNH TOÁN C A GI I THU T 42
2.4 PH C T P TÍNH TOÁN V I TÌNH TR NG D LI U VÀO 45
2.5 CHI PHÍ TH C HI N THU T TOÁN 46
Trang 4§3 QUY VÀ GI I THU T QUY 50
3.1 KHÁI NI M V QUY 50
3.2 GI I THU T QUY 50
3.3 VÍ D V GI I THU T QUY 51
3.4 HI U L C C A QUY 55
§4 C U TRÚC D LI U BI U DI N DANH SÁCH 58
4.1 KHÁI NI M DANH SÁCH 58
4.2 BI U DI N DANH SÁCH TRONG MÁY TÍNH 58
§5 NG N X P VÀ HÀNG I 64
5.1 NG N X P (STACK) 64
5.2 HÀNG I (QUEUE) 66
§6 CÂY (TREE) 70
6.1 NH NGH A 70
6.2 CÂY NH PHÂN (BINARY TREE) 71
6.3 BI U DI N CÂY NH PHÂN 73
6.4 PHÉP DUY T CÂY NH PHÂN 74
6.5 CÂY K_PHÂN 76
6.6 CÂY T NG QUÁT 77
§7 KÝ PHÁP TI N T , TRUNG T VÀ H U T 79
7.1 BI U TH C D I D NG CÂY NH PHÂN 79
7.2 CÁC KÝ PHÁP CHO CÙNG M T BI U TH C 79
7.3 CÁCH TÍNH GIÁ TR BI U TH C 79
7.4 CHUY N T D NG TRUNG T SANG D NG H U T 83
7.5 XÂY D NG CÂY NH PHÂN BI U DI N BI U TH C 86
§8 S P X P (SORTING) 87
8.1 BÀI TOÁN S P X P 87
8.2 THU T TOÁN S P X P KI U CH N (SELECTIONSORT) 89
8.3 THU T TOÁN S P X P N I B T (BUBBLESORT) 90
8.4 THU T TOÁN S P X P KI U CHÈN 90
8.5 SHELLSORT 92
8.6 THU T TOÁN S P X P KI U PHÂN O N (QUICKSORT) 93
8.7 THU T TOÁN S P X P KI U VUN NG (HEAPSORT) 99
8.8 S P X P B NG PHÉP M PHÂN PH I (DISTRIBUTION COUNTING) 102
8.9 TÍNH N NH C A THU T TOÁN S P X P (STABILITY) 103
8.10 THU T TOÁN S P X P B NG C S (RADIX SORT) 104
8.11 THU T TOÁN S P X P TR N (MERGESORT) 109
8.12 CÀI T 112
8.13 ÁNH GIÁ, NH N XÉT 119
§9 TÌM KI M (SEARCHING) 124
9.1 BÀI TOÁN TÌM KI M 124
9.2 TÌM KI M TU N T (SEQUENTIAL SEARCH) 124
9.3 TÌM KI M NH PHÂN (BINARY SEARCH) 124
9.4 CÂY NH PHÂN TÌM KI M (BINARY SEARCH TREE - BST) 125
Trang 59.5 PHÉP B M (HASH) 130
9.6 KHOÁ S V I BÀI TOÁN TÌM KI M 130
9.7 CÂY TÌM KI M S H C (DIGITAL SEARCH TREE - DST) 131
9.8 CÂY TÌM KI M C S (RADIX SEARCH TREE - RST) 134
9.9 NH NG NH N XÉT CU I CÙNG 139
PH N 3 QUY HO CH NG 141
§1 CÔNG TH C TRUY H I 142
1.1 VÍ D 142
1.2 C I TI N TH NH T 143
1.3 C I TI N TH HAI 144
1.4 CÀI T QUY 145
§2 PH NG PHÁP QUY HO CH NG 147
2.1 BÀI TOÁN QUY HO CH 147
2.2 PH NG PHÁP QUY HO CH NG 147
§3 M T S BÀI TOÁN QUY HO CH NG 151
3.1 DÃY CON N I U T NG DÀI NH T 151
3.2 BÀI TOÁN CÁI TÚI 156
3.3 BI N I XÂU 158
3.4 DÃY CON CÓ T NG CHIA H T CHO K 162
3.5 PHÉP NHÂN T H P DÃY MA TR N 166
3.6 BÀI T P LUY N T P 170
PH N 4 CÁC THU T TOÁN TRÊN TH 175
§1 CÁC KHÁI NI M C B N 176
1.1 NH NGH A TH (GRAPH) 176
1.2 CÁC KHÁI NI M 177
§2 BI U DI N TH TRÊN MÁY TÍNH 179
2.1 MA TR N K (ADJACENCY MATRIX) 179
2.2 DANH SÁCH C NH (EDGE LIST) 180
2.3 DANH SÁCH K (ADJACENCY LIST) 181
2.4 NH N XÉT 182
§3 CÁC THU T TOÁN TÌM KI M TRÊN TH 184
3.1 BÀI TOÁN 184
3.2 THU T TOÁN TÌM KI M THEO CHI U SÂU (DEPTH FIRST SEARCH) 185
3.3 THU T TOÁN TÌM KI M THEO CHI U R NG (BREADTH FIRST SEARCH) 187
3.4 PH C T P TÍNH TOÁN C A BFS VÀ DFS 190
§4 TÍNH LIÊN THÔNG C A TH 191
4.1 NH NGH A 191
4.2 TÍNH LIÊN THÔNG TRONG TH VÔ H NG 192
Trang 64.3 TH Y VÀ THU T TOÁN WARSHALL 192
4.4 CÁC THÀNH PH N LIÊN THÔNG M NH 195
§5 VÀI NG D NG C A DFS và BFS 206
5.1 XÂY D NG CÂY KHUNG C A TH 206
5.2 T P CÁC CHU TRÌNH C S C A TH 209
5.3 BÀI TOÁN NH CHI U TH 209
5.4 LI T KÊ CÁC KH P VÀ C U C A TH 213
§6 CHU TRÌNH EULER, NG I EULER, TH EULER 216
6.1 BÀI TOÁN 7 CÁI C U 216
6.2 NH NGH A 216
6.3 NH LÝ 216
6.4 THU T TOÁN FLEURY TÌM CHU TRÌNH EULER 217
6.5 CÀI T 218
6.6 THU T TOÁN T T H N 220
§7 CHU TRÌNH HAMILTON, NG I HAMILTON, TH HAMILTON 223
7.1 NH NGH A 223
7.2 NH LÝ 223
7.3 CÀI T 224
§8 BÀI TOÁN NG I NG N NH T 228
8.1 TH CÓ TR NG S 228
8.2 BÀI TOÁN NG I NG N NH T 228
8.3 TR NG H P TH KHÔNG CÓ CHU TRÌNH ÂM - THU T TOÁN FORD BELLMAN 230
8.4 TR NG H P TR NG S TRÊN CÁC CUNG KHÔNG ÂM - THU T TOÁN DIJKSTRA 232
8.5 THU T TOÁN DIJKSTRA VÀ C U TRÚC HEAP 235
8.6 TR NG H P TH KHÔNG CÓ CHU TRÌNH - S P X P TÔ PÔ 238
8.7 NG I NG N NH T GI A M I C P NH - THU T TOÁN FLOYD 241
8.8 NH N XÉT 243
§9 BÀI TOÁN CÂY KHUNG NH NH T 248
9.1 BÀI TOÁN CÂY KHUNG NH NH T 248
9.2 THU T TOÁN KRUSKAL (JOSEPH KRUSKAL - 1956) 248
9.3 THU T TOÁN PRIM (ROBERT PRIM - 1957) 253
§10 BÀI TOÁN LU NG C C I TRÊN M NG 257
10.1 CÁC KHÁI NI M 257
10.2 M NG TH NG D VÀ NG T NG LU NG 260
10.3 THU T TOÁN FORD-FULKERSON (L.R.FORD & D.R.FULKERSON - 1962) 263
10.4 THU T TOÁN PREFLOW-PUSH (GOLDBERG - 1986) 267
10.5 M T S M R NG 273
§11 BÀI TOÁN TÌM B GHÉP C C I TRÊN TH HAI PHÍA 280
11.1 TH HAI PHÍA (BIPARTITE GRAPH) 280
11.2 BÀI TOÁN GHÉP ÔI KHÔNG TR NG VÀ CÁC KHÁI NI M 280
11.3 THU T TOÁN NG M 281
11.4 CÀI T 282
Trang 7§12 BÀI TOÁN TÌM B GHÉP C C I V I TR NG S C C TI U TRÊN TH HAI
PHÍA - THU T TOÁN HUNGARI 288
12.1 BÀI TOÁN PHÂN CÔNG 288
12.2 PHÂN TÍCH 288
12.3 THU T TOÁN 289
12.4 BÀI TOÁN TÌM B GHÉP C C I V I TR NG S C C I TRÊN TH HAI PHÍA 297
12.5 NÂNG C P 298
§13 BÀI TOÁN TÌM B GHÉP C C I TRÊN TH 304
13.1 CÁC KHÁI NI M 304
13.2 THU T TOÁN EDMONDS (1965) 305
13.3 THU T TOÁN LAWLER (1973) 307
13.4 CÀI T 309
13.5 PH C T P TÍNH TOÁN 313
TÀI LI U C THÊM 315
Trang 8HÌNH V
Hình 1: Cây tìm ki m quay lui trong bài toán li t kê dãy nh phân 13
Hình 2: X p 8 quân h u trên bàn c 8x8 19
Hình 3: ng chéo B-TN mang ch s 10 và đ ng chéo N-TB mang ch s 0 19
Hình 4: L u đ thu t gi i (Flowchart) 36
Hình 5: Ký pháp Θ l n, Ο l n và Ω l n 41
Hình 6: Tháp Hà N i 54
Hình 7: C u trúc nút c a danh sách n i đ n 59
Hình 8: Danh sách n i đ n 59
Hình 9: C u trúc nút c a danh sách n i kép 61
Hình 10: Danh sách n i kép 61
Hình 11: Danh sách n i vòng m t h ng 61
Hình 12: Danh sách n i vòng hai h ng 62
Hình 13: Dùng danh sách vòng mô t Queue 67
Hình 14: Di chuy n toa tàu 69
Hình 15: Di chuy n toa tàu (2) 69
Hình 16: Cây 70
Hình 17: M c c a các nút trên cây 71
Hình 18: Cây bi u di n bi u th c 71
Hình 19: Các d ng cây nh phân suy bi n 72
Hình 20: Cây nh phân hoàn ch nh và cây nh phân đ y đ 72
Hình 21: ánh s các nút c a cây nh phân đ y đ đ bi u di n b ng m ng 73
Hình 22: Nh c đi m c a ph ng pháp bi u di n cây b ng m ng 73
Hình 23: C u trúc nút c a cây nh phân 74
Hình 24: Bi u di n cây b ng c u trúc liên k t 74
Hình 25: ánh s các nút c a cây 3_phân đ bi u di n b ng m ng 76
Hình 26: Bi u di n cây t ng quát b ng m ng 77
Hình 27: C u trúc nút c a cây t ng quát 78
Hình 28: Bi u th c d i d ng cây nh phân 79
Hình 29: Vòng l p trong c a QuickSort 94
Hình 30: Tr ng thái tr c khi g i đ quy 95
Hình 31: Heap 100
Hình 32: Vun đ ng 100
Hình 33: o giá tr k[1] cho k[n] và xét ph n còn l i 101
Hình 34: Vun ph n còn l i thành đ ng r i l i đ o tr k[1] cho k[n-1] 101
Hình 35: ánh s các bit 104
Hình 36: Thu t toán s p x p tr n 109
Hình 37: Cài đ t các thu t toán s p x p v i d li u l n 121
Trang 9Hình 38: Cây nh phân tìm ki m 126
Hình 39: Xóa nút lá cây BST 127
Hình 40 Xóa nút ch có m t nhánh con trên cây BST 128
Hình 41: Xóa nút có c hai nhánh con trên cây BST thay b ng nút c c ph i c a cây con trái 128
Hình 42: Xóa nút có c hai nhánh con trên cây BST thay b ng nút c c trái c a cây con ph i 128
Hình 43: ánh s các bit 131
Hình 44: Cây tìm ki m s h c 131
Hình 45: Cây tìm ki m c s 134
Hình 46: V i đ dài dãy bit z = 3, cây tìm ki m c s g m các khoá 2, 4, 5 và sau khi thêm giá tr 7 135
Hình 47: RST ch a các khoá 2, 4, 5, 7 và RST sau khi lo i b giá tr 7 136
Hình 48: Cây tìm ki m c s a) và Trie tìm ki m c s b) 138
Hình 49: Hàm đ quy tính s Fibonacci 149
Hình 50: Tính toán và truy v t 152
Hình 51: Truy v t 160
Hình 52: Ví d v mô hình đ th 176
Hình 53: Phân lo i đ th 177
Hình 54 180
Hình 55 181
Hình 56: th và đ ng đi 184
Hình 57: Cây DFS 187
Hình 58: Cây BFS 190
Hình 59: th G và các thành ph n liên thông G1, G2, G3 c a nó 191
Hình 60: Kh p và c u 191
Hình 61: Liên thông m nh và liên thông y u 192
Hình 62: th đ y đ 193
Hình 63: n đ th vô h ng và bao đóng c a nó 193
Hình 64: Ba d ng cung ngoài cây DFS 197
Hình 65: Thu t toán Tarjan "b " cây DFS 199
Hình 66: ánh s l i, đ o chi u các cung và duy t BFS v i cách ch n các đ nh xu t phát ng c l i v i th t duy t xong (th t 11, 10… 3, 2, 1) 204
Hình 67: th G và m t s ví d cây khung T1, T2, T3 c a nó 208
Hình 68: Cây khung DFS (a) và cây khung BFS (b) (M i tên ch chi u đi th m các đ nh) 208
Hình 69: Phép đ nh chi u DFS 211
Hình 70: Phép đánh s và ghi nh n cung ng c lên cao nh t 213
Hình 71: Mô hình đ th c a bài toán b y cái c u 216
Hình 72 217
Hình 73 217
Hình 74 223
Hình 75: Phép đánh l i ch s theo th t tôpô 238
Hình 76: Hai cây g c r 1 và r 2 và cây m i khi h p nh t chúng 249
Trang 10Hình 77: M ng v i các kh n ng thông qua (1 phát, 6 thu) và m t lu ng c a nó v i giá tr 7 257
Hình 78: M ng G và m ng th ng d G f t ng ng (ký hi u f[u,v]:c[u,v] ch lu ng f[u, v] và kh n ng thông qua c[u, v] trên cung (u, v)) 261
Hình 79: M ng th ng d và đ ng t ng lu ng 262
Hình 80: Lu ng trên m ng G tr c và sau khi t ng 262
Hình 81: M ng gi c a m ng có nhi u đi m phát và nhi u đi m thu 273
Hình 82: Thay m t đ nh u b ng hai đ nh u in , u out 274
Hình 83: M ng gi c a m ng có kh n ng thông qua c a các cung b ch n hai phía 274
Hình 84: th hai phía 280
Hình 85: th hai phía và b ghép M 281
Hình 86: Mô hình lu ng c a bài toán tìm b ghép c c đ i trên đ th hai phía 285
Hình 87: Phép xoay tr ng s c nh 289
Hình 88: Thu t toán Hungari 292
Hình 89: Cây pha "m c" l n h n sau m i l n xoay tr ng s c nh và tìm đ ng 299
Hình 90: th G và m t b ghép M 304
Hình 91: Phép ch p Blossom 306
Hình 92: N Blossom đ dò đ ng xuyên qua Blossom 306
Trang 11CH NG TRÌNH
P_1_02_1.PAS * Thu t toán sinh li t kê các dãy nh phân đ dài n 6
P_1_02_2.PAS * Thu t toán sinh li t kê các t p con k ph n t 8
P_1_02_3.PAS * Thu t toán sinh li t kê hoán v 9
P_1_03_1.PAS * Thu t toán quay lui li t kê các dãy nh phân đ dài n 12
P_1_03_2.PAS * Thu t toán quay lui li t kê các t p con k ph n t 14
P_1_03_3.PAS * Thu t toán quay lui li t kê các ch nh h p không l p ch p k 16
P_1_03_4.PAS * Thu t toán quay lui li t kê các cách phân tích s 17
P_1_03_5.PAS * Thu t toán quay lui gi i bài toán x p h u 21
P_1_04_1.PAS * K thu t nhánh c n dùng cho bài toán ng i du l ch 26
P_1_04_2.PAS * Dãy ABC 28
P_2_07_1.PAS * Tính giá tr bi u th c RPN 81
P_2_07_2.PAS * Chuy n bi u th c trung t sang d ng RPN 84
P_2_08_1.PAS * Các thu t toán s p x p 112
P_3_01_1.PAS * m s cách phân tích s n 143
P_3_01_2.PAS * m s cách phân tích s n 144
P_3_01_3.PAS * m s cách phân tích s n 144
P_3_01_4.PAS * m s cách phân tích s n 145
P_3_01_5.PAS * m s cách phân tích s n dùng đ quy 145
P_3_01_6.PAS * m s cách phân tích s n dùng đ quy 145
P_3_03_1.PAS * Tìm dãy con đ n đi u t ng dài nh t 152
P_3_03_2.PAS * C i ti n thu t toán tìm dãy con đ n đi u t ng dài nh t 154
P_3_03_3.PAS * Bài toán cái túi 157
P_3_03_4.PAS * Bi n đ i xâu 161
P_3_03_5.PAS * Dãy con có t ng chia h t cho k 163
P_3_03_6.PAS * Dãy con có t ng chia h t cho k 165
P_3_03_7.PAS * Nhân t i u dãy ma tr n 169
P_4_03_1.PAS * Thu t toán tìm ki m theo chi u sâu 185
P_4_03_2.PAS * Thu t toán tìm ki m theo chi u r ng 188
P_4_04_1.PAS * Thu t toán Warshall li t kê các thành ph n liên thông 195
P_4_04_2.PAS * Thu t toán Tarjan li t kê các thành ph n liên thông m nh 202
P_4_05_1.PAS * Li t kê các kh p và c u c a đ th 214
P_4_06_1.PAS * Thu t toán Fleury tìm chu trình Euler 218
P_4_06_2.PAS * Thu t toán hi u qu tìm chu trình Euler 221
P_4_07_1.PAS * Thu t toán quay lui li t kê chu trình Hamilton 224
P_4_08_1.PAS * Thu t toán Ford-Bellman 231
P_4_08_2.PAS * Thu t toán Dijkstra 233
P_4_08_3.PAS * Thu t toán Dijkstra và c u trúc Heap 235
Trang 12P_4_08_4.PAS * ng đi ng n nh t trên đ th không có chu trình 239
P_4_08_5.PAS * Thu t toán Floyd 242
P_4_09_1.PAS * Thu t toán Kruskal 250
P_4_09_2.PAS * Thu t toán Prim 254
P_4_10_1.PAS * Thu t toán Ford-Fulkerson 265
P_4_10_2.PAS * Thu t toán Preflow-push 270
P_4_11_1.PAS * Thu t toán đ ng m tìm b ghép c c đ i 283
P_4_12_1.PAS * Thu t toán Hungari 295
P_4_12_2.PAS * Cài đ t ph ng pháp Kuhn-Munkres O(k 3 ) 300
P_4_13_1.PAS * Ph ng pháp Lawler áp d ng cho thu t toán Edmonds 310
Trang 15PH N 1 BÀI TOÁN LI T KÊ
Có m t s bài toán trên th c t yêu c u ch rõ: trong m t t p các đ i
t ng cho tr c có bao nhiêu đ i t ng tho mãn nh ng đi u ki n nh t
đ nh Bài toán đó g i là bài toán đ m
Trong l p các bài toán đ m, có nh ng bài toán còn yêu c u ch rõ nh ng
c u hình tìm đ c tho mãn đi u ki n đã cho là nh ng c u hình nào Bài toán yêu c u đ a ra danh sách các c u hình có th có g i là bài toán li t
kê
gi i bài toán li t kê, c n ph i xác đ nh đ c m t thu t toán đ có th
theo đó l n l t xây d ng đ c t t c các c u hình đang quan tâm Có nhi u ph ng pháp li t kê, nh ng chúng c n ph i đáp ng đ c hai yêu
th y l i gi i Qua đó, ta c ng nên bi t r ng ch nên dùng ph ng pháp
li t kê khi không còn m t ph ng pháp nào khác tìm ra l i gi i
Chính nh ng n l c gi i quy t các bài toán th c t không dùng ph ng pháp li t kê đã thúc đ y s phát tri n c a nhi u ngành toán h c
Trang 16V y có th đ ng nh t f v i dãy giá tr (f(1), f(2), …, f(k)) và coi dãy giá tr này c ng là m t
ch nh h p l p ch p k c a S Nh ví d trên (E, C, E) là m t ch nh h p l p ch p 3 c a S D dàng ch ng minh đ c k t qu sau b ng quy n p ho c b ng ph ng pháp đánh giá kh n ng
Khi k = n M t ch nh h p không l p ch p n c a S đ c g i là m t hoán v các ph n t c a S
Ví d : m t hoán v : 〈A, D, C, E, B, F〉 c a S = {A, B, C, D, E, F}
f(i) A D C E B F
Trang 17ý r ng khi k = n thì s ph n t c a t p X = {1, 2, …, n} đúng b ng s ph n t c a S Do tính ch t đôi m t khác nhau nên dãy f(1), f(2), …, f(n) s li t kê đ c h t các ph n t trong S
Nh v y f là toàn ánh M t khác do gi thi t f là ch nh h p không l p nên f là đ n ánh Ta có
L y m t t p con k ph n t c a S, xét t t c k! hoán v c a t p con này D th y r ng các hoán
v đó là các ch nh h p không l p ch p k c a S Ví d l y t p {A, B, C} là t p con c a t p S trong ví d trên thì: 〈A, B, C〉, 〈C, A, B〉, 〈B, C, A〉, … là các ch nh h p không l p ch p 3 c a
S i u đó t c là khi li t kê t t c các ch nh h p không l p ch p k thì m i t h p ch p k s
đ c tính k! l n V y s t h p ch p k c a t p g m n ph n t là n! n
kk!(n k)!
⎛ ⎞
= ⎜ ⎟
Trang 18Trên các ki u d li u đ n gi n chu n, ng i ta th ng nói t i khái ni m th t Ví d trên
ki u s thì có quan h : 1 < 2; 2 < 3; 3 < 10; …, trên ki u ký t Char thì c ng có quan h 'A' < 'B'; 'C' < 'c'…
Xét quan h th t toàn ph n "nh h n ho c b ng" ký hi u "≤" trên m t t p h p S, là quan h hai ngôi tho mãn b n tính ch t:
Trên các dãy h u h n, ng i ta c ng xác đ nh m t quan h th t :
Xét a[1 n] và b[1 n] là hai dãy đ dài n, trên các ph n t c a a và b đã có quan h th t "≤" Khi đó a ≤ b n u nh
Ho c a[i] = b[i] v i ∀i: 1 ≤ i ≤ n
Ho c t n t i m t s nguyên d ng k: 1 ≤ k < n đ :
a[1] = b[1]
a[2] = b[2]
Trang 19Th t đó g i là th t t đi n trên các dãy đ dài n
Khi đ dài hai dãy a và b không b ng nhau, ng i ta c ng xác đ nh đ c th t t đi n B ng cách thêm vào cu i dãy a ho c dãy b nh ng ph n t đ c bi t g i là ph n t ∅ đ đ dài c a a
và b b ng nhau, và coi nh ng ph n t ∅ này nh h n t t c các ph n t khác, ta l i đ a v xác
đ nh th t t đi n c a hai dãy cùng đ dài Ví d :
〈1, 2, 3, 4〉 < 〈5, 6〉
〈a, b, c〉 < 〈a, b, c, d〉
'calculator' < 'computer'
2.1 SINH CÁC DÃY NH PHÂN DÀI N
M t dãy nh phân đ dài n là m t dãy x[1 n] trong đó x[i] ∈ {0, 1} (∀i : 1 ≤ i ≤ n)
D th y: m t dãy nh phân x đ dài n là bi u di n nh phân c a m t giá tr nguyên p(x) nào đó
n m trong đo n [0, 2n
- 1] S các dãy nh phân đ dài n = s các s t nhiên ∈ [0, 2n
- 1] = 2n
Ta s l p ch ng trình li t kê các dãy nh phân theo th t t đi n có ngh a là s li t kê l n
l t các dãy nh phân bi u di n các s nguyên theo th t 0, 1, …, 2n-1
Ví d : Khi n = 3, các dãy nh phân đ dài 3 đ c li t kê nh sau:
Trang 20N u th y thì thay s 0 đó b ng s 1 và đ t t t c các ph n t phía sau v trí đó b ng 0
N u không th y thì thì toàn dãy là s 1, đây là c u hình cu i cùng
D li u vào (Input): nh p t file v n b n BSTR.INP ch a s nguyên d ng n ≤ 30
K t qu ra (Output): ghi ra file v n b n BSTR.OUT các dãy nh phân đ dài n
Assign(f, OutputFile); Rewrite(f);
FillChar(x, SizeOf(x), 0); {C u hình ban đ u x=00 0}
repeat {Thu t toán sinh}
for i := 1 to n do Write(f, x[i]); {In ra c u hình hi n t i}
WriteLn(f);
i := n; {x[i] là ph n t cu i dãy, lùi d n i cho t i khi g p s 0 ho c khi i = 0 thì d ng}
while (i > 0) and (x[i] = 1) do Dec(i);
if i > 0 then {Ch a g p ph i c u hình 11…1}
begin
x[i] := 1; {Thay x[i] b ng s 1}
FillChar(x[i + 1], (n - i) * SizeOf(x[1]), 0); { t x[i+1] = x[i+2] = … = x[n] := 0}
Trang 21h n trên (giá tr l n nh t có th nh n) c a x[k] là n, c a x[k-1] là n - 1, c a x[k-2] là n - 2…
T ng quát: gi i h n trên c a x[i] = n - k + i;
Còn t t nhiên, gi i h n d i c a x[i] (giá tr nh nh t x[i] có th nh n) là x[i-1] + 1
Nh v y n u ta đang có m t dãy x đ i di n cho m t t p con, n u x là c u hình k t thúc có ngh a là t t c các ph n t trong x đ u đã đ t t i gi i h n trên thì quá trình sinh k t thúc, n u không thì ta ph i sinh ra m t dãy x m i t ng d n tho mãn v a đ l n h n dãy c theo ngh a không có m t t p con k ph n t nào chen gi a chúng khi s p th t t đi n
V y k thu t sinh t p con k ti p t t p đã có x có th xây d ng nh sau:
Tìm t cu i dãy lên đ u cho t i khi g p m t ph n t x[i] ch a đ t gi i h n trên n - k + i
N u tìm th y:
T ng x[i] đó lên 1
t t t c các ph n t phía sau x[i] b ng gi i h n d i
N u không tìm th y t c là m i ph n t đã đ t gi i h n trên, đây là c u hình cu i cùng
Input: file v n b n SUBSET.INP ch a hai s nguyên d ng n, k (1 ≤ k ≤ n ≤ 30) cách nhau ít
Trang 22P_1_02_2.PAS * Thu t toán sinh li t kê các t p con k ph n t program Combination;
Assign(f, OutputFile); Rewrite(f);
for i := 1 to k do x[i] := i; {x := 12…k (C u hình kh i t o)}
i := k; {Xét t cu i dãy lên tìm x[i] ch a đ t gi i h n trên n - k + i}
while (i > 0) and (x[i] = n - k + i) do Dec(i);
Nh v y hoán v đ u tiên s là 〈1, 2, …, n〉 Hoán v cu i cùng là 〈n, n-1, …, 1〉
Hoán v s sinh ra ph i l n h n hoán v hi n t i, h n th n a ph i là hoán v v a đ l n h n hoán v hi n t i theo ngh a không th có m t hoán v nào khác chen gi a chúng khi s p th t
Gi s hoán v hi n t i là x = 〈3, 2, 6, 5, 4, 1〉, xét 4 ph n t cu i cùng, ta th y chúng đ c x p
gi m d n, đi u đó có ngh a là cho dù ta có hoán v 4 ph n t này th nào, ta c ng đ c m t hoán v bé h n hoán v hi n t i Nh v y ta ph i xét đ n x[2] = 2, thay nó b ng m t giá tr khác Ta s thay b ng giá tr nào?, không th là 1 b i n u v y s đ c hoán v nh h n, không
th là 3 vì đã có x[1] = 3 r i (ph n t sau không đ c ch n vào nh ng giá tr mà ph n t tr c
đã ch n) Còn l i các giá tr 4, 5, 6 Vì c n m t hoán v v a đ l n h n hi n t i nên ta ch n x[2] = 4 Còn các giá tr (x[3], x[4], x[5], x[6]) s l y trong t p {2, 6, 5, 1} C ng vì tính v a
đ l n nên ta s tìm bi u di n nh nh t c a 4 s này gán cho x[3], x[4], x[5], x[6] t c là 〈1, 2,
5, 6〉 V y hoán v m i s là 〈3, 4, 1, 2, 5, 6〉
Trang 23Ta có nh n xét gì qua ví d này: o n cu i c a hoán v hi n t i đ c x p gi m d n, s x[5] =
4 là s nh nh t trong đo n cu i gi m d n tho mãn đi u ki n l n h n x[2] = 2 N u đ i ch x[5] cho x[2] thì ta s đ c x[2] = 4 và đo n cu i v n đ c s p x p gi m d n Khi đó mu n
bi u di n nh nh t cho các giá tr trong đo n cu i thì ta ch c n đ o ng c đo n cu i
Trong tr ng h p hoán v hi n t i là 〈2, 1, 3, 4〉 thì hoán v k ti p s là 〈2, 1, 4, 3〉 Ta c ng
có th coi hoán v 〈2, 1, 3, 4〉 có đo n cu i gi m d n, đo n cu i này ch g m 1 ph n t (4)
V y k thu t sinh hoán v k ti p t hoán v hi n t i có th xây d ng nh sau:
Xác đ nh đo n cu i gi m d n dài nh t, tìm ch s i c a ph n t x[i] đ ng li n tr c đo n cu i
đó i u này đ ng ngh a v i vi c tìm t v trí sát cu i dãy lên đ u, g p ch s i đ u tiên th a mãn x[i] < x[i+1]
N u tìm th y ch s i nh trên
Trong đo n cu i gi m d n, tìm ph n t x[k] nh nh t tho mãn đi u ki n x[k] > x[i] Do
đo n cu i gi m d n, đi u này th c hi n b ng cách tìm t cu i dãy lên đ u g p ch s k
đ u tiên tho mãn x[k] > x[i] (có th dùng tìm ki m nh phân)
o giá tr x[k] và x[i]
L t ng c th t đo n cu i gi m d n (t x[i+1] đ n x[k]) tr thành t ng d n
N u không tìm th y t c là toàn dãy đã s p gi m d n, đây là c u hình cu i cùng
Input: file v n b n PERMUTE.INP ch a s nguyên d ng n ≤ 12
Output: file v n b n PERMUTE.OUT các hoán v c a dãy (1, 2, …, n)
Trang 24Assign(f, OutputFile); Rewrite(f);
while x[k] < x[i] do Dec(k); {Lùi d n k đ tìm g p x[k] đ u tiên l n h n x[i]}
Swap(x[k], x[i]); { i ch x[k] và x[i]}
a := i + 1; b := n; {L t ng c đo n cu i gi m d n, a: đ u đo n, b: cu i đo n}
while a < b do
begin
Swap(x[a], x[b]); { o giá tr x[a] và x[b]}
Inc(a); {Ti n a và lùi b, ti p t c cho t i khi a, b ch m nhau}
Các ch ng trình trên x lý không t t trong tr ng h p t m th ng, đó là tr ng h p n = 0
đ i v i ch ng trình li t kê dãy nh phân c ng nh trong ch ng trình li t kê hoán v , tr ng
h p k = 0 đ i v i ch ng trình li t kê t h p, hãy kh c ph c đi u đó
t ng ng v i m t ph n t đ c ch n trong t p Ví d v i t p {1, 2, 3, 4} thì dãy nh phân
1010 s t ng ng v i t p con {1, 3} Hãy l p ch ng trình in ra t t c các t p con c a {1,
2, …, n} theo hai ph ng pháp
Bài 6
Nh p vào danh sách tên n ng i, in ra t t c các cách x p n ng i đó vào m t bàn
Trang 25Bài 7
Nh p vào danh sách n b n nam và n b n n , in ra t t c các cách x p 2n ng i đó vào m t bàn tròn, m i b n nam ti p đ n m t b n n
Bài 8
Ng i ta có th dùng ph ng pháp sinh đ li t kê các ch nh h p không l p ch p k Tuy nhiên
có m t cách khác là li t kê t t c các t p con k ph n t c a t p h p, sau đó in ra đ k! hoán v
c a nó Hãy vi t ch ng trình li t kê các ch nh h p không l p ch p k c a {1, 2, …, n} theo c hai cách
nh c đi m và ít tính ph d ng trong nh ng thu t toán duy t h n ch H n th n a, không
ph i c u hình ban đ u lúc nào c ng d tìm đ c, không ph i k thu t sinh c u hình k ti p cho m i bài toán đ u đ n gi n nh trên (Sinh các ch nh h p không l p ch p k theo th t t
đi n ch ng h n) Ta sang m t chuyên m c sau nói đ n m t ph ng pháp li t kê có tính ph
d ng cao h n, đ gi i các bài toán li t kê ph c t p h n đó là: Thu t toán quay lui (Back tracking)
Trang 26§3 THU T TOÁN QUAY LUI
Thu t toán quay lui dùng đ gi i bài toán li t kê các c u hình M i c u hình đ c xây d ng
n) Xét t t c các giá tr x[n] có th nh n, th cho x[n] nh n l n l t các giá tr đó, thông báo
c u hình tìm đ c 〈x[1], x[2], …, x[n]〉
Trên ph ng di n quy n p, có th nói r ng thu t toán quay lui li t kê các c u hình n ph n t
d ng x[1 n] b ng cách th cho x[1] nh n l n l t các giá tr có th V i m i giá tr th gán cho x[1] bài toán tr thành li t kê ti p c u hình n - 1 ph n t x[2 n]
Mô hình c a thu t toán quay lui có th mô t nh sau:
{Th t c này th cho x[i] nh n l n l t các giá tr mà nó có th nh n}
procedure Try(i: Integer);
〈Ghi nh n vi c cho x[i] nh n giá tr V (n u c n)〉;
Try(i + 1); {G i đ quy đ ch n ti p x[i+1]}
〈N u c n, b ghi nh n vi c th x[i] := V đ th giá tr khác〉;
end;
end;
end;
Thu t toán quay lui s b t đ u b ng l i g i Try(1)
3.1 LI T KÊ CÁC DÃY NH PHÂN DÀI N
Input/Output v i khuôn d ng nh trong P_1_02_1.PAS
Bi u di n dãy nh phân đ dài N d i d ng x[1 n] Ta s li t kê các dãy này b ng cách th dùng các giá tr {0, 1} gán cho x[i] V i m i giá tr th gán cho x[i] l i th các giá tr có th gán cho x[i+1].Ch ng trình li t kê b ng thu t toán quay lui có th vi t:
P_1_03_1.PAS * Thu t toán quay lui li t kê các dãy nh phân đ dài n program BinaryStrings;
const
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
Trang 27Input/Output có khuôn d ng nh trong P_1_02_2.PAS
li t kê các t p con k ph n t c a t p S = {1, 2, …, n} ta có th đ a v li t kê các c u hình x[1 n], đây các x[i] ∈ S và x[1] < x[2] < … < x[k] Ta có nh n xét:
Trang 28P_1_03_2.PAS * Thu t toán quay lui li t kê các t p con k ph n t program Combination;
Trang 29N u đ ý ch ng trình trên và ch ng trình li t kê dãy nh phân đ dài n, ta th y v c b n chúng ch khác nhau th t c Try(i) - ch n th các giá tr cho xi, ch ng trình li t kê dãy
nh phân ta th ch n các giá tr 0 ho c 1 còn ch ng trình li t kê các t p con k ph n t ta
th ch n x[i] là m t trong các giá tr nguyên t x[i-1] + 1 đ n n - k + i Qua đó ta có th th y tính ph d ng c a thu t toán quay lui: mô hình cài đ t có th thích h p cho nhi u bài toán, khác v i ph ng pháp sinh tu n t , v i m i bài toán l i ph i có m t thu t toán sinh k ti p riêng làm cho vi c cài đ t m i bài m t khác, bên c nh đó, không ph i thu t toán sinh k ti p nào c ng d cài đ t
3.3 LI T KÊ CÁC CH NH H P KHÔNG L P CH P K
li t kê các ch nh h p không l p ch p k c a t p S = {1, 2, …, n} ta có th đ a v li t kê các
c u hình x[1 k] đây các x[i] ∈ S và khác nhau đôi m t
Nh v y th t c Try(i) - xét t t c các kh n ng ch n x[i] - s th h t các giá tr t 1 đ n n, mà các giá tr này ch a b các ph n t đ ng tr c ch n Mu n xem các giá tr nào ch a đ c
ch n ta s d ng k thu t dùng m ng đánh d u:
Kh i t o m t m ng c[1 n] mang ki u logic boolean đây c[i] cho bi t giá tr i có còn t
do hay đã b ch n r i Ban đ u kh i t o t t c các ph n t m ng c là TRUE có ngh a là các
ph n t t 1 đ n n đ u t do
T i b c ch n các giá tr có th c a x[i] ta ch xét nh ng giá tr j có c[j] = TRUE có ngh a
là ch ch n nh ng giá tr t do
Tr c khi g i đ quy tìm x[i+1]: ta đ t giá tr j v a gán cho x[i] là đã b ch n có ngh a là
đ t c[j] := FALSE đ các th t c Try(i + 1), Try(i + 2)… g i sau này không ch n ph i giá
tr j đó n a
Sau khi g i đ quy tìm x[i+1]: có ngh a là s p t i ta s th gán m t giá tr khác cho x[i]
thì ta s đ t giá tr j v a th đó thành t do (c[j] := TRUE), b i khi xi đã nh n m t giá tr
khác r i thì các ph n t đ ng sau: x[i+1], x[i+2] … hoàn toàn có th nh n l i giá tr j đó
i u này hoàn toàn h p lý trong phép xây d ng ch nh h p không l p: x[1] có n cách ch n, x[2] có n - 1 cách ch n, …L u ý r ng khi th t c Try(i) có i = k thì ta không c n ph i đánh
d u gì c vì ti p theo ch có in k t qu ch không c n ph i ch n thêm ph n t nào n a
Input: file v n b n ARRANGE.INP ch a hai s nguyên d ng n, k (1 ≤ k ≤ n ≤ 20) cách nhau ít nh t m t d u cách
Output: file v n b n ARRANGE.OUT ghi các ch nh h p không l p ch p k c a t p {1, 2, …,
Trang 30P_1_03_3.PAS * Thu t toán quay lui li t kê các ch nh h p không l p ch p k program Arrangement;
Try(i + 1); {Th t c này ch xét nh ng giá tr còn t do gán cho x[i+1]}
c[j] := True; {B đánh d u: j l i là t do, b i s p t i s th m t cách ch n khác c a x[i]}
Assign(f, OutputFile); Rewrite(f);
FillChar(c, SizeOf(c), True); {T t c các s đ u ch a b ch n}
Try(1); {Th các cách ch n giá tr c a x[1]}
Close(f);
end
Nh n xét: khi k = n thì đây là ch ng trình li t kê hoán v
3.4 BÀI TOÁN PHÂN TÍCH S
3.4.1 Bài toán
Cho m t s nguyên d ng n ≤ 30, hãy tìm t t c các cách phân tích s n thành t ng c a các s nguyên d ng, các cách phân tích là hoán v c a nhau ch tính là 1 cách
3.4.2 Cách làm:
Ta s l u nghi m trong m ng x, ngoài ra có m t m ng t M ng t xây d ng nh sau: t[i] s là
t ng các ph n t trong m ng x t x[1] đ n x[i]: t[i] := x[1] + x[2] + … + x[i]
Trang 31Khi li t kê các dãy x có t ng các ph n t đúng b ng n, đ tránh s trùng l p ta đ a thêm ràng
bu c x[i-1] ≤ x[i]
Vì s ph n t th c s c a m ng x là không c đ nh nên th t c PrintResult dùng đ in ra 1 cách phân tích ph i có thêm tham s cho bi t s in ra bao nhiêu ph n t
Th t c đ quy Try(i) s th các giá tr có th nh n c a x[i] (x[i] ≥ x[i - 1])
Khi nào thì in k t qu và khi nào thì g i đ quy tìm ti p ?
L u ý r ng t[i - 1] là t ng c a t t c các ph n t t x[1] đ n x[i-1] do đó
Khi t[i] = n t c là (x[i] = n - t[i - 1]) thì in k t qu
Khi tìm ti p, x[i+1] s ph i l n h n ho c b ng x[i] M t khác t[i+1] là t ng c a các s t x[1] t i x[i+1] không đ c v t quá n V y ta có t[i+1] ≤ n ⇔ t[i-1] + x[i] + x[i+1] ≤ n ⇔ x[i] + x[i+1] ≤ n - t[i-1] t c là x[i] ≤ (n - t[i-1])/2 Ví d đ n gi n khi n = 10 thì ch n x[1] =
6, 7, 8, 9 là vi c làm vô ngh a vì nh v y c ng không ra nghi m mà c ng không ch n ti p x[2] đ c n a
M t cách d hi u: ta g i đ quy tìm ti p khi giá tr x[i] đ c ch n còn cho phép ch n thêm
m t ph n t khác l n h n ho c b ng nó mà không làm t ng v t quá n Còn ta in k t qu
ch khi x[i] mang giá tr đúng b ng s thi u h t c a t ng i-1 ph n t đ u so v i n
V y th t c Try(i) th các giá tr cho x[i] có th vi t nh sau: (đ t ng quát cho i = 1, ta đ t x[0] = 1 và t[0] = 0)
Xét các giá tr c a x[i] t x[i - 1] đ n (n - t[i-1]) div 2, c p nh t t[i] := t[i - 1] + x[i] và g i
đ quy tìm ti p
Cu i cùng xét giá tr x[i] = n - t[i-1] và in k t qu t x[1] đ n x[i]
Input: file v n b n ANALYSE.INP ch a s nguyên d ng n ≤ 30
Output: file v n b n ANALYSE.OUT ghi các cách phân tích s n
Trang 32Xét bàn c t ng quát kích th c nxn M t quân h u trên bàn c có th n đ c các quân khác
n m t i các ô cùng hàng, cùng c t ho c cùng đ ng chéo Hãy tìm các x p n quân h u trên bàn c sao cho không quân nào n quân nào
Ví d m t cách x p v i n = 8:
Trang 33Hình 2: X p 8 quân h u trên bàn c 8x8
3.5.2 Phân tích
Rõ ràng n quân h u s đ c đ t m i con m t hàng vì h u n đ c ngang, ta g i quân h u s
đ t hàng 1 là quân h u 1, quân h u hàng 2 là quân h u 2… quân h u hàng n là quân h u
n V y m t nghi m c a bài toán s đ c bi t khi ta tìm ra đ c v trí c t c a nh ng quân
h u
N u ta đ nh h ng ông (Ph i), Tây (Trái), Nam (D i), B c (Trên) thì ta nh n th y r ng:
M t đ ng chéo theo h ng ông B c - Tây Nam ( B-TN) b t k s đi qua m t s ô, các
ô đó có tính ch t: Hàng + C t = C (Const) V i m i đ ng chéo B-TN ta có 1 h ng s C
và v i m t h ng s C: 2 ≤ C ≤ 2n xác đ nh duy nh t 1 đ ng chéo B-TN vì v y ta có th đánh ch s cho các đ ng chéo B- TN t 2 đ n 2n
M t đ ng chéo theo h ng ông Nam - Tây B c ( N-TB) b t k s đi qua m t s ô, các
4
5 6 7 8
Trang 34Ban đ u c 3 m ng đánh d u đ u mang giá tr TRUE (Các c t và đ ng chéo đ u t do)
Thu t toán quay lui:
Xét t t c các c t, th đ t quân h u 1 vào m t c t, v i m i cách đ t nh v y, xét t t c các cách đ t quân h u 2 không b quân h u 1 n, l i th 1 cách đ t và xét ti p các cách đ t quân h u 3…M i cách đ t đ c đ n quân h u n cho ta 1 nghi m
Khi ch n v trí c t j cho quân h u th i, thì ta ph i ch n ô(i, j) không b các quân h u đ t
tr c đó n, t c là ph i ch n c t j còn t do, đ ng chéo B-TN (i+j) còn t do, đ ng chéo N-TB(i-j) còn t do i u này có th ki m tra (a[j] = b[i+j] = c[i-j] = TRUE)
Khi th đ t đ c quân h u th i vào c t j, n u đó là quân h u cu i cùng (i = n) thì ta có
m t nghi m N u không:
Tr c khi g i đ quy tìm cách đ t quân h u th i + 1, ta đánh d u c t và 2 đ ng chéo
b quân h u v a đ t kh ng ch (a[j] = b[i+j] = c[i-j] := FALSE) đ các l n g i đ quy
ti p sau ch n cách đ t các quân h u k ti p s không ch n vào nh ng ô n m trên c t j
Hãy xem l i trong các ch ng trình li t kê ch nh h p không l p và hoán v v k thu t đánh
d u đây ch khác v i li t kê hoán v là: li t kê hoán v ch c n m t m ng đánh d u xem giá
tr có t do không, còn bài toán x p h u thì c n ph i đánh d u c 3 thành ph n: C t, đ ng chéo B-TN, đ ng chéo N- TB Tr ng h p đ n gi n h n: Yêu c u li t kê các cách đ t n quân xe lên bàn c nxn sao cho không quân nào n quân nào chính là bài toán li t kê hoán v
Input: file v n b n QUEENS.INP ch a s nguyên d ng n ≤ 12
Output: file v n b n QUEENS.OUT, m i dòng ghi m t cách đ t n quân h u
Trang 35QUEENS.INP
5
QUEENS.OUT (1, 1); (2, 3); (3, 5); (4, 2); (5, 4);
b: array[2 2 * max] of Boolean;
c: array[1 - max max - 1] of Boolean;
FillChar(a, SizeOf(a), True); {M i c t đ u t do}
FillChar(b, SizeOf(b), True); {M i đ ng chéo ông B c - Tây Nam đ u t do}
FillChar(c, SizeOf(c), True); {M i đ ng chéo ông Nam - Tây B c đ u t do}
Trang 36Tên g i thu t toán quay lui, đ ng trên ph ng di n cài đ t có th nên g i là k thu t vét c n
b ng quay lui thì chính xác h n, tuy nhiên đ ng trên ph ng di n bài toán, n u nh ta coi công vi c gi i bài toán b ng cách xét t t c các kh n ng c ng là 1 cách gi i thì tên g i Thu t toán quay lui c ng không có gì trái logic Xét ho t đ ng c a ch ng trình trên cây tìm ki m quay lui ta th y t i b c th ch n x[i] nó s g i đ quy đ tìm ti p x[i+1] có ngh a là quá trình
s duy t ti n sâu xu ng phía d i đ n t n nút lá, sau khi đã duy t h t các nhánh, ti n trình lùi
l i th áp đ t m t giá tr khác cho x[i], đó chính là ngu n g c c a tên g i "thu t toán quay lui"
Trang 37Bài 9
Mã đi tu n: Cho bàn c t ng quát kích th c nxn và m t quân Mã, hãy ch ra m t hành trình
c a quân Mã xu t phát t ô đang đ ng đi qua t t c các ô còn l i c a bàn c , m i ô đúng 1 l n Bài 10
Chuy n t t c các bài t p trong bài tr c đang vi t b ng sinh tu n t sang quay lui
Bài 11
Xét s đ giao thông g m n nút giao thông đánh s t 1 t i n và m đo n đ ng n i chúng,
m i đo n đ ng n i 2 nút giao thông Hãy nh p d li u v m ng l i giao thông đó, nh p s
hi u hai nút giao thông s và d Hãy in ra t t c các cách đi t s t i d mà m i cách đi không
đ c qua nút giao thông nào quá m t l n
Trang 38§4 K THU T NHÁNH C N
4.1 BÀI TOÁN T I U
M t trong nh ng bài toán đ t ra trong th c t là vi c tìm ra m t nghi m tho mãn m t s đi u
ki n nào đó, và nghi m đó là t t nh t theo m t ch tiêu c th , nghiên c u l i gi i các l p bài
toán t i u thu c v l nh v c quy ho ch toán h c Tuy nhiên c ng c n ph i nói r ng trong nhi u tr ng h p chúng ta ch a th xây d ng m t thu t toán nào th c s h u hi u đ gi i bài
toán, mà cho t i nay vi c tìm nghi m c a chúng v n ph i d a trên mô hình li t kê toàn b các
c u hình có th và đánh giá, tìm ra c u hình t t nh t Vi c li t kê c u hình có th cài đ t b ng các ph ng pháp li t kê: Sinh tu n t và tìm ki m quay lui D i đây ta s tìm hi u ph ng pháp li t kê b ng thu t toán quay lui đ tìm nghi m c a bài toán t i u
4.2 S BÙNG N T H P
Mô hình thu t toán quay lui là tìm ki m trên 1 cây phân c p N u gi thi t r ng ng v i m i nút t ng ng v i m t giá tr đ c ch n cho x[i] s ng v i ch 2 nút t ng ng v i 2 giá tr
mà x[i+1] có th nh n thì cây n c p s có t i 2n nút lá, con s này l n h n r t nhi u l n so v i
d li u đ u vào n Chính vì v y mà n u nh ta có thao tác th a trong vi c ch n x[i] thì s ph i
tr giá r t l n v chi phí th c thi thu t toán b i quá trình tìm ki m lòng vòng vô ngh a trong các b c ch n k ti p x[i+1], x[i+2], … Khi đó, m t v n đ đ t ra là trong quá trình li t kê l i
gi i ta c n t n d ng nh ng thông tin đã tìm đ c đ lo i b s m nh ng ph ng án ch c ch n không ph i t i u K thu t đó g i là k thu t đánh giá nhánh c n trong ti n trình quay lui
{Th t c này th ch n cho x[i] t t c các giá tr nó có th nh n}
procedure Try(i: Integer);
begin
for 〈M i giá tr V có th gán cho x[i]〉 do
begin
〈Th cho x[i] := V〉;
if 〈Vi c th trên v n còn hi v ng tìm ra c u hình t t h n BESTCONFIG〉 then
if 〈x[i] là ph n t cu i cùng trong c u hình〉 then
〈C p nh t BESTCONFIG〉
else
begin
〈Ghi nh n vi c th x[i] = V n u c n〉;
Try(i + 1); {G i đ quy, ch n ti p x[i+1]}
〈B ghi nh n vi c th cho x[i] = V (n u c n)〉;
end;
end;
end;
Trang 39K thu t nhánh c n thêm vào cho thu t toán quay lui kh n ng đánh giá theo t ng b c, n u
t i b c th i, giá tr th gán cho x[i] không có hi v ng tìm th y c u hình t t h n c u hình BESTCONFIG thì th giá tr khác ngay mà không c n ph i g i đ quy tìm ti p hay ghi nh n
k t qu làm gì Nghi m c a bài toán s đ c làm t t d n, b i khi tìm ra m t c u hình m i (t t
h n BESTCONFIG - t t nhiên), ta không in k t qu ngay mà s c p nh t BESTCONFIG b ng
c u hình m i v a tìm đ c
4.4 BÀI TOÁN NG I DU L CH
4.4.1 Bài toán
Cho n thành ph đánh s t 1 đ n n và m tuy n đ ng giao thông hai chi u gi a chúng, m ng
l i giao thông này đ c cho b i b ng C c p nxn, đây C[i, j] = C[j, i] = Chi phí đi đo n
đ ng tr c ti p t thành ph i đ n thành ph j Gi thi t r ng C[i, i] = 0 v i ∀i, C[i, j] = +∞
n u không có đ ng tr c ti p t thành ph i đ n thành ph j
M t ng i du l ch xu t phát t thành ph 1, mu n đi th m t t c các thành ph còn l i m i thành ph đúng 1 l n và cu i cùng quay l i thành ph 1 Hãy ch ra cho ng i đó hành trình
v i chi phí ít nh t Bài toán đó g i là bài toán ng i du l ch hay bài toán hành trình c a m t
th ng gia (Traveling Salesman)
4.4.2 Cách gi i
Hành trình c n tìm có d ng x[1 n + 1] trong đó x[1] = x[n + 1] = 1 đây gi a x[i] và x[i+1]: hai thành ph liên ti p trong hành trình ph i có đ ng đi tr c ti p (C[i, j] ≠ +∞) và ngo i tr thành ph 1, không thành ph nào đ c l p l i hai l n Có ngh a là dãy x[1 n] l p thành 1 hoán v c a (1, 2, …, n)
Duy t quay lui: x[2] có th ch n m t trong các thành ph mà x[1] có đ ng đi t i (tr c ti p),
Sau th t c tìm ki m quay lui mà chi phí c a BestConfig v n b ng +∞ thì có ngh a là nó không tìm th y m t hành trình nào tho mãn đi u ki n đ bài đ c p nh t BestConfig, bài toán
Trang 40không có l i gi i, còn n u chi phí c a BestConfig < +∞ thì in ra c u hình BestConfig - đó là hành trình ít t n kém nh t tìm đ c
Input: file v n b n TOURISM.INP
Dòng 1: Ch a s thành ph n (1 ≤ n ≤ 20) và s tuy n đ ng m trong m ng l i giao thông
m dòng ti p theo, m i dòng ghi s hi u hai thành ph có đ ng đi tr c ti p và chi phí đi trên quãng đ ng đó (chi phí này là s nguyên d ng ≤ 100)
Output: file v n b n TOURISM.OUT, ghi hành trình tìm đ c
3 4
1 2 1 3
P_1_04_1.PAS * K thu t nhánh c n dùng cho bài toán ng i du l ch program TravellingSalesman;
C: array[1 max, 1 max] of Integer; {Ma tr n chi phí}
X, BestWay: array[1 max + 1] of Integer; {X đ th các kh n ng, BestWay đ ghi nh n nghi m}
T: array[1 max + 1] of Integer; {T[i] đ l u chi phí đi t X[1] đ n X[i]}
Free: array[1 max] of Boolean; {Free đ đánh d u, Free[i]= True n u ch a đi qua tp i}