You are on page 1of 78

Bà i 1 .

TẬP HỢP VÀ ÁNH XẠ

1.1. TẬP HỢP VÀ PHẦN TỬ

Tập hợp và phần tử là những khái niệm toán học nguyên sơ, không thể định
nghĩa mà ta chỉ có thể mô tả chúng.
Có 2 cách mô tả tập hợp:
Cách thứ nhất:
Tất cả những đối tượng có một hoặc một vài tính chất chung nào đó tạo thành
một tập hợp (đôi khi nói ngắn gọn là một tập); khi đó mỗi đối tượng là một phần
tử của tập hợp đó.
Thí dụ 1. Tập hợp các số nguyên dương tạo nên tập N+.
N  {1, 2, 3, ..., n, ...} . Khi đó các số 1, 2, 3, … là các phần tử của N+. Các
phần tử của N+ có 2 tính chất chung: đó là nguyên và dương.
Thí dụ 2. A  {1, 3, 5, 7, ...} là tập hợp các số nguyên dương lẻ. Các phần tử
của A có 3 tính chất chung là nguyên, dương và lẻ.
Nếu x là phần tử của A ta viết x  A ; nếu x không phải phần tử của A thì ta
viết x  A .
Khi mô tả tập hợp theo cách này phải đạt được yêu cầu sau đây: Khi đưa ra
một đối tượng bất kỳ thì các tính chất chung mà chúng ta nêu lên phải đủ để
khẳng định đối tượng đó có phải là phần tử của tập hợp hay không.
Trong thí dụ 2: số 15  A ; số 16  A vì 16 không có tính chất lẻ.
Trong trường hợp yêu cầu trên không đạt được ta phải dùng cách khác.
Cách thứ hai:
Liệt kê các phần tử của tập hợp.
Thí dụ 1. B  {2, 4, 5, 6, 8}
Khi mô tả tập hợp theo cách này thì lại không đòi hỏi các phần tử của tập hợp
phải có một tính chất nào giống nhau.
Thí dụ 2. C  {0, a, Hà Nội, *}.
1.1.1. Tập hữu hạn và tập vô hạn.
Số lượng phần tử của A gọi là bản số của A; ký hiệu là |A| hay N(A); đó là
một số nguyên dương.
Nếu |A| là một số hữu hạn thì A là tập hữu hạn, còn gọi là tập rời rạc. Toán
rời rạc chỉ quan tâm đến các tập rời rạc.
Nếu A không phải tập hữu hạn thì A là tập vô hạn.
Thí dụ.
A  {2, 4, 6, 8} là tập hữu hạn.
N  {0, 1, 2, ...,n, ...} : tập các số tự nhiên là tập vô hạn.
Z  {0,  1,  2, ...,  n, ...} : tập các số nguyên là tập vô hạn.

1
1.1.2. Tập rỗng.
Nếu | A |  0 thì A gọi là tập rỗng, đó là tập không chứa một phần tử nào.
Việc đưa vào tập rỗng rất có ý nghĩa khi ta nghiên cứu về các phép toán trên tập
hợp.
Thí dụ.
A là tập các nghiệm số thực của phương trình x 2  3x  2  0 thì
A  {1, 2} .
Còn tập nghiệm thực của phương trình x 2  x  1  0 là một tập rỗng vì
phương trình này không có nghiệm thực.
Ta ký hiệu tập rỗng là  .
1.1.3. Sự bằng nhau của hai tập.
Hai tập A và B gọi là bằng nhau (ta viết A  B ) nếu chúng bao gồm những
phần tử như nhau, nghĩa là:
xA  x B
Thí dụ.
A  {x, 2, 5, 4} và B  {5, x, 4, 2} là hai tập bằng nhau.
Thứ tự hay vị trí của các phần tử không quan trọng.
1.1.4. Sự bao hàm và tập con.
Nếu x  A  x  B thì ta nói:
 A bao hàm trong B hoặc A chứa trong B.
 B bao hàm A hay B chứa A.
 A là tập con của B.
Để diễn đạt điều này ta viết A  B hay B  A .
Vậy
 A  B nếu A  B và B  A
 A chứa các phần tử của nó.
 Tập rỗng  là tập con của mọi tập A.
Để hình dung quan hệ giữa hai tập người ta dùng sơ đồ Ven để biểu diễn hình
học một tập, coi mỗi tập là một vòng phẳng kín, mỗi điểm bên trong là một phần
tử của tập đó. Khi đó quan hệ A  B được biểu thị bởi hình 1 – vòng A nằm
trong vòng B.

A
B

Hình 1

2
1.1.5. Tập vũ trụ.
Tập vũ trụ ký hiệu là U, đó là tập bao hàm mọi tập khác; khi biểu diễn tập U
bằng sơ đồ Ven, người ta dùng 1 hình vuông hoặc hình chữ nhật. Khi đó mọi tập
khác đều nằm trong hình vuông hoặc hình chữ nhật đó (Hình 2).

C
A
B

Hình 2

1.1.6. Tập lũy thừa.


Cho tập A, tập lũy thừa của A ký hiệu là P(A) hay 2A là tập mọi tập con của A
(bao gồm cả tập rỗng và bản thân tập A).
Thí dụ: A  {1, 2, 3} thì
P(A)  , {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3} .
Tập lũy thừa của A thường liên quan đến việc trắc nghiệm những tập con của
A để xem chúng có thỏa mãn một tính chất nào đó hay không.
Sau này ta sẽ chứng minh: Nếu | A |  n thì | P(A) |  | 2A |  2n.

1.2. CÁC PHÉP TOÁN TẬP HỢP

Từ hai tập A và B cho trước tạo ra một tập mới theo một cách nào đó, ta gọi
đó là phép hợp thành. Mỗi phép hợp thành như thế là một phép toán tập hợp.

1.2.1. Phép hợp.


Hợp của 2 tập A và B, ký hiệu là A  B , là tập chứa tất cả các phần tử thuộc
A hoặc thuộc B, nghĩa là:
x  A  B  {x  A hoặc x  B}
A  B được biểu diễn bởi sơ đồ Ven như hình 3.

A B

AB

Hình 3

3
Thí dụ. A  {1, 3, 5}, B  {1, 2, 3}  A  B  {1, 2, 3, 5}

1.2.2. Phép giao.


Giao của hai tập A và B, ký hiệu là A  B , là tập chứa tất cả các phần tử vừa
thuộc A, vừa thuộc B, nghĩa là
x  A  B  {x  A và x  B}
Biểu diễn của A  B bằng sơ đồ Ven có dạng như hình 4.

A B

AB

Hình 4

Thí dụ. Cũng trong thí dụ trên A  {1, 3, 5}, B  {1, 2, 3} thì
A  B  {1, 3}
Nếu A  B   thì ta nói rằng A và B là hai tập rời nhau.
Thí dụ: A  {1, 3, 5, 7, 9}, B  {2, 4, 6, 8} là hai tập rời nhau vì
A  B  .

1.2.3. Phép trừ.


Hiệu của hai tập A và B ký hiệu là A\B, là tập chứa các phần tử thuộc A mà
không thuộc B. Biểu diễn của A\B bằng sơ đồ Ven có dạng như hình 5.

A B

A\B
Hình 5
Thí dụ. A  {1, 2, 5}, B  {1, 2, 3}  A\B = {5}

1.2.4. Tập bù.


Nếu A  E thì E\A là tập bù của A trong E và ký hiệu là A .

Dễ dàng nhận thấy A  A


Trường hợp đặc biệt nếu E  U thì A  U \ A được gọi ngắn gọn là tập bù của
A.

4
A A

Hình 6
 Luật De Morgan:
 A  E;  B  E ta có:
a) A  B  A  B
b) A  B  A  B
Các phép toán a) và b) có thể mở rộng cho n tập; khi đó định luật De Morgan
sẽ có dạng tổng quát sau đây:
Ai  Ai
i I i I

Ai  Ai
i I i I

Các phép toán nêu trên thỏa mãn các đẳng thức dưới đây mà ta gọi đó là các
luật
Đẳng thức Tên gọi
A A
Luật đồng nhất
AUA
AUU
Luật nuốt
A
AAA
Luật lũy đẳng
AAA
ABBA
Luật giao hoán
ABBA
A  (B  C)  (A  B)  C
Luật kết hợp
A  (B  C)  (A  B)  C
A  (B  C)  (A  B)  (A  C)
Luật phân phối
A  (B  C)  (A  B)  (A  C)
ABAB
Luật De Morgan
ABAB
AA Luật bù

5
1.2.5. Phủ và phân hoạch.
Cho S  {A1, A2 , ..., An } trong đó Ai (i  1, n) là các tập con của E. Nếu
n
Ai  E thì S gọi là một phủ của E.
i 1

Nếu S là một phủ của E và Ai  A j    i  j thì S gọi là một phân


hoạch của E.
Thí dụ.
E  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
A1  {1, 3, 5, 7, 9};
A2  {0, 2, 4, 6, 8};
thì S  {A1, A2} là một phân hoạch của E.
Khái niệm phân hoạch là cơ sở của “nguyên lý cộng” trong bài toán đếm mà
ta sẽ nghiên cứu ở chương sau.

1.2.6. Tích Đề-các.


Tích Đề-các của 2 tập A và B, ký hiệu là A  B , là một tập được định nghĩa
như sau:
A  B  {(a, b): a  A; b  B}
Dễ dàng nhận thấy A  B không có tính giao hoán.
Mở rộng cho tích Đề-các của n tập:
A1  A2  ...  An  {(a1, a 2 , ..., a n ): a i  Ai , i  1, n}
Nếu A1  A2  ...  An  A thì tích Đề-các được ký hiệu là A n , nghĩa là:
An  A  A  ...  A
Dễ dàng chứng minh được A  B  A  B
Cho nên tích Đề-các là cơ sở của “nguyên lý nhân” trong bài toán đếm ở
chương sau.
1.3. QUAN HỆ TƯƠNG ĐƯƠNG VÀ QUAN HỆ THỨ TỰ

1.3.1. Quan hệ 2 ngôi.


Ta đưa vào tập E một quan hệ R có liên quan đến 2 phần tử của E. Xét 2 phần
tử a và b của E, nếu a có quan hệ R với b thì ta viết aRb; khi đó R là quan hệ 2
ngôi trên tập E.
Thí dụ 1. Trên tập số thực : aRb  a  b là quan hệ 2 ngôi trên tập số thực.
Thí dụ 2.
E là tập các đường thẳng trên một mặt phẳng P nào đó.
aRb  a / / b là quan hệ 2 ngôi.

6
Thí dụ 3.
E là tập các sinh viên trong 1 lớp học nào đó
aRb  ”a cùng năm sinh với b” là một quan hệ 2 ngôi.
Quan hệ 2 ngôi trên một tập E có thể có các tính chất sau đây:
a) Tính phản xạ:
Quan hệ R có tính chất phản xạ nếu aRa  a  E
Thí dụ:
- Quan hệ “cùng năm sinh” có tính phản xạ
- Quan hệ “nhỏ hơn” (a < b) không có tính phản xạ vì không thể có
a < a.
b) Tính đối xứng:
Quan hệ R có tính đối xứng nếu aRb  bRa
Thí dụ.
- Quan hệ “cùng năm sinh” có tính đối xứng
- Quan hệ “nhỏ hơn” (a < b) không có tính đối xứng vì từ a < b không thể
suy ra b < a.
c) Tính bắc cầu:
Quan hệ R gọi là có tính bắc cầu nếu (aRb và bRc)  aRc
Thí dụ 1.
Quan hệ “cùng năm sinh” có tính bắc cầu; quan hệ “nhỏ hơn” cũng có tính
bắc cầu vì từ (a < b và b < c) suy ra a < c.
Thí dụ 2.
Trên tập các số nguyên dương N+ ta đưa vào quan hệ như sau:
aRb  a và b là 2 số nguyên tố cùng nhau.
Quan hệ R này không có tính bắc cầu; vì (4R5 và 5R8) không thể suy ra
4R8 vì 4 và 8 không nguyên tố cùng nhau do chúng có 2 ước chung khác 1 đó là
2 và 4.
d) Tính phản xứng:
Quan hệ R gọi là có tính phản xứng nếu (aRb và bRa)  a = b
Thí dụ 1.
Quan hệ aRb  a  b có tính phản xứng vì từ a  b và b  a ta suy ra
a = b (trên tập số thực)
Thí dụ 2.
E là tập các cán bộ trong một cơ quan, ta đưa vào quan hệ R như sau:
aRb  lương của a không cao hơn lương của b.
Quan hệ R này không có tính phản xứng vì (aRb và bRa) ta chỉ suy ra
lương của a = lương của b mà không thể suy ra a = b ; nghĩa là a và b có thể vẫn
là hai cán bộ khác nhau của cơ quan đó.

7
1.3.2. Các phương pháp biểu diễn quan hệ 2 ngôi.
a) Phương pháp liệt kê.
Theo định nghĩa thì mọi quan hệ 2 ngôi R trên tập E đều là tập con của tập
tích Đề-các E  E , nghĩa là luôn viết được R  E  E . Do đó một trong những
phương pháp biểu diễn R là liệt kê tất cả các phần tử của R trong E  E .
Thí dụ. Cho E  {a1, a 2 , a 3} . Tìm trong E một quan hệ 2 ngôi có tính phản
xạ, đối xứng nhưng không bắc cầu.
Ta có:
R  {(a1, a1 ), (a 2 , a 2 ), (a 3 , a 3 ), (a1, a 2 ), (a 2 , a1), (a 2 , a 3 ), (a 3 , a 2 )}
Tính phản xạ được thể hiện ở 3 phần tử đầu, 4 phần tử sau thể hiện tính đối
xứng. Ở đây ta có (a1, a 2 ) và (a 2 , a 3 )  R nhưng (a1, a 3 )  R nên không có
tính chất bắc cầu..
b) Phương pháp sơ đồ.
Mỗi phần tử của E là một đỉnh của đồ thị, nếu a i Ra j thì có cung nối a i đến
a j . Trong thí dụ trên ta có

a1 a2 a3

c) Phương pháp ma trận quan hệ.


Nếu E  {a1, a 2 , ..., a n } thì R được biểu diễn bởi ma trận vuông cấp n:
R  (rij )n  n trong đó
1 khi a i Ra j
rij  
0 khi không có a i Ra j hay (a i , a j )  R
Trong thí dụ trên ta có:
1 1 0
R   1 1 1 
0 1 1
 

1.3.3. Quan hệ tương đương.


Quan hệ 2 ngôi trên tập E gọi là quan hệ tương đương nếu nó có 3 tính chất:
phản xạ, đối xứng và bắc cầu. Dễ dàng thấy rằng:
- Quan hệ “cùng năm sinh” trên tập các sinh viên của một lớp là quan hệ
tương đương.
- Quan hệ “song song” trên tập các đường thẳng trong một mặt phẳng nào đó
là quan hệ tương đương.

8
- Quan hệ “a < b” trên tập số thực không phải là quan hệ tương đương.
Nếu R là quan hệ tương đương thì aRb có thể viết là a  b .
Ta có định nghĩa sau:
Giả sử R là một quan hệ tương đương trên E và x  E . Khi đó lớp tương
đương chứa x là tập con:
x  {y  E : yRx}
Định lý 1. Giả sử R là quan hệ tương đương trên E. Khi đó:
1) x  E : x  x
2) x, y  E, xRy  x  y
3) Nếu x  y   thì 2 lớp tương đương x và y trùng nhau.
Khi đưa quan hệ tương đương R vào E thì chúng chia E thành các lớp tương
đương.
Các lớp tương đương này rời nhau và tạo nên một phủ của E; do đó nó là một
phân hoạch của E.
Việc đưa vào tập E một quan hệ tương đương là một cách tìm một phân hoạch
của E, nhờ đó ta có thể tìm số phần tử của E bằng cách tìm tổng số các phần tử
của tất cả các lớp tương đương.
1.3.4. Quan hệ thứ tự.
Quan hệ 2 ngôi R trên tập E gọi là quan hệ thứ tự nếu nó có 3 tính chất: phản
xạ, phản xứng và bắc cầu. Dễ dàng thấy rằng quan hệ ( a  b ) hay ( a  b ) là
quan hệ thứ tự trên tập các số tự nhiên cũng như trên tập các số thực.
a) Quan hệ thứ tự toàn phần.
Cho R là một quan hệ thứ tự trên E, nếu  a, b  E ta đều có aRb hoặc bRa
thì R gọi là quan hệ thứ tự toàn phần; khi đó mọi phần tử của E được sắp xếp
theo một thứ tự xác định theo quan hệ R và E là một tập có thứ tự toàn phần.
b) Quan hệ thứ tự không toàn phần.
Nếu R là một quan hệ thứ tự trên E nhưng không phải là quan hệ thứ tự toàn
phần thì ta nói R là quan hệ thứ tự không toàn phần.
Thí dụ.
- Quan hệ  trên tập số thực là quan hệ thứ tự toàn phần vì với mọi số thực
a và b ta luôn có a  b hoặc b  a , và dó đó tập các số thực là tập có thứ tự toàn
phần.
- Quan hệ  trên tập các véc tơ n chiều (trong không gian véc tơ n chiều
R n ) là quan hệ thứ tự không toàn phần vì  a  R n và  b  R n mà ta không có
a  b và cũng không có b  a . Tập R n còn gọi là tập có thứ tự bộ phận.
1.4. ÁNH XẠ
1.4.1. Các định nghĩa.

9
Định nghĩa 1.
f gọi là ánh xạ từ tập A vào tập B nếu  x  A,  y duy nhất  B mà ta ký
hiệu là f(x) và gọi là ảnh của x qua ánh xạ f. Ta viết:
f :A B
x f (x)
Định nghĩa 2.
Nếu E  A thì ảnh của E qua f là tập:
f (E)  {y  B:  x  E; y  f (x)}
Hoặc ta cũng viết: f (E)  {f (x) : x  E}
Chú ý.
- Nếu f 1 (y)   thì y  f (A)
- Nếu f 1 (y)  x thì x là phần tử duy nhất có ảnh là y.
Định nghĩa 3.
Cho f là một ánh xạ từ tập A vào tập B.
a) f là toàn ánh nếu f (A)  B
b) f là đơn ánh nếu  x1, x 2  A và x1  x 2  f (x1 )  f (x 2 )
c) f là một song ánh nếu f vừa là toàn ánh vừa là đơn ánh.
Chú ý.
Nếu f là một song ánh từ A lên B thì ta viết f : A  B . Khi đó  y  B,  x
duy nhất  A để cho y  f (x) ; như vậy sự tương ứng y  x là một ánh xạ từ
B vào A mà ta ký hiệu f 1 .
f 1 : B  A
y f 1 (y)  x với y  f (x)
Và ta có
f f 1 (y)   y,  y  B
f 1  f (x)  x,  x  A
Và trong trường hợp này ta nói f 1 là ánh xạ ngược của f.
Thí dụ. Ký hiệu R là tập số thực; R  là tập số thực không âm.
a) f : R  R cho bởi y  x 2 là một ánh xạ nhưng không phải là toàn ánh vì
các số âm không là ảnh của bất kỳ số x nào qua ánh xạ y  x 2 ; cũng không phải
là đơn ánh vì hai số x và x (với x  0 ) có chung một ảnh.
b) f : R  R  cho bởi y  x 2 là toàn ánh nhưng không phải là đơn ánh.
c) f : R   R  cho bởi y  e x là đơn ánh nhưng không phải là toàn ánh vì
các số  1 không là ảnh của bất kỳ số x  0 qua ánh xạ y  e x .

