L
L
Ê
ÊM
M
I
I
N
N
H
HHOÀ
HOÀ
N
N
G
G
Albert Einstein
i
MC LC
PHN 1. BÀI TOÁN 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 KHÔNG LP 2
1.3. HOÁN V 2
1.4. T HP 3
§2. PHNG PHÁP SINH (GENERATION) 4
2.1. SINH CÁC DÃY NH PHÂN DÀI N 5
2.2. LIT KÊ CÁC TP CON K PHN T 6
2.3. LIT KÊ CÁC HOÁN V 8
§3. THUT TOÁN QUAY LUI 12
3.1. LIT KÊ CÁC DÃY NH PHÂN DÀI N 12
3.2. LIT KÊ CÁC TP CON K PHN T 13
3.3. LIT KÊ CÁC CHNH HP KHÔNG LP CHP K 15
3.4. BÀI TOÁN PHÂN TÍCH S 17
3.5. BÀI TOÁN XP HU 19
§4. K THUT NHÁNH CN 24
4.1. BÀI TOÁN TI U 24
4.2. S BÙNG N T HP 24
4.3. MÔ HÌNH K THUT NHÁNH CN 24
4.4. BÀI TOÁN NGI DU LCH 25
4.5. DÃY ABC 27
PHN 2. CU TRÚC D LIU VÀ GII THUT 33
§1. CÁC BC C BN KHI TIN HÀNH GII CÁC BÀI TOÁN TIN HC 34
1.1. XÁC NH BÀI TOÁN 34
6.6. CÂY TNG QUÁT 77
§7. KÝ PHÁP TIN T, TRUNG T VÀ HU T 79
7.1. BIU THC DI DNG CÂY NH PHÂN 79
7.2. CÁC KÝ PHÁP CHO CÙNG MT BIU THC 79
7.3. CÁCH TÍNH GIÁ TR BIU THC 79
7.4. CHUYN T DNG TRUNG T SANG DNG HU T 83
7.5. XÂY DNG CÂY NH PHÂN BIU DIN BIU THC 86
§8. SP XP (SORTING) 88
8.1. BÀI TOÁN SP XP 88
8.2. THUT TOÁN SP XP KIU CHN (SELECTIONSORT) 90
8.3. THUT TOÁN SP XP NI BT (BUBBLESORT) 91
8.4. THUT TOÁN SP XP KIU CHÈN (INSERTIONSORT) 91
8.5. SP XP CHÈN VI DÀI BC GIM DN (SHELLSORT) 93
8.6. THUT TOÁN SP XP KIU PHÂN ON (QUICKSORT) 94
8.7. THUT TOÁN SP XP KIU VUN NG (HEAPSORT) 101
8.8. SP XP BNG PHÉP M PHÂN PHI (DISTRIBUTION COUNTING) 104
8.9. TÍNH N NH CA THUT TOÁN SP XP (STABILITY) 105
8.10. THUT TOÁN SP XP BNG C S (RADIX SORT) 106
8.11. THUT TOÁN SP XP TRN (MERGESORT) 111
8.12. CÀI T 114
8.13. ÁNH GIÁ, NHN XÉT 122
§9. TÌM KIM (SEARCHING) 126
9.1. BÀI TOÁN TÌM KIM 126
9.2. TÌM KIM TUN T (SEQUENTIAL SEARCH) 126
9.3. TÌM KIM NH PHÂN (BINARY SEARCH) 126
9.4. CÂY NH PHÂN TÌM KIM (BINARY SEARCH TREE - BST) 127
iii
9.5. PHÉP BM (HASH) 132
9.6. KHOÁ S VI BÀI TOÁN TÌM KIM 132
3.2. THUT TOÁN TÌM KIM THEO CHIU SÂU (DEPTH FIRST SEARCH) 187
3.3. THUT TOÁN TÌM KIM THEO CHIU RNG (BREADTH FIRST SEARCH) 189
3.4. PHC TP TÍNH TOÁN CA BFS VÀ DFS 192
§4. TÍNH LIÊN THÔNG CA TH 193
4.1. NH NGHA 193
4.2. TÍNH LIÊN THÔNG TRONG TH VÔ HNG 194
iv
4.3. TH Y VÀ THUT TOÁN WARSHALL 194
4.4. CÁC THÀNH PHN LIÊN THÔNG MNH 197
§5. VÀI NG DNG CA DFS và BFS 208
5.1. XÂY DNG CÂY KHUNG CA TH 208
5.2. TP CÁC CHU TRÌNH C S CA TH 211
5.3. BÀI TOÁN NH CHIU TH 211
5.4. LIT KÊ CÁC KHP VÀ CU CA TH 215
§6. CHU TRÌNH EULER, NG I EULER, TH EULER 219
6.1. BÀI TOÁN 7 CÁI CU 219
6.2. NH NGHA 219
6.3. NH LÝ 219
6.4. THUT TOÁN FLEURY TÌM CHU TRÌNH EULER 220
6.5. CÀI T 221
6.6. THUT TOÁN TT HN 223
§7. CHU TRÌNH HAMILTON, NG I HAMILTON, TH HAMILTON 226
7.1. NH NGHA 226
7.2. NH LÝ 226
7.3. CÀI T 227
§8. BÀI TOÁN NG I NGN NHT 231
8.1. TH CÓ TRNG S 231
8.2. BÀI TOÁN NG I NGN NHT 231
8.3. TRNG HP TH KHÔNG CÓ CHU TRÌNH ÂM - THUT TOÁN FORD BELLMAN 233
13.1. CÁC KHÁI NIM 307
13.2. THUT TOÁN EDMONDS (1965) 308
13.3. THUT TOÁN LAWLER (1973) 310
13.4. CÀI T 312
13.5. PHC TP TÍNH TOÁN 316
TÀI LIU C THÊM 319 vi
HÌNH V
Hình 1: Cây tìm kim quay lui trong bài toán lit kê dãy nh phân 13
Hình 2: Xp 8 quân hu 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 20
Hình 4: Lu đ thut gii (Flowchart) 36
Hình 5: Ký pháp Θ ln, Ο ln và Ω ln 41
Hình 6: Tháp Hà Ni 54
Hình 7: Cu trúc nút ca danh sách ni đn 59
Hình 8: Danh sách ni đn 59
Hình 9: Cu trúc nút ca danh sách ni kép 61
Hình 10: Danh sách ni kép 61
Hình 11: Danh sách ni vòng mt hng 61
Hình 12: Danh sách ni vòng hai hng 62
Hình 13: Dùng danh sách vòng mô t Queue 67
Hình 14: Di chuyn toa tàu 69
Hình 15: Di chuyn toa tàu (2) 69
Hình 16: Cây 70
Hình 17: Mc ca các nút trên cây 71
Hình 18: Cây biu din biu thc 71
Hình 19: Các dng cây nh phân suy bin 72
Hình 43: ánh s các bit 133
Hình 44: Cây tìm kim s hc 133
Hình 45: Cây tìm kim c s 136
Hình 46: Vi đ dài dãy bit z = 3, cây tìm kim c s gm các khoá 2, 4, 5 và sau khi thêm giá tr 7 137
Hình 47: RST cha các khoá 2, 4, 5, 7 và RST sau khi loi b giá tr 7 138
Hình 48: Cây tìm kim c s a) và Trie tìm kim c s b) 140
Hình 49: Hàm đ quy tính s Fibonacci 151
Hình 50: Tính toán và truy vt 154
Hình 51: Truy vt 163
Hình 52: Ví d v mô hình đ th 178
Hình 53: Phân loi đ th 179
Hình 54 182
Hình 55 183
Hình 56: th và đng đi 186
Hình 57: Cây DFS 189
Hình 58: Cây BFS 192
Hình 59: th G và các thành phn liên thông G1, G2, G3 ca nó 193
Hình 60: Khp và cu 193
Hình 61: Liên thông mnh và liên thông yu 194
Hình 62: th đy đ 195
Hình 63: n đ th vô hng và bao đóng ca nó 195
Hình 64: Ba dng cung ngoài cây DFS 199
Hình 65: Thut toán Tarjan “b” cây DFS 201
Hình 66: ánh s li, đo chiu các cung và duyt BFS vi cách chn các đnh xut phát ngc li vi th t
duyt xong (th t 11, 10… 3, 2, 1) 206
Hình 67: th G và mt s ví d cây khung T1, T2, T3 ca nó 210
Hình 68: Cây khung DFS (a) và cây khung BFS (b) (Mi tên ch chiu đi thm các đnh) 210
Hình 69: Phép đnh chiu DFS 213
Hình 70: Phép đánh s và ghi nhn cung ngc lên cao nht 215
Hình 71: Mô hình đ th ca bài toán by cái cu 219
Hình 89: Cây pha “mc” ln hn sau mi ln xoay trng s cnh và tìm đng 302
Hình 90: th G và mt b ghép M 307
Hình 91: Phép chp Blossom 309
Hình 92: N Blossom đ dò đng xuyên qua Blossom 309
ix
CHNG TRÌNH
P_1_02_1.PAS * Thut toán sinh lit kê các dãy nh phân đ dài n 6
P_1_02_2.PAS * Thut toán sinh lit kê các tp con k phn t 8
P_1_02_3.PAS * Thut toán sinh lit kê hoán v 9
P_1_03_1.PAS * Thut toán quay lui lit kê các dãy nh phân đ dài n 12
P_1_03_2.PAS * Thut toán quay lui lit kê các tp con k phn t 14
P_1_03_3.PAS * Thut toán quay lui lit kê các chnh hp không lp chp k 16
P_1_03_4.PAS * Thut toán quay lui lit kê các cách phân tích s 18
P_1_03_5.PAS * Thut toán quay lui gii bài toán xp hu 21
P_1_04_1.PAS * K thut nhánh cn dùng cho bài toán ngi du lch 26
P_1_04_2.PAS * Dãy ABC 28
P_2_07_1.PAS * Tính giá tr biu thc RPN 81
P_2_07_2.PAS * Chuyn biu thc trung t sang dng RPN 84
P_2_08_1.PAS * Các thut toán sp xp 114
P_3_01_1.PAS * m s cách phân tích s n 145
P_3_01_2.PAS * m s cách phân tích s n 146
P_3_01_3.PAS * m s cách phân tích s n 146
P_3_01_4.PAS * m s cách phân tích s n 147
P_3_01_5.PAS * m s cách phân tích s n dùng đ quy 147
P_3_01_6.PAS * m s cách phân tích s n dùng đ quy 148
P_3_03_1.PAS * Tìm dãy con đn điu tng dài nht 154
P_3_03_2.PAS * Ci tin thut toán tìm dãy con đn điu tng dài nht 156
P_3_03_3.PAS * Bài toán cái túi 159
BNG CÁC KÝ HIU C S DNG
x
⎢⎥
⎣⎦
Floor of x: S nguyên ln nht ≤ x
x
⎡⎤
⎢⎥
Ceiling of x: S nguyên nh nht ≥ x
nk
P
S chnh hp không lp chp k ca n phn t =
n!
(n k)!−
n
k
⎛⎞
⎜⎟
⎝⎠
Binomial coefficient: H s ca hng t
k
x trong đa thc
()
b
a
ab↑↑
m
a
a
b
copies of a
a
a
log x
Logarithm to base a of x: Logarithm c s a ca x (
b
a
log a b
=
)
lg x
Logarithm nh phân (c s 2) ca x
ln x
Logarithm t nhiên (c s e) ca x
*
a
log x S ln ly logarithm c s a đ thu đc s ≤ 1 t x (
*
a
log (a b) b↑↑ = )
*
À
À
I
IT
T
O
O
Á
Á
N
NL
L
I
I
T
TK
K
Ê
Ê
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 nhiên.
Gi X là tp các s nguyên 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) nên ánh x f có th xác đnh qua bng các 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 dãy giá tr (f(1), f(2), …, f(k)) và coi dãy giá tr này cng là mt
chnh hp lp chp k ca S. Nh ví d trên (E, C, E) là mt chnh hp lp chp 3 ca S. D
dàng chng minh đc kt qu sau bng quy np hoc bng phng pháp đánh giá kh nng
la chn:
S chnh hp lp chp k ca tp gm n phn t là
k
n
1.2.
CHNH HP KHÔNG LP
Khi f là đn ánh có ngha là vi ∀i, j ∈ X ta có f(i) = f(j) ⇔ i = j. Nói mt cách d hiu, khi
dãy giá tr f(1), f(2), …, f(k) gm các phn t thuc S khác nhau đôi mt thì f đc gi là mt
chnh hp không lp chp k ca S. Ví d mt chnh hp không lp (C, A, E):
i 1 2 3
f(i) C A E
S chnh hp không lp chp k ca tp gm n phn t là:
nk
đc tính k! ln. Vy s t hp chp k ca tp gm n phn t là
n
n!
k
k!(n k)!
⎛⎞
=
⎜⎟
−
⎝⎠
4 Chuyên đ
HSPHN 1999-2004
§2.
PHNG PHÁP SINH (GENERATION)
Phng pháp sinh có th áp dng đ gii bài toán lit kê t hp đt ra nu nh hai điu kin
sau tho mãn:
Có th xác đnh đc mt th t trên tp các cu hình t hp cn lit kê. T đó có th bit
đccu hình đu tiên và cu hình cui cùng trong th t đó.
Xây dng đc thut toán t mt cu hình cha phi cu hình cui, sinh ra đc cu hình
k tip nó.
Phng pháp sinh có th mô t nh sau:
〈Xây dng cu hình đu tiên〉;
repeat
〈
a ra cu hình đang có〉;
〈
T cu hình đang có sinh ra cu hình k tip nu còn〉;
a[k+1] < b[k+1]
Trong trng hp này, ta có th vit a < b.
Th t đó gi là th t t đin trên các dãy đ dài n.
Khi đ dài hai dãy a và b không bng nhau, ngi ta cng xác đnh đc th t t đin. Bng
cách thêm vào cui dãy a hoc dãy b nhng phn t đc bit gi là phn t ∅ đ đ dài ca a
và b bng nhau, và coi nhng phn t ∅ này nh hn tt c các phn t khác, ta li đa v xác
đnh th t t đin ca 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
Mt dãy nh phân đ dài n là mt dãy x[1 n] trong đó x[i] ∈ {0, 1} (∀i : 1 ≤ i ≤ n).
D thy: mt dãy nh phân x đ dài n là biu din nh phân ca mt giá tr nguyên p(x) nào đó
nm trong đon [0, 2
n
- 1]. S các dãy nh phân đ dài n = s các s t nhiên ∈ [0, 2
n
- 1] = 2
n
.
Ta s lp chng trình lit kê các dãy nh phân theo th t t đin có ngha là s lit kê ln
lt các dãy nh phân biu din các s nguyên theo th t 0, 1, …, 2
n
-1.
Ví d: Khi n = 3, các dãy nh phân đ dài 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 dãy đu tiên s là 00…0 và dãy cui cùng s là 11…1. Nhn xét rng nu dãy x =
110
111
P_1_02_1.PAS * Thut toán sinh lit kê các dãy nh phân đ dài n
{$MODE DELPHI} (*This program uses 32-bit Integer [-2
31
2
31
- 1]*)
program Binary_Strings;
const
InputFile = 'BSTR.INP';
OutputFile = 'BSTR.OUT';
max = 100;
var
x: array[1 max] of Integer;
n, i: Integer;
f: Text;
begin
Assign(f, InputFile); Reset(f);
ReadLn(f, n);
Close(f);
Assign(f, OutputFile); Rewrite(f);
FillChar(x, SizeOf(x), 0); {Cu hình ban đu x=00 0}
repeat {Thut toán sinh}
for i := 1 to n do Write(f, x[i]); {In ra cu hình hin ti}
WriteLn(f);
i := n; {x[i] là phn t cui dãy, lùi 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 hình 11…1}
gii hn trên nên đ sinh cu hình mi ta không th sinh bng cách tng mt phn t trong s
các x[6], x[5], x[4], x[3] lên đc, ta phi tng x[2] = 2 lên thành x[2] = 3. c cu hình mi
là x = 〈1, 3, 6, 7, 8, 9〉. Cu hình này đã tho mãn ln hn cu hình trc nhng cha tho
mãn tính cht va đ ln mun vy ta li thay x[3], x[4], x[5], x[6] bng các 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 hình mi x = 〈1, 3, 4, 5, 6, 7
〉 là cu hình k tip. Nu mun tìm tip, ta li nhn
thy rng x[6] = 7 cha đt gii hn trên, nh vy ch cn tng x[6] lên 1 là đc x = 〈1, 3, 4,
5, 6, 8〉.
Vy k thut sinh tp con k tip t tp đã có x có th xây dng nh sau:
Tìm t cui dãy lên đu cho ti khi gp mt phn t x[i] cha đt gii hn trên n - k + i.
Nu tìm thy:
Tng x[i] đó lên 1.
t tt c các phn t phía sau x[i] bng gii hn di.
Nu không tìm thy tc là mi phn t đã đt gii hn trên, đây là cu hình cui cùng
Input: file vn bn SUBSET.INP cha hai s nguyên dng n, k (1 ≤ k ≤ n ≤ 100) cách nhau
ít nht mt du cách
Output: file vn bn SUBSET.OUT các tp con k phn t ca tp {1, 2, …, n}
SUBSET.INP
5 3
SUBSET.OUT
{1, 2, 3}
{1, 2, 4}
{1, 2, 5}
{1, 3, 4}
for i := 1 to k do x[i] := i; {Khi to x := (1, 2, …, k)}
repeat
{In ra cu hình hin ti}
Write(f, '{');
for i := 1 to k - 1 do Write(f, x[i], ', ');
WriteLn(f, x[k], '}');
{Sinh tip}
i := k; {Xét t cui dãy lên tìm x[i] cha đt gii hn trên n - k + i}
while (i > 0) and (x[i] = n - k + i) do Dec(i);
if i > 0 then {Nu cha lùi đn 0 có ngha là cha phi cu hình kt thúc}
begin
Inc(x[i]); {Tng x[i] lên 1, t các 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; {Lùi đn tn 0 có ngha là tt c các ph
n t đã đt gii hn trên - ht cu hình}
Close(f);
end.
2.3.
LIT KÊ CÁC HOÁN V
Ta s lp chng trình lit kê các hoán v ca {1, 2, …, n} theo th t t đin.
Ví d vi n = 4, ta phi lit kê đ 24 hoán 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 hoán v đu tiên s là 〈1, 2, …, n〉. Hoán v cui cùng là 〈n, n-1, …, 1〉.
Hoán v s sinh ra phi ln hn hoán v hin ti, hn th na phi là hoán v va đ ln hn
hoán v hin ti theo ngha không th có mt hoán v nào khác chen gia chúng khi sp th t.
Input: file vn bn PERMUTE.INP cha s nguyên dng n ≤ 100
Output: file vn bn PERMUTE.OUT các hoán v ca dãy (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 toán sinh lit kê hoán v
{$MODE DELPHI} (*This program uses 32-bit Integer [-2
31
2
31
- 1]*)
program Permutation;
const
InputFile = 'PERMUTE.INP';
OutputFile = 'PERMUTE.OUT';
max = 100;
var
n, i, k, a, b: Integer;
x: array[1 max] of Integer;
f: Text;
procedure Swap(var X, Y: Integer); {Th tc đo giá tr hai tham bin X, Y}
Dec(b);
end;
end;
until i = 0; {Toàn dãy là dãy gim dn - không sinh tip đc - ht cu hình}
Close(f);
end.
Bài tp:
Bài 1
Các chng trình trên x lý không tt trong trng hp tm thng, đó là trng hp n = 0
đi vi chng trình lit kê dãy nh phân cng nh trong chng trình lit kê hoán v, trng
hp k = 0 đi vi chng trình lit kê t hp, hãy khc phc điu đó.
Bài 2
Lit kê các dãy nh phân đ dài n có th coi là lit kê các chnh hp lp chp n ca tp 2 phn
t {0, 1}. Hãy lp chng trình:
Nhp vào hai s n và k, lit kê các chnh hp lp chp k ca {0, 1, …, n -1}.
Hng dn: thay h c s 2 bng h c s n.
Bài 3
Hãy lit kê các dãy nh phân đ dài n mà trong đó cm ch s “01” xut hin đúng 2 ln.
Bài 4.
Nhp vào mt danh sách n tên ngi. Lit kê tt c các cách chn ra đúng k ngi trong s n
ngi đó.
Bài 5
Lit kê tt c các tp con ca tp {1, 2, …, n}. Có th dùng phng pháp lit kê tp con nh
trên hoc dùng phng pháp lit kê tt c các dãy nh phân. Mi s 1 trong dãy nh phân
tng ng vi mt phn t đc chn trong tp. Ví d vi tp {1, 2, 3, 4} thì dãy nh phân
Bài toán lit kê 11
Lê Minh Hoàng
1010 s tng ng vi tp con {1, 3}. Hãy lp chng trình in ra tt c các tp con ca {1,
2, …, n} theo hai phng pháp.