ôn tập

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 24

1.

Tập hợp
Chỉnh hợp lặp
Chỉnh hợp lặp chập k của tập n phần tử là một cách sắp xếp có thứ tự k phần tử lấy từ tập
gồm n phần tử đã cho, mỗi phần tử có thể được lấy lặp lại.
Ví dụ 1: Tập A={a, b, c}
Có thể đặt bao nhiêu tên biến có độ dài 4 ký tự.
Giải: Mối tên biến có 4 ký tự được chọn từ tập A là một bộ 4 phần tử được lấy từ tập A. Vậy
có số tên biến có 4 ký tự được chọn từ A là N(A) x N(A) x N(A) x N(A) = 3 x 3 x 3 x 3=81
Ta có công thức tính chỉnh hợp lặp chập k từ n phần tử là:

Ank
= nk
Chỉnh hợp không lặp
Chỉnh hợp không lặp chập k của tập n phần tử ( gọi tắt là chỉnh hợp chập k) là một cách sắp
xếp có thứ tự k phần tử lấy từ tập gồm n phần tử đã cho, mỗi phần tử không được lấy lặp lại.
Ví dụ 3: Tập A= {1, 2, 3, 4, 5} các bộ (2, 3,5); (2, 5, 3) là các chỉnh hợp không lặp chập 3 từ
5 phần tử, còn các bộ (1, 1, 2);(1, 2, 1) và (2, 3, 2) không phải là chỉnh hợp không lặp chập 3 từ 5
phần tử, đó là chỉnh hợp lặp chập 3 từ 5 phần tử.
Ta có công thức tính chỉnh hợp không lặp chập k từ n phần tử là:

n!
Pkn (n−k )!
=
Hoán vị
Hoán vị của n phần tử khác nhau là một cách sắp xếp có thứ tự n phần từ đó.
Ví dụ 7: Có 4 người rủ nhau đi chụp ảnh là anh, Bắc, Cúc, Dương. Hãy tính xem có bao
nhiêu kiểu ảnh chụp mà cả 4 người đứng thành một hàng.
Giải: Đầu tiên ta có 4 khả năng chọn người đứng bên trái cùng, sau khi chọn người đứng trái
ta có 3 khả năng chọn người đứng kế theo, tiếp đó chỉ có thể chọn được 2 khả năng người còn
lại, như vậy ta có số kiểu ảnh có thể chụp khác nhau về vị trí đứng là 4.3.2.1=4!= 24 kiểu.
Ta có công thức tính số hoán vị của n phần tử là:
Pn = n!

Tổ hợp

Tổ hợp chập k từ n phần tử là cách chọn không phân biệt thứ tự k phần tử lấy từ tập n phần
tử đã cho, mỗi phần tử không được lấy lặp lại.

Ví dụ 2: Có 5 sinh viên là Anh, Bắc, Cúc, Dương, Giang của khoa CNTT. Chủ nhiệm khoa
muốn chọn để thành lập một tổ 3 người để thực hiện một đề tài khoa học. hỏi có bao nhiêu
phương án để thành lập tổ 3 người đó?

Giải: Ta ký hiệu tên của các sinh viên là A, B, C, D, G. Các phương án thành lập tổ có thể là tổ
hợp chập 3 của 5 phần tử đó. Cụ thể là:

(A, B, C); (A, B, D); (A, B, G); (A, C, D); (A, D, G)

(B, C, D); (B, C, G); (B, D, G); (C, D, G); (A, C, G)

Như vậy có tất cả 10 phương án.

C kn
là số tổ hợp chập k của n phần tử, ta có công thức sau:

n!
C kn (n−k )!k!
=

Tổ hợp lặp

Tổ hợp chập k từ n phần tử là cách chọn không phân biệt thứ tự k phần tử lấy từ tập n phần
tử đã cho, mỗi phần tử có thể được lấy lặp lại.

Số tổ hợp lặp chập k từ n phần tử bằng

( n+ k−1 )!
Rkn =
k!( n−1) !

Ví dụ : Có bao nhiêu cách chọn 4 tờ giấy bạc từ một két đựng tiền gồm những tờ 2, 5, 10,
20, 50 và tờ 100 ngàn đồng, nếu thứ tự mà các tờ tiền được chọn ra là không quan trọng, các tờ
tiền cùng loại là không phân biệt và mỗi loại có ít nhất 4 tờ.

( 6+ 4-1) !
R64 = =126
4! ( 6-1) !
Nguyên lý cộng
Giả sử có hai công việc. Việc thứ nhất có thể làm bằng n1 cách, việc thứ hai có thể làm bằng
n2 cách và nếu hai việc này có thể làm độc lập với nhau, khi đó sẽ có n1+ n2 cách làm cả hai việc.

Các ví dụ dưới đây minh họa việc sử dụng quy tắc tổng như thế nào.

Ví dụ . Giả sử cần chọn hoặc là một cán bộ của khoa Công nghệ hoặc là một sinh viên công
nghệ làm đại diện trong Hội đồng của Khoa. Hỏi có bao nhiêu cách chọn vị đại biểu này nếu
khoa Công nghệ có 127 cán bộ và 813 sinh viên?

Giải. Ta gọi việc thứ nhất là việc chọn một cán bộ của khoa Công nghệ. Nó có thể làm bằng
127 cách. Việc thứ hai, chọn một sinh viên khoa Công nghệ, có thể làm bằng 813 cách. Theo
nguyên lý cộng có 127 + 813 = 940 cách chọn vị đại diện này.

Nguyên lý cộng mở rộng

Giả sử các việc T1,T2,...,Tm có thể làm tương ứng bằng n1,n2,..,nm cách và giả sử m việc này có
thể thực hiện độc lập nhau. Khi đó số cách làm cả m việc là n 1+ n2 +.. + nm.

Nguyên lý nhân

Giả sử một nhiệm vụ nào đó được tách ra làm hai việc. Việc thứ nhất có thể làm bằng n1
cách, việc thứ hai có thể làm bằng n2 cách sau khi việc thứ nhất đã được làm, khi đó sẽ có n1. n2
cách thực hiện nhiệm vụ này.

Ví dụ: Người ta có thể ghi nhãn cho những chiếc ghế trong một giảng đường bằng một chữ
cái và một số nguyên dương không vượt quá 100. Bằng cách như vậy bao nhiêu chiếc ghế có
thể được ghi nhãn khác nhau?

Giải. Thủ tục ghi nhãn cho một chiếc ghế gồm hai việc, gán một trong 26 chữ cái và sau đó
gán một trong 100 số nguyên dương. Nguyên lý nhân chỉ ra rằng có 26.100 cách khác nhau để
gán nhãn cho một chiếc ghế. Như vậy nhiều nhất ta có thể gán nhãn cho 2600 chiếc ghế.

Nguyên lý nhân mở rộng

Giả sử một nhiệm vụ nào đó được thi hành bằng T1,T2 ,.. ,Tm việc. Nếu việc Ti có thể làm
bằng ni cách sau khi các việc T1,T2 ,.. , Ti-1 đã được làm, khi đó có n1. n2... .nm cách thi hành
nhiệm vụ đã cho.
Ví dụ . Có bao nhiêu dãy nhị phân có độ dài bằng 7 ?

Giải. Mỗi một trong 7 bit của dãy nhị phân có thể chọn bằng hai cách vì mỗi bit hoặc bằng
0 hoặc bằng 1. Bởi vậy, nguyên lý nhân cho thấy có tổng cộng 2 7 =128 dãy nhị phân khác nhau
có độ dài bằng7.

Nguyên lý bù trừ
Khi một phần của hai công việc có thể được làm đồng thời, chúng ta không thể dùng
nguyên lý cộng để tính số cách thực hiện nhiệm vụ gồm cả hai việc. Cộng số cách làm mỗi việc
sẽ dẫn đến sự trùng lặp, vì những cách làm cả hai việc sẽ được tính hai lần. Để tính đúng số
cách thực hiện nhiệm vụ này ta cộng số cách làm mỗi một trong hai việc rồi trừ đi số cách làm
đồng thời cả hai việc. Đó là nguyên lý bù trừ. Ví dụ sau sẽ minh họa chúng ta có thể giải quyết
bài toán đếm như thế nào khi sử dụng nguyên lý này.

Ví dụ. Có bao nhiêu dãy nhị phân độ dài 8 bit hoặc được bắt đầu bằng bit 1 hoặc kết thúc
bằng hai bit 00?

Giải: Việc thứ nhất, xây dựng các dãy nhị phân độ dài 8 bit bắt đầu bằng bit 1, có thể được
làm bằng 27=128 cách, vì bit đầu chỉ có thể chọn bằng một cách, mỗi một trong bẩy bít sau có
thể chọn bằng hai cách.Việc thứ hai, xây dựng các dãy nhị phân độ dài 8 bit kết thúc bằng hai
bit 00, có thể làm bằng 26 = 64 cách, vì mỗi một trong sáu bit đầu có thể làm bằng hai cách, hai
bit cuối cùng có thể chọn chỉ bằng một cách. Có thể làm cả hai việc đồng thời, xây dựng các dãy
nhị phân dài 8 bit bắt đầu bằng bit 1 và kết thúc bằng hai bit 00, bằng 2 5 = 32 cách, vì mỗi một
trong 5 bit từ bit thứ hai tới bit thứ sáu có thể chọn bằng hai cách, bit đầu và hai bit cuối cùng
có thể chọn chỉ bằng một cách. Cuối cùng, số dãy nhị phân độ dài 8 bit hoặc được bắt đầu bằng
bit 1 hoặc kết thúc bằng hai bit 00 bằng số cách làm hoặc công việc một hoặc công việc hai và
bằng 128+64-32=160.

Nguyên lý Dirichle
Nếu có k+1 hoặc nhiều hơn đồ vật được đặt vào trong k hộp, thì có ít nhất một hộp chứa
hai hoặc nhiều hơn hai đồ vật.

Nguyên lý Dirichle tổng quát.

Nếu có N đồ vật được đặt vào trong k hộp, sẽ tồn tại một hộp chứa ít nhất N/k vật.

Ví dụ 4. Trong 100 người có ít nhất 100 / 12 = 8.33= 9 người cùng tháng sinh.
Bài toán tối ưu

Bài toán lập lịch gia công

Các chi tiết lần lượt gia công trên các máy A,B. Thời gian gia công cho bởi bảng sau:

Chi tiết
D1 D2 D3 … Dn
Máy
A a1 a2 a3 … an
B b1 b2 b3 … bn

Hãy tìm lịch gia công tối ưu cho 2 máy đó, vẽ sơ đồ Gantt để tìm thời gian gia công tối
ưu.

Thuật toán Johnson:

Bước 1:

N1= tập các chi tiết sao cho ai < bi

N2= tập các chi tiết còn lại (ai >= bi )

Bước 2:

1= tập các chi tiết sao cho ai < bi

N2= tập các chi tiết còn lại (ai >= bi )

Các chi tiết lần lượt gia công trên các máy A,B. Thời gian gia công cho bởi bảng sau:

Chi tiết
D1 D2 D3 D4 D5
Máy
A 6 5 3 4 7
B 5 3 6 5 6

Hãy tìm lịch gia công tối ưu cho 2 máy đó, vẽ sơ đồ Gantt để tìm thời gian gia công tối
ưu.

Đáp án:

N1=D3, D4
N2=D1, D2,D5

Sắp xếp tăng dần N1 theo ai là D3, D4

Sắp xếp giảm dần N2 theo bi là D5, D1, D2

Lịch gia công tối ưu là:D3, D4, D5, D1, D2

Vẽ sơ đồ Gantt thời gian gia công tối ưu là: 28

2. Logic
¿
Phép tuyển ( )

Nhận giá trị đúng khi một trong hai mệnh đề đúng, nhận giá trị sai khi cả hai mệnh đề sai
¿
Phép hội ( )

Nhận giá trị đúng khi cả hai mệnh đề đúng, nhận giá trị sai khi một trong hai mệnh đề sai

Ví dụ: “ Hôm nay thứ sáu và trời mưa”. Mệnh đề này đúng vào hôm thứ sáu trời mưa, và là
sai vào bất kỳ ngày nào không phải là thứ sáu, trời không mưa hoặc thứ sáu nhưng trời không
mưa..
¬¿ ¿
Phép phủ định ( hoặc - )

Phủ định của đúng là sai, phủ định của sai là đúng

Ví dụ: Tìm phủ định của mệnh đề:

“Hôm nay là thứ sáu”.

Giải: Phủ định của mệnh đề trên là:

“ Hôm nay không phải là thứ sáu”.


Phép tuyển loại ( )

Nhận giá trị đúng khi một trong hai đúng, nhận giá trị sai khi cả hai mệnh đề cùng đúng
hoặc cùng sai.

Phép kéo theo ( )

Chỉ nhận giá trị sai khi mệnh đề thứ nhất là đúng, mệnh đề thứ hai là sai.
Ví dụ: “Nếu hôm nay trời nắng thì chúng tôi sẽ đi ra bãi biển”

Mệnh đề này chỉ sai khi hôm nay trời nắng nhưng chúng tôi không đi ra biển.

Phép tương đương ()

Mệnh đề tương đương pq là mệnh đề chỉ đúng khi p và q có cùng giá trị chân lý và sai
trong mọi trường hợp còn lại.

Chú ý: mệnh đề tương đương đúng chỉ khi pq và qp đều đúng. Mệnh đề tương đương
pq có các cách diễn đạt là ‘p nếu và chỉ nếu q”, “p là cần và đủ đối với q” và “nếu p thì q và
ngược lại”.

Bảng 3.1Bảng chân trị của các phép toán lôgic

p q p p
¿
q p q
¿
⊕ p

q pq
p q

0 0 1 0 0 0 1 1

0 1 1 1 0 1 1 0

1 0 0 1 0 1 0 0

1 1 0 1 1 0 1 1

Độ ưu tiên của các toán tử logic:

Tương tự như đối với các phép toán số học, để tránh phải dùng nhiều dấu ngoặc trong các
biểu thức logic, ta đưa ra một thứ tự ưu tiên trong việc tính toán. ở trên ta có 5 toán tử logic:
¿ ¿ → ↔
- ( phủ định), (và), (hoặc), (kéo theo), (tương đương). Thứ tự ưu tiên của các toán tử
trên được liệt kê theo mức độ giảm dần như sau :

¿,∨,−
→,↔

Trong đó, các toán tử liệt kê trên cùng dòng có cùng độ ưu tiên.

. Các luật logic


Các luật logic là cơ sở để ta thực hiện các biến đổi trên một biểu thức logic để có được biểu
thức logic mới tương đương logic với biểu thức logic có trước. Ta sẽ sử dụng các qui tắc thay
thế và các luật logic đã biết để thực hiện các phép biến đổi tương đương trên các biêu thức
logic.

Dưới đây, chúng ta sẽ liệt kê ra một số luật logic thường được sử dụng trong lập luận và
chứng minh. Các luật này có thể được suy ra trực tiếp từ các bảng chân trị của các biểu thức
logic.

 Các luật về phép phủ định :

p⇔ p
(luật phủ định của phủ định).

1⇔ 0

0 ⇔1

 Luật giao hoán:


¿ ⇔ ¿
p q q p

p∧q ⇔q∧ p

 Luật kết hợp :


¿ ¿ ⇔ ¿ ¿
p (q r) (p q) r
¿ ¿ ⇔ ¿ ¿
p (q r) (p q) r

 Luật phân bố


¿ ¿ ⇔ ¿ ¿ ¿
p (q r) (p q) (p r)
¿ ¿ ⇔ ¿ ¿ ¿
p (q r) (p q) (p r)

 Luật De Morgan

( p∧q ) ⇔ p∨q

( p∨q ) ⇔ p∧q

 Luật về phần tử bù


p∨ p⇔1

p∧ p ⇔0
 Luật kéo theo

p→q ⇔ p∨q
 Luật tương đương

p ↔ q⇔ ( p →q ) ∧( q→ p )

 Các luật đơn giản của phép tuyển:


¿ ⇔
p p p (tính lũy đẳng của phép tuyển)
¿ ⇔
p 1 1 (luật này còn được gọi là luật thống trị)
¿ ⇔
p 0 p (luật này còn được gọi là luật trung hòa)
¿ ¿ ⇔
p (p q) p (luật này còn được gọi là luật hấp thụ)

 Các luật đơn giản của phép hội


¿ ⇔
p p p (tính lũy đẳng của phép hội)
¿ ⇔
p 1 p (luật này còn được gọi là luật trung hòa)
¿ ⇔
p 0 0 (luật này còn được gọi là luật thống trị)
¿ ¿ ⇔
p (p q) p (luật này còn được gọi là luật hấp thụ)

3. Đại số Boole
Các cổng logic
Một sơ đồ mạch điện tử với hai đầu vào a và b, và đầu ra là a.b sẽ được biểu diễn bởi sơ đồ
sau đây, được gọi là cổng “Và”(AND).

a
a.b

b
Tương tự, đối với các phép toán Boole khác ta cũng có các cổng tương ứng có ký hiệu sơ đồ
như sau: a
a+b
Cổng “Hoặc” (OR)
b

Bộ đảo (NOT)
¿
¿
aa a a a

hay

Cổng “Không và”


a a|b

b
Cổng “Không hoặc”

a a+b
b

Hình 4.3 các loại cổng cơ bản

3.3.2 Tổ hợp các cổng logic


Mỗi biểu thức Boole hay hàm Boole theo n biến một sơ đồ mạch tương ứng. Sơ đồ mạch
này có n đầu vào và một đầu ra, và là một hệ thống được lắp ghép từ các cổng logic.

Ví dụ: Hàm Boole f(x,y) =


x+xy+ y có sơ đồ mạch tương ứng như sau:

x
x +xy + y
y
Phương pháp bảng Karnaugh tối thiểu hóa hàm Boole
Phương pháp này đuợc Maruice Karnaugh đưa ra vào năm 1953. Phương pháp này thường
chỉ áp dụng khi hàm có số biến tương đối nhỏ.
Các bảng Karnaugh cho chúng ta một phương pháp trực quan để rút gọn các khai triển tổng
các tích. Trước hết chúng ta minh hoạ cách dùng phương pháp bảng Karnaugh để rút gọn biểu
thức của các hàm Boole hai biến.
Một bảng Karnaugh đối với hàm Boole 2 biến gồm 4 ô vuông, trong đó hình vuông biểu
diễn tiểu hạng có mặt trong khai triển được ghi số 1. Các hình ô được gọi là kề nhau nếu các
tiểu hạng mà chúng biểu diễn chỉ khác nhau một tục biến (tục biến là một biến ở tiểu hạng này
nhưng nó là phủ định của biến ấy ở tiểu hạng kia). Ví dụ ô biểu diễn
x y kề với các ô vuông biểu