10
d) f : R  R cho bởi y  ax  b (a  0) là song ánh (vừa là toàn ánh, vừa
là đơn ánh). Ánh xạ ngược của nó là:
f 1 : R  R
y  a 1y  a 1b
1.4.2. Hợp (hay tích) của 2 ánh xạ.
Cho 2 ánh xạ: f : A  B và g : B  C , khi đó:
 x  A,  y  B sao cho f (x)  y
Và  y  B,  z  C sao cho g(y)  z
Do đó  x  A,  z  C (qua ánh xạ trung gian f) sao cho g f (x)  z
Vậy có một ánh xạ từ A tới C xác định như sau:
x  A  z  g f (x)  C
Định nghĩa 4.
Hợp (hay tích) của hai ánh xạ f và g ký hiệu là g f : A  C xác định như
sau: x  A  (g f )(x)  g f (x)   C
Hợp của 2 ánh xạ thường được biểu diễn bởi sơ đồ:

A B g C
f
x
y = f(x) z = g(y)

g f
Thí dụ. Cho A  B  C  R ;
x  R  y  f (x)  x 2  R
y  R  z  g(y)  y  3  R
Khi đó ánh xạ hợp: g f : R  R xác định như sau:
x  R  (g f )(x)  g f (x)   x 2  3  R
Định lý 3.
Hợp của 2 đơn ánh là một đơn ánh.
Hợp của 2 toàn ánh là một toàn ánh.
Hợp của 2 song ánh là một song ánh.
Cho ánh xạ f : A  B và A1, A 2 là 2 tập con bất kỳ của A; B1 , B2 là 2
tập con bất kỳ của B. Khi đó:
f (A1  A2 )  f (A1 )  f (A2 )
f (A1  A2 )  f (A1 )  f (A2 )
f 1 (B1  B2 )  f 1 (B1 )  f 1(B2 )
f 1 (B1  B2 )  f 1 (B1 )  f 1(B2 )

11
Bà i 2 . BÀI TOÁN ĐẾM

2.1. PHÁT BIỂU BÀI TOÁN

Dạng tổng quát nhất của bài toán đếm có thể phát biểu ngắn gọn như sau: Cho
một tập rời rạc A; tìm bản số |A| của tập A, tức là hãy đếm xem A có bao nhiêu
phần tử.
Khi đếm các phần tử của A phải đảm bảo nghiêm ngặt 2 nguyên tắc:
Một là: Không bỏ sót, nghĩa là phần tử nào cũng được đếm.
Hai là: Không trùng lặp, nghĩa là không có phần tử nào được đếm quá một
lần.
Phương pháp tổng quát để giải bài toán đếm có thể diễn giải như sau: Giả sử
A là tập cần đếm, N  {1, 2, 3, ..., n} là tập n số nguyên dương đầu tiên. Nếu lập
được sự tương ứng đơn trị hai chiều giữa các phần tử của A và các phần tử của
N; nghĩa là tìm được một song ánh f
f : A  N thì | A |  n
Tuy nhiên có rất nhiều cách cho tập A khác nhau nên phương pháp nêu trên
chỉ có ý nghĩa như một định hướng tổng quát, còn trên thực tế thì người ta phải
căn cứ vào hình thái cụ thể của tập A mà tìm ra một giải pháp thích hợp.
Mỗi phương pháp đếm là một thuật toán, nên trước tiên ta tìm hiểu những
khái niệm cơ bản về thuật toán.
2.2. KHÁI NIỆM THUẬT TOÁN

2.2.1. Định nghĩa.


Thuật toán giải một bài toán nào đó, có thể hiểu một cách trực quan là một
dãy hữu hạn các bước chỉ rõ những thao tác toán học phải thực hiện trên các đối
tượng để thu được lời giải của bài toán.
Thuật toán có các đặc trưng sau:
a) Tính hữu hạn
b) Tính chính xác.
c) Tính đơn trị.
d) Tính phổ dụng.
e) Tính tối ưu.

2.2.2. Biểu diễn thuật toán.


Có 3 cách biểu diễn thuật toán, mỗi cách đều có ưu nhược điểm nhất định nên
tùy theo từng trường hợp ta lựa chọn sao cho thích hợp.
a) Biểu diễn bằng ngôn ngữ tự nhiên, liệt kê các bước của thuật toán.

1
b) Biểu diễn bằng sơ đồ khối.
Phương pháp này sử dụng các biểu trưng hình học quy ước để diễn đạt các
bước và thao tác cần thực hiện trong thuật toán. Ta quy ước có các khối sau:

Nút khởi đầu hoặc kết thúc

Nút thao tác, ghi câu lệnh cần thực hiện

Nút điều kiện, ghi rõ điều kiện cần kiểm tra trong quá
trình tính toán

Cung, dùng để chỉ đường đi của thuật toán

c) Biểu diễn bằng ngôn ngữ lập trình.


Để giải một bài toán bằng máy tính, người ta thường sử dụng một loại ngôn
ngữ lập trình nào đó: Đó là một dãy hữu hạn các câu lệnh được viết theo một quy
tắc nhất định trên ngôn ngữ lập trình mà ta sử dụng.
2.2.3. Phương pháp quy nạp.
Quy nạp toán học là một phương pháp hữu hiệu để chứng minh một mệnh đề
toán học đúng với mọi số tự nhiên n. Để thực hiện điều đó ta phải tiến hành các
bước sau:
Bước 1: Chứng minh mệnh đề đúng với n  1 .
Bước 2: Giả sử mệnh đề đã đúng với n, ta chứng minh mệnh đề đúng với
(n  1)
Thí dụ 1. Chứng minh rằng  n  N*
n(n  1)(2n  1)
12  22  ...  n 2 
6
1(1  1)(2  1)
Bước 1: Với n  1 ta có 12  . Vậy công thức đúng với n  1
6
Bước 2: Giả sử công thức trên đúng với n, tức là ta có
n(n  1)(2n  1)
12  22  ...  n 2 
6
Ta phải chứng minh công thức đúng với (n  1) , nghĩa là:
(n  1)(n  2)(2n  3)
12  22  ...  n 2  (n  1) 2 
6

2
n(n  1)(2n  1)
Ta có vế trái  12  22  ...  n 2  (n  1) 2   (n  1)2
6
(n  1)(n  2)(2n  3)
  vế phải.
6
Vậy công thức được chứng minh.

2.2.4. Phương pháp đệ quy.


Đệ quy là khái niệm rất hay gặp trong toán học cũng như trong lập trình, nó
cho phép ta mô tả một cách ngắn gọn và sáng sủa các đối tượng cũng như các
quá trình liên quan đến dãy số tự nhiên.
Như vậy đệ quy là một phương pháp xác định các đối tượng thỏa mãn một
tính chất nào đó; nó bao gồm các quy tắc, trong đó một số quy tắc để xác định
các đối tượng ban đầu và quy tắc còn lại dùng để xác định các đối tượng tiếp theo
nhờ các đối tượng ban đầu đã được xác định.
Thí dụ.
Cho dãy số a 0 , a1, a 2 , ..., a n , ... có tính chất sau:
a 0  0, a1  1 và a n  a n 1  a n 2 ;  n  2 .
Đó chính là dãy Fibonacci mà  n  2 ta có thể tìm được số Fibonacci thứ n
nếu biết số Fibonacci thứ (n  1) và thứ (n  2) . Bằng quy nạp toán học hoặc
bằng cách giải phương trình truy hồi tuyến tính cấp 2 hệ số hằng ta có thể chứng
minh rằng  n  0 ta có:
n n
1 1  5  1 1  5 
an      
5 2  5 2 

2.3. CÁC PHÉP TOÁN TỔ HỢP KHÔNG LẶP

2.3.1. Chỉnh hợp.


Định nghĩa. Chỉnh hợp chập k của n phần tử là một nhóm gồm k phần tử lấy
trong n phần tử đã cho và sắp xếp theo một thứ tự nhất định. Ở đây mỗi phần tử
chỉ được lấy một lần (không lặp).
Thí dụ.
Cho X  {0, 1, 2, 3, 4, 5} gồm 6 phần tử.
Các nhóm dưới đây 123, 213, 402, 305, … đều là các chỉnh hợp chập 3 của 6
phần tử. Hai chỉnh hợp 123 và 213 có các phần tử như nhau nhưng khác nhau về
thứ tự.
Như vậy hai chỉnh hợp là khác nhau nếu chúng có ít nhất một phần tử khác
nhau hoặc thứ tự các phần tử khác nhau. Để xây dựng một chỉnh hợp ta xây dựng

3
dần từ thành phần đầu tiên. Thành phần đầu tiên có n cách chọn, thành phần thứ
hai chỉ có (n  1) khả năng chọn, …, thành phần thứ k chỉ có (n  k  1) khả
năng chọn.
Nếu ký hiệu số chỉnh hợp chập k của n phần tử là A kn thì ta có:
Akn  n.(n  1). ... .(n  k  1) (1)
Thí dụ.
Từ các phần tử của X đã cho ở trên, có thể lập được bao nhiêu con số hàng
trăm mà các chữ số là khác nhau?
Ta thấy ngay S  A36  A52  6.5.4  5.4  120  20  100 số.
Ở đây, A 52 chính là số các chỉnh hợp chập 3 có số 0 đứng ở phía trước; con số
này không phải con số hàng trăm.

2.3.2. Hoán vị.


Định nghĩa. Hoán vị của n phần tử là một cách sắp xếp thứ tự n phần tử đó.
Ký hiệu số hoán vị là Pn thì
Pn  Ann  n.(n  1). ... .2.1  n! (2)
Thí dụ. Có 5 người dàn hàng ngang chụp ảnh, hỏi có bao nhiêu kiểu ảnh khác
nhau?
Mỗi kiểu ảnh là một hoán vị, vậy số kiểu ảnh là: P5  5!  120

2.3.3. Tổ hợp.
Định nghĩa. Tổ hợp chập k của n phần tử là một nhóm gồm k phần tử lấy
trong n phần tử đã cho (không kể thứ tự).
Nếu ký hiệu C kn là số tổ hợp chập k của n phần tử thì dễ dàng thấy rằng:
A kn n.(n  1). ... .(n  k  1)
C .Pk  A
k
n
k
n C k
n  (3)
Pk k!
Nếu chú ý rằng C kn là số nguyên thì ta có nhận xét thú vị sau đây: Tích của k
số tự nhiên liên tiếp nhau luôn chia hết cho tích của k số tự nhiên đầu tiên (k!).
Thí dụ 1.
Có 10 người thi đấu bóng bàn vòng tròn, hỏi có bao nhiêu trận đấu?
Cứ 2 người tạo nên 1 trận đấu, mỗi trận đấu là một tổ hợp chập 2 của 10.
Vậy số trận đấu là:
10.9
2
C10   45 trận
1.2

4
Các số tổ hợp C kn rất hay gặp trong toán rời rạc, ta thường gọi là hệ số tổ hợp.
Dưới đây là một số công thức đáng nhớ:
n!
Ckn  (4)
k!.(n  k)!
Ckn  Cnn  k (5)
Ckn  Ckn 11  Ckn 1 ; (n  k  0) (6)
Để có thể áp dụng công thức (4) và (5) cho mọi k  n ta quy ước:
C0n  Cnn  1 và 0!  1
- Công thức (6) với quy ước C0n  1 cho phép ta tính tất cả các hệ số tổ hợp chỉ
bằng phép cộng.
Nhị thức Newton:
n
(x  y)   Ckn .x k y n  k
n

k 0

Cho y  1 ta có công thức:


n
(x  1)   Ckn .x k
n
(7)
k 0

Từ hệ thức này ta suy ra một số công thức sau đây:


- Cho x  1 thì sẽ có:
C0n  C1n  Cn2  ...  Cnn  2n (8)
- Cho x   1 thì sẽ có:
C0n  C1n  Cn2  C3n ...  (1)n Cnn  0
Từ đó suy ra
C0n  Cn2  ...  C1n  C3n  ...  2n  1 (9)
- Đạo hàm theo x hai vế của (7) rồi thay x  1 sẽ có:
C1n  2Cn2  ...  nCnn  n2n 1 (10)

2.4. CÁC PHÉP TOÁN TỔ HỢP CÓ LẶP

2.4.1. Chỉnh hợp lặp.


Định nghĩa. Chỉnh hợp lặp chập k của n phần tử là một nhóm gồm k phần tử
lấy trong n phần tử đã cho và sắp xếp theo một thứ tự nhất định; các phần tử có
thể lấy lặp.
Thí dụ 1. Với X  {0, 1, 2, 3, 4, 5} các chỉnh hợp lặp chập 3 có thể là 123,
213, 211, 111, …

5
Nếu ký hiệu Lkn là số chỉnh hợp lặp chập k của n phần tử thì dễ dàng thấy
rằng mỗi thành phần của nó đều có n cách lựa chọn nên ta có công thức:
Lkn  n k (11)
Chú ý rằng trong chỉnh hợp lặp số k không bị giới hạn bởi điều kiện k  n
mà trái lại k có thể lấy giá trị lớn hơn n. Chẳng hạn như với 3 chữ số 1, 2, 3 ta
vẫn có thể lập được các con số hàng triệu gồm 7 chữ số:
1 222 333; 2 221 111; …
Thí dụ 2.
Từ các chữ số thuộc X  {0, 1, 2, 3, 4, 5} có thể lập được bao nhiêu con số
hàng trăm?
Mỗi con số hàng trăm là một chỉnh hợp lặp chập 3 của 6 chữ số đã cho, loại
trừ các chỉnh hợp lặp có số 0 đứng trước.
Do đó ta có số các con số hàng trăm là:
s  L36  L26  63  62  180 số

2.4.2. Hoán vị lặp.


Ta hãy xét 2 nhóm gồm 5 chữ cái: THANG và NHANH
Nếu ta hoán vị 5 chữ cái trong nhóm THANG thì sẽ được P5  5!  120 hoán vị
khác nhau. Nhưng khi hoán vị các chữ cái trong nhóm NHANH thì sẽ không
được 120 hoán vị khác nhau; vì khi ta đổi vị trí 2 chữ N với nhau hoặc 2 chữ H
với nhau thì sẽ không tạo ra một hoán vị mới.
Trong các hoán vị này, chữ N lặp 2 lần, chữ H lặp 2 lần, ta gọi đó là các hoán
vị lặp. Số hoán vị lặp trong trường hợp này dễ dàng tính được là:
120
 30
2.2
Bây giờ ta xét trường hợp tổng quát:
Cho k phần tử khác nhau; ta ký hiệu P(n1, n 2 , ..., n k ) là số hoán vị của k
phần tử trên, trong đó phần tử thứ nhất lặp n1 lần, phần tử thứ hai lặp n 2 lần, …,
phần tử thứ k lặp n k lần.
Ta dễ dàng chứng minh được công thức sau đây:
(n1  n 2  ...  n k )!
P(n1, n 2 , ..., n k )  (12)
n1 ! n 2 !... n k !
Thí dụ.
Hoán vị các chữ cái trong tên của dòng sông MISSISIPI, ta thấy ở đây chỉ có
4 chữ cái M, P, S, I trong đó M và P không lặp, S lặp 3 lần, I lặp 4 lần. Vậy số
hoán vị là:

6
(1  1  3  4)! 9!
P(1, 1, 3, 4)    2520
1!1! 3!4! 3!4!
Nếu ta đặt n  n1  n 2  ...  n k thì sẽ có định lý sau đây:
Định lý 1.
Ký hiệu Cn (n1, n 2 , ..., n k ) là số cách chia n phần tử khác nhau thành k nhóm
với số các phần tử tương ứng là n1, n 2 , ..., n k . Nếu n i  n j  i  j thì
Cn (n1, n 2 , ..., n k )  P(n1, n 2 , ..., n k ) .

Thí dụ 1.
Có bao nhiêu cách chia bộ bài tú lơ khơ 52 quân thành 4 phần tương ứng với
số quân là 10, 12, 14, 16.
Vì số quân của các phần khác nhau nên
52!
C52 (10, 12, 14, 16) 
10!12!14!16!
Giả thiết n i  n j  i  j là để cho các nhóm được tạo thành không có sự
trùng lặp. Nếu n1  n 2  ...  n i (i  k) tức là có i nhóm có số phần tử bằng
nhau thì công thức tính sẽ là:
P(n1, n 2 , ..., n k )
Cn (n1, n 2 , ..., n i , n i 1, ..., n k ) 
i!
Nghĩa là số cách chia nhóm sẽ giảm đi i! lần.
Thí dụ 2.
Chia 4 đối tượng a, b, c, d thành 2 nhóm, mỗi nhóm gồm 2 đối tượng thì chỉ
có 3 cách
(a, b) và (c, d)
(a, c) và (b, d)
(a, d) và (b, c)
Chú ý rằng nếu lấy ra 2 đối tượng từ 4 đối tượng thì có C24  6 cách, nhưng
chia thành 2 nhóm, mỗi nhóm 2 đối tượng thì lại chỉ có:
P(2, 2) 4! 24
C4 (2, 2)     3 cách như trên.
2! 2!. 2!2! 8
Thí dụ 3.
Có bao nhiêu cách chia bộ bài tú lơ khơ 52 quân thành 4 phần bằng nhau?
Khi đó mỗi phần có 13 quân nên:
P(13, 13, 13, 13) 52!
C52 (13, 13, 13, 13)  
4! 4!. (13!)4

7
2.4.3. Tổ hợp lặp.
Định nghĩa. Tổ hợp lặp chập k của n phần tử là một nhóm gồm k phần tử lấy
(có thể lặp) trong n phần tử đã cho. Giống như trong chỉnh hợp lặp, số k có thể
lớn hơn n.
Ta ký hiệu số tổ hợp lặp chập k của n phần tử là R kn
Ta có R kn  Cnk  k  1

Thí dụ 1.
Hai quả cam, ba quả quýt, bốn quả chanh có thể coi như tổ hợp lặp chập 9 của
3 phần tử ; trong đó cam lặp 2 lần, quýt lặp 3 lần, chanh lặp 4 lần.
Thí dụ 2.
Có bao nhiêu cách chia 10 chiếc kẹo cho 5 em bé?
Mỗi cách chia là một tổ hợp lặp chập 10 của 5 phần tử, vậy số cách chia là:
14.13.12.11
5  C5 10 1  C14  C14 
R10  1001 cách.
10 10 4

4!
Thí dụ 3.
Phương trình x1  x 2  x 3  x 4  8 ; x i  0 và nguyên ( i  1, 4 ) có bao
nhiêu nghiệm?
Mỗi nghiệm là một tổ hợp lặp chập 8 của 4 phần tử, vậy số nghiệm là:
11.10.9
R 84  C84  8 1  C11
8
 C11
3
  165 nghiệm.
3!

8
Bài 3. CÁC NGUYÊN LÝ ĐẾM

Mỗi bài toán đếm có một cấu trúc khác nhau nên chúng ta cần phải lựa chọn
phương pháp đếm phù hợp với cấu trúc của bài toán đó. Một số phương pháp
đếm có tính chất tổng quát cho một lớp bài toán, ta gọi nó là nguyên lý đếm.
Dưới đây là các nguyên lý quan trọng.

3.1. Nguyên lý cộng


Nếu A1, A2 , ..., An là một phân hoạch của A, nghĩa là
A  A1  A2  ...  An và Ai  A j  ,  i  j thì
n
| A |  | A j |
j 1

Thí dụ 1.
X  {x1, x 2 , ..., x n }; A  P(X) là tập lũy thừa của X. Tìm |A|.
Ta biết rằng P(X) là tập mọi tập con có thể có của X kể cả tập rỗng  và bản
thân tập X. Ta ký hiệu A k là tập mọi tập con gồm k phần tử của X;
k  0, 1, 2, ..., n . Trong đó A 0 là tập rỗng. Ta thấy
A  P(X)  A0  A1  A2  ...  An và Ai  A j  ,  i  j
Áp dụng nguyên lý cộng thì sẽ có:
n
| A |  | Ak |
k 0
n
Vì | A k |  Cnk nên ta có | A |  C
k 0
k
n  2n

3.2. Nguyên lý nhân


Nếu A là tích Descarte: A  E1  E2  ...  En thì
| A |  | E1 |  | E 2 |  ...  | E n |
Trường hợp đặc biệt: A  E n thì | A |  | E |n
Thí dụ 1.
Mỗi biển số ô tô được ghi bởi 1 bộ gồm 2 chữ cái có lặp trong 26 chữ cái
tiếng Anh và một bộ 4 chữ số có lặp. Hỏi có bao nhiêu biển số khác nhau?
Ký hiệu E1 là tập các bộ 2 chữ cái có lặp trong 26 chữ cái, ta có
| E1 |  L226  262  676
Ký hiệu E 2 là tập các bộ 4 chữ số có lặp thì | E 2 |  L410  104
Ký hiệu E là tập các biển số ô tô thì A  E1  E 2 . Do đó
| A |  | E1 |  | E 2 |  676.104

1
Thí dụ 2.
Có bao nhiêu xâu nhị phân có độ dài 10?
Ký hiệu E  {0, 1} ; A là tập các xâu nhị phân có độ dài 10 thì A  E10 .
Vậy | A |  210  1024 .
3.3. Nguyên lý loại trừ
Nếu A  B thì | A |  | B |  | B \ A |
Ta gọi đó là nguyên lý loại trừ
Thí dụ.
Có 8 nam và 10 nữ; có bao nhiêu cách chọn ra 6 người có cả nam và nữ?
- Nếu muốn áp dụng nguyên lý cộng ta làm như sau:
Ký hiệu A i là tập các nhóm 6 người có cả nam và nữ; trong đó có i nam
(1  i  5 ) thì ta có:
A  A1  A2  A3  A4  A5 và Ai  A j  ,  i  j
Vậy | A |  | A1 |  | A2 |  | A3 |  | A4 |  | A5 |
Nhưng khi tính | Ai | ta phải áp dụng nguyên lý nhân.
6i
| Ai |  C8i .C10 ; (1  i  5)
Vậy | A |  C18.C10
5
 C82.C10
4
 C83.C10
3
 C84.C10
2
 C85.C10
1

- Nếu áp dụng nguyên lý loại trừ ta làm như sau:


Tổng số nam và nữ là: 8  10  18 ; có thể tạo ra C18
6
các nhóm gồm 6 người.
Nếu loại bỏ số các nhóm chỉ có nam hoặc chỉ có nữ thì sẽ được số các nhóm có
cả nam và nữ.
Số nhóm chỉ có nam là C86
6
Số nhóm chỉ có nữ là C10
Vậy số nhóm cần tìm là: | A |  C18
6
 (C86  C10
6
)  18272

3.4. Nguyên lý bù trừ


Nguyên lý bù trừ giải quyết bài toán đếm số phần tử của một phủ của A, nghĩa là:
A  A1  A2  ...  An mà không có điều kiện Ai  A j  ,  i  j nên
không thể áp dụng nguyên lý cộng.
Dễ dàng thấy rằng:
- Với n  2 thì A  A1  A2 . Ta dễ dàng chứng minh được
| A |  | A1 |  | A2 |  | A1  A2 |
Các phần tử x  A1  A2 được đếm 2 lần, một lần tính trong A1 và một lần
tính trong A 2 , vậy phải trừ đi 1 lần.
- Với n  3 thì A  A1  A2  A3 ; công thức đếm sẽ là:

2
| A |  (| A1 |  | A2 | | A3 |)  (| A1  A2 | | A2  A3 | | A3  A1 |) | A1  A 2  A3 |

Ý nghĩa của công thức này là: Các phần tử thuộc giao của 2 tập được đếm 2
lần phải trừ đi một lần. Các phần tử x  A1  A2  A3 được tính 3 lần trong
| A1 |, | A2 |, | A3 | và bị trừ đi 3 lần trong giao của các 2 tập
| A1  A2 |, | A2  A3 |, | A3  A1 | ; như vậy coi như chưa được đếm. Vậy phải bù
vào | A1  A2  A3 |
Trường hợp tổng quát: Nếu A  A1  A2  ...  An thì
| A |  N1  N2  N3  ...  (1)n Nn
n
Trong đó N1  | A |
i 1
i

N 2  | Ai  A j |
i j

N3   |A
i  j k
i  A j  Ak |

……………………
Nn  | A1  A2  ...  An |

Thí dụ 1.
Trong một lớp học, mỗi sinh viên đều biết ít nhất một ngoại ngữ. Có 30 sinh
viên biết tiếng Anh, 31 sinh viên biết tiếng Pháp, 32 sinh viên biết tiếng Nga, 15
sinh viên biết tiếng Anh và Pháp, 16 sinh viên biết tiếng Pháp và Nga, 17 sinh
viên biết tiếng Nga và Anh, 5 sinh viên biết cả 3 ngoại ngữ. Hỏi cả lớp có bao
nhiêu sinh viên?
Theo nguyên lý bù trừ ta có: N  N1  N2  N3 nên
N  (30  31  32)  (15  16  17)  5  50 sinh viên.
Thí dụ 2.
Có bao nhiêu số nguyên dương,  1000 chia hết cho 2, 3 hoặc 5.
Ký hiệu A2 , A3 , A5 là tập các số tương ứng chia hết cho 2, 3, 5 và
A  A 2  A3  A 5 .
Theo nguyên lý bù trừ:
| A |  N1  N2  N3
Trong đó N1  | A2 |  | A3 |  | A5 |
N 2  | A 2  A3 |  | A 2  A 5 |  | A 3  A 5 |
N3  | A2  A3  A5 |

3
1000 
Ta có: | A 2 |    500 trong đó [x] là phần nguyên của x.
 2 
1000 
| A3 |    333;
 3 
1000 
| A5 |    200;
 5 
 N1  500  333  200  1033
1000 
| A 2  A3 |    166 ;
 6 
1000 
| A 2  A5 |    100 ;
 10 
1000 
| A3  A5 |    66 ;
 15 
 N2  166  100  66  332
1000 
N3  | A 2  A3  A5 |    33.
 30 
Vậy | A |  1033  332  33  734 .
Thí dụ 3. Tìm số mất thứ tự.
Bỏ n bức thư vào n phong bì ghi sẵn địa chỉ. Tìm xác suất để không một bức
thư nào đúng địa chỉ.
Số cách bỏ thư là n!, số cách bỏ thư không bức thư nào đúng địa chỉ là D n thì
Dn
xác suất cần tìm là: P 
n!
D n là số mất thứ tự. D n được tính theo nguyên lý bù trừ
Dn  N  N1  N2  ...  (1)n Nn
Trong đó N  n!
N k là số cách bỏ thư có ít nhất k lá thư đúng địa chỉ.
Dễ dàng thấy rằng Nk  Cnk .(n  k)! . Trong đó C kn là số cách chọn k bức
thư để bỏ đúng địa chỉ, còn (n  k) bức thư còn lại ta bỏ một cách tùy ý, nghĩa
là có (n  k)! cách. Trong (n  k)! cách bỏ thư này vẫn có những thư đúng địa
n!
chỉ nên N k  Cnk .(n  k)!  là số cách bỏ thư để có ít nhất k thư đúng địa
k!
chỉ.
Thay vào đó ta có:

4
n! n! n! n
(1) k
Dn  n!    ...  (1) n  n!. 
1! 2! n! k  0 k!

Vậy xác suất là:


1 1 1
P 1   ...  (1) n
1! 2! n!

1 1
Điều lý thú là khi cho n   thì P  e1  
e 3
Số mất thứ tự D n tăng rất nhanh. Sau đây là một vài giá trị của D n
n 1 2 3 4 5 6 7 8 9 10
Dn 0 1 2 9 44 265 1854 14833 133496 1334961

3.5. Nguyên lý quy về đơn giản


Một trong các phương pháp đếm là quy một bài toán phức tạp thành các bài
toán đơn giản hơn. Điều này không phải lúc nào cũng dễ dàng vì nó thường đòi
hỏi những hiểu biết sâu sắc và sự phân tích khéo léo các cấu hình phức tạp cần
đếm. Nguyên lý này có ý nghĩa như một định hướng tổng quát, còn cách thức cụ
thể thì lại phụ thuộc vào cấu trúc của bài toán.
Dưới đây ta xét một thí dụ khác để thấy tính đa dạng của nguyên lý này:
“Một người vượt cầu thang có 9 bậc theo cách lúc thì bước 1 bậc, lúc thì bước
2 bậc, lúc thì bước 3 bậc một bước. Hỏi có bao nhiêu cách vượt 9 bậc cầu thang
như thế? ”
Giai đoạn 1.
Ta phân biệt các cách khác nhau theo số lượng mỗi bước của cách vượt cầu
thang. Ký hiệu x1, x 2 , x 3 là số bước tương ứng với 1 bậc, 2 bậc, 3 bậc thì ta có:
x1  2x 2  3x3  9; x i  0 và nguyên (i  1, 3)
Ở giai đoạn này mỗi nghiệm của phương trình trên x(x1, x 2 , x 3 ) được coi
như là một cách vượt cầu thang. Vậy ta có các cách sau đây:
x1  (0, 0, 3) x 7  (6, 0, 1)
x 2  (1, 1, 2) x8  (1, 4, 0)
x 3  (3, 0, 2) x 9  (3, 2, 0)
x 4  (0, 3, 1) x10  (5, 2, 0)
x 5  (2, 2, 1) x11  (7, 1, 0)
x 6  (4, 1, 1) x12  (9, 0, 0)
Giai đoạn 2:

5
Ký hiệu f (x i ) là số cách vượt cầu thang tương ứng với x i . Ta tính các f( x i ).
Dễ dàng thấy f (x1 )  1 . Để tính f (x 2 ) ta thấy x 2  (1, 1, 2) nghĩa là có 4
bước: một bước 1 bậc, một bước 2 bậc và hai bước ba bậc.
Trong bốn bước này ta chọn một bước nào đó cho 1 bậc, có C14  4 cách. Sau
khi chọn bước này, còn lại 3 bước, ta chọn một bước cho 3 bậc: đó là C13  3
cách. Vậy f (x 2 )  4.3  12 cách. Theo cách đó ta có:
f (x1 )  C33  1 f (x 7 )  C17  7
f (x 2 )  C14 .C13  12 f (x8 )  C18  8
f (x 3 )  C52  10 f (x 9 )  C36  20
f (x 4 )  C14  4 f (x10 )  C72  21
f (x 5 )  C15.C24  30 f (x11 )  C18  8
f (x 6 )  C16 .C15  30 f (x12 )  C99  1
Vậy số cách vượt cầu thang là:
12
S   f (x i )  149 cách.
i 1

3.6. Nguyên lý truy hồi


Khi tính số các cấu hình tổ hợp được tạo lập từ n phần tử, thì số cấu hình tổ
hợp này phụ thuộc vào n; ta ký hiệu là Tn . Trong nhiều trường hợp rất khó tìm
trực tiếp công thức của Tn , nhưng nhiều khi lại có thể tìm được mối liên hệ giữa
Tn và Tn 1 hoặc với Tk , (k  n  1) . Nhờ công thức này cùng với các giá trị
ban đầu T1 , T2 mà ta dễ dàng tìm được Tn với bất kỳ giá trị nào của n. Công
thức đó gọi là công thức truy hồi.
Do tính kế thừa, công thức truy hồi rất có tác dụng trong việc lập chương
trình cho máy tính, đơn giản hóa đáng kể quá trình tính toán.
Nếu công thức truy hồi có dạng Tn  f (Tn 1 ) (hoặc Tn  f (Tn 1, Tn  2 ) ) thì
ta gọi đó là phương trình truy hồi cấp 1 (hoặc cấp 2). Nếu biết T1 (hoặc T1 và
T2 ) thì ta có thể tính được Tn với bất kỳ giá trị nào của n . Cách tìm phương
trình truy hồi, tùy theo bài toán thường rất khác nhau.
Dưới đây ta xét một số thí dụ điển hình:
Thí dụ 1.
Cho n đường thẳng có vị trí tổng quát trong mặt phẳng, nghĩa là không có 2
đường thẳng nào song song và cũng không có 3 đường thẳng nào đồng quy. Tìm
số phần mặt phẳng Tn được tạo thành từ n đường thẳng đó.

6
Ta vẽ (n  1) đường thẳng có vị trí tổng quát, số phần mặt phẳng là Tn 1 . Vẽ
thêm đường thẳng thứ n, cắt (n  1) đường thẳng đã cho tại (n  1) giao điểm
khác nhau; các giao điểm này chia đường thẳng vẽ thêm thành n phần.

Đường thẳng thứ n


An

A n 1

A1 A2

Mỗi phần đường thẳng nằm trong 1 phần mặt phẳng tạo nên bởi (n  1)
đường thẳng ban đầu và chia đôi phần mặt phẳng đó, nghĩa là tạo thêm n phần
mặt phẳng nữa.
Vậy ta có:
Tn  Tn 1  n
Ta biết rằng T0  1 nên
T1  T0  1  1 1
T2  T1  2  1 1  2
....................
Tn  Tn 1  n  1 1  2  ...  n
n(n  1)
Và tìm được Tn  1 
2
Thí dụ 2. Bài toán họ nhà thỏ của Fibonacci (nhà toán học Ý 1170-1226).
Thả một cặp thỏ mới sinh (1 con đực, 1 con cái) lên một đảo hoang. Giả sử
khi được 2 tháng tuổi, chúng bắt đầu sinh sản, mỗi tháng một lứa, mỗi lứa sinh ra
1 cặp thỏ con. Các cặp thỏ con cũng sinh trưởng và sinh sản theo quy tắc trên.
Tìm số cặp thỏ trên đảo sau n tháng, biết rằng trong thời gian nghiên cứu không
có cặp thỏ nào bị chết bệnh hoặc bị săn bắt.
Giải:

7
Ký hiệu Tn là số cặp thỏ có ở tháng thứ n; số cặp thỏ này bằng số cặp thỏ có
ở tháng thứ (n  1) là Tn 1 cộng với số cặp thỏ mới sinh ra là Tn  2 .
Vậy ta có:
Tn  Tn 1  Tn  2
Theo điều kiện ban đầu ta có:
T0  0
T1  1
Ta suy ra:
T2  T1  T0  1  1  2
T3  T2  T1  2  1  3
T4  T3  T2  3  2  5
Tiếp tục như vậy ta có dãy số: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … gọi là dãy số
Fibonacci, dãy số đặc trưng cho một quá trình “sinh mà không tử”; một quá trình
có lẽ chỉ có trong thế giới tâm linh – thế giới của những linh hồn bất tử – mà
không có trong thế giới tiến hóa của muôn loài.
Nhưng nếu coi một sinh vật có đời sống “đủ dài” (ngoài tầm nghiên cứu của
Tn ) là “bất tử” thì dãy số Fibonacci lại liên quan đến nhiều vấn đề lý thú không
chỉ trong toán học mà trong cả sinh học, kiến trúc, nghệ thuật và cũng đã từng là
chìa khóa giải mã cho những vấn đề huyền bí trong những câu chuyện rất hấp
dẫn.
Quy luật của dãy số Fibonacci là một số hạng bất kỳ bằng tổng của hai số
hạng đứng liền trước nó.

Giải phương trình truy hồi Fibonacci:


Tn  Tn 1  Tn  2  0
Phương trình đặc trưng: r 2  r  1  0 có 2 nghiệm phân biệt:
1 5
r1, 2 
2
n n
1  5  1  5 
Nghiệm tổng quát là: Tn  c1    c2   .
 2   2 
Theo điều kiện của bài toán ta có: T0  1, T1  1 nên
c1  c2  1

 1  5  1  5 
c
 1    c 2  1
  2   2 

8
1 5 1 5
Giải được c1  ; c2  
2 5 2 5
Do đó ta có:

1  1  5  
n 1 n 1
1  5 
Tn      
5  2   2  
 

9
Bài 4. BÀI TOÁN LIỆT KÊ VÀ BÀI TOÁN TỒN TẠI

1.1. PHÁT BIỂU BÀI TOÁN LIỆT KÊ

Cho tập A  {a1, a 2 , ..., a n } . Từ các phần tử của A, ta tạo ra các cấu hình tổ
hợp theo một quy tắc nào đó và gọi B là tập tất cả các cấu hình tổ hợp đó. Bài
toán đặt ra là hãy liệt kê tất cả các cấu hình tổ hợp của B. Khác với bài toán đếm
là tìm số phần tử của B, trong bài toán này, ta phải lập một danh sách cấu hình
chỉ rõ từng phần tử của B. Rõ ràng là có nhiều cách liệt kê khác nhau, tuy nhiên
chúng phải bảo đảm 2 nguyên tắc sau đây:
Một là: Không bỏ sót, nghĩa là phần tử nào cũng phải được liệt kê.
Hai là: Không trùng lặp, nghĩa là không có phần tử nào được liệt kê quá một
lần.
Khó khăn của việc giải bài toán liệt kê là sự “bùng nổ tổ hợp” nghĩa là khi số
phần tử cần liệt kê là một số lớn. Thí dụ, tập B có 1 triệu phần tử, đây không phải
là con số lớn đối với các bài toán tổ hợp, và giả sử cứ 1 giây thì máy tính có thể
liệt kê được 1 phần tử thì ta phải làm việc trên máy tính trong 35 ngày, mỗi ngày
8 giờ.
Tuy nhiên, nếu số cấu hình tổ hợp không lớn thì cùng với máy tính, phương
pháp liệt kê lại có thể giải được một số bài toán khó mà cho đến nay người ta
cũng chưa tìm được phương pháp tổng quát để đếm các phần tử của B.
Thí dụ như có bao nhiêu cách xếp 8 quân hậu lên 1 bàn cờ vua sao cho chúng
từng đôi một không khống chế lẫn nhau (nghĩa là 2 quân hậu bất kỳ không được
đứng chung 1 hàng, 1 cột hay 1 đường chéo). Hoặc có bao nhiêu cách phủ kín
một bàn cờ vua bằng 32 quân đôminô.
4.2. THUẬT TOÁN SINH

Thuật toán sinh là một thuật toán có thể áp dụng để giải các bài toán liệt kê
các tổ hợp, thuật toán này dựa trên 2 giả thiết sau đây:
- Có thể xác định được một thứ tự toàn bộ trên tập các cấu hình tổ hợp cần
liệt kê, từ đó xác định được cấu hình tổ hợp đầu tiên và cấu hình tổ hợp
cuối cùng trong thứ tự đã xác định đó.
- Đưa ra được một thuật toán để từ một cấu hình hiện có, tìm được cấu hình
tiếp theo, nếu không tìm được cấu hình tiếp theo thì phải khẳng định được
(chứng minh được) cấu hình hiện có là cấu hình cuối cùng (nghĩa là không
còn một cấu hình nào khác ngoài các cấu hình đã liệt kê.)
Thí dụ. Liệt kê tất cả các dãy nhị phân có độ dài n.
Ta xếp các dãy này theo thứ tự tự nhiên, tức là theo thứ tự của số mà nó biểu
diễn, nghĩa là dãy đầu tiên gồm n số 0 và dãy cuối cùng gồm n số 1.
Như vậy dãy nhị phân được liệt kê theo thứ tự sau:
1
00...000  0
00...001  1
00...010  2
00...011  3
........................
11...111  2n  1
Thuật toán sinh có những hạn chế sau:
- Trong nhiều bài toán việc tìm cấu hình ban đầu thường không phải là đơn
giản, thậm chí ngay cả sự tồn tại một cấu hình như thế nhiều khi vẫn còn
là điều nghi vấn.
- Mặt khác việc sắp xếp thứ tự các cấu hình nhiều khi rất phức tạp, do đó
không phải một cấu hình kế tiếp nào cũng được sinh ra từ một cấu hình
hiện có một cách đơn giản.
Hãy xét thí dụ: Liệt kê tất cả các cách điền các chữ số nguyên dương (từ 1
đến 9) vào 9 ô vuông nhỏ trong một hình vuông lớn sao cho tổng các chữ số trên
mỗi hàng, mỗi cột và mỗi đường chéo đều bằng nhau.
Việc đưa ra một cấu hình đầu tiên tuy không đơn giản nhưng không đến nỗi
quá khó, chẳng hạn có thể đưa ra một cấu hình như dưới đây:

2 9 4
7 5 3
6 1 8

Việc sinh ra một cấu hình tiếp theo từ cấu hình này rất đơn giản và có nhiều
cách, chẳng hạn như: hoán vị 2 hàng biên hoặc 2 cột biên, chuyển vị qua đường
chéo chính hoặc phụ, quay hình vuông 900 theo chiều kim đồng hồ hoặc ngược
chiều kim đồng hồ, …. Nhưng khó khăn lại ở chỗ ta không biết sắp xếp các cấu
hình này theo thứ tự nào để biết được đâu là cấu hình cuối cùng, nghĩa là ta chưa
chỉ ra được thủ tục để kết thúc thuật toán.
Qua thí dụ trên ta thấy rằng thuật toán sinh có những hạn chế nên tính phổ
dụng không cao. Dưới đây ta xét một thuật toán có tính phổ dụng cao hơn.
4.3. THUẬT TOÁN QUAY LUI

Ý tưởng cơ bản của thuật toán này là để xây dựng 1 cấu hình gồm n thành
phần, người ta xây dựng dần các thành phần của cấu hình bằng cách thử lại tất cả
các khả năng. Giả sử cấu hình cần xây dựng có n thành phần là a1a 2 ... a n . Giả
thiết ở bước k ta đã xây dựng được (k  1) thành phần a1a 2 ... a k 1 và bây giờ
xác định thành phần a k . Ta duyệt tất cả các khả năng có thể đề cử cho a k và

2
đánh số các khả năng ấy là i  1, 2, ..., n k . Với mỗi khả năng i  {1, 2, ..., n k } ta
kiểm tra xem i có chấp nhận được không.
Có thể xảy ra 2 trường hợp:
- Nếu chấp nhận i thì xác định a k theo i, sau đó nếu k  n thì ta có một cấu
hình, nếu k  n thì ta chuyển sang bước k  1 .
- Nếu  i  {1, 2, ..., n k } mà không có khả năng nào chấp nhận được thì ta
quay lại bước (k  1) để xác định a k 1 .
Điểm mấu chốt của thuật toán này bao gồm 2 điểm chính sau đây:
Một là: Đưa ra một danh sách mọi khả năng đề cử cho i, nghĩa là không được
bỏ sót một khả năng nào.
Hai là: Phải ghi nhớ tại mỗi bước đã đi qua, những khả năng nào đã được thử
để tránh trùng lặp. Rõ ràng những thông tin này phải được lưu trữ theo cơ cấu
“ngăn xếp” (stack: vào sau, ra trước).
Hai yêu cầu: không bỏ sót và không trùng lặp luôn luôn là những đòi hỏi
nghiêm khắc đối với bài toán đếm cũng như bài toán liệt kê.
Thí dụ 1.
Liệt kê các cách xếp 4 quân hậu lên một hình vuông gồm 16 ô vuông ( 4  4 )
sao cho các quân hậu đó từng đôi một không khống chế lẫn nhau.
Ta đánh dấu các cột bởi các chữ A, B, C, D và các hàng bởi các số 1, 2, 3, 4.
Đầu tiên ta xác định vị trí cho quân hậu ở cột A. Có 4 khả năng lựa chọn là
A1, A2 , A3 , A4 .
- Giả sử ta lựa chọn vị trí A1 . Khi đó các ô bị khống chế là
A2 , A3 , A4 , B1, B2 , C1, C3 , D1, D4 . Ta xóa các ô này bởi dấu  (hình 3.1).
Bây giờ để lựa chọn vị trí cho quân hậu ở cột B, ta chỉ có 2 khả năng là
B3 , B4 .
Nếu chọn B3 ta có kết quả như hình 3.2 và nếu chọn B4 thì có kết quả như
hình 3.3.
Trên hình 3.2 không còn 1 ô trống nào để có thể xếp chỗ cho quân hậu trên
cột C.
Vậy việc chọn B3 là không chấp nhận được.
A B C D A B C D A B C D
1 ۩    1 ۩    1 ۩   
2   2    2   ۩ 
3   3  ۩   3    
4   4     4  ۩  

Hình 3.1 Hình 3.2 Hình 3.3

3
Trên hình 3.3, cột C chỉ còn 1 ô trống là C2 để xếp hậu, khi đó ô D2 , D3 đều
bị khống chế, nên không còn ô trống nào để xếp hậu trên cột D. Vậy việc chọn
B4 cũng không thể chấp nhận.
Do đó việc xếp hậu tại A1 không thể chấp nhận.
Do tính chất đối xứng của hình vuông nên việc xếp hậu tại A 4 cũng bị loại
trừ.
Vậy chỉ còn lại 2 khả năng là xếp hậu tại A 2 hoặc A 3 .
- Xếp hậu tại A 2 . Xem hình 3.4.
A B C D A B C D A B C D
1   1   1   ۩ 
2 ۩    2 ۩    2 ۩   
3   3    3    ۩
4   4  ۩   4  ۩  

Hình 3.4 Hình 3.5 Hình 3.6

Khi đó chỉ còn một khả năng duy nhất để xếp hậu ở cột B, đó là B4 . Sau khi
xếp hậu ở B4 thì cũng chỉ còn một khả năng duy nhất để xếp hậu ở cột C, đó là
C1 .
Sau khi xếp hậu ở C1 thì cũng chỉ còn 1 khả năng duy nhất để xếp hậu ở cột
D, đó là D3 . (Xem hình 3.5, 3.6).
Vậy ta có được 1 cấu hình (hình 3.7).
Tương tự nếu chọn A 3 cho quân hậu đầu tiên thì ta có 1 cấu hình nữa (hình
3.8).
A B C D A B C D
1 ۩ 1 ۩
2 ۩ 2 ۩
3 ۩ 3 ۩
4 ۩ 4 ۩

Hình 3.7 Hình 3.8

Quá trình tìm lời giải theo thuật toán quay lui có thể mô tả bởi cây tìm kiếm
lời giải như dưới đây:

4
Gốc

Khả năng chọn a1

Khả năng chọn a 2

Khả năng chọn a 3


Với a1 ,a 2 đã chọn

Hình 3.9. Cây tìm kiếm lời giải theo thuật toán quay lui

Trên hàng thứ nhất là 4 khả năng lựa chọn vị trí cho quân hậu ở cột A.
Trên hàng thứ hai là các khả năng lựa chọn vị trí cho quân hậu ở cột B sau khi
vị trí của quân hậu ở cột A đã được lựa chọn (hàng 2 có 6 khả năng)
Trên hàng thứ 3 là các khả năng lựa chọn vị trí cho quân hậu ở cột C sau khi
vị trí của các quân hậu ở cột A và cột B đã được chọn. Hàng 3 chỉ có 4 khả năng,
nghĩa là có 2 trường hợp không lựa chọn được vị trí cho quân hậu ở cột C.
Trên hàng cuối cùng là các vị trí cho quân hậu ở cột D sau khi vị trí của các
quân hậu ở các cột A, B, C đã lựa chọn. Chỉ có 2 trường hợp, tương ứng với 2
cách xếp 4 quân hậu thỏa mãn điều kiện của bài toán đề ra.
Người ta còn có thể sử dụng “cây tìm kiếm lời giải” để liệt kê các dãy nhị
phân, liệt kê các hoán vị và các tổ hợp. Dưới đây ta xét một thí dụ để giải một bài
toán khác.
Thí dụ 2. Hãy liệt kê tất cả các con số hàng trăm gồm các chữ số khác nhau
được chọn từ tập A = {1, 3, 5, 7, 9} và tạo thành các dãy tăng (số hàng trăm < số
hàng chục < số hàng đơn vị).
Ta có cây tìm kiếm lời giải dưới đây:

1
5
3
3 7
5 7
7
5
5 9 9
7 9
9 9
7
7 9

Hình 3.11
5
Dễ dàng kiểm tra lại để thấy rằng số các con số này đúng bằng số tổ hợp
C35  10 .

4.4. PHÁT BIỂU BÀI TOÁN TỒN TẠI

Trong các bài toán đếm và bài toán liệt kê, người ta tập trung sự chú ý vào
việc đếm hoặc liệt kê các cấu hình tổ hợp thỏa mãn một số tính chất nào đó và
thừa nhận sự tồn tại của các cấu hình tổ hợp đó là hiển nhiên. Tuy nhiên có rất
nhiều bài toán, việc chỉ ra sự tồn tại của một cấu hình thỏa mãn những tính chất
cho trước là rất khó khăn. Chẳng hạn, một kỳ thủ trước một tình huống cụ thể của
một ván cờ, cần suy nghĩ xem liệu có một dãy các nước đi để chắc chắn thắng
được đối phương hay không. Nhiều khi ta không tìm được lời giải nhưng cũng
không khẳng định được là không có lời giải. Như vậy nội dung của bài toán tồn
tại khác hẳn với các bài toán đếm và liệt kê. Vấn đề đặt ra ở đây là: có hay không
một cấu hình tổ hợp thỏa mãn một số tính chất cho trước? Điều này kéo theo sự
khác nhau cả về phương pháp tư duy và thuật toán. Bài toán tồn tại xem như
được giải quyết nếu ta tìm được một cấu hình hoặc chứng minh được sự tồn tại
của cấu hình. Nhiều khi ta không tìm được một cách cụ thể cấu hình đó; mà chỉ
nêu ra được một cách xây dựng cấu hình, hoặc là chứng minh được rằng cấu hình
cần tìm là không có thì bài toán cũng coi như được giải quyết. Để thấy rõ nội
dung đa dạng và tính chất phức tạp của bài toán tồn tại, dưới đây ta hãy xét một
số bài toán cổ điển nổi tiếng.

4.4.1. Bài toán đội hình duyệt binh của 36 sĩ quan.


Có 6 đơn vị quân đội A, B, C, D, E, F; mỗi đơn vị cử 6 sĩ quan với 6 cấp bậc
khác nhau: a, b, c, d, e, f. Hỏi rằng có thể xếp 36 sĩ quan thành một đội ngũ hình
vuông (6 hàng ngang, 6 hàng dọc) sao cho mỗi hàng ngang và mỗi hàng dọc đều
có người của tất cả các đơn vị và tất cả các cấp bậc sĩ quan.
Bài toán có thể mở rộng cho n đơn vị quân đội với n cấp bậc sĩ quan khác
nhau.
Với n  4 ta có một lời giải như sau:

Ab Ba Cc Dd

Bc Ad Db Ca

Cd Dc Aa Bb

Da Cb Bd Ac

6
Một lời giải cho trường hợp n  5 là:

Aa Bb Cc Dd Ee

Bc Ca Db Ec Ad

Cd De Ea Ab Bc

Dc Ed Ae Ba Cb

Eb Ac Bd Ce Da

Bài toán này do Euler đề xuất và ông mất khá nhiều thời gian cho bài toán
n  6 mà không đạt kết quả nên ông đưa ra một giả thuyết là bài toán này không
có lời giải, ngoài ra bài toán n  2 cũng không có lời giải nên Euler nêu lên một
giả thuyết tổng quát là bài toán với n  4k  2 thì không có lời giải. Giả thuyết
này của Euler tồn tại suốt gần hai thế kỷ.
Mãi đến năm 1901, Tarri - một nhà toán học Pháp - đã chứng minh được rằng
với n  6 bài toán không có lời giải bằng cách duyệt tất cả các khả năng xếp, và
đến năm 1960, ba nhà toán học Mỹ là Boce, Parker và Srikanda mới tìm được
phương pháp xây dựng hình vuông la tinh trực giao cho các trường hợp:
n  4k  1 với k  1, 2, 3, ... ; còn các trường hợp khác vẫn còn là những thách
thức hóc búa với trí tuệ loài người.

4.4.2. Bài toán tô màu bản đồ.


Các nhà nghiên cứu về bản đồ tô màu bản đồ địa lý theo quy tắc sau: Hai
nước có chung đường biên giới phải được tô bởi 2 màu khác nhau. Hãy chứng
minh rằng mọi bản đồ địa lý có thể tô bằng 4 màu.
Người ta đã chứng minh được rằng mọi bản đồ đều có thể tô với số màu lớn
hơn 4, và với số màu ít hơn 4 thì không thể tô được. Tuy nhiên mọi bản đồ thực
tế chỉ cần 4 màu là đủ; không ai tìm được một bản đồ mà bắt buộc phải tô bằng 5
màu.
Bài toán này do một thương nhân người Anh là Gazri đề ra từ những năm
1850; người ta cố gắng chứng minh rằng chỉ cần 4 màu là đủ. Sau hơn một thế
kỷ, mãi đến năm 1976 hai nhà toán học Mỹ là K.Appel và W.Haken mới chứng
minh được giả thuyết này bằng máy tính điện tử.
Tuy nhiên người ta vẫn nghi ngờ tính đúng đắn của cách chứng minh có sự
trợ giúp của máy tính điện tử này.
Vì vậy vào cuối những năm 1990 hai tác giả trên đã công bố cách chứng minh
của mình bằng một cuốn sách dày 800 trang.

7
4.4.3. Bài toán hình lục giác huyền bí.
Bài toán này do Cliford Adams đề ra năm 1910, nội dung như sau:
Hãy điền các số từ 1 đến 19 vào 19 ô hình lục giác (như hình vẽ) sao cho tổng
các số theo 3 chiều của các cạnh hình lục giác đều bằng nhau.
Hơn nửa thế kỷ sau, năm 1962, Adams đã công bố lời giải như hình vẽ dưới
đây. Điều bất ngờ đây lại là lời giải duy nhất nếu bỏ qua những lời giải được suy
ra từ một phép biến hình đơn giản, chẳng hạn quay hình lục giác một góc 600.

15
14 13
9 8 10
6 4
11 5 12
1 2
18 7 16
17 19
3

Hình 4.1

4.5. MỘT SỐ PHƯƠNG PHÁP GIẢI BÀI TOÁN TỒN TẠI

4.5.1. Phương pháp phản chứng.


Giả sử ta phải giải bài toán: Nếu có A thì có B (nghĩa là A  B ). Ở đây A là
giả thiết, B là kết luận.
Lập luận của phương pháp phản chứng là: Giả thiết rằng B là sai (không có
B); bằng các quy tắc suy diễn logic, ta sẽ đi đến một kết luận mâu thuẫn với giả
thiết A đã cho (tức là không có A), (nghĩa là B  A ), tương ứng với mệnh đề
phản đảo của mệnh đề cần chứng minh.
Thí dụ.
Một đội bóng đá gồm 20 cầu thủ đeo số áo từ 1 đến 20, đứng ngẫu nhiên
thành một vòng tròn. Chứng minh rằng luôn tìm được ít nhất một nhóm gồm 4
cầu thủ đứng liền nhau mà tổng các số ghi trên áo của họ  43 .
Giải. Chứng minh bằng phản chứng.
Giả sử điều này không xảy ra, nghĩa là tổng các số ghi trên áo các cầu thủ của
tất cả các nhóm gồm 4 cầu thủ đứng liền nhau đều  42 .
Có tất cả 20 nhóm như thế, cho nên nếu ký hiệu S là tổng các số ghi trên áo
của tất cả các nhóm thì ta có:
S  20.42  840

8
Vì các cầu thủ xếp vòng tròn, mỗi nhóm gồm 4 cầu thủ đứng liền nhau nên
mỗi cầu thủ được xếp vào 4 nhóm khác nhau, do đó khi tính tổng các số ghi trên
áo của tất cả các nhóm thì số áo của mỗi cầu thủ được tính 4 lần. Vậy
20.21
S  4.(1  2  ...  20)  4.  840
2
Từ kết quả trên suy ra tổng các số ghi trên áo của mỗi nhóm đều phải bằng
42. Điều này không thể xảy ra vì 2 nhóm kề nhau thì khác nhau 1 cầu thủ nên
không thể có tổng các số ghi trên áo của họ bằng nhau được.
Mệnh đề đã được chứng minh.
Có một số bài toán tồn tại mà lời giải của nó có thể khái quát hóa cho một lớp
khá rộng các bài toán, nên người ta trình bày các bài toán đó dưới dạng một định
lý gọi là định lý tồn tại.

4.5.2. Bài toán nhốt chim bồ câu và định lý Dirichlet.


a) Định lý Dirichlet giản đơn.
Nếu nhốt (n  1) con chim vào n chiếc lồng (n là số nguyên dương) thì có ít
nhất 1 lồng chứa ít nhất 2 con chim.
Thí dụ 1.
Trong số 13 sinh viên chọn bất kỳ, có ít nhất 2 sinh viên sinh cùng một tháng.
Thí dụ 2.
Cho S  {1, 2, 3, 4, 5, 6, 7, 8} . Chọn ra 5 số bất kỳ. Chứng minh rằng có ít
nhất 2 số có tổng bằng 9.
Thật vậy, ta chia 8 số đã cho làm 4 nhóm và coi mỗi nhóm như 1 lồng chim:
S1  {1, 8}; S2  {2, 7}; S3  {3, 6}; S4  {4, 5}
Mỗi số ta chọn ra coi như 1 con chim; mỗi số thuộc vào một nhóm nào đó.
Vậy nhốt 5 con chim vào 4 chiếc lồng, theo định lý Dirichlet sẽ luôn có ít nhất 1
nhóm chứa 2 số; 2 số này có tổng bằng 9. Bài toán đã được giải quyết.

b) Định lý Dirichlet tổng quát.


Nhốt n con chim vào k chiếc lồng (n, k là số nguyên dương) thì sẽ có ít nhất 1
n n
lồng chứa ít nhất   con chim; trong đó   là số nguyên nhỏ nhất trong các
k k
n
số nguyên lớn hơn hoặc bằng .
k
Thí dụ 1.
Trong lớp có 50 sinh viên; chứng minh rằng có ít nhất 5 sinh viên có cùng
tháng sinh.
Coi 12 tháng như 12 lồng chim; 50 sinh viên như 50 con chim. Định lý
 50 
Dirichlet tổng quát cho ta đáp số    5 sinh viên có cùng tháng sinh.
 12 

9
Bà i 5 . CÁC BÀI TOÁN TỔ HỢP TỐI ƯU

5.1. PHÁT BIỂU BÀI TOÁN

Cho A là một tập hữu hạn, B là tập các cấu hình tổ hợp được tạo ra từ các
phần tử của A, F(x) là một hàm xác định trên B. Giả sử B   và tất nhiên B
cũng là một tập hữu hạn. Bài toán đặt ra là: Tìm x*  B sao cho:
F(x* )  F(x)  x  B hoặc F(x* )  F(x)  x  B
Trong bài toán này: F(x) gọi là hàm mục tiêu, B gọi là tập xác định của bài
toán, mỗi x  B gọi là một phương án; x * nếu có, gọi là phương án tối ưu;
F(x* ) gọi là giá trị tối ưu. Dưới đây ta hãy xét một vài bài toán tiêu biểu cho lớp
các bài toán này.

5.1.1. Bài toán người du lịch.


Có n thành phố A1, A2 , ..., A n ; một người du lịch xuất phát từ một thành phố
nào đó muốn đi qua tất cả các thành phố còn lại, mỗi thành phố đúng 1 lần rồi trở
về nơi xuất phát. Biết cij là chi phí đi từ A i đến A j ; không nhất thiết cij  c ji .
Hãy tìm hành trình thỏa mãn các điều kiện trên với tổng chi phí ít nhất.
Gọi mỗi hành trình thỏa mãn các điều kiện trên là x và B là tập tất cả các hành
trình có thể có, mỗi hành trình là một hoán vị của n thành phố, do đó | B |  n! .
Với mỗi hành trình x, tương ứng với một chi phí là F(x). Vậy bài toán đặt ra là:
Tìm x*  B sao cho: F(x* )  F(x)  x  B .
Đôi khi cũng viết
F(x)  min
xB

5.1.2. Bài toán cái túi.


Một nhà thám hiểm tìm kiếm được n mẫu quặng; mẫu quặng thứ i cân nặng
a i (kg) và có giá trị là ci (đ). Anh ta có một cái túi chỉ đựng được b (kg). Hỏi
rằng khi từ rừng sâu trở về, nhà thám hiểm cần đem theo những mẫu quặng nào
để có tổng giá trị là lớn nhất?
Ký hiệu x i là biến nhị phân: x i  {0, 1} , còn gọi là biến lựa chọn.
x i  1 có nghĩa là nhà thám hiểm sẽ chọn đem về mẫu quặng thứ i và x i  0
trong trường hợp ngược lại. Khi đó mô hình toán học của bài toán này là:
n
F(x)   ci x i  max
i 1

1

n 

B   a i x i  b; x i  {0, 1}, i = 1, n 

 i 1 

Ở đây mỗi x(x1, x 2 , ..., x n )  B là một phương án, tương ứng với dãy nhị
phân có độ dài n; do đó | B |  2n . Bài toán trên cũng có thể viết:
F(x)   c, x   max
xB
Đặc điểm của bài toán tổ hợp tối ưu là miền xác định của bài toán là một tập
rời rạc, nên thuật toán giải các bài toán tổ hợp tối ưu hoàn toàn khác với thuật
toán tìm cực trị của một hàm n biến trên một tập compact mà chúng ta đã biết
trong giải tích các hàm nhiều biến.
Dưới đây ta cũng xét một vài thuật toán tiêu biểu.
5.2. THUẬT TOÁN DUYỆT TOÀN BỘ

Giả sử phải giải bài toán: F(x)  min, max; x  B trong đó B là tập rời
rạc. Để giải bài toán này trước tiên ta liệt kê các phần tử của B; sau đó với mỗi
x  B ta tính F(x); và so sánh các giá trị của F(x) để tìm ra phương án tối ưu.
Thuật toán đó gọi là thuật toán duyệt toàn bộ hay thuật toán điểm diện.
Nếu số phần tử của B là nhỏ thì thì thuật toán này rất có hiệu quả và dễ hiểu.
Nếu |B| là khá lớn thì thuật toán này rất khó thực hiện, ngay cả việc thực hiện
trên các máy tính hiện đại nhất. Chẳng hạn như trong bài toán người du lịch với
n  15 thì ta có | B|  15!  1307674368000 phương án.
Nếu mỗi giây máy tính duyệt được 1 triệu phương án thì máy tính phải làm
việc trong thời gian liên tục là 1 307 674 giây, tương ứng với 3 700 giờ làm việc
liên tục hay 154 ngày liên tục. Đó là một điều không khả thi.
Tuy nhiên cũng cần nhấn mạnh rằng có không ít bài toán tổ hợp tối ưu, chúng
ta chưa có một thuật toán hữu hiệu nào ngoài thuật toán duyệt toàn bộ, khi đó
trong quá trình liệt kê, chúng ta cần tận dụng những thông tin thu được ở mỗi
bước để loại bỏ những phương án mà chắc chắn không phải là tối ưu. Một trong
các giải pháp như thế được giới thiệu dưới đây với tên gọi “thuật toán nhánh
cận”.
5.3. THUẬT TOÁN NHÁNH CẬN

Giả sử phải giải bài toán:


F(x)  min
xB
trong đó B là tập rời rạc.
Lược đồ tổng quát của thuật toán nhánh cận có thể mô tả như sau:
Bước 0:
Tìm cận dưới của F(x) trên B. Đó là một số, ký hiệu là:
2
(B)  F(x); x  B
Thông thường để tìm (B) người ta tìm một hàm non của F(x); đó là hàm
G(x)  F(x); x  B và đối với hàm non này ta dễ dàng tìm được cực tiểu của
nó:
(B)  min G(x)
xB

Do đó ta cũng có
(B)  F(x); x  B
Nếu tìm được x*  B mà f (x* )  (B) thì x * là phương án tối ưu. Nếu
không ta chuyển sang bước 1.
Bước 1:
Chia B thành một phân hoạch B1, B2 , ..., Br . Để dễ trình bày và không kém
phần tổng quát ta có thể lấy r  2 ; nghĩa là chia B thành 2 tập B11 và B12 mà:
B  B11  B12 và B11  B12  
Sau đó ta tìm các cận dưới (B11 ) và (B12 ) , sự phân nhánh này tạo thành
một cây và các cận dưới tăng dần (B1i )  (B), (i  1, 2)
Giả sử (B11 )  (B12 ) và tìm được x*  B11 mà f (x* )  (B11 ) thì x * là
phương án tối ưu; nếu không thì chuyển sang bước sau.
Bước k:
Giả sử ở bước (k  1) ta có một phân hoạch Bik 1 trong đó
i  {1, 2, ..., rk 1} và giả thiết rằng:
(Bkt 1 )  min (Bik 1 )
i

Ở bước k ta chia Bkt 1 thành một phân hoạch B1k và Bk2 ; và giả sử ta đánh số
lại các đỉnh treo cũ và các đỉnh treo mới từ 1 đến rk và giả sử rằng:
(Bsk )  min (Bik ); i  {1, 2, ..., rk }
i

Nếu tìm được x  B mà f (x* )  (Bsk ) thì x * là phương án tối ưu; nếu
* k
s

không thì chuyển sang bước (k  1) .

1
(B11 )  (B12 )
B
1 B12

B12 B22

3
Hình 5.1

Vì số phần tử của B là hữu hạn nên khả năng xấu nhất là sự phân nhánh phải
thực hiện cho đến khi mỗi đỉnh treo chỉ chứa một phần tử, như vậy thuật toán
cũng sẽ kết thúc sau một số hữu hạn bước.
Quá trình của thuật toán là thực hiện xen kẽ sự phân nhánh và tìm cận nên
thuật toán được gọi tên là thuật toán nhánh cận (Branches anh Bounds).
Hiệu quả của thuật toán phụ thuộc chủ yếu vào việc chọn hàm non G(x) có sát
với F(x) hay không và việc tìm cực tiểu của nó có dễ dàng không, cũng như sự
phân nhánh có cho phép ta nhanh chóng tìm ra phương án tối ưu không.
Nếu việc tìm cực tiểu của G(x) trên các tập con, tức là tìm cận dưới của F(x)
trên tập con đó lại rất khó khăn phức tạp thì thuật toán trở nên vô nghĩa. Ngược
lại nếu vì mục đích tìm cận dưới một cách dễ dàng, ta chọn hàm non G(x) quá xa
với F(x) tức là | F(x)  G(x) | khá lớn thì rất dễ dẫn đến tình huống phải phân
nhánh cho đến khi mỗi đỉnh treo chỉ chứa một phần tử, khi đó thuật toán này
cũng không hơn gì thuật toán duyệt toàn bộ vì ta phải xem xét đến từng phương
án của tập B. Chính vì vậy mà sự phân nhánh và tìm cận phải căn cứ vào đặc thù
về cấu trúc của bài toán mà lựa chọn cho thích hợp, không có giải pháp vạn năng
cho mọi bài toán.
5.4. THUẬT TOÁN QUY HOẠCH ĐỘNG RỜI RẠC

5.4.1. Phương trình truy toán của quy hoạch động.


Thuật toán quy hoạch động đặc biệt có hiệu quả trong những trường hợp mà
hàm mục tiêu là hàm tách biến và có một ràng buộc bậc nhất.
Giả sử phải giải bài toán:
N
F(x)   gi (x i )  max (hoặc min) (1)
i 1
N
0   a i x i  b; x i  0, (i  1, N)
i 1

Ở đây F(x) là một hàm N biến nhưng biểu diễn được thành tổng của N hàm
một biến, điều này cho phép chúng ta biến bài toán tĩnh đã cho thành một bài
toán động:
n
Fn (x)   g i (x i )  max (hoặc min) (2)
i 1
n

a x
i 1
i i  b; x i  0, (i  1, N)

Tức là ta không giải bài toán với một trị số N cố định, mà giải bài toán với
những giá trị của n thay đổi: n  1, 2, ..., N .

4
Khi đó với n  1 ta có:
F1 (x)  g1 (x1 )  max
0  a1x1  b
Với n  2 ta có:
F2 (x)  g1 (x1 )  g 2 (x 2 )  max
0  a1x1  a 2 x 2  b
Khi n  N thì bài toán (2) trở thành bài toán (1) đã cho.
Ta ký hiệu
n
Fn (b)  max  g i (x i ) (3)
i 1
n
0   aixi  b
i 1

Khi đó nguyên lý của quy hoạch động dựa trên phương trình truy toán dưới
đây:
Fn (b)  max{g n (x n )  Fn 1(b  a n x n )} (4)
0  a n x n  b, (n  1, 2, 3, ...)
Theo công thức này muốn tìm Fn (b) thì phải tìm Fn 1 (b) , nghĩa là ta phải bắt
đầu từ việc tìm F1 (b) .
Ý nghĩa của nguyên lý này là biến một quá trình tối ưu hóa thành một quá
trình nhiều giai đoạn và sự tìm kiếm tối ưu toàn cục phải dựa vào sự tìm kiếm tối
ưu từng giai đoạn; còn về mặt toán học nó cho phép ta thay thế một bài toán tìm
cực trị của một hàm n biến thành n bài toán tìm cực trị của hàm một biến và
đương nhiên việc tìm cực trị của hàm một biến bao giờ cũng dễ hơn.

5.4.2. Áp dụng thuật toán quy hoạch động giải bài toán cái túi.
Mô hình toán học của bài toán cái túi có dạng:
F(x)  c1x1  c2 x 2  ...  c N x N  max
0  a1x1  a 2 x 2  ...  a N x N  b
x i  {0, 1}, (i = 1, N)
Phương trình truy toán của bài toán này có dạng:
Fn (b)  max{cn x n  Fn 1 (b  a n x n )}
0  anxn  b
x n  {0, 1}
Thí dụ.
Giải bài toán sau:
F(x)  14x1  8x 2  28x3  42x 4  45x5  20x 6  30x 7  15x8  max

5
2x1  x 2  4x 3  7x 4  8x 5  6x 6  5x 7  3x 8  20
x i  {0, 1}, i = 1, 8
Giải.
Căn cứ vào phương trình truy toán, ta lập được bảng số sau đây:

n 1 2 3 4 5 6 7 8
cn 14 8 28 42 45 20 30 15
an 2 1 4 7 8 6 5 3
b F1 (b) F2 (b) F3 (b) F4 (b) F5 (b) F6 (b) F7 (b) F8 (b)
0 0 0 0 0 0 0 0 0
1 0 8 8 8 8 8 8 8
2 14 14 14 14 14 14 14 14

3 14 22 22 22 22 22 22 22
4 14 22 28 28 28 28 28 28
5 14 22 36 36 36 36 36 36
6 14 22 42 42 42 42 42 42
7 14 22 50 50 50 50 50 50

8 14 22 50 50 50 50 52 52
9 14 22 50 56 56 56 58 58
10 14 22 50 64 64 64 66 66
11 14 22 50 70 70 70 72 72
12 14 22 50 78 78 78 80 80

13 14 22 50 84 84 84 84 84
14 14 22 50 92 92 92 92 92
15 14 22 50 92 95 95 95 95
16 14 22 50 92 95 95 95 95
17 14 22 50 92 101 101 101 101

18 14 22 50 92 109 109 109 109


19 14 22 50 92 115 115 115 115
20 14 22 50 92 123 123 125 125

6
Bảng 5.13
Từ bảng số này ta suy ra: maxF(x)  F8 (20)  125 , đó là giá trị tối ưu.
Bây giờ ta còn phải tìm phương án tối ưu bằng cách xuất phát từ giá trị tối ưu
đã tìm được và sử dụng phương trình truy toán.
Ta thấy F8 (20)  F7 (20) . Vậy x 8  0 .
Vì F7 (20)  F6 (20) nên x 7  1.
Vì c7  30 và a 7  5 nên suy ra F6 (20  5)  F6 (15)  125  30  95
Vì F6 (15)  F5 (15) nên x 6  0
Vì F5 (15)  F4 (15) nên x 5  1 .
Từ c5  45 và a 5  8 ta có F4 (15  8)  F4 (7)  95  45  50
Vì F4 (7)  F3 (7) nên x 4  0
Vì F3 (7)  F2 (7) nên x 3  1 .
Từ c3  28 và a 3  4 ta có F2 (7  4)  F2 (3)  50  28  22
Tiếp tục như trên sẽ suy ra x 2  1 và cuối cùng x1  1 .
Vậy phương án tối ưu là:
x1*  x*2  x*3  x*5  x*7  1; x*4  x*6  x*8  0
Giá trị tối ưu là:
F(x* )  c1  c2  c3  c5  c7  14  8  28  45  30  125  F8 (20)
Và cũng dễ dàng kiểm tra lại:
a1  a 2  a 3  a 5  a 7  2  1  4  8  5  20 .

7
Bà i 6 . ĐỒ THỊ HỮU HẠN VÀ ỨNG DỤNG

6.1. ĐỒ THỊ CÓ HƯỚNG

6.1.1. Định nghĩa


Cho X là một tập hợp rời rạc X  x1, x 2 ,..., x n  gọi là tập các đỉnh, U là
tập các cặp có thứ tự gồm 2 phần tử của X, mỗi cặp phần tử đó gọi là một cung.
Khi đó G  (X, U) gọi là đồ thị có hướng. X và U đều là các tập rời rạc nên G
gọi là đồ thị hữu hạn.
Để biểu diễn hình học một đồ thị, mỗi đỉnh được biểu diễn bằng một điểm;
mỗi cung u  (x i , y j ) được biểu diễn bởi một mũi tên, nối x i với x j .
Thí dụ.

x8 x2 x1

x5 x4 x9
 x7

x3 x6 x10

Hình 6.1

Đồ thị ở hình 6.1 có 10 đỉnh và 13 cung, cung (x1, x 2 ) có x1 là đỉnh gốc, x 2


là đỉnh ngọn. Cung (x 2 , x 2 ) gọi là một khuyên. Đỉnh x 4 không có cung đến
cũng không có cung đi, gọi là đỉnh cô lập.
Nếu ta ký hiệu x là tập các đỉnh có cung đến từ x thì  chính là phép biến
đổi  : X  X .
Khi đó một đồ thị có hướng G  (X, U) cũng có thể định nghĩa như là:
G  (X, ) trong đó X là tập đỉnh và  là phép biến đổi X vào X. Hai định
nghĩa này hoàn toàn tương đương.
Nếu x  x x  X , tức là đồ thị không có khuyên, ta gọi đó là đồ thị đơn.
Sau này ta chỉ nghiên cứu các đồ thị đơn, nên để cho ngắn gọn, ta bỏ qua tính từ
“đơn” này, nghĩa là khi ta nói: cho đồ thị có hướng G  (X, U) thì ta hiểu ngầm
là đồ thị đơn.
1
6.1.2. Đường đi và mạch
Hai đỉnh có cung nối gọi là 2 đỉnh kề, trong đó 1 đỉnh là gốc còn đỉnh kia là
ngọn.
Hai cung gọi là kề nhau nếu ngọn của cung này là gốc của cung kia.
Trên hình 6.1: Hai cung (x1, x 2 ) và (x 2 , x 7 ) là 2 cung kề nhau.
Dãy các cung liên tiếp kề nhau xuất phát từ x, kết thúc tại y gọi là một đường
đi từ x đến y. Đường đi đó là sơ cấp nếu mỗi đỉnh chỉ qua một lần.
Thí dụ.
Các cung (x1, x 2 ) (x 2 , x 7 ) (x 7 , x 6 ) (x 6 , x10 ) là đường đi từ x1 đến x10 ; đó
là một đường đi sơ cấp.
Nếu đường đi là khép kín, nghĩa là x  y ta gọi đó là một mạch. Đường sơ
cấp khép kín gọi là mạch sơ cấp.
Thí dụ.
(x1, x 2 ) (x 2 , x 7 ) (x 7 , x1 ) là một mạch sơ cấp
(x1, x 2 ) (x 2 , x 7 ) (x 7 , x 6 ) (x 6 , x 9 ) (x 9 , x 7 ) (x 7 , x1 ) là một mạch, nhưng
không phải là mạch sơ cấp vì đi qua đỉnh x 7 hai lần.
Mạch đi qua tất cả các cung mỗi cung một lần là mạch Euler, mạch đi qua tất
cả các đỉnh, mỗi đỉnh một lần là mạch Hamilton.

xy

xy

Hình 6.2 Hình 6.3


Hình 6.2 là thí dụ về một mạch Euler, cũng là mạch Hamilton, còn hình 6.3 là
mạch Euler mà không phải là mạch Hamilton.

6.1.3. Đồ thị liên thông


a) G  (X, U) gọi là liên thông mạnh nếu với mọi cặp đỉnh (x, y) đều có
đường đi từ x đến y; liên thông mạnh còn gọi là liên thông 2 chiều.
b) G  (X, U) gọi là liên thông yếu nếu với mọi cặp đỉnh (x, y) mà không
có đường đi từ x đến y thì có đường đi từ y đến x; liên thông yếu còn gọi là liên
thông một chiều.

2
x1 x2 x5 x4 x3

x3

x5

x4 x1 x2
Hình 6.4 Hình 6.5

Hình 6.4 là thí dụ về liên thông mạnh. Từ một đỉnh bất kỳ đều có đường đi
đến mọi đỉnh khác. Hình 6.5 là đồ thị liên thông yếu.
Nếu ta có G1  (X1, U1 ) và G 2  (X2 , U2 ) là hai đồ thị liên thông và
X1  X2   và U1  U2  
thì đồ thị G(X, U) trong đó X  X1  X2 và U  U1  U2 là đồ thị không
liên thông nhưng có 2 thành phần liên thông.

6.1.4. Đồ thị con và đồ thị bộ phận


a) Đồ thị con.
Cho 2 đồ thị G(X, ) và G(X1, 1 ) . Ta nói rằng G1 là đồ thị con của đồ thị
G nếu:
X1  X và 1x  x  X1
Như vậy nếu bớt đi một số đỉnh và các cung liên hệ với đỉnh đó ta được một
đồ thị con của G.
Nếu bớt đi một đỉnh x 3 thì từ đồ thị của hình 6.4, ta có đồ thị con sau
đây:
x1 x2

x5

x4
Hình 6.6

b) Đồ thị bộ phận.
Nếu X  X1 và U1  U thì G1 (X1, U1 ) là đồ thị bộ phận của
G  (X, U) , tức là nếu ta bớt đi một số cung mà giữ nguyên số đỉnh thì ta có
được một đồ thị bộ phận.
3
6.1.5. Biểu diễn đồ thị bằng ma trận
a) Ma trận kề
Cho đồ thị G  (X, U) trong đó X  n . Ma trận A  (a ij )n  n là ma trận
kề của đồ thị G được xác định như sau:

1 khi (x i , x j )  U
a ij  

0 khi (x i , x j )  U
Thí dụ.
x1 x2

x6

x3

x5 x4
Hình 6.7
Đồ thị cho ở hình 6.7, có ma trận kề như sau:
x1 x2 x3 x4 x5 x6
x1 0 1 1 0 0 0
x2 0 0 0 0 1 0
x3 0 0 0 0 0 0
x4 0 0 1 0 0 0
x5 1 0 0 1 0 0
x6 1 0 0 0 1 0

Ma trận kề xác định hoàn toàn cấu trúc của đồ thị. Số các số 1 trên đồ thị là số
cung của đồ thị. Số các số 1 trên hàng x i là số cung đi từ x i . Số các số 1 trên cột
x j là số các cung đến x j . Nếu tất cả các số trên dòng x i đều bằng 0 thì x i là
đỉnh ra của đồ thị (thí dụ x 3 ). Nếu tất cả các số trên cột x j đều bằng 0 thì x j là
đỉnh vào của đồ thị (thí dụ x 6 ).

b) Ma trận trọng số.


Nếu với mỗi cung (x i , x j ) , ta gán cho nó 1 số (x i , x j ) , số này có thể là độ dài
của cung (x i , x j ) hoặc chi phí cho hành trình đi từ x i đến x j .
Khi đó ma trận trọng số của đồ thị được xác định như sau:
4
 (x i , x j ) khi (x i , x j )  U

bij   khi (x i , x j )  U

0 j  i; (i  1, n)

Thí dụ.
x1 5 x2

8
7
x6
3
2
x3
4
4
6
x5 x4

Hình 6.8

Ma trận trọng số của đồ thị trên hình 6.8 có dạng như sau:

x1 x2 x3 x4 x5 x6

x1 0 5 7   
x2  0   2 
x3   0   
x4   4 0  
x5 3   6 0 
x6 8    4 0

Việc biểu diễn đồ thị bằng ma trận tạo điều kiện cho việc giải các bài toán tìm
kiếm hoặc tối ưu trên đồ thị bằng máy tính điện tử.
6.2. ĐỒ THỊ VÔ HƯỚNG

6.2.1. Các định nghĩa


Tương tự như đồ thị có hướng; ta định nghĩa G  (X, V) là một đồ thị vô
hướng trong đó X là tập các đỉnh và V là tập các cạnh. Mỗi v  V là một đoạn
thằng nối 2 đỉnh, không phân biệt đỉnh đầu và đỉnh cuối. Trên thực tế có rất nhiều

5
thí dụ về đồ thị vô hướng. Chẳng hạn khi xem bản đồ giao thông thì mỗi nút giao
thông: giao điểm của 2 hoặc nhiều đường coi như 1 đỉnh; đường giao thông nối
liền 2 nút coi như một cạnh, không phân biệt nút đầu và nút cuối, mỗi cạnh cũng
có thể coi như 2 cung ngược chiều nhau. Do đó khi chuyển từ đồ thị có hướng
sang đồ thị vô hướng, có những khái niệm vẫn giữ nguyên (chẳng hạn đỉnh của
đồ thị); có những khái niệm phải đối tên cho phù hợp, để tránh lầm lẫn.
a) Một số khái niệm được đổi tên.
- Cung đổi thành cạnh
- Đường đi từ x đến y đổi thành xích nối x và y
- Mạch là đường đi khép kín đổi thành: chu trình là xích nối khép kín
Từ đó cũng suy ra:
- Xích sơ cấp là xích đi qua mỗi đỉnh một lần.
- Chu trình sơ cấp là một xích sơ cấp khép kín.
- Chu trình Euler là một chu trình đi qua tất cả các cạnh, mỗi cạnh một
lần.
- Chu trình Hamilton là chu trình đi qua tất cả các đỉnh, mỗi đỉnh một
lần.
b) Một số khái niệm giữ nguyên tên gọi, nhưng nội dung cần được xác định lại
cho phù hợp với đồ thị vô hướng.
- Hai đỉnh kề nhau là 2 đỉnh có cạnh nối.
- Hai cạnh kề nhau là 2 cạnh có một đỉnh chung.
- Nếu bớt đi một số đỉnh và những cạnh liên quan đến các đỉnh đó thì ta
được một đồ thị con.
- Nếu giữ nguyên các đỉnh và bớt đi một số cạnh ta được một đồ thị bộ
phận.
- Đồ thị vô hướng gọi là liên thông nếu mọi cặp đỉnh (x, y) đều có 1 xích nối.
Trong đồ thị vô hướng không có khái niệm liên thông mạnh và liên thông yếu.
6.2.2. Đồ thị đủ
Đồ thị G(X, V) gọi là đồ thị đủ nếu mọi cặp đỉnh đều kề nhau; nghĩa là
(x, y)  V  x, y  X .
Nếu X  n thì số cạnh sẽ là:
n(n  1)
V  C2n 
2
Định nghĩa trên cũng được dùng cho đồ thị có hướng G  (X, U) , nhưng nội
dung cần được hiểu chính xác hơn; đó là với mọi cặp đỉnh (x, y) nếu cung
(x, y)  U thì (y, x)  U , nghĩa là mọi cặp đỉnh đều kề nhau.
Dễ dàng thấy rằng đồ thị đủ có các tính chất sau đây:
- Đồ thị đủ không có đỉnh cô lập.
- Đồ thị đủ là đồ thị liên thông.
- Mọi đồ thị con của đồ thị đủ cũng là đồ thị đủ.

6
6.3. ĐỒ THỊ EULER VÀ ĐỒ THỊ HAMILTON

6.3.1. Bậc của đỉnh.


Khái niệm về bậc của đỉnh, chỉ dùng cho đồ thị vô hướng, đó là số cạnh nối
một đỉnh với các đỉnh khác và kí hiệu là (x) .
Nếu (x)  0 thì x là đỉnh cô lập; (x)  1 thì x là đỉnh treo. Nếu
(x)  r x  X thì G(X, V) là đồ thị chính quy (còn gọi là đồ thị đều) bậc r.
Dễ dàng thấy rằng nếu G(X, V) là đồ thị đủ có n đỉnh thì đó là đồ thị chính
quy bậc (n  1) .

Hình 6.9 Hình 6.10


Đồ thị chính quy bậc 3 Đồ thị chính quy bậc 4

Khái niệm bậc của đỉnh có ý nghĩa quan trọng trong việc nghiên cứu đồ thị
Euler và đồ thị Hamilton và từ đó giúp ta nghiên cứu các bài toán quan trọng
trong lý thuyết đồ thị.

6.3.2. Đồ thị Euler và bài toán 7 chiếc cầu ở Konigsberg


a) Các định nghĩa.
Cho G(X, V) là đồ thị liên thông
- Một xích đi qua tất cả các cạnh của G, mỗi cạnh 1 lần gọi là xích Euler.
- Một xích Euler khép kín gọi là chu trình Euler.
- Đồ thị G(X, V) chứa một chu trình Euler gọi là đồ thị Euler.
- Đồ thị G(X, V) chứa 1 xích Euler gọi là đồ thị nửa Euler.
Thí dụ.
x1 x2 x1 x2 x1 x2

x4 x3 x4 x3 x4 x3
H1 H2 H3
Hình 6.11

7
Trên hình 6.11:
H1 là đồ thị Euler vì có chu trình Euler (x1, x 2 , x 3 , x 4 , x1) ;
H 2 là đồ thị nửa Euler vì có xích Euler (x1, x 2 , x 3 , x 4 , x1, x 3 ) .
Còn H 3 không có chu trình Euler, cũng không có đường đi Euler.
Một điều quan trọng là làm thế nào để nhận biết một đồ thị đã cho có phải là đồ
thị Euler hay không. Muốn vậy ta chứng minh định lý sau đây:

b) Định lý Euler.
Đồ thị liên thông G(X, V) là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều
có bậc chẵn.

c) Bài toán 7 chiếc cầu ở Koenigsberg


Thành phố Koenigsberg trước kia thuộc nước Phổ, bây giờ là thành phố
Kaliningrad thuộc Cộng hòa liên bang Nga, được chia thành 4 vùng A, B, C, D
ngăn cách bởi các nhánh sông Pregel; trong đó A, B là hai bên bờ sông. Vào thế
kỷ 18 người ta đã xây 7 chiếc cầu nối các miền như hình 6.13. Người dân thường
dạo chơi qua những chiếc cầu. Họ tự hỏi: liệu có thể xuất phát từ một nơi nào đó
(A, B, C hoặc D) đi qua tất cả 7 chiếc cầu, mỗi cầu 1 lần rồi quay về nơi xuất
phát được không?

C D

B
Hình 6.13

Trong nhiều năm, đây là bài toán khó. Người ta liệt kê rất nhiều hành trình
nhưng không tìm được lời giải. Tuy nhiên cũng không ai chứng minh được hành
trình thỏa mãn điều kiện trên là không có. Năm 1736 nhà toán học Thụy sĩ là
Euler đã công bố lời giải bài toán này, và đây cũng là ứng dụng đầu tiên của lý
thuyết đồ thị. Euler đã biểu diễn bản đồ trên hình 6.13 bởi một đồ thị phẳng dưới
đây, trong đó mỗi cạnh nối hai đỉnh tương ứng với 1 chiếc cầu.

8
A

C D

Hình 6.14

Hành trình đi qua tất cả 7 chiếc cầu, mỗi cầu 1 lần, tương ứng mỗi một chu
trình Euler của đồ thị (hình 6.14). Nhưng đồ thị này không phải là đồ thị Euler vì
có các đỉnh bậc lẻ (ở đây tất cả các đỉnh đều có bậc lẻ). Do đó hành trình thỏa
mãn các điều kiện đặt ra là không có. Bài toán đã được giải quyết.

6.3.3. Đồ thị Hamilton và bài toán người đưa thư

a) Định nghĩa.
Đồ thị G(X, V) gọi là đồ thị Hamilton nếu nó liên thông và chứa một chu
trình đi qua tất cả các đỉnh, mỗi đỉnh một lần. Đồ thị trên hình 6.14 là đồ thị
Hamilton, vì có chu trình ACBDA đi qua tất cả các đỉnh mỗi đỉnh một lần. Cho
đến nay việc tìm điều kiện cần và đủ cho đồ thị Hamilton vẫn còn là một vấn đề
mở, nhưng có một kết quả nghiên cứu đáng chú ý là nếu ta tăng thêm số cạnh nối
các đỉnh của G đến một mức nào đó thì sẽ thu được một đồ thị Hamilton. Đó là
một điều kiện đủ, thể hiện bằng một định lý dưới đây.

b) Định lý Dirac (1952)


Cho G(X, V) là một đồ thị đơn; liên thông và có n đỉnh.
n
Nếu   x   x  X thì G(X, V) là đồ thị Hamilton.
2
c) Bài toán người đưa thư
Một nhân viên bưu điện, xuất phát từ trạm bưu điện mà anh ta làm việc, cần
chuyển n bức thư đến n địa chỉ khác nhau, mỗi nơi chỉ đến 1 lần rồi trở về trạm
bưu điện, hãy tìm một hành trình ngắn nhất.
Mỗi hành trình như thế là một chu trình Hamilton. Theo định lý Dirac nếu bậc
n
của tất cả các đỉnh đều  thì bài toán có lời giải. Nhưng đây chỉ là điều kiện
2
n
đủ; nếu có một đỉnh nào đó có bậc  thì vẫn chưa thể khẳng định được rằng
2
đồ thị không phải là đồ thị Hamilton.
9
Khi giải bài toán người du lịch, vấn đề đặt ra hoàn toàn tương tự, nhưng
ta giả thiết là biết ma trận chi phí C  (cij )n  n nghĩa là ta đã thừa nhận đồ thị đã
cho là một đồ thị đủ, nghĩa là mọi cặp đỉnh đều kề nhau nên sự tồn tại chu trình
Hamilton là điều đương nhiên.
Còn với bài toán người đưa thư, bản đồ giao thông trên một địa bàn hẹp, với
những điều kiện địa hình cụ thể, không phải lúc nào cũng là một đồ thị Hamilton.
Do đó vẫn đề đặt ra trước tiên lại là có chu trình Hamilton hay không, nếu không
có thì bài toán trở nên vô nghĩa.

6.4. CÂY VÀ CÁC BÀI TOÁN VỀ CÂY

6.4.1. Định nghĩa


Cây là đồ thị vô hướng, liên thông và không có chu trình.
Các hình dưới đây đều là cây:

Hình 6.15

Độ dài của một cây là số cạnh của cây đó.


Một cây chứa tất cả các đỉnh của đồ thị gọi là cây bao trùm hoặc là cây khung
của đồ thị đó. Một đồ thị liên thông có thể chứa nhiều cây bao trùm khác nhau.
Các tính chất quan trọng của một cây được thể hiện bởi định lý dưới đây.

6.4.2. Định lý về các mệnh đề tương đương


Cho G  (X, V) là đồ thị vô hướng liên thông có n đỉnh và m cạnh. Khi đó 6
mệnh đề dưới đây là tương đương.
Mệnh đề 1: G là 1 cây nghĩa là G liên thông và không chứa chu trình (đây là định
nghĩa).
Mệnh đề 2: G không chứa chu trình và có m  (n  1) cạnh.
Mệnh đề 3: G liên thông và có m  (n  1) cạnh.
Mệnh đề 4: G không chứa chu trình và nếu thêm 1 cạnh nối 2 đỉnh không kề
nhau thì xuất hiện đúng 1 chu trình.
Mệnh đề 5: G liên thông và nếu bỏ đi 1 cạnh tùy ý thì sẽ được một đồ thị bộ phận
không liên thông (nghĩa là mất tính liên thông).
Mệnh đề 6: Mỗi cặp đỉnh của G được nối với nhau bởi một xích (hay dây
chuyền) duy nhất!

10
6.4.3. Bài toán liệt kê cây
Cho một đồ thị vô hướng đủ, có n cạnh:
n(n  1)
G  (X, V); X  n; V 
2
Vấn đề đặt ra là G(X, V) chứa bao nhiêu cây bao nhiêu trùm khác nhau. Nói
cách khác, nếu có n đỉnh thì có thể tạo ra bao nhiêu cây bao trùm khác nhau.
Trả lời câu hỏi này, ta có định lý sau đây:
a) Định lý Kelly (1889)
Với n đỉnh cho trước thì có đúng n n  2 cây bao trùm khác nhau.
Thí dụ. Với n  4 ta có T4  42  16 ; n  5 thì T5  53  125 .

11
Bà i 7 . CÁC BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ

7.1. BÀI TOÁN TÌM CÂY BAO TRÙM NGẮN NHẤT

Cho G  (X, V) là đồ thị vô hướng và liên thông; v  V ta gán cho nó 1 số


(v)  0 gọi là độ dài của cạnh v. Gọi T là một cây bao trùm nào đó và T là tập
mọi cây bao trùm của G. Ta định nghĩa độ dài của cây T là:
(T)  
vT
(v)

Bài toán đặt ra hãy tìm T*  T sao cho


(T* )  (T) T  T
Cây T* gọi là cây bao trùm ngắn nhất (hoặc còn gọi là cây khung ngắn nhất).
Có hai thuật toán giải bài toán này.

a) Thuật toán Kruskal


Bước 1: Sắp xếp các cạnh theo thứ tự độ dài không giảm. (Cạnh đầu tiên là
ngắn nhất).
Bước 2: Bắt đầu từ cạnh đầu tiên, ta thêm dần các cạnh tiếp theo với nguyên
tắc: cạnh thêm vào không tạo thành chu trình với các cạnh đã chọn. Thuật toán kết
thúc khi chọn được (n  1) cạnh.
Thí dụ. Tìm cây bao trùm ngắn nhất của đồ thị dưới đây:

x1 2 x2

10 4 3
12 8
x6 13 x3

9 6 5
6

x5 7 x4

Các cạnh được sắp xếp theo dãy không giảm của độ dài:
{2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13}
Đầu tiên ta chọn các cạnh có độ dài 2 và 3, cạnh có độ dài 4 bị loại vì nó tạo
thành chu trình với hai cạnh đã chọn, ta chọn tiếp cạnh có độ dài 5, trong 2 cạnh có
dộ dài 6 ta chỉ chọn 1. Vì nếu chọn cả 2 thì chúng sẽ tạo thành chu trình; cạnh độ

1
dài 7 và 8 cũng bị loại vì lý do đó; ta chọn tiếp cạnh 9 là đủ 5 cạnh (vì có 6 đỉnh) và
thuật toán kết thúc.
Có 2 cây bao trùm ngắn nhất như hình dưới đây:

x1 2 x2 x1 2 x2

3 3
x6 6 x3 x6 x3
6
9 9
5 5
x5 x4 x5 x4

T1* T2*

(T1* )  (T1* )  2  3  5  6  9  25

b) Thuật toán Prim


Khác với thuật toán Kruskal là kết nạp dần từng cạnh sao cho đủ (n  1) cạnh;
thuật toán Prim xuất phát từ 1 đỉnh bất kỳ và kết nạp dần từng đỉnh kề gần nhất sao
cho đủ n đỉnh.
Bước 1: Đặt X1  {x t1 } trong đó x t1  X là đỉnh bất kỳ
V1  {}
Trong đó X1 và V1 là tập đỉnh và tập cạnh của cây bao trùm ngắn nhất mà ta
chọn ở bước 1, nghĩa là ở bước này ta chọn 1 đỉnh và chưa chọn cạnh nào.
Bước 2: Tìm min { (x, x t1 )}  (x t 2 , x t1 )
x  H1
Trong đó H1 là tập các đỉnh kề với x t1 và (x, x t1 ) là độ dài của cạnh
(x, x t1 ) ; sau đó đặt:
X2  X1  {x t 2 }  {x t1 , x t 2 }
V2  {(x t1 , x t 2 )} .
Bước k: Ta tìm được Xk  {x t1 , x t 2 ,....., x t k } và Vk là tập (k  1) cạnh nối
các đỉnh thuộc X k , nói cách khác Vk chính là cây con của cây bao trùm ngắn nhất
chứa các đỉnh thuộc X k .
Nếu k  n thì thuật toán kết thúc và cây bao trùm ngắn nhất chính là
T*  {Xn , Vn } .
Nếu k  n thì chuyển sang bước (k  1) như sau:
Tìm min (x, y)  (x* , y* )
2
x  Hk
y  Xk
Trong đó H k là tập các đỉnh không thuộc X k và kề với ít nhất 1 đỉnh thuộc
X k ; sau đó đặt:
Xk 1  Xk  {x*}
Vk 1  Vk  {(x* , y* )}
Quá trình được lặp lại cho đến khi đạt được X n và Vn .
Thí dụ. Tìm cây bao trùm ngắn nhất trên đồ thị sau
x1 2 x2

10 4 3
12 8
x6 13 x3

9 6 5
6

x5 7 x4
Giả sử ở bước 1 ta chọn:
Bước 1: X1  {x 3}, V1  {}
Bước 2: X2  {x 3 , x 2}, V2  {(x 3 , x 2 )} .
Bước 3: X3  {x 3 , x 2 , x1}, V3  {(x 3 , x 2 ), (x 2 , x1)} .
Bước 4: X4  {x 3 , x 2 , x1, x 4}
V4  {(x3 , x 2 ), (x 2 , x1 ), (x 3 , x 4 )}
Bước 5: X5  {x3 , x 2 , x1, x 4 , x 5}
V5  {(x3 , x 2 ), (x 2 , x1), (x 3 , x 4 ), (x1, x 5 )}
Bước 6: X6  {x3 , x 2 , x1, x 4 , x 5 , x 6}
V6  {(x3 , x 2 ), (x 2 , x1), (x 3 , x 4 ), (x1, x 5 ), (x 5 , x 6 )}
Kết thúc.
Trong ví dụ trên, vì số đỉnh và số cạnh không lớn, nên ta có thể tìm thấy một
cách trực quan. Trong trường hợp số đỉnh và số cạnh khá lớn, để thực hiện thuật
toán Prim một cách hiệu quả hơn, nghĩa là nhanh chóng tìm được đỉnh và cạnh để
bổ sung và cây bao trùm, ta thực hiện sự gán nhãn cho các đỉnh của đồ thị. Giả sử ở
bước khởi tạo ta chọn một đỉnh bất kỳ nào đó, chẳng hạn là x m ; khi đó nhãn của
x m là [0, x m ] . Số 0 biểu thị khoảng cách từ x m đến x m . Giả sử ở bước k, ta đã có
X k và x i  Xk . Ta tìm min (x i , y)  (x i , yi )  i

y  Xk

3
Khi đó nhãn của x i là [ i , yi ] . Sau đó nếu r  min i thì đỉnh x r được tuyển
và cạnh (x r , y r ) được bổ sung vào cây khung.
Trước hết ta biểu diễn đồ thị ở hình 6.21 bằng ma trận trọng số dưới đây:
x1 x2 x3 x4 x5 x6

x1 0 2 4 8 6 10

x2 2 0 3   12

x3 4 3 0 5 6 13

x4 8  5 0 7 

x5 6  6 7 0 9

x6 10 12 13  9 0

Để phù hợp với thí dụ trên, ở bước khởi tạo ta chọn x 3 , khi đó tại các bước lặp,
nhãn của các đỉnh biểu thị bằng bảng dưới đây.
Ở bước 1; x 2 được chọn nên nhãn của nó là cố định trong các bước lặp tiếp
theo, ta ghi nhận điều đó bằng các dấu - ; còn x 2 được chọn, ta đánh dấu *.
Sau 6 bước thuật toán kết thúc, ta cũng có 2 lời giải tùy theo ở bước 4 ta chọn
cạnh (x1, x 5 ) hay (x 3 , x 5 ) .
Quá trình thực hiện thuật toán được ghi lại trong bảng dưới đây.

Bước Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh


XK VK
lặp x1 x2 x3 x4 x5 x6
Bước
1
khởi [4, x 3 ] [3, x 3 ]* [0, x 3 ] [5, x 3 ] [6, x 3 ] [13, x 3 ] x3 
tạo

Bước x3 , x 2
[2, x1 ]* - - [5, x 3 ] [6, x 3 ] [12, x 2 ] (x 3 , x 2 )
2

Bước - - - [5, x 3 ]* [6, x1 ] [10, x1 ] x 3 , x 2 , (x 3 , x 2 )


3 [6, x 3 ] x1 (x 2 , x1 )

Bước x 3 , x 2 , (x 3 , x 2 )
4 - - - - [6, x1 ]* [10, x1 ] x1 , x 4 (x 2 , x1 )

4
[6, x 3 ] (x 4 , x 3 )

(x 3 , x 2 )
x3, x 2 ,
Bước (x 2 , x1 )
- - - - -
x1 , x 4 ,
5 [9, x 5 ]* (x 4 , x 3 )
x5 (x 3 , x 5 )
(x 3 , x 2 )
x 3 , x 2 , (x 2 , x1 )
Bước - - - - - - x1 , x 4 , (x 4 , x 3 )
6
x 5 , x 6 (x 3 , x 5 )
(x 5 , x 6 )

7.2. BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT


a) Phát biểu bài toán
Cho đồ thị có hướng và liên thông G(X, U) , trong đó S  X mà 1S  
và Z  X mà  Z   . Nghĩa là không có cung đến S và cũng không có cung đi
từ Z. Đỉnh S gọi là đỉnh xuất phát; đỉnh Z là đích cần phải đến; u  U ta gán cho
nó một số (u)  0 gọi là độ dài của cung u. Ký hiệu T là đường đi từ S đến Z và
T và tập mọi đường đi từ S đến Z.
Với mỗi đường đi T T ta định nghĩa độ dài của T là:
(T)  
uT
(u)

Bài toán đặt ra là:


Tìm T*  T sao cho l(T* )  l(T) T  T
T* được gọi là đường đi ngắn nhất từ S đến Z.
Dưới đây là thuật toán giải bài toán này

b) Thuật toán Dijkstra cải biên.


Thuật toán Dijkstra dựa vào nguyên lý cơ bản sau đây:
Giả sử T* là đường đi ngắn nhất từ S đến Z; x k là đỉnh trung gian trên đường
này. Kí hiệu T* (S, x k ) là đường đi từ S đến x k trên con đường T* thế thì
T* (S, x k ) cũng là đường đi ngắn nhất trong những đường đi từ S đến x k . Dựa
trên nguyên lý này, thuật toán Dijkstra xuất phát từ S, tìm đường đi ngắn nhất đến
các đỉnh kề với nó, rồi từ đó lan tỏa dần đến Z.
Bước 1: L1  {S} gán cho S một số (S)  0 .
Bước 2: L2  {x  X : 1x  S} . Sau đó x  L2 ta gán cho nó một số
(x)  (s, x) ; đó là đường đi ngắn nhất từ S đến x.

5
Bước k: Tìm Lk  {x  X : 1x  L1  L2  ...  Lk 1} ; và x  Lk ta gán

cho nó một số: (x)  min{(y)  (y, x)} y  1x


Nếu Lk  {Z} thì thuật toán dừng và (Z) là độ dài của đường đi
ngắn nhất

Thí dụ. Tìm đường đi ngắn nhất từ S đến Z trên đồ thị dưới đây:
12
1 4
5 4 10
7 6
13 12 5
S 3 6 Z
5 4 7
8 14
2 5
6

Bước 1: L1  {S}; (S) = 0


Bước 2: L1  {1, 2}; (1)  5, (2)  8 .
Bước 3: L3  {3}; (3)  min{0  13, 5  7, 8  5}  12 .
Bước 4: L4  {4, 5}; (4)  min{5  12, 12  4}  16 .
(5)  min{8  6, 12  4}  14 .
Bước 5: L5  {6}; (6)  min{16  6, 12  12, 14  7}  21 .
Bước 6: L6  {Z}; (Z)  min{16  10, 21  5, 14  14}  26 .
Vậy độ dài của đường đi ngắn nhất từ S đến Z là (Z)  26 .

5 16
12
1 4
5 4 10
0 7 12 6 21 26
13 12 5
S 3 6 Z
5 4 7
8 14
2 5
6
8 14

Số ghi trong hình khuyên tại mỗi đỉnh là độ dài đường đi ngắn nhất từ S
đến đỉnh đó

6
Muốn tìm đường đi cụ thể thì ta bắt đầu từ Z và lan tỏa ngược lại để tìm các
đỉnh thuộc đường đi ngắn nhất kề với nó.
Giả sử x là đỉnh kề với Z. Nếu (x)  (x, Z)  (Z) thì x là đỉnh thuộc
đường đi ngắn nhất. Theo quy tắc này ta tìm được 2 đường đi ngắn nhất.
T1*  (S, 1, 3, 4, Z) và T2*  (S, 2, 5, 6, Z)
(T1* )  (T2* )  26 .

7.3. BÀI TOÁN TÌM LUỒNG VẬN TẢI CỰC ĐẠI

a) Phát biểu bài toán


Cho đồ thị có hướng G  (X, U) liên thông và  S  X mà 1S   và
 Z  X mà Z   . S gọi là đỉnh vào và Z gọi là đỉnh ra của mạng. u  U ta
gán cho nó một số t(u)  0 gọi là tải năng của cung u, đó là lượng hàng hóa tối đa
có thể vận chuyển qua cung u trong một đơn vị thời gian nào đó. Với mỗi x  X ta
kí hiệu U x và U x là tập các cung đến x và tập các cung đi từ x. Một đồ thị như
trên được gọi là một mạng vận tải.
Ta nói rằng hàm (u) xác định trên U, nhận các giá trị nguyên, được gọi là một
luồng của mạng vận tải nếu nó thỏa mãn các điều kiện sau đây:
1) (u)  0 , u  U
2) (u)  t(u) , u  U
3)  (u)   (u) , x  X \ {S, Z}
u  Ux u  Ux

Ý nghĩa của hàm (u) , đó là lượng hàng hóa tải qua cung u trong một đơn vị
thời gian, lấy giá trị nguyên, không âm, và không vượt quá tải năng t(u); tại mọi
đỉnh trung gian (không kể S và Z) tổng lượng hàng hóa đến một đỉnh nào đó bằng
lượng hàng hóa đi khỏi đỉnh ấy. Từ đó suy ra.
f ()   (u)   (u)
u  US u  UZ

f () gọi là cường độ của luồng, đúng bằng tổng lượng hàng hóa chuyển đến Z.
Luồng (u) như trên là tồn tại; chẳng hạn (u)  0, u . Ta gọi  là tập mọi
luồng (u) , rõ ràng   
Bài toán đặt ra là: Tìm *   sao cho
f (* )  f (),   
* gọi là luồng vận tải cực đại của mạng vận tải đã cho.
b) Thuật toán Ford – Fulkerson (cải biên)
Trước khi trình bày thuật toán, ta hãy làm quen một số thuật ngữ sau đây:
- Cung u gọi là cung bão hòa nếu (u)  t(u) .
7
- Đường đi từ S đến Z gọi là đường đầy nếu nó chứa ít nhất một cung
bão hòa.
- Luồng đạt giá trị cực đại, gọi tắt là luồng cực đại, nếu mọi đường đi từ
S đến Z đều là đầy.
Dựa vào những khái niệm như trên, thuật toán Ford – Fulkerson có thể mô tả
như sau:
Bước 1: Chọn một đường đi nào đó từ S đến Z, gọi là T1 và làm cho T1 trở
thành đầy. Ký hiệu f (T1 )  min t(u) .
u  T1

Ký hiệu U1* là tập các cung bão hòa của T1 .


Ta tìm đồ thị bộ phận G1 của G như sau:
G1  (X, U1 ) trong đó U1  U \ U1* (loại bỏ các cung bão hòa của T1 ) ngoài
ra tải năng t1 (u) của các cung u  G1 được xác định như sau:
 t(u)  f (T1 ),  u  T1
t1 (u)  
 t(u),  u  T1
Bước 2: Lặp lại bước 1 đối với đồ thị G1 (X, U1 ) .
Bước k: Lặp lại bước 1 với đồ thị bộ phận G k 1 (X, Uk 1 ) .
Nếu không tìm được đường Tk từ S đến Z, nghĩa là S và Z thuộc 2 thành phần
liên thông khác nhau của G k 1 (X, Uk 1 ) thì thuật toán kết thúc. Khi đó:
k 1
f ( ) 
*
 f (T )
i 1
i

Khi giải các bài toán cụ thể trên một mạng vận tải không phức tạp lắm, ta có thể
chọn đồng thời một số đường khác nhau từ S đến Z để xử lý cùng một lúc, điều này
giúp cho ta rút ngắn thời gian giải bài toán.
Thí dụ. Áp dụng thuật toán Ford – Fulkerson để tìm luồng cực đại trên mạng
vận tải dưới đây:
5
1 4
7
12 6 5 6
15 7 20
S 3 6 Z
3 10 7
9 10
2 5
6

Bước 1: Chọn đồng thời 3 đường:


T1  (S, 1, 4, Z) ; f (T1 )  5 cung bão hòa (1, 4) .
T2  (S, 3, 6, Z) ; f (T2 )  7 cung bão hòa (3, 6) .
8
T3  (S, 2, 5, Z) ; f (T3 )  6 cung bão hòa (2, 5) .
Đồ thị bộ phận G1 có dạng:
1 4
7 6 5 2
6
8 13
S 3 6 Z
3 10 7
3 4
2 5

Bước 2: Chọn 2 đường từ S đến Z như sau:


T4  (S, 1, 3, 4, 6, Z) ; f (T4 )  5 cung bão hòa (3, 4) .
T5  (S, 3, 5, 6, Z) ; f (T5 )  7 cung bão hòa (5, 6) .
Đồ thị bộ phận G 2 có dạng:

1 4
2 1 2
1
1 1
S 3 6 Z
3 3
3 4
2 5

Bước 3: Chọn T6  (S, 2, 3, 5, Z) ; f (T6 )  3 .


Các cung bão hòa (S, 2) (2, 3) (3, 5) .
Đồ thị G 3 có dạng:
1 4
2 1 2
1
1 1
S 3 6 Z

1
2 5

Đồ thị G 3 thỏa mãn các điều kiện kết thúc của thuật toán
6
Luồng cực đại có giá trị là: f ( )  *
 f (T )  5  7  6  5  7  3  33 .
i 1
i

9
Bà i 8 . MỘT SỐ VẤN ĐỀ VỀ LOGIC TOÁN

8.1. MỆNH ĐỀ VÀ CÁC PHÉP TOÁN MỆNH ĐỀ

8.1.1. Mệnh đề
Trong ngôn ngữ thông thường, mệnh đề được hiểu như là một câu bao gồm
một số thành phần nhất định và nêu lên một nội dung nào đó, nhưng logic toán
chỉ quan tâm đến những câu mà ta có thể khẳng định được nó là đúng hay sai.
Thí dụ.
a) Những khẳng định sau đây là mệnh đề:
- Paris là thủ đô của nước Pháp.
- 5 là một số lớn hơn 3.
- Phương trình x 2  3x  2  0 vô nghiệm.
- 6 là số nguyên tố.
Hai mệnh đề đầu là đúng, ta nói chúng có giá trị 1; hai mệnh đề sau là sai,
chúng có giá trị 0.

8.1.2. Các phép toán mệnh đề


a) Phép phủ định
Phủ định của mệnh đề A ký hiệu là A hay A (đọc là không A) có giá trị
trái với A.
A A
0 1
1 0

Dễ thấy rằng A có giá trị như A.


Hai mệnh đề có giá trị như nhau, ta nói là chúng tương đương logic, ta ký
hiệu A  B ; đôi khi cũng viết A  B .
b) Phép hội
Hội của 2 mệnh đề A và B ký hiệu là A  B , (đọc là A và B) nó chỉ lấy giá
trị 1 khi cả A và B đều có giá trị 1.
A B AB
0 0 0
0 1 0
1 0 0
1 1 1

Dễ thấy rằng A  B  min{A, B}

1
c) Phép tuyển
Tuyển của 2 mệnh đề A và B ký hiệu là A  B (đọc là A hoặc B) là một
mệnh đề chỉ lấy giá trị 0 khi cả A và B có giá trị 0.

A B AB
0 0 0
0 1 1
1 0 1
1 1 1

Dễ thấy rằng A  B  max{A, B} .


Điều này có nghĩa là A  B lấy giá trị đúng khi có ít nhất 1 trong 2 mệnh đề
A hoặc B có giá trị đúng.
Thí dụ 1.
A: Ba mua máy tính.
B: Ba mua tivi.
Khi đó A  B có nghĩa là “Ba mua máy tính hoặc mua tivi”; sẽ lấy giá trị
đúng nếu: Ba mua máy tính mà không mua tivi, hoặc Ba mua tivi mà không mua
máy tính, hoặc Ba mua cả máy tính và tivi. Tuy nhiên cũng có những trường hợp
không xảy ra đồng thời cả A và B đều đúng.
Thí dụ 2.
A: Ba dự họp ở Hà Nội.
B: Ba đi công tác ở thành phố Hồ Chí Minh.
Rõ ràng là không thể xảy ra đồng thời Ba đi dự họp ở Hà Nội và Ba đi công
tác ở thành phố Hồ Chí Minh. Khi đó ta có phép tuyển loại trừ (gọi tắt là tuyển
loại) và ký hiệu là A  B
Bảng giá trị của phép tuyển loại như sau:

A B AB
0 0 0
0 1 1
1 0 1
1 1 0
d) Phép kéo theo
A kéo theo B là một mệnh đề, ký hiệu là A  B (đọc là nếu A thì B) chỉ lấy
giá trị sai khi A đúng, B sai.
Bảng giá trị của A  B như sau:

2
A B AB
0 0 1
0 1 1
1 0 0
1 1 1

Theo bảng giá trị này thì: nếu A là sai thì A  B luôn luôn đúng cho dù B
đúng hay sai; còn nếu A là đúng thì A  B chỉ đúng khi B đúng.
Trong phép toán này thì A coi như điều kiện đủ của B hay B là điều kiện cần
của A.

Trong các phép toán trên thì ba phép toán: phủ định, tuyển, hội là các phép
tính cơ bản, còn các phép toán còn lại được suy ra từ các phép toán trên, chẳng
hạn A  B và A  B cùng có bảng giá trị như nhau, nên ta có thể viết
A  B  A  B.

A B A AB
0 0 1 1
0 1 1 1
1 0 0 0
1 1 0 1

8.2. BIẾN MỆNH ĐỀ VÀ BIỂU THỨC LOGIC

8.2.1. Định nghĩa 1


Các biến x, y, z mà trong quá trình nghiên cứu ta có thể gán cho chúng
những mệnh đề khác nhau được gọi là biến mệnh đề (tương tự như: nếu ta có thể
gán cho chúng những trị số khác nhau thì chúng được gọi là biến số). Các phép
toán mệnh đề cũng có thể thực hiện trên các biến mệnh đề. Biểu thức logic – còn
gọi là dạng mệnh đề được định nghĩa một cách qui nạp như sau:
- Các biến mệnh đề x, y, z được thừa nhận là biểu thức logic.
- Các phép toán mệnh đề được thực hiện giữa các biến mệnh đề là một biểu
thức logic.
Thí dụ 1. (x  y) ; (z  x) ; (y  z) , …
- Các phép toán mệnh đề được thực hiện giữa các biểu thức logic là một biểu
thức logic
Thí dụ 2. (x  y)  (z  x) ; (x  y)  (y  z) , …

3
Các biến mệnh đề x, y, z được gán những mệnh đề khác nhau: A, B, C;
nhưng các mệnh đề A, B, C chỉ lấy các giá trị 0 hoặc 1 nên cuối cùng các biến
mệnh đề cũng chỉ lấy các giá trị 0 hoặc 1, các biến mệnh đề cũng còn gọi là biến
Boole.
8.2.2. Định nghĩa 2
Hai biểu thức logic (hoặc 2 dạng mệnh đề) E và F gọi là tương đương logic
nếu nó có cùng bảng chân lý như nhau. Khi ấy ta viết:
E  F hay E  F
Như đã chứng minh ở trên x  y  x  y .
8.2.3. Định nghĩa 3
a) Dạng mệnh đề là một hằng đúng nếu nó luôn lấy giá trị 1.
b) Dạng mệnh đề là một hằng sai nếu nó luôn lấy giá trị 0.
Dễ dàng thấy rằng hai mệnh đề E và F là tương đương logic khi và chỉ khi
E  F là một hằng đúng.
Nếu chỉ chú ý đến phép kéo theo 1 chiều thì ta có định nghĩa sau đây:
8.2.4. Định nghĩa 4
Dạng mệnh đề F được gọi là hệ quả logic của dạng mệnh đề E nếu E  F là
một hằng đúng.
8.3. CÁC QUY TẮC THAY THẾ LOGIC
8.3.1. Quy tắc 1
Giả sử E  f (F1, F2 ,..., Fn ) là biểu thức logic được xây dựng từ các biểu thức

logic F1, F2 ,..., Fn và F1  F1 thế thì E  E  f[F1, F2 ,..., Fn ] .


Nghĩa là:
Nếu ta thay thế biểu thức logic con F1 bởi biểu thức logic F1 tương đương
với nó thì biểu thức logic thu được tương đương logic với E.
Thí dụ. x  (y  z)  x  (y  z)
Đôi khi cũng viết x  (y  z)  x  (y  z)
Nhờ các thay thế này ta có thể rút gọn biểu thức logic bằng cách thay thế một
biểu thức logic con bởi một dạng mệnh đề tương đương với nó nhưng đơn giản
hơn.
8.3.2. Quy tắc 2
Nếu E  f (F1, F2 ,..., Fn ) là một hằng đúng và F1 , F2 ,..., Fn là các dạng

mệnh đề tùy ý thì E  f (F1 , F2 ,..., Fn ) vẫn là một hằng đúng.
Nhờ cách thay thế này ta có thể phức tạp hóa hoặc đơn giản hóa một biểu
thức của một hằng đúng.
Ngoài 2 qui tắc trên ta còn sử dụng 10 biểu thức tương đương logic (còn gọi
là 10 quy luật logic) để rút gọn một dạng mệnh đề cho trước.

4
Với x, y, z là các biến mệnh đề, 1 là hằng đúng; 0 là hằng sai, ta có các quy
luật logic sau đây:

1. x  x  x; xxx Luật lũy đẳng

2. x  0  x; x 1 x Luật trung hòa


Luật thống trị
3. x  1  1; x00
(luật nuốt)
4. x  x  1; xx0 Luật phần tử bù

5. xyyx x  y  y  x Luật giao hoán

x  (y  z)  (x  y)  z
6. Luật kết hợp
x  (y  z)  (x  y)  z
x  (y  z)  (x  y)  (x  z)
7. Luật phân bố
x  (y  z)  (x  y)  (x  z)
x  (x  y)  x
8. Luật hấp thu
x  (x  y)  x
xyxy
9. Luật De Morgan
xyxy
Luật phủ định của
10. xx
phủ định

Ta có thể kiểm tra các luật trên bằng cách lập các bảng giá trị của chúng để so
sánh.

Thí dụ. Ta có thể áp dụng liên tiếp quy tắc thay thế thứ nhất để có được các tương
đương logic sau đây:
[x  (x  y)]  y  [x  (x  y)]  y  [(x  x)  (x  y)]  y
 [0  (x  y)]  y  (x  y)  y  (x  y)  y  (x  y)]  y
= x  (y  y)  x  1  1
Vậy [x  (x  y)]  y là một hằng đúng.

8.4. CÁC QUY TẮC SUY DIỄN LOGIC

Trong các chứng minh toán học, người ta thường xuất phát từ một số khẳng
định đúng cho trước mà ta thường gọi là giả thiết hay tiền đề và áp dụng các quy
tắc suy diễn logic để suy ra một khẳng định nào đó mà ta gọi là kết luận; đó là hệ

5
quả logic của giả thiết. Chẳng hạn xuất phát từ các mệnh đề p1, p2 , ..., pn và q là
hệ quả logic của chúng thì dạng mệnh đề dưới đây là một hằng đúng.
(p1  p2  ...  pn )  q .
Phép suy diễn trên được mô hình hóa bởi sơ đồ sau:
p1
p2

pn
q

Dưới đây là những phép suy diễn cơ bản, từ đó người ta có thể tích hợp chúng
để tạo ra những phép suy diễn phức tạp hơn. Mỗi phép suy diễn cơ bản là một
hằng đúng mà chúng ta có thể kiểm tra bằng cách lập bảng giá trị của nó.

8.4.1. Quy tắc Modus Ponens (Phương pháp khẳng định)


Quy tắc này được thể hiện bởi hằng đúng
[(p  q)  p]  q
hoặc dưới dạng sơ đồ:
pq

p
q
Thí dụ.
- Nếu n là số chẵn thì n chia hết cho 2.
- Mà n là số chẵn.
- Suy ra n chia hết cho 2.
Người ta có thể áp dụng quy tắc này cùng với phương pháp thay thế logic để
đơn giản hóa các bước suy luận.
8.4.2. Quy tắc Syllogism (Phương pháp tam đoạn luận)
Quy tắc Syllogism được thể hiện bởi hằng đúng sau:
[(p  q)  (q  r)]  (p  r)
hoặc sơ đồ:
pq

qr

p  r
Thí dụ

6
p: hai tam giác vuông có 1 cạnh bằng nhau và 1 góc nhọn bằng nhau.
q: hai tam giác có 1 cạnh bằng nhau kèm giữa 2 góc bằng nhau.
r: hai tam giác bằng nhau.
Vậy p  r : Hai tam giác vuông có một bằng nhau và một góc nhọn bằng
nhau thì bằng nhau.

8.4.3. Quy tắc Modus Tollens (Phương pháp phủ định)


Quy tắc này thể hiện bởi hằng đúng sau:
[(p  q)  q]  p
Hoặc bởi mô hình:
pq

p

8.4.4. Quy tắc mâu thuẫn (Phương pháp phản chứng)


Quy tắc này được thể hiện bởi tương đương logic sau:
[(p1  p2  ...  pn )  q]  [(p1  p2  ...  pn  q)  0]
Do đó nếu chứng minh được vế phải là một hằng đúng thì vế trái cũng là một
hằng đúng. Nói cách khác nếu thêm giả thiết q vào các tiền đề cho trước mà dẫn
đến mâu thuẫn thì q là hệ quả của các tiền đề cho trước.

8.4.5. Quy tắc chứng minh theo trường hợp


Quy tắc này được thể hiện bởi hằng đúng sau:
[(p  r)  (q  r)]  [(p  q)  r]
Ý nghĩa của quy tắc này là nếu có thể tách giả thiết thành 2 phần là p đúng
hoặc q đúng, và ta đã chứng minh được một cách riêng rẽ cho từng trường hợp
rằng kết luận r là đúng thì khi ấy r cũng đúng cho cả hai trường hợp.
Thí dụ. Để chứng minh rằng f (n)  n 3  2n (n nguyên dương) luôn chia hết cho
3; ta xét 2 trường hợp:
1) n chia hết cho 3, ta có f (n)  n(n 2  2) cũng chia hết cho 3.
2) n không chia hết cho 3, khi đó có thể viết n  3k  1 (k là nguyên dương)
do đó n 2  2  (3k  1)2  2  9k 2  6k  1  2  3 (3k 2  2k  1) chia hết
cho 3.
Vậy f (n) chia hết cho 3.
Như vậy trong mọi trường hợp f (n)  n(n 2  2) luôn chia hết cho 3.

8.5. VỊ TỪ VÀ LƯỢNG TỪ
7
8.5.1. Định nghĩa 1.
Khẳng định p(x) gọi là một vị từ nếu:
- Bản thân p(x) không phải là mệnh đề.
- Nếu thay x bởi một phần tử a  A thì p(a) là một mệnh đề, mệnh đề đó có
thể đúng hoặc sai, x được gọi là biến tự do của vị từ p(x) .
Thí dụ. p(x) : x là số nguyên tố. Đây là một vị từ.
Ta thấy:
p(1), p(2), p(5), p(7) là các mệnh đề đúng có 1 biến tự do x.
Còn p(4), p(6), p(15) là các mệnh đề sai.

8.5.2. Định nghĩa 2.


Cho trước p(x), q(x) là các vị từ một biến x  A . Khi đó.
Phủ định của p kí hiệu là p cũng là vị từ mà khi thay x bởi a  A thì ta được
mệnh đề p(a) .
Các phép toán tuyển (p  q) , hội (p  q) và kéo theo p  q cũng là những
vị từ mà khi ta thay x bởi a  A thì ta được các mệnh đề p(a)  q(a) ;
p(a)  q(a) ; p(a)  q(a) .

8.5.3. Định nghĩa 3.


Cho p(x) là vị từ một biến x  A .
1) Nếu với mọi x  A , nghĩa là thay x bởi phần tử bất kỳ a  A ta được
mệnh đề đúng p(a) ; thì khi đó mệnh đề “Với mọi x  A , p(x) là mệnh đề
đúng” được ký hiệu là “ x  A, p(x) ”.
2) Nếu có một số giá trị a  A mà p(a) là mệnh đề đúng và với một số giá
trị b  A thì p(b) là mệnh đề sai thì khi đó mệnh đề “tồn tại x  A , p(x) là
mệnh đề đúng” được ký hiệu “ x  A, p(x) ”.
Ta gọi các mệnh đề:
“ x  A, p(x) ” và “ x  A, p(x) ”
là lượng từ hóa của vị từ p(x) , trong đó:
 gọi là lượng từ phổ dụng.
 là lượng từ tồn tại.
Khi đó
- Phủ định của mệnh đề “ x  A, p(x) ” sẽ là “ x  A, p(x) ”
nghĩa là: tồn tại x  A , p(x) là mệnh đề đúng, nghĩa là p(x) sai.
- Phủ định của mệnh đề “ x  A, p(x) ” sẽ là “ x  A, p(x) ”.

8
8.6. HÀM ĐẠI SỐ LOGIC

8.6.1. Định nghĩa


Cho E  {0, 1} ; ánh xạ f : E n  E gọi là một hàm đại số logic của n biến;
một hàm đại số thường được xác định bởi bảng giá trị của nó; trong đó liệt kê
mọi bộ giá trị có thể có của các biến cùng với giá trị tương ứng của f.
Thí dụ.
x y z f (x, y, z)
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 0

Vì E  2 nên E  2n nên ta có 2n bộ trị số khác nhau của các biến, do đó


n

n
số các hàm đại số logic khác nhau của n biến là 22 , chẳng hạn với n  3 thì có
8 bộ giá trị khác nhau của biến và 28  256 hàm đại số logic khác nhau của 3
biến.
Các hàm đại số logic phụ thuộc thực sự vào các biến được gọi là hàm đại số
logic sơ cấp; với n  2 ta có các hàm thông dụng sau đây:

x y f1 f2 f3 f4 f5 f6 f7 f8 f9 f10

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

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

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

1 1 1 1 0 1 1 0 0 1 0 0
Trong đó:
f1  x  y Tuyển của x và y
f2  x  y Hội của x và y
f3  x  y Tuyển loại của x và y

9
f4  x  y Hàm kéo theo (x kéo theo y)
f5  x  y Gọi là hàm tương đương
f6  x  y Gọi là hàm Vebb của x và y (x  y  x  y)
f7  x | y Gọi là hàm Sheffer của x và y (x | y  x  y)
f8  x  y
f 9  f8  x  y
f10  f 4  (x  y)  x  y

Trong các hàm trên quan trọng nhất là hàm tuyển và hội. Các hàm khác được
suy ra từ hàm tuyển, hội cùng với phép toán phủ định.
Ta thấy rằng mỗi một biểu thức logic, ta có thể lập được bảng giá trị của nó,
do đó nó có một hàm đại số logic tương đương logic với biểu thức logic đó,
nghĩa là chúng có cùng một bảng giá trị như nhau. Nói gọn lại mỗi một biểu thức
logic tương ứng với một hàm đại số logic; và ngược lại mỗi hàm đại số logic
cũng có thể cho bởi một biểu thức logic.
Bằng các phép thay thế logic, ta có thể thấy rằng một hàm đại số logic có thể
cho bởi nhiều biểu thức logic có dạng khác nhau (nhưng có cùng bảng giá trị như
nhau). Vì vậy ta quan tâm đến những dạng nào có ít phép toán nhất.

8.6.2. Dạng chuẩn tắc của hàm đại số logic


a) Tuyển sơ cấp
Tuyển sơ cấp của các biến logic một tuyển trong đó mỗi biến và phủ định của
nó chỉ xuất hiện tối đa 1 lần. Giả sử có 3 biến logic x, y, z thì các tuyển sau đây là
tuyển sơ cấp:
x  y  z; x  y  z ; x  y  z ; x  y, …
Các tuyển có đủ cả 3 biến ta gọi là tuyển sơ cấp cực đại;
b) Hội sơ cấp
Hội sơ cấp của các biến logic; là một hội, trong đó mỗi biến và phủ định của
nó chỉ xuất hiện tối đa 1 lần.
Thí dụ.
x  y  z ; x  y  z ; x  y  z ; x  y ,…
Nếu hội có đủ các biến, ta gọi đó là hội cực đại. Tương tự với tuyển sơ cấp, ta
thấy hội sơ cấp là dạng chứa ít phép toán nhất.
c) Tuyển chuẩn tắc
Tuyển chuẩn tắc là tuyển của các hội sơ cấp khác nhau.
Thí dụ.
1) (x  y  z)  (x  y  z)  (x  y  z)
2) (x  y  z)  (x  y)  (x  z)
10
Nếu tất cả các hội sơ cấp đều là cực đại thì tuyển chuẩn tắc gọi là đầy đủ;
trong thí dụ trên thì 1) là tuyển chuẩn tắc đầy đủ; còn 2) là không đầy đủ.
Dễ thấy rằng tuyển chuẩn tắc cũng là dạng chứa ít phép toán nhất trong các
dạng tuyển biểu diễn hàm F(x, y, z) .
d) Hội chuẩn tắc
Hội chuẩn tắc là hội của các tuyển sơ cấp khác nhau. Nếu tất cả các tuyển sơ
cấp đều là cực đại thì hội chuẩn tắc là đầy đủ
Thí dụ.
(x  y  z)  (x  y  z)  (x  y  z)
là hội chuẩn tắc đầy đủ.
Hội chuẩn tắc cũng là dạng chứa ít phép toán nhất trong các dạng hội biểu
diễn hàm F(x, y, z) .

7.6.3. Tìm dạng chuẩn tắc của các hàm đại số logic
a) Tìm dạng tuyển chuẩn tắc
Ta tiến hành theo trình tự sau đây:
- Lập bảng giá trị của hàm đại số logic.
- Tìm các hội sơ cấp.
- Tìm tuyển của các hội sơ cấp.
Thí dụ.
Tìm dạng tuyển chuẩn tắc của hàm đại số logic cho bởi biểu thức logic sau
đây:
F(x, y, z)  (x | y)  (y  z)
- Trước tiên ta lập bảng giá trị của F(x, y, z) .

x y z x|y yz F(x, y, z)


0 0 0 1 0 0

0 0 1 1 1 1 H1  x  y  z

0 1 0 1 1 1 H2  x  y  z
0 1 1 1 0 0

1 0 0 1 0 0

1 0 1 1 1 1 H3  x  y  z

1 1 0 0 1 1 H4  x  y  z
1 1 1 0 0 1 H5  x  y  z

- Tìm các hội sơ cấp.


11
Ta quan tâm đến các giá trị 1 của F(x, y, z) . Trong bảng có 5 số 1, tương
ứng với 5 hội sơ cấp khác nhau: H1, H2 , H3 , H4 , H5 .
Ta thấy rằng hội của các mệnh đề có giá trị 1 khi mọi mệnh đề có giá trị 1 nên
dễ dàng tìm được:
H1  x  y  z
H2  x  y  z
H3  x  y  z
H4  x  y  z
H5  x  y  z
- Vậy dạng tuyển chuẩn tắc của F(x, y, z) là:
F(x, y, z)  H1  H2  H3  H4  H5
 (x  y  z)  (x  y  z)  (x  y  z)  (x  y  z)  (x  y  z)

b) Tìm dạng hội chuẩn tắc


Ta cũng tiến hành theo trình tự như khi tìm dạng tuyển chuẩn tắc, chỉ có điều
khác là sau khi lập bảng giá trị của hàm F(x, y, z) , thay cho việc tìm hội sơ cấp,
chúng ta tìm tuyển sơ cấp.
Khi tìm tuyển sơ cấp ta quan tâm đến các giá trị 0 của hàm F(x, y, z) . Trong
bảng giá trị của hàm F(x, y, z) có 3 số 0 tương ứng với các bộ trị số của x, y, z
như sau:

x y z F(x, y, z)
0 0 0 0 T1  x  y  z

0 1 1 0 T2  x  y  z

1 0 0 0 T3  x  y  z

Ta biết rằng tuyển của các mệnh đề có giá trị 0 khi mọi mệnh đề lấy giá trị 0,
nên ta dễ dàng tìm được:
T1  x  y  z
T2  x  y  z
T3  x  y  z
và do đó dạng hội chuẩn tắc của F(x, y, z) là
F(x, y, z)  T1  T2  T3
 (x  y  z)  (x  y  z)  (x  y  z) .

12
Ta cũng thấy rằng dạng tuyển chuẩn tắc và hội chuẩn tắc mà chúng ta vừa tìm
được đều là dạng chuẩn tắc đầy đủ.
7.6.4. Biểu diễn các hàm đại số logic chỉ bằng 2 phép tính
Dạng chuẩn tắc của một hàm đại số logic cho dù có bao nhiêu biến cũng chỉ
có 3 phép tính: tuyển, hội và phủ định. Ta tìm cách biểu diễn một hàm đại số
logic chỉ bằng 2 phép tính: hoặc là tuyển và phủ định hoặc là hội và phủ định.
a) Chỉ có dấu tuyển và phủ định
Muốn vậy ta phải làm mất các dấu hội chứa trong biểu thức của F(x, y, z) ;
ta chỉ việc áp dụng luật phủ định của phủ định và luật DeMorgan.
A  A và A  B  A  B
Thí dụ
F(x, y, z)  (x  y  z)  (x  y  z)  (x  y  z)

 (x  y  z)  (x  y  z)  (x  y  z)
 (x  y  z)  (x  y  z)  (x  y  z)
b) Chỉ có dấu hội và phủ định
Ta sẽ làm mất dấu tuyển bằng cách áp dụng 2 công thức:
A  A và A  B  A  B
Thí dụ
F(x, y, z)  (x  y  z)  (x  y  z)  (x  y  z)

 (x  y  z)  (x  y  z)  (x  y  z)
 (x  y  z)  (x  y  z)  (x  y  z)
8.7. CỔNG LOGIC VÀ TỔNG HỢP CÁC MẠCH LOGIC
Có thể sử dụng các phép toán mệnh đề và hàm đại số logic để mô hình hóa
các mạch trong các thiết bị điện tử nói chung và trong máy tính nói riêng. Mỗi
máy tính có nhiều mạch, mỗi mạch có thể mô hình hóa bởi các quy tắc của các
phép toán mệnh đề. Các phần tử cơ bản của một mạch gọi là một cổng, mỗi cổng
thực hiện một phép toán mệnh đề. Có 3 loại cổng tương ứng với 3 phép toán
mệnh đề. Các cổng mà ta nghiên cứu ở đây chỉ phụ thuộc đầu vào mà không phụ
thuộc vào trạng thái của mạch; đó là những mạch không có khả năng nhớ, những
mạch như vậy gọi là các mạch tổ hợp.
8.7.1. Cổng NOT
Cổng NOT tương ứng với phép toán phủ định, nếu đầu vào là x thì đầu ra là
x , nó có vai trò như một bộ đảo mạch. Cổng NOT được mô tả bởi hình dưới đây:
x x

NOT
13
8.7.2. Cổng AND. Cổng AND thực hiện phép hội, đầu vào có thể nhận nhiều
biến, đầu ra là hội của các biến đó và được mô tả bởi hình dưới đây:
x
xyz
y
z

AND
8.7.3. Cổng OR
Cổng OR thực hiện phép tuyển, đầu vào có thể nhận nhiều biến, đầu ra là
tuyển của các biến đó. Cổng OR được mô tả bởi hình dưới đây
x
xyz
y
z

OR
8.7.4. Thiết kế mạch logic thực hiện một hàm đại số logic cho trước
Ta biết rằng một hàm đại số logic cho trước, bao giờ cũng có thể tìm được
dạng chuẩn tắc của nó. Trong dạng chuẩn tắc chỉ có 3 phép tính phủ định, tuyển
và hội, các phép tính này tương ứng với các cổng NOT, OR và AND nên ta có
thể sử dụng các cổng này để thiết kế một mạch logic để thực hiện hàm đại số
logic đã cho.
Thí dụ. F(x, y, z)  (x  y  z)  (x  y  z)  (x  y  z)

AND
x
x  y z
y
z OR

AND
x
x  y z F(x, y, z)
y
xz

AND
x
x  y z
y
z

14

You might also like