diễn xy,
x y . Bốn ô vuông và các tiểu hạng mà chúng biểu diễn được cho trên hình 4.5

y y
x xy x
y
x xy x
y

Hình 4.5 Bảng Karnaugh hai biến

x
Ví dụ 2: Hàm Boole f(x,y) = xy + y + x
y có bảng Karnaugh tương ứng là:
y y
x 1 1
x 1

Hình 4.6 Bảng Karnaugh cho ví dụ 2


Trong bảng Karnaugh các ô bằng 0 sẽ để trống.
Chúng ta có thể tổ hợp các tiểu hạng từ bảng Karnaugh. Bất cứ khi nào có các số 1 ở hai ô
kề nhau thì các tiểu hạng được biểu diễn bởi các ô đó đều có thể được tổ hợp lại thành một tích
chỉ có một biến. Ví dụ xy và
x y biểu diễn bởi 2 ô kề nhau được tổ hợp thành một biến y vì xy +
x y = y ( x + x ) = y. Hơn nữa nếu cả 4 ô đều là số 1 thì kết quả tổ hợp của 4 tiểu hạng là 1.
Rút gọn đối với ví dụ 2:
x
xy + y = y

xy + x
y =x
x y
Vậy f(x,y) = xy + y + x =x + y
Bảng Karnaugh ba biến là một hình chữ nhật được chia thành 8 ô. Các ô biểu diễn 8 tiểu
hạng 3 biến khả dĩ. Hai ô được gọi là kề nhau nếu các tiểu hạng mà chúng biểu diễn khác nhau
một tục biến
yz
y
z y z yz
x
x

Ví dụ 4: Hàm Boole f(x,y,z) = xyz +


x y z + x yz + x y z +x y z có bảng Karnaugh tương ứng là
yz
y
z y z yz
x 1
x 1 1 1

Từ bảng Karnaugh, chúng ta có thể tổ hợp các tiểu hạng như sau:
Các khối gồm 2 ô kề nhau biểu diễn số 1 tổ hợp thành một tích chỉ có hai biến
Các khối gồm 4 ô kề nhau có thể tổ hợp thành tích chỉ có một biến duy nhất.
Bảng gồm tất cả các ô số 1 thì f(x, y, z)=1

yz
y
z y z yz
x 1
x 1
xy z + x y z= y z

yz
y
z y z yz
x
x 1 1

x yz + x y z = x z

yz
y
z y z yz
x 1 1
x 1 1

xy z + x y z + x y z + x yz =z

yz
y
z yz yz
x
x 1 1 1 1

x yz + x y z + x y z + x y z = x

yz
y
z y z yz
x 1 1 1 1
x 1 1 1 1

xyz + xy z + x y z + x y z + x yz + x y z + x y z + x yz = 1
Rút gọn ở ví dụ 4:
x
xyz + yz = yz
x yz + x y z = x y

x yz + x y z = x z
f(x,y,z) = xyz +
x y z + x yz + x y z +x y z = yz + x y + x z
4.Đồ thị
Chu trình và đường Euler

5.3.2 Chu trình Euler


ω
Định nghĩa: Giả sử G = <V,E> là đồ thị vô hướng . Một chu trình trong đồ thị G được gọi là
chu trình Euler nếu nó đi qua tất cả các cạnh của G và đi qua mỗi cạnh đúng một lần.

Ví dụ: Cho đồ thị G = <V,E>


v
e1 e7
v v v v
e2 e3 e4

e9 e8 e6 e5
v v

Hình 5.22

Chu trình Euler trong đồ thị trên là:

z = v1e1v3e8v6e9v2e2v3e3v4e4v5e5v7e6v4e7v1.

Định lý: Đồ thị vô hướng G = <V,E> có chu trình Euler khi và chỉ khi G là liên thông và bậc
của tất cả các đỉnh trong đồ thị G là số chẵn.

5.3.3 Đường Euler

Định nghĩa: Đường Euler trong đồ thị G = <V, E> là đường đi qua tất cả các cạnh (cung) của
đồ thị, mỗi cạnh đi qua đúng một lần.

Định lý: Cho G = <V, E> là đồ thị vô hướng liên thông. Điều kiện cần và đủ để đồ thị có
đường Euler nhưng không có chu trình Euler là số đỉnh bậc lẻ trong đồ thị là 2.

a) Cho đồ thị G1 như sau:


a b d

c
e
g f
Đồ thị G1 có chu trình hay đường Euler không? Nếu có hãy chỉ ra đường hay
chu trình Euler đó.
Giải:
a) Phát biểu (không chứng minh) điều kiện cần và đủ để một đồ thị vô hướng có
chu trình Euler: Đồ thị vô hướng G = <V,E> có chu trình Euler khi và chỉ khi G là
liên thông và bậc của tất cả các đỉnh trong đồ thị G là số chẵn.

Phát biểu (không chứng minh) điều kiện cần và đủ để một đồ thị vô hướng có
đường Euler nhưng không có chu trình Euler: Cho G = <V, E> là đồ thị vô hướng
liên thông. Điều kiện cần và đủ để đồ thị có đường Euler nhưng không có chu
trình Euler là số đỉnh bậc lẻ trong đồ thị là 2.

Trong G1 bậc đỉnh a, bậc đỉnh b =3

bậc đỉnh g, bậc đỉnh d, bậc đỉnh e =2

bậc đỉnh f, bậc đỉnh c =4

như vậy G1 có 2 đỉnh bậc lẻ, các đỉnh khác bậc chẵn nên không có chu trình
Euler mà có đường Euler đường đó là a b f a g f c e d c b
2 Đường đi ngắn nhất trong đồ thị có trọng số

Cho đồ thị hữu hạn G = <V,E>. Với mỗi cạnh e E ta đặt tương ứng với số dương l(e) và gọi
là trọng số của e.

Đồ thị với các cạnh có trọng số như trên gọi là đồ thị có trọng số.
α
Ta ký hiệu D(a,b): = tập tất cả các đường nối đỉnh a với đỉnh b trong đồ thị G=<V,E>, gọi là
α
vi ei vi ei vi ei vi
1 1 2 2 n−1 n−1 n ∈ ∈
một đường nào đó trong G và giả sử = ... , vij V, eij E (j=1,2,...,n).
n−1
∑ l(e ij )
α j=1 α
Khi đó ta ký hiệu l( )= và gọi là trọng số của đường .

Bài toán: Cho đồ thị đơn liên thông có trọng số G = <V,E> và a,b V là hai đỉnh trong đồ thị.
α α
Tìm các đường từ đỉnh a đến đỉnh b trong đồ thị G = <V,E> có trọng số ít nhất, tức thoả
α β β∈
mãn l( ) = min{l( )/ D(a,b)}

Thuật toán:

Bước 1: Đánh trọng số các đỉnh.


σ
Trọng số của đỉnh xuất phát a là (a) = 0.
σ
Tại các đỉnh còn lại ta ghi một trọng số dương đủ lớn sao cho nó lớn hơn trọng số của các
đỉnh từ a tới.

Bước 2: Thực hiện việc giảm trọng số các đỉnh.


σ σ
Giả sử tại đỉnh x được ghi trọng số (x). Nếu tồn tại đỉnh y có trọng số (y) từ y sang x mà
σ σ σ σ σ
(x) > (y) + l(y,x) thì ta thay trọng số của (x) bởi trọng số ’(x) = (y) + l(y,x). Trường hợp
σ σ σ
(x) < (y) + l(y,x), trọng số của x giữ nguyên là
(x). Quá trình thực hiện cho tới khi trọng số
∀ ∈ ∈
của tất cả các đỉnh trong G = <V,E> đạt cực tiểu, tức là v V không tồn tại v1 V kề với v mà
σ σ
(v1) + l(v1, v) < (v).

Bước 3: Xác định đường từ a đến b có trọng số ít nhất.

Từ bước 3 ta xác định được trọng số của đỉnh b. Xuất phát từ b đi về đỉnh kề với b, chẳng
vi σ σ in
v vi vi
n n n
hạn đó là đỉnh có tính chất (b) = ( ) + l( ,b). Nếu không có đỉnh kề như vậy thì ta
đi về đỉnh kề với b có trọng số cạnh (cung) từ đỉnh đó về b là ít nhất.
vi vi σ
vi σ
vi vi vi
n n−1 n n−1 n−1 n
Từ đỉnh ta đi ngược về đỉnh có tính chất ( )= ( ) + l( , ), nếu không đi
vi
n
về đỉnh kề với mà trọng số cạnh (cung) giữa chúng là ít nhất.
vi σ
vi σ
vi vi
1 1 1 1
Bằng cách đó ta sẽ đi về đỉnh mà đỉnh kề là a sao cho ( )= (a) +l(a, )= l(a, ),
σ
với (a)=0.
α
vi vi vi vi
1 2 n−1 n
Đường =a ... b là đường đi từ a đến b có trọng số ít nhất trong số tất cả các
đường từ a đến b.

Thuật toán Dijkstra: Tìm đường đi ngắn nhất

α β β∈
l( ) = min{l( )/ D(a,b)}

Procedure Dijkstra (G: đồ thị liên thông có trọng số dương)

{G có các đỉnh a= v0, v1, ..., vn =b và trọng số l(vi,vj) =

nếu (vi,vj) E của G}

For (i= 1; i< n ; i++)


σ ∞
(vi):= ;
σ
(a):= 0;


S:= ;

{ban đầu các nhãn được khởi tạo sao cho nhãn của a bằng 0, còn các đỉnh khác bằng , tập
S là rỗng}

While (b S)

{
σ
u:= đỉnh không thuộc S có nhãn (u) nhỏ nhất;
¿
S:= S {u};

For tất cả các đỉnh v không thuộc S


σ σ σ σ
if (u) + l(u,v) < (v) then (v):= (u) + l(u,v)

{thêm vào S đỉnh có nhãn nhỏ nhất và sửa đổi nhãn của các đỉnh không thuộc S}
α
}; {l( ) = l(a,b) = độ dài đường đi ngắn nhất từ a đến b}.

Ví dụ: Dùng thuật toán Dijkstra tìm đường đi độ dài ngắn nhất từ đỉnh a đến đỉnh d của đồ
thị có trọng số cho trong hình 5.29

5
4 b c 6
8
a 2
1 d
2
f e 3
10
Hình 5.29

Giải: Các buớc dùng thuật toán Dijkstra tìm độ dài đường đi ngắn nhất giữa đỉnh a và đỉnh
d được biểu diễn bởi bảng dưới đây:

S a b c d e f

∅ 0 ∞ ∞ ∞ ∞ ∞

{a} 4, a ∞ ∞ ∞ 2, a

{a, f} 3, f 10, f ∞ 12, f

{a, f, b} 8, b ∞ 12, f

{a, f, b, c} 14, c 10, c

{a, f, b, c, e} 13, e

{a, f, b, c, e, d}

Tìm các đường đi ngắn nhất từ a tới d có trọng số 13 bằng cách đi từ d ngược trở lại a

b3,f c8,b
d13,e
a0 e10,c

f2,a

Đường đi ngắn nhất từ a đến d là: a f b c e d, với độ dài là 13.

5. Cây
6.5 Cây khung nhỏ nhất.

Định nghĩa 1. Cây khung nhỏ nhất trong một đồ thị liên thông, có trọng số là một cây khung
có tổng các trọng số trên các cạnh của nó là nhỏ nhất.

6.5.2 Các thuật toán tìm cây khung nhỏ nhất.


Thuật toán Prim. Thuật toán này do Robert Prim đưa ra vào năm 1957, mặc dù ý tưởng cơ
bản của nó đã có từ sớm hơn rất nhiều. Để thực hiên thuật toán Prim, ta bắt đầu bằng việc
chọn một cạnh bất kỳ có trọng số nhỏ nhất, đặt nó vào cây khung. Lần lượt ghép vào cây các
cạnh có trọng số tối thiểu liên thuộc với một đỉnh của cây và không tạo ra chu trình trong cây.
Thuật toán sẽ dừng khi n-1 cạnh được ghép vào cây.

Cuối mục này, chúng ta chứng minh rằng thuật toán này tạo ra cây khung nhỏ nhất cho đồ
thị liên thông có trọng số. Thuật toán 1 mô tả thuật toán Prim ở dạng giả mã.

Thuật toán 1. Thuật toán Prim.


procedure Prim (G: đồ thị liên thông có trọng số với n đỉnh)
T:= cạnh có trọng số nhỏ nhất.
for i:=1 to n-2
begin
e:= cạnh có trọng số tối thiểu liên thuộc với một đỉnh trong T
và không tạo ra chu trình trong T nếu ghép nó vào T
T:=T với e được thêm vào.
end { T là cây khung nhỏ nhất của G}
Lưu ý rằng việc chọn một đỉnh ghép vào cây trong mỗi giai đoạn của thuật toán là không
xác định khi có nhiều hơn một cạnh cùng trọng số và thỏa mãn những tiêu chuẩn nào đó. Để
việc chọn một cạnh được xác định, chúng ta sắp xếp các cạnh theo một thứ tự nào đó. Khi đó
chúng ta sẽ chọn cạnh gặp đầu tiên trong số các cạnh cùng trọng số và liên thuộc với một cạnh
ở bước trước. Cũng vậy cần lưu ý là có thể có nhiều hơn một cây khung nhỏ nhất ứng với một
đồ thị liên thông và có trọng số. Ví dụ sau minh họa cách dùng thuật toán Prim.

Ví dụ 1. Dùng thuật toán Prim để thiết kế một mạng truyền thông có giá tối thiểu để nối các
trung tâm máy tính biểu diễn trên Hình 6.20.

Giải. Chúng ta sẽ giải bài toán này bằng cách tìm cây khung nhỏ nhất trong đồ thị trên Hình
1. Thuật toán Prim được tiến hành bằng cách chọn cạnh đầu tiên là cạnh có trọng số nhỏ nhất
và lần lượt thêm một cạnh có trọng số nhỏ nhất trong số những cạnh nối với một đỉnh của cây
và không tạo thành một chu trình. Các cạnh được tô đậm trên Hình 1 là cây khung nhỏ nhất
nhận được bằng thuật toán Prim, từng bước chọn cạnh là (b,e), (ed), (d,a), (a,c), Độ dài tổng
cộng là 3600 $

1200$

a 2000$ b

1000$

900$ d

1300$ 1600$

700$ 800$

1400$

2200$

Hình 6.20

Ví dụ 2. Dùng thuật toán Prim, hãy tìm cây khung nhỏ nhất của đồ thị trên Hình 21.

a 2 b 3 c 1 d

3 1 2 5

e 4 f 3 g 3 h

4 2 4 3
Giải. Cây khung nhỏ nhất được xây dựng bằng thuật toán Prim được thể hiện trên Hình
6.21. Thứ tự chọn các cạnh cũng được biểu diễn trong bảng bên cạnh. Độ dài cây khung nhỏ
nhất là 24.

Thuật toán Kruskal. Thuật toán này do Kruskal phát minh năm 1956, mặc dù ý tưởng cơ
bản của nó đã được biết từ sớm hơn nhiều. Để thực hiện thuật toán Kruskal ta chọn cạnh có
trọng số nhỏ nhất của đồ thị. Lần lượt ghép vào cạnh có trọng số tối thiểu, và không tạo thành
chu trình với các cạnh đã được chọn. Thuật toán dừng sau khi n-1 cạnh đã được chọn.

Dạng giả mã của thuật toán này được cho trong Thuật toán 2.

Thuật toán 2. Thuật toán Kruskal.

procedure Kruskal (G: đồ thị n đỉnh, liên thông có trọng số )

T:= đồ thị rỗng

for i:=1 to n-1

begin

e:= một cạnh bất kỳ của G với trọng số nhỏ nhất và

không tạo ra chu trình trong T, khi gộp nó vào T.

T:= T với cạnh e đã được thêm vào.

end { T là cây khung nhỏ nhất}

Trong thuật toán Prim ta chọn các cạnh có trọng số tối thiểu, liên thuộc với các đỉnh đã
thuộc cây và không tạo ra chu trình. Trong khi đó thuật toán Kruskal chọn các cạnh có trọng số
tối thiểu mà không nhất thiết phải liên thuộc với các đỉnh của cây và không tạo ra chu trình.
Chú ý rằng cũng như trong thuật toán Prim, khi dùng thuật toán Kruskal nếu các cạnh là không
được sắp thứ tự có thể có nhiều cách chọn trong mỗi bước của thuật toán này. Do đó để cho
thủ tục xác định cần sắp xếp các cạnh theo một trật tự nào đó. Ví dụ sau đây sẽ minh họa cách
dùng thuật toán Kruskal.
Ví dụ 3. Dùng thuật toán Kruskal, hãy tìm cây khung nhỏ nhất của đồ thị trên hình 6.21.

Giải. Cây khung nhỏ nhất và cách chọn các cạnh trong mỗi bước của thuật toán Kruskal
được thể hiện trên Hình 6.22.

a 2 b 3 c 1 d

3 1 2 5

e 4 f 3 g 3 h

4 2 4 3

i 3 j 3 k 1 l

Bây giờ chúng ta sẽ chứng minh rằng thuật toán Prim tạo ra cây khung nhỏ nhất của đồ thị
liên thông có trọng số.

Cho đồ thị G2 vô hướng như hình vẽ.


A 1 B 3 C

6 3 8
4 5 H 14 3
6
1
5 2 4
1 G
3 9 D
F E

a) Viết thuật toán Kruskal tìm cây khung nhỏ nhất


b) Áp dụng thuật toán Kruskal để tìm cây khung nhỏ nhất của đồ thị G2.
Giải :
a) Trình bày thuật toán Kruskal tìm cây khung nhỏ nhất (0.5đ)
procedure Kruskal (G: đồ thị n đỉnh, liên thông có trọng số )

T:= đồ thị rỗng

for i:=1 to n-1

begin

e:= một cạnh bất kỳ của G với trọng số nhỏ nhất và

không tạo ra chu trình trong T, khi gộp nó vào T.

T:= T với cạnh e đã được thêm vào.

end { T là cây khung nhỏ nhất}

b) Áp dụng (1.5 đ)
- Sắp xếp

Tìm cây khung nhỏ nhất theo thuật toán Kruskal

STT Cạnh chọn Tập cạnh chọn

1 AB AB

2 BE AB,BE

3 FH AB,BE, FH

4 EG AB,BE, FH, EG

5 EF AB,BE, FH, EG, EF

6 BC AB,BE, FH, EG, EF, BC

7 CD AB,BE, FH, EG, EF, BC, CD

Cây khung nhỏ nhất AB,BE, FH, EG, EF, BC, CD với trọng số 14

You might also like