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

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CÔNG NGHỆ THÔNG TIN

TẬP BÀI GIẢNG


Môn học: Toán học rời rạc

Đà Nẵng, tháng 12 năm 2015

TS.Nguyễn Văn Hiệu Page 1


Chương 1. ĐẠI CƯƠNG VỀ ĐỒ THỊ................................................................................5

Bài 1. CÁC KHÁI NIỆM CƠ BẢN.................................................................................5

1.1 Đồ thị..................................................................................................................5

1.2 Bậc của đỉnh đồ thị.............................................................................................7

1.3 Đồ thị con..........................................................................................................11

1.4 Biểu diễn đồ thị bằng ma trận...........................................................................13

Bài tập................................................................................................................................17

Bài 2. CÁC PHÉP TOÁN TRÊN ĐỒ THỊ....................................................................21

1.5 Các phép toán cơ bản........................................................................................21

1.6 Đồ thị đẳng cấu, đồ thị tự bù............................................................................30

Bài tập................................................................................................................................34

Chương 2. ĐƯỜNG ĐI VÀ CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI......................................37

Bài 1. ĐƯỜNG ĐI VÀ CHU TRÌNH............................................................................37

2.1 Đường đi và chu trình.......................................................................................37

2.2 Tính liên thông..................................................................................................39

2.3 Tính liên thông mạnh........................................................................................41

2.4 Đường đi và Tính đẳng cấu..............................................................................45

Bài tập................................................................................................................................49

Bài 2. CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI......................................................................53

2.5 Đường đi Euler.................................................................................................53

2.6 Đường đi Hamilton...........................................................................................54

2.7 Bài toán đường đi ngắn nhất.............................................................................55

Bài tập................................................................................................................................59

TS.Nguyễn Văn Hiệu Page 2


Chương 3. CÂY.................................................................................................................62

Bài 1. CÂY VÔ HƯỚNG...............................................................................................62

3.1 Khái niệm..........................................................................................................62

3.2 Tính chất cơ bản của cây vô hướng..................................................................67

Bài tập................................................................................................................................70

Bài 2. CÁC ỨNG DỤNG CỦA CÂY............................................................................73

3.3 Cây tìm kiếm nhị phân......................................................................................73

3.4 Cây quyết định..................................................................................................76

3.5 Mã tiền tố – Huffman coding............................................................................78

3.6 Cây trò chơi.......................................................................................................82

Bài tập................................................................................................................................87

Bài 3. DUYỆT CÂY......................................................................................................90

3.7 Universal Address System................................................................................90

3.8 Thuật toán duyệt cây.........................................................................................91

3.9 Cây biểu diễn biểu thức..................................................................................100

Bài tập..............................................................................................................................104

Chương 4. Cây Khung.....................................................................................................107

Bài 1. CÂY KHUNG....................................................................................................107

4.1. Cây khung.......................................................................................................107

4.2. Thuật toán tìm kiếm theo chiều sâu................................................................108

4.3. Thuật toán tìm kiếm theo chiều rộng..............................................................111

Bài tập..............................................................................................................................113

Bài 2. CÂY KHUNG NHỎ NHẤT..............................................................................115

TS.Nguyễn Văn Hiệu Page 3


4.4. Thuật toán tìm cây khung nhỏ nhất................................................................115

4.5. Ứng dụng........................................................................................................120

Bài tập..............................................................................................................................121

Chương 5. LUỒNG VÀ MẠNG.....................................................................................122

5.1. Khái niệm về luồng và mạng..........................................................................122

5.2. Luồng cức đại.................................................................................................123

5.3. Luồng cực đại và lát cắt cực tiểu....................................................................130

5.4. Mạng tổng quát...............................................................................................132

5.5. Bài toán luồng cực đại chi phí cực tiểu...........................................................134

Bài tập..............................................................................................................................135

TS.Nguyễn Văn Hiệu Page 4


Chương 1. ĐẠI CƯƠNG VỀ ĐỒ THỊ
Bài 1. CÁC KHÁI NIỆM CƠ BẢN

1.1 Đồ thị
Về trực quan, một đồ thị được biểu diễn bởi các đỉnh và các cạnh nối giữa chúng.

Ví dụ 1.1.1.

Về hình thức, một đồ thị là một cặp các tập (V , E ) , trong đó V là tập các đỉnh và E là
tập các cạnh, được biểu diễn bởi cặp đỉnh. Mỗi phân tử thuộc tập E có thể xuất hiện
nhiều hơn một lần.

Định nghĩa 1.1.1. Đồ thị G=(V , E ) bao gồm V là tập khác rỗng các đỉnh (hoặc nút)
và E là tập các cạnh. Trong đó, mỗi cạnh được xác định là một cặp không thứ tự hai đỉnh
và được gọi là cạnh nối giữa hai đỉnh đó.

Thường chúng ta kí hiệu các đỉnh bởi chữ cái viết thường: a ,b ,c ,… hoặc v 1 , v 2 ,…
hoặc các số nguyên: 1,2,3,…

Ví dụ 1.1.2. Kí hiệu các đỉnh đồ thị như hình dưới

TS.Nguyễn Văn Hiệu Page 5


là tập các đỉnh và E={( v 1 , v 2 ),(v 2 , v 5 ),( v 5 , v 5 ),(v 5 , v 4 ),(v 5 , v 4 ), } là
V = v , …, v 5 }
{1
Trong đó,
tập các cạnh của đồ thị.

Tương tự, các cạnh đồ thị được kí hiệu bởi các chữ cái viết thường: a ,b ,c ,… hoặc
e 1 , e 2 ,… hoặc các số nguyên: 1,2,3,…

Chú ý. Hai cạnh (u , v ) và (v , u ) được coi là như nhau. Nói cách khác, cạnh được kí
hiệu bởi một cặp đỉnh không kể thứ tự.

Ví dụ 1.1.3. Đồ thị dưới được kí hiệu các đỉnh như hình dưới

E={e 1 ,…, e 5 }
Tập cạnh .

Chú ý. Tập hợp các đỉnh (V ) của một đồ thị (G) có thể là vô hạn hoặc hữu hạn. Một
đồ thị với vô hạn các đỉnh được gọi là đồ thị vô hạn. Ngược lại, đồ thị với hữu hạn đỉnh
được gọi là đồ thị hữu hạn. Trong giáo trình này, chúng ta chỉ quan tâm đến đồ thị hữu
hạn.

Ví dụ 1.1.4. Một mạng lưới các máy tính có thể liên kết trao đổi thông tin với nhau.
Trong đó, mỗi máy tính được coi là một điểm và mỗi sự liên kết giữa hai máy tính là một
đường (đường liên kết). Khi đó, để mô hình mạng máy tính chúng ta có thể sử dụng đồ
thị với mỗi đỉnh là một máy tính và cạnh chính là đường liên kết giữa hai máy tính.

Đồ thị, mà trong đó mọi cạnh được nối bởi hai đỉnh khác nhau và không có hai cạnh
nào cùng nối bởi một cặp đỉnh, được gọi là đơn đồ thị. Trong đơn đồ thị, một cạnh có thể
được biểu diễn bởi một cặp đỉnh { u , v } .

Đồ thị, mà trong đó có nhiều hơn 1 cạnh nối giữa cặp đỉnh nào đó, được gọi là đa đồ
thị.

TS.Nguyễn Văn Hiệu Page 6


Cho G là một đa đồ thị,{ u , v } là một cặp không thứ tự của đỉnh u và v thuộc G . Nếu
trong G tồn tại m cạnh nối giữa cặp { u , v } thì chúng ta nói rằng cặp { u , v } là một cạnh có
bậc là m trong G .

Cạnh được nối bởi một đỉnh vào chính nó được gọi là vòng.

Đồ thị theo định nghĩa trên được gọi là đồ thị vô hướng. Trong đó, mọi cạnh thuộc đồ
thị được xác định bởi một cặp không thứ tự của hai đỉnh thuộc đồ thị, được gọi là vô
hướng.

Định nghĩa 1.1.2. Đồ thị có hướng G= (V , E ) bao gồm V , là tập khác rỗng các đỉnh,
và E là tập hợp các cạnh có hướng. Mỗi cạnh có hướng được xác định là một cặp thứ tự
của hai đỉnh. Cặp thứ tự ( u , v ) được kí hiệu cho cạnh có hướng nối từ đỉnh u đến đỉnh v .
Khi đó, u được gọi là đỉnh đầu và v được gọi là đỉnh cuối của cạnh.

Khi chúng ta vẽ đồ thị có hướng, mỗi cạnh nối từ đỉnh u đến đỉnh v được biểu diễn
bởi một đường với dấu mũi tên để xác định đỉnh đầu là u và đỉnh kết thúc là v . Đồ thị có
hướng có thể chứa các vòng hoặc nhiều cạnh có hướng cùng nối bởi một cặp thứ tự của
hai đỉnh. Đồ thị có hướng có thể chứa cạnh nối bởi cặp thứ tự ( u , v ) và đồng thời chứa
cạnh nối bởi cặp thứ tự ( v , u ) .

Đơn đồ thị có hướng là đồ thị có hướng, mà trong đó không chứa vòng và cạnh đa
bậc. Vì trong đơn đồ thị có hướng, với mỗi cặp thứ tự hai đỉnh ( u , v ) chỉ xác định tối đa
một cạnh nên có thể dùng kí hiệu ( u , v ) để biểu diễn cạnh nối từ đỉnh u đến đỉnh v trong
đơn đồ thị có hướng.

1.2 Bậc của đỉnh đồ thị


Cho đồ thị G=(V , E )

Định nghĩa 1.2.1. Hai đỉnh u và v trong đồ thị vô hướng G được gọi là liền kề nếu
tồn tại một cạnh nối giữa cặp hai đỉnh { u , v } . Nếu e là cạnh được biểu diễn bởi { u , v } , khi
đó e được gọi là cạnh nối của hai đỉnh u và v . Đỉnh u và v được gọi là đỉnh kết thúc
của cạnh { u , v } .

TS.Nguyễn Văn Hiệu Page 7


Tập các đỉnh liền kề với đỉnh v trong G kí hiệu là N G ( v ) hoặc N ( v ) . Tương tự, cho
U ⊂ V là tập các đỉnh thuộc đồ thị G , khi đó tập các đỉnh thuộc V ¿ liền kề với một

trong các đỉnh thuộc U được gọi là tập liền kề của tập U , kí hiệu là N (U ) .

Định nghĩa 1.2.2. Bậc của một đỉnh u trong đồ thị vô hướng là số cạnh nối với đỉnh
đó, ký hiệu là deg (u) . Với trường hợp cạnh là vòng, nối từ một đỉnh đến chính nó, bậc
của đỉnh đó được tính 2 lần.

Theo định nghĩa, deg(u)=|N (u)|.

Ví dụ 1.2.1. Trong hình dưới:

● Với đồ thị vô hướng G : deg (a )=2 , deg (b )=deg (c )=deg( f )=4 , deg (d )=1 ,
deg (e )=3 và deg ( g)=0 .

● Với đồ thị vô hương H : deg (a )=4 , deg (b )=deg (e )=6 , deg (c )=1 và
deg (d )=5 .

Đỉnh với bậc bằng 0 được gọi là đỉnh cô lập. Theo định nghĩa, đỉnh cô lập không kề
cận với bất kỳ đỉnh nào trong đồ thị. Ví dụ đỉnh g trong đồ thị G là đỉnh độc lập.

Kí hiệu:

δ (G)=min { deg (v )|v ∈ V } là bậc cực tiểu của đồ thị;

Δ(G)=max { deg (v )|v ∈ V } là bậc cực đại của đồ thị.

TS.Nguyễn Văn Hiệu Page 8


Đại lượng

1
deg(G)= ∑ deg(v )
|V| v ∈V

là bậc trung bình của đồ thị G . Rõ rang

δ (G)≤deg(G )≤Δ(G) .

Định lý 1.2.1. (The Handshaking Theorem) Cho G=(V , E ) là một đồ thị vô hướng
với e cạnh. Khi đó

2 e= ∑ deg (v )
v ∈V

Định lý 1.2.2. Trong đồ thị vô hướng, số đỉnh bậc lẻ luôn là số chẵn.

Chứng minh. Xét G= (V , E ) là đồ thị vô hướng. Trong đó, V 1 là tập hợp các đỉnh có
số bậc chẵn, V 2 là tập hợp các đỉnh có số bậc lẻ. Rõ ràng, V 1 ∪V 2 =V và V 1 ∩V 2 =∅ .
Theo định lý 1:

2 e= ∑ deg (v )= ∑ deg (v )+ ∑ deg (v )


v ∈V v ∈V 1 v∈V
2

∑ deg(v )
Vì deg (v ) với v ∈ V 1 là chẵn nên v ∈V 1 là số chẵn. Do tổng bằng 2 e là số chẵn, suy
∑ deg(v )
rav ∈V 2
là số chẵn. Vì các thành phần thuộc tổng này đều là số lẻ nên số đỉnh v ∈ V 2
phải là số chẵn. Đó là điều cần chứng minh.

Định nghĩa 1.2.3. Cho đồ thị G= (V , E ) là đồ thị có hướng, (u , v )∈ E là một cạnh


thuộc đồ thị. Khi đó, chúng ta nói u là đỉnh kề đến v , và v được gọi là kề từ u . Đỉnh u
được gọi là đỉnh đầu của cạnh (u , v ) , đỉnh v được gọi là đỉnh cuối của cạnh (u , v ) . Đỉnh
đầu và đỉnh cuỗi của một vòng là trùng nhau.

Vì các cạnh trong đồ thị có hướng là một cặp thứ tự hai đỉnh thuộc đồ thị, theo định
nghĩa về bậc của đỉnh có thể định nghĩa lại theo số cạnh tương ứng với đỉnh đó là đỉnh
đầu hay đỉnh cuối.

TS.Nguyễn Văn Hiệu Page 9


Định nghĩa 1.2.4. Cho đồ thị G= (V , E ) là đồ thị có hướng. Bậc vào của đỉnh v ∈ V ,

kí hiệu deg (v ) , là số cạnh thuộc đồ thị có đỉnh cuối là đỉnh v . Bậc ra của đỉnh v , kí hiệu
deg + (v ) , là số cạnh thuộc đồ thị có đỉnh đầu là đỉnh v .

Ví dụ 1.2.2. Xác định bậc vào và bậc ra của các đỉnh trong đồ thị G ở hình dưới.

− − − − − −
Bậc vào: deg (a )=2 , deg (b )=2 ,deg (c )=3 ,deg (d )=2 ,deg (e )=3 ,deg ( f )=0 .
+ + + + + +
Bậc ra: deg (a )=4 ,deg (b )=1 ,deg (c )=2 ,deg (d )=2 ,deg (e )=3 và deg (f )=0 .

Định lý 1.2.3. Cho G= (V , E ) là đồ thị có hướng. Khi đó

∑ deg− (v )= ∑ deg + (v )=|E|


v ∈V v ∈V

Định nghĩa 1.2.5. Đồ thị K n là đơn đồ thị với n đỉnh thoả mãn mọi cặp đỉnh đều có
duy nhất một cạnh nối.

Ví dụ 1.2.3. Hình dưới đây là đồ thị K 5 .

n(n−1)
Chú ý. Mọi đỉnh của đồ thị K n đều có bậc n−1 , và K n có 2 cạnh.

Định nghĩa 1.2.6. Đồ thị lưỡng phân G=(V , E ) là đồ thị mà tập đỉnh V được phân
làm 2 tập rời nhau V 1 và V 2 (V =V 1∪V 2 và V 1 ∩V 2 =∅ ) sao cho mỗi cạnh thuộc tập E
thoả mãn chỉ nối với một đỉnh thuộc V 1 và một đỉnh thuộc V 2 , kí hiệu G=({V 1 ,V 2 }, E ) .

TS.Nguyễn Văn Hiệu Page 10


Ví dụ 1.2.4. Đơn đồ thị C 6 là lưỡng phân (Figure 7) vì tập đỉnh có thể phân hoạch
thành hai tập 1 { 1 3 5 } và 2 { 2 4 6 } , trong đó mỗi cạnh thuộc C 6 đều được nối
V = v ,v ,v V = v ,v ,v

bởi một đỉnh thuộc V 1 và một đỉnh thuộc V 2 .

Đồ thị
K m, n là đồ thị lưỡng phân ({V 1 ,V 2 }, E ) với tập V 1 có m đỉnh và tập V 2 có n đỉnh

với mỗi đỉnh thuộc V 1 được nối với mỗi đỉnh thuộc V 2 bằng một cạnh duy nhất.

Ví dụ 1.2.5. Hình dưới đây là đồ thị


K3,3.

Chú ý. Đồ thị lưỡng phân đủ K m, n =({V 1 , V 2 }, E ) có m× n cạnh. Mỗi đỉnh thuộc tập V 1
có bậc là n và mỗi đỉnh thuộc tập V 2 có bậc là m .

Định nghĩa 1.2.7. Cho G là đơn đồ thị. Vecto bậc d (G ) của đồ thị G là dãy giảm
dần các bậc của tất cả các đỉnh của G .

Vecto v gồm các số tự nhiên gọi là vecto đồ thị nếu tồn tại đơn đồ thị có vecto bậc là
v.

1.3 Đồ thị con


Định nghĩa 1.3.1. Đồ thị con của đồ thị G= (V , E ) là đồ thị H= (W , F ) , trong đó
W ⊆V và F ⊆ E . Đồ thị con H của G được gọi là đồ thị con nghiêm ngặt nếu H ≠G .

Ví dụ 1.3.1. Đồ thị G trong hình dưới là đồ thị con của K 5 .

TS.Nguyễn Văn Hiệu Page 11


Nếu W =V thì H được gọi là đồ thị con phủ của .

Nếu F ⊂ E thì kí hiệu G−F là đồ thị con (V , E−F ) của gồm tập đỉnh V và tập
cạnh E−F .

Nếu W ⊂ V thì kí hiệu G−W là đồ thị con của thu được từ sau khi loại bỏ các
đỉnh thuộc W và các cạnh nối với chúng.

Cho W ⊂ V , đồ thị con của G sinh bởi W , kí hiệu [ W ] , là đồ thị (W , EW ) với

EW ={e ∈ E|e={u , v },u ∈ W∨v ∈ W }

Định nghĩa 1.3.2. Hợp của hai đơn đồ thị G1 =( V 1 , E1 ) và G2 =(V 2 , E 2 ) là đơn đồ thị
với tập đỉnh V =V 1∪V 2 và tập cạnh E=E1 ∪E2 . Hợp của G 1 và G 2 kí hiệu là G 1 ∪G 2 .

Ví dụ 1.3.2. Hợp của đơn đồ thị G 1 và G 2 mô tả ở hình dưới.

TS.Nguyễn Văn Hiệu Page 12


1.4 Biểu diễn đồ thị bằng ma trận
Một cách biểu diễn đồ thị (không có cạnh đa cấp) đơn giản nhất là sử dụng danh sách
chứa tất cả các cạnh thuộc đồ thị đó. Một cách biểu diễn khác với đố thị không có cạnh
đa cấp là sử dụng danh sách kề, trong đó với mỗi đỉnh thuộc đồ thị, xác định danh sách
đầy đủ các đỉnh kề với nó.

Ví dụ 1.4.1. Hình dưới mô tả cách biểu diễn đơn đồ thị G bằng danh sách kề.

Trong ví dụ, với đỉnh a thuộc đồ thị, danh sách đầy đủ các đỉnh kề với nó gồm 3 đỉnh
b , c và e .

Ma trận kề. Biểu diễn đồ thị bằng danh sách tất cả các cạnh hay danh sách kề sẽ rất
cồng kềnh nếu đồ thị có nhiều cạnh. Để đơn giản cho việc tính toán, đồ thị có thể được
biểu diễn bằng ma trận. Hai dạng ma trận được dùng để biểu diễn ma trận sẽ được giới
thiệu trong phần này. Một dựa trên tính kề của đỉnh, và một dựa trên mối quan hệ giữa
đỉnh và cạnh đồ thị.

Cho G= (V , E ) là đơn đồ thị, trong đó |V|=n . Giả sử tập các đỉnh thuộc G có thể
được đánh thứ tự như sau: v 1 , v 2 ,…, v n . Ma trận kề
A=[ aij ] (hoặc AG ) của G là ma trận

vuông kích thước n×n . Trong đó, giá trị


a ij=1 nếu đỉnh v i liền kề đỉnh v j . Ngược lại,
a ij=0 . Nói cách khác,

a ij=
{
1,
0,
Ơ {v i , v j }∈ E
Ơ {v i , v j }∉ E

Ví dụ 1.4.2. Sử dụng ma trận kề biểu diễn đồ thị ở hình dưới


TS.Nguyễn Văn Hiệu Page 13
Chúng ta sắp xếp trật tự các đỉnh thuộc đồ thị như sau: a ,b , c , d . Ma trận kề biểu diễn
đồ thị là:

Ví dụ 1.4.3. Vẽ đồ thị tương ứng với ma trậ kề:

với thứ tự các đỉnh là a ,b , c , d .

Đồ thị tương ứng với ma trận kề:

TS.Nguyễn Văn Hiệu Page 14


Chú ý rằng ma trận kề của một đồ thị phụ thuộc vào cách xác định thứ tự của các đỉnh
thuộc đồ thị. Chúng ta có n ! bộ thứ tự khác nhau từ n đỉnh của đồ thị, tương ứng với n !
ma trận kề khác nhau để biểu diễn cùng một đồ thị.

Ma trận kề của đơn đồ thị là đối xứng, có nghĩa là: ij


a =a ji , vì chúng đều bằng 1 nếu

v
tồn tại cạnh nối giữa hai đỉnh v i và j , bằng 0 trong trường hợp ngược lại. Ngoài ra, vì
trong đơn đồ thị không có cạnh khuyên nên a ii=0 với mọi i=1 , 2 ,…n .

Ma trận kề có thể được sử dụng để biểu diễn đồ thị vô hướng với cạnh khuyên và
cạnh đa cấp. Giá trị a ii=1 tương ứng với cạnh khuyên tại đỉnh a i . Trong đó, với cạnh đa
a
cấp, giá trị ma trận kề không còn nhận giá trị trong tập {0,1} nữa. Giá trị ij bằng số cạnh
a
nối giữa hai đỉnh a i và j .

Ví dụ 1.4.4. Dùng ma trận kề biểu diễn đồ thị dưới đây.

Ma trận kề tương ứng:

Ma trận zero-one còn được sử dụng để biểu diễn đồ thị có hướng. Trong đó, ma trận
cho đồ thị có hướng G=(V , E ) nhận giá trị 1 tại vị trí (i , j) nếu tồn tại cạnh nối từ đỉnh
v i đến đỉnh v j . Nói một cách khác, nếu A=[ aij ] là ma trận biểu diễn đồ thị có hướng với
tương ứng bộ thứ tự các định xác định, khi đó

TS.Nguyễn Văn Hiệu Page 15


a ij=
{
1 , ( v i , v j )∈ E
0 , ( vi , v j ) ∉ E

Ma trận kề cho đồ thị có hướng không có tính chất đối xứng, vì có thể có cạnh nối từ
v v
đỉnh v i đến đỉnh j tuy nhiên không có cạnh nới từ đỉnh j đến đỉnh v i . Tương tự phần
trên, ma trận kề cũng có thể dùng để biểu diễn đồ thị có hướng với cạnh đa cấp.

Một cách khác để biểu diễn đồ thị là việc sử dụng ma trận đỉnh-cạnh. Cho G=(V , E )
là một đồ thị vô hướng. Giả sử (v 1 , v 2 ,…, v n ) và (e 1 , e2 ,…, e m ) là hai bộ thứ tự các đỉnh và
các cạnh thuộc đồ thị. Khi đó, ma trận đỉnh-cạnh tương ứng với hai bộ thứ tự trên là một
ma trận n×m :
M=[mij ] , trong đó

m ij=
{ 1, whenedge e j is incident withv i ,
0 , otherwise

Ví dụ 1.4.5. Biểu diễn ma trận đỉnh-cạnh cho đồ thị hình dưới.

Ma trận đỉnh-cạnh biểu diễn cho đồ thị:

Ma trận đỉnh-cạnh có thể được dùng để biểu diễn cho cạnh đa cấp và cạnh khuyên.
Cạnh đa cấp được biểu diễn trong ma trận đỉnh-cạnh bằng cách sử dụng nhiều cột có
cùng giá trị tương ứng với các ô. Cạnh khuyên được biểu diễn bằng việc sử dụng một cột
với đúng 1 ô có giá trị 1, tương ứng với đỉnh nút của cạnh khuyên.

Ví dụ 1.4.6. Biểu diễn đồ thị hình dưới bằng ma trận đỉnh-cạnh.

TS.Nguyễn Văn Hiệu Page 16


Ma trận đỉnh-cạnh tương ứng với đồ thị:

Định nghĩa 1.4.1. Cho G=(V , E ) là đồ thị có hướng không khuyên với n đỉnh,
V = {v 1 , v 2 ,…, v n } E={e 1 , e 2 ,…, e m }
, và m cạnh, . Ma trận liên thuộc của đồ thị G là ma trận
A=(a ij )n×m thoả mãn a ij=1 nếu đỉnh v i là đỉnh đầu của cạnh e j ; a ij=−1 nếu đỉnh v i là
e a =0 nếu đỉnh v i không được nối bởi cạnh e j .
đỉnh cuối của cạnh j ; và ij

Bài tập

Bài 1. Xác định số đỉnh, số cạnh, bậc các đỉnh, đỉnh cô lập trong các đồ thị vô hướng
dưới đây

TS.Nguyễn Văn Hiệu Page 17


Bài 2. Xác định số đỉnh, số cạnh, bậc ra và bậc vào của các đỉnh trong các đồ thị có
hướng dưới đây

Bài 3. Vẽ các đồ thị sau:

a. K 7 b.
K 1 ,8 c.
K4, 4

d. C 7 e. W 7 f. Q4

Bài 4. Vẽ tất cả đồ thị con của đồ thị dưới đây

TS.Nguyễn Văn Hiệu Page 18


Bài 5. Có bao nhiêu đồ thị con của đồ thị K 3 và W 3 .

Bài 6. Xây dựng danh sách kề biểu diễn các đồ thị sau

Bài 7. Biểu diễn các đồ thị trên băng ma trận kề.

Bài 8. Biểu diễn các đồ thị sau băng ma trận kề

a. K 4 b. K 1 ,4 c. K 2 , 3

d. C 4 e. W 4 f. Q3

Bài 9. Vẽ các đồ thị tương ứng với ma trận kề sau

Bài 10. Vẽ các đồ thị tương ứng với ma trận kề sau


TS.Nguyễn Văn Hiệu Page 19
Bài 11. Xác định ma trận liền kề cho các đồ thị sau

TS.Nguyễn Văn Hiệu Page 20


Bài 2. CÁC PHÉP TOÁN TRÊN ĐỒ THỊ

1.5 Các phép toán cơ bản


Các phép toán một ngôi

Định nghĩa 1.5.1. Đồ thị bù của đơn đồ thị G=(V , E ) là đơn đồ thị Ḡ=(V , Ē ) , trong
đó Ē là tập các cạnh không thuộc tập E .

Ví dụ 1.5.1.

Ví dụ 1.5.2. Phần bù của đồ thị K n là đồ thị rỗng gồm n đỉnh.

¯
Chú ý. Ḡ =G .

Định nghĩa 1.5.2. Cho đơn đồ thị G=(V , E ) và G =(V , E ) thoả V ⊆ V , khi đó đồ
' ' ' '

' ''
thị sai khác, kí hiệu G−G =( V , E ) , trong đó là tập các cạnh thuộc tập E và không
''
E
'
thuộc tập E .

Ví dụ 1.5.3.

TS.Nguyễn Văn Hiệu Page 21


Đồ thị đường (Line graph). Tạo đồ thị mới bằng cách chuyển cạnh thành đỉnh và tạo
các cạnh tương ứng.

Định nghĩa 1.5.3. Cho G là một đồ thị, đồ thị đường (line graph) của G , kí hiệu
L(G) được định nghĩa như sau:

● Mỗi đỉnh của L(G) là cạnh của G , và

● Hai đỉnh của L(G) gọi là liền kề khi và chỉ khi tương ứng cạnh chúng trong G
có chung một đỉnh.

Ví dụ 1.5.4. Hình dưới mô tả đồ thị G và đồ thị đường L(G) của nó. Mỗi đỉnh thuộc
L(G) được gán nhãn là cặp đỉnh của cạnh tương ứng trong đồ thị G . Ví dụ, với đỉnh (1,3)
thuộc đồ thị L(G) sẽ tương ứng với cạnh nối 2 đỉnh 1 và 3 trong đồ thị G .

TS.Nguyễn Văn Hiệu Page 22


Đỉnh (1,3) liền kề với đỉnh (1,4) , đỉnh (1,2) vì chúng tương ứng với các cạnh có chung
đỉnh 1 ở đồ thị G , và đỉnh (4 ,3) vì tương ứng có đỉnh chung 3 ở đồ thị G .

Một số tính chất:

● Đồ thị đường của một đồ thị liên thông là đồ thị liên thông. Nếu G là đồ thị
liên thông, nghĩa là luôn tồn tại đường đi giữa hai đỉnh thuộc đồ thị, đồng
nghĩa với luôn tồn tại đường đi giữa hai cạnh thuộc nó. Khi đó, L(G) luôn tồn
tại đường đi giữa hai đỉnh thuộc đồ thị, và là đồ thị liên thông.

● Nếu đồ thị G có một chu trình Euler, khi đó, nếu G là liên thông và có tất cả
các đỉnh với bậc chẵn thì đồ thị đường của G , L(G) , là đồ thị Hamilton.

Đồ thị phẳng là một đồ thị có thể được nhúng vào mặt phẳng, tức là có thể được vẽ
trên mặt phẳng sao cho các cạnh chỉ gặp nhau ở các đỉnh.

Định nghĩa 1.5.4. Cho G là một đồ thị phẳng, đồ thị đối ngẫu của G là một đồ thị
phẳng, kí hiệu H , thỏa mãn:

● Mỗi đỉnh của H tương ứng là mỗi miền mặt phẳng của đồ thị G , và

● Hai đỉnh thuộc H gọi là liền kề nếu tương ứng hai miền mặt phẳng của chúng
trong G liền kề nhau.

Thuật ngữ “đối ngẫu” được dùng để chỉ tính đối xứng này: nếu H là đối ngẫu của G
thì G cũng là đối ngẫu của H .

TS.Nguyễn Văn Hiệu Page 23


Ví dụ 1.5.5. Hình dưới mô tả đồ thị G và đồ thị đối ngẫu G của nó.
'

Một số tính chất.

● Đồ thị đối ngẫu của một đồ thị phẳng là một đa đồ thị phẳng và gồm nhiều
cạnh.

● Nếu G là đồ thị liên thông và G là đồ thị đối ngẫu của G thì G và G là hai
' '

đồ thị đẳng cấu với nhau.

● Nếu G và H là hai đồ thị liên thông và là hai đồ thị đảng cấu với nhau,
'
G và
lần lượt là đồ thị đối ngẫu của G và H thì
' ' '
H G và H có thể không đẳng
cấu với nhau.

Ví dụ 1.5.6. Hình ảnh dưới mô tả tính chất vừa nêu trên.

TS.Nguyễn Văn Hiệu Page 24


Các phép toán hai ngôi

Cho hai đơn đồ thị G1 =(V 1 , E1 ) và G2 =(V 2 , E 2 ) .

Phép hợp của G1 và G 2 , kí hiệu G 1 ∪G 2 , là đồ thị (V 1 ∪V 2 , E1 ∪E2 ) .

Phép giao của G1 và G 2 , kí hiệu G 1 ∩G 2 , là đồ thị (V 1 ∩V 2 , E1 ∩E2 ) .

Phép tổng của G1 và G 2 , kí hiệu G1 ⊕G2 , là đồ thị con của G 1 ∪G 2 với tập cạnh là
E1 ⊕ E 2=( E1 −E2 )∪( E2 −E1 ) .

Ví dụ 1.5.7. Cho đơn đồ thị

TS.Nguyễn Văn Hiệu Page 25


Khi đó :

Chú ý. Phép giao, hợp và tổng có thể được định nghĩa tương tự cho các đa đồ thị.

Nếu v là một đỉnh thuộc đồ thị G=(V , E ) , khi đó G−v là đồ thị con của G với tập
đỉnh là: V −{v} . Thao tác trên gọi là phép loại bỏ đỉnh.

TS.Nguyễn Văn Hiệu Page 26


Ví dụ 1.5.8.

là một cạnh của đồ thị G=(V , E ) , khi đó G−e là đồ thị (V , E ) ,


'
Tương tự, nếu e
'
trong đó E =E {e ¿ ¿ . Thao tác trên gọi là phép loại bỏ cạnh.

Ví dụ 1.5.9.

Nếu u và v là hai đỉnh thuộc đồ thị G=(V , E ) , khi đó chúng ta định nghĩa short-
' '
circuit của hai đỉnh u và v là đồ thị (V , E ) , trong đó
'
V =(V −{u , v })∪{w} (w ∉V )

E' =( E− {( v ' , u) ,( v ' , v )|v ' ∈V }) ∪{( v ' , w )|( v ' , u) ∈ E∨( v ' , v )∈ E }
∪{ ( w , w )|( u ,u ) ∈ E∨( v , v ) ∈ E }

Thao tác trên gọi là phép short-circuit hai đỉnh u và v .

Ví dụ 1.5.10. Short-circuit của v 3 và v 4 trong đồ thị G1

TS.Nguyễn Văn Hiệu Page 27


Cho đồ thị G=(V , E ) , phép cắt cạnh e=(u , v ) (không là vòng) là thao tác mà trong đó
đầu tiên, thực hiện phép loại bỏ cạnh e và tiếp đến thực hiện phép short-circuit hai đỉnh
u và v .

Ví dụ 1.5.11. Phép cắt cạnh e 3 trong đồ thị G1

Phép loại bỏ cạnh e 3 :

Phép short-circuit hai đỉnh v 2 và v 3 :

Định nghĩa 1.5.5. Một đỉnh v của đồ thị G gọi là đỉnh cắt nếu số thành phần liên
thông của đồ thị G−v nhiều hơn số thành phần liên thông của đồ thị G .

Ví dụ 1.5.12. Đỉnh v là đỉnh cắt của đồ thị dưới đây

TS.Nguyễn Văn Hiệu Page 28


Một đồ thị gọi là tách rời nếu hoặc nó không liên thông hoặc nó có ít nhất một đỉnh
cắt. Ngược lại đồ thị gọi là không tách rời.

Ví dụ 1.5.13. Đồ thị G ở ví dụ trước là đồ thị tách rời.

Ví dụ 1.5.14. Đồ thị dưới đây không tách rời.

Định nghĩa 1.5.6. Một block của đồ thị G là đô thị con G1 của G thỏa mãn điều kiện

- G1 là đồ thị không tách rời, và

- Nếu G 2 là đồ thị con của G thì G 1 ∪G 2 =G 1 hoặc G 1 ∪G 2 là đồ thị tách rời.

Ví dụ 1.5.15. Đồ thị dưới đây là tách rời.

TS.Nguyễn Văn Hiệu Page 29


Định nghĩa 1.5.7. Một tập cắt của đồ thị liên thông G=(V , E ) là tập cạnh F ⊆ E
thỏa mãn

1. G−F là đồ thị không liên thông, và

2. G−H là đồ thị liên thông với mọi H ⊂ F .

Định lý 1.5.1. Nếu F là tập cắt của đồ thị liên thông G thì đồ thị G−F có 2 thành
phần liên thông.

1.6 Đồ thị đẳng cấu, đồ thị tự bù


Định nghĩa 1.6.1. Hai đồ thị G1 =(V 1 , E1 ) và G2 =(V 2 , E 2 ) được gọi là đẳng cấu nếu
tồn tại một hàm song ánh f từ V 1 đến V 2 thỏa mãn điều kiện: với mọi đỉnh a , b thuộc V 1
, nếu a và b liền kề trong G 1 khi và chỉ khi f (a ) và f (b ) liền kề trong G 2 . Khi đó, hàm
f được gọi là phép đẳng cấu.

Ví dụ 1.6.1. Hãy chỉ ra rằng đồ thị G=(V , E ) và H=(W , F ) (hình dưới) là đẳng cấu.

TS.Nguyễn Văn Hiệu Page 30


Hàm f với f (u1 )=v 1 , f ( u2 )=v 4 , f (u3 )=v 3 và f ( u4 )=v 2 là song ánh từ tập đỉnh V
vào tập W . Để kiểm tra điều kiện liền kề, chúng ta thấy tất cả các cặp đỉnh liền kề trong
G là:

(u1 , u2 ) , (u1 , u3 ) ,(u2 , u 4 ) và (u3 , u 4 ) ,

tương ứng với các cặp đỉnh liền kề trong H là:

(f ( u1 )=v 1 , f ( u2 )=v 4 ) ,(f (u1 )=v 1 , f (u3 )=v 3 ) ,(f ( u2 )=v 4 , f (u4 )=v 2 ) ,
(f (u3 )=v 3 , f (u 4 )=v 2 ) . ⊲

Thường rất khó để xác định hai đồ thị có đẳng cấu hay không? Với mỗi đồ thị có n
đỉnh, tồn tại n ! hàm song ánh khác nhau giữa hai tập đỉnh của đồ thị. Trong trường hợp n
đủ lớn, để kiểm tra tính liên kề cho từng hàm là điều không khả thi. Đôi khi, việc chỉ ra
hai đồ thị không là đẳng cấu lại đơn giản hơn. Việc xác định hai đồ thị không là đẳng cấu
có thể dựa vào một số đặc điểm bất biến qua phép đẳng cấu, ví dụ như số đỉnh, số cạnh
đồ thị … Nếu các đặc điểm trên tương ứng với hai đồ thị có sự sai khác, chúng ta có thể
khẳng định hai đồ thị không là đẳng cấu. Ví dụ, đồ thị đẳng cấu với đơn đồ thị phải có
cùng số đỉnh với đồ thị đó, vì phép đẳng cấu là hàm song ánh giữa hai tập đỉnh đồ thị.

Đồ thị đẳng cấu với đơn đồ thị phải có cùng số cạnh với đồ thị đó. Ngoài ra, bậc của
đồ thị cũng được bảo toàn qua phép đẳng cấu. Ví dụ, đỉnh v trong đồ thị G có bậc là d
thì tương ứng đỉnh f (v ) trong đồ thị H cũng có bậc là d , trong đó giả thiết cho G và H
là đẳng cấu, f là phép đẳng cấu từ đồ thị G đến đồ thị H .

Ví dụ 1.6.2. Đồ thị G và H như hình dưới là không đẳng cấu.

TS.Nguyễn Văn Hiệu Page 31


Cả đồ thị G và H đều có cùng 5 đỉnh và 6 cạnh. Tuy nhiên, H có một đỉnh với bậc là
1 (đỉnh e ), còn G không có đỉnh nào bậc là 1, dẫn đến G và H không đẳng cấu.

Số đỉnh, số cạnh và bậc của mỗi đỉnh thuộc đồ thị là bất biến đối với phép đẳng cấu.
Nếu một trong các giá trị trên của hai đồ thị không trùng khớp nhau thì khẳng định hai đồ
thị không cùng đẳng cấu. Tuy nhiên, trong trường hợp các giá trị trên đều trùng khớp vẫn
chưa là điều kiện đủ để xác định hai đồ thị có đẳng cấu hay không. Thực tế, không có tập
các điều kiện bất biến nào giúp xác định tính đẳng cấu của hai đồ thị.

Ví dụ 1.6.3. Xác định hai đồ thị hình dưới có đẳng cấu không?

Đồ thị G và H đều có 8 đỉnh và 10 cạnh, có 4 đỉnh với bậc là 2 và 4 đỉnh với bậc là
3. Tuy nhiên, G và H là không đẳng cấu. Rõ ràng, với deg (a )=2 trong G , đỉnh a phải
tương ứng với một trong các đỉnh t , u , x , hoặc y trong H , là các đỉnh có bậc bằng 2. Tuy
nhiên, tương ứng với các đỉnh trên trong H đều có các đỉnh liền kề với bậc là 2, mà điều
đó không đúng với đỉnh a trong G .

TS.Nguyễn Văn Hiệu Page 32


Nói một cách khác, nếu G và H là đẳng cấu thì các đồ thị con của G và H được xây
dựng từ các đỉnh có bậc là 3 và các cạnh nối giữa chúng phải đẳng cấu. Tuy nhiên, hai đồ
thị con ở hình trên lại không đẳng cấu với nhau.

Một cách giúp xác định hàm f từ tập đỉnh của đồ thị G vào tập đỉnh của đồ thị H có
phải là đẳng cấu không, chúng ta có thể sử dụng ma trận kề. Trong thực tế, để xác định f
là đẳng cấu, chúng ta có thể chỉ ra ma trận kề của G là tương đương với ma trận kề của
H

Ví dụ 1.6.4. Xác định đồ thị G và H ở hình dưới là đẳng cấu.

Cả G và H đều có 6 đỉnh và 7 cạnh. Cả hai đều có 4 đỉnh với bậc là 2 và 2 đỉnh với
bậc là 3. Có thể dễ dàng nhận thấy với những đồ thị con của G và H chứa tất cả các đỉnh
có bậc là 2 và các cạnh nối giữa chúng là đẳng cấu với nhau.

Xây dựng hàm f : Vì deg (u1 )=2 và u1 không liền kề với bất kì đỉnh nào có bậc là 2
nên ảnh của u1 phải là v 4 hoặc v 6 (các đỉnh có cùng tính chất trên trong H ). Giả sử
f (u1 )=v 6 . Vì u2 liền kề với u1 nên ảnh của u2 chỉ có thể là v 3 và v 5 . Giả sử f (u2 )=v 3 .

Tiếp tục, sử dụng tính chất liền kề của các đỉnh, chúng ta xác định được f (u3 )=v 4 ,
f (u4 )=v 5 , f (u5 )=v 1 , và f (u6 )=v 2 . Hàm f song ánh từ tập đỉnh của G đến tập đỉnh
của H đã được xác định. Để kiểm tra sự thỏa mãn tính liền kề của f , chúng ta kiểm tra
ma trận kề của G :
TS.Nguyễn Văn Hiệu Page 33
và ma trận kề của H với các hàng và các cột tương ứng là ảnh của các đỉnh thuộc G :

Vì AG =A H nên khẳng định hàm f thỏa mãn tính liền kề. Chúng ta kết luận hàm
f là phép đẳng cấu hay đồ thị G và H là đẳng cấu. Chú ý, nếu f được xác định không
là phép đẳng cấu thì chúng ta chưa thể kết luận G và H không là đẳng cấu, bởi vì còn
phụ thuộc vào các hàm song ánh khác chưa khảo sát.

Bài tập

Bài 1. Tìm đồ thị hợp và đồ thị giao của các cặp đồ thị sau

TS.Nguyễn Văn Hiệu Page 34


Bài 2. Xác định đồ thị bù của các đồ thị sau

a. K n b. K m, n c. C n d. Qn

Bài 3. Xác định tính liên thông, liên thông mạnh, liên thông yếu của các đồ thị sau

Bài 4. Tìm thành phần liên thông mạnh trong các đồ thị sau

TS.Nguyễn Văn Hiệu Page 35


Bài 5. Tìm số đường đi có độ dài n giữa hai đỉnh khác nhau trong đồ thị K 4 với giá
trị của n

a. 2 b. 3 c. 4 d. 5

Bài 6. Tìm tất cả đỉnh cát của các đồ thị sau

TS.Nguyễn Văn Hiệu Page 36


Chương 2. ĐƯỜNG ĐI VÀ CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI
Bài 1. ĐƯỜNG ĐI VÀ CHU TRÌNH

2.1 Đường đi và chu trình


Đường đi là chuỗi các cạnh, bắt đầu bởi một đỉnh thuộc đồ thị và lần lượt đi qua từng
đỉnh tương ứng mỗi cạnh thuộc đường đi. Dưới đây là định nghĩa hình thức của đường đi.

Định nghĩa 2.1.1. Cho n là số nguyên dương và G là đồ thị vô hướng. Một đường đi
với độ dài n từ đỉnh u đến đỉnh v trong G là một chuỗi n cạnh e 1={x 0 , x 1 },
e 2 ={x 1 , x 2 }, …, e n ={x n−1 , x n } thuộc G , trong đó x 0 =u và x n =v .

Trong trường hợp đơn đồ thị, chúng ta kí hiệu đường đi bằng chuỗi các đỉnh như:
x 0 , x 1 , …, x n (bởi vì chuỗi các đỉnh như trên là duy nhất tương ứng với mỗi đường đi). Khi

đó, x 0 gọi là đỉnh khởi đầu, và x n gọi là đỉnh kết thúc. n là độ dài đường đi. Đường đi
với chỉ một đỉnh x 0 có độ dài bằng 0.

Đường đi được gọi là mở nếu x 0 ≠x n . Ngược lại, gọi là đường đi đóng.

Ví dụ 2.1.1. Trong đồ thị

đường đi

v 2 ,v 5 ,v 1 , v 5 ,v 4 ,v 4 ,v 4

là đường đi mở, và đường đi

TS.Nguyễn Văn Hiệu Page 37


v 4 , v 4 , v 3 ,v 2 , v 5 , v 4

là đường đi đóng.

Đường đi được gọi là chu trình nếu có độ dài lớn hơn 0 và có điểm đầu trùng điểm
cuối (là đường đi đóng). Theo định nghĩa trên, đường đi được gọi là chu trình nếu đỉnh
u=v và có độ dài lớn hơn 0 ( n>0 ) . Khi đó, đường đi hay chu trình được gọi là đi qua

các đỉnh x 1 , x 2 , …, x n−1 hay đi qua các cạnh e 1 , e 2 , …, en .

Đường đi đơn hoặc chu trình đơn là đường đi hay chu trình mà trong đó không có hai
cạnh nào trùng nhau.

Đường đi sơ cấp là đường đi không đi qua một đỉnh quá một lần.

Ví dụ 2.1.2. Trong đồ thị đơn ở hình dưới, a, d, c , f , e là một đường đi đơn với độ dài
4 vì {a , d }, {d , c} , {c , f }, và {f , e } đều là cạnh đồ thị.

Tuy nhiên, d , e , c, a không là đường đi, vì {e, c} không phải là cạnh của đồ thị. Chú ý,
b, c , f , e , b là chu trình với độ dài 4, vì {b , c}, {c , f }, {f , e }, và {e, b} là các cạnh thuộc đồ
thị, và nó bắt đầu và kết thúc tại đỉnh b . Đường đi a, b , e, d , a, b, với độ dài 5 không phải
là đường đi đơn vì chứa cạnh {a , b} hai lần.

Định nghĩa 2.1.2. Cho n là số nguyên dương và G là đồ thị có hướng. Một đường đi
với độ dài n từ đỉnh u đến đỉnh v trong G là một chuỗi n cạnh e 1=( x 0 , x 1 ) , e 2 =( x 1 , x2 )
, …, e n =( x n−1 , x n ) thuộc G , trong đó x 0 =u và x n =v .

Với đồ thị có hướng không có cạnh đa cấp, đường đi có thể biểu diễn bởi chuỗi các
đỉnh như: x 0 , x 1 , x 2 , …, x n .

Một đường đi với độ dài lớn hơn 0 bắt đầu và kết thúc tại một đỉnh được gọi là chu
trình.
TS.Nguyễn Văn Hiệu Page 38
Đường đi đơn hay chu trình đơn là đường đi hay chu trình mà trong đó không chứa
hai cạnh nào trùng nhau.

2.2 Tính liên thông


Một mạng máy tính luôn đảm bảo khả năng hai máy tính có thể truyền thông tin cho
nhau, một thông tin có thể truyền gián tiếp đến một hoặc nhiều máy. Khi đó, một đồ thị
dùng để mô tả một mạng máy tính, câu hỏi đặt ra cho đồ thị là: “Luôn tồn tại một đường
đi giữa hai đỉnh thuộc đồ thị?”

Định nghĩa 2.2.1. Một đồ thị vô hướng được gọi là liên thông nếu với mọi cặp đỉnh
khác nhau {u , v}, luôn tồn tại một đường đi bắt đầu tại đỉnh u và kết thúc tại đỉnh v .

Như vậy, bất kỳ hai máy tính nào trong mạng máy tính đều có thể truyền thông tin
cho nhau khi và chỉ khi đồ thị mô tả mạng máy tính đó là liên thông.

Ví dụ 2.2.1. Đồ thị G 1 ở hình dưới là liên thông, vì với mọi cặp đỉnh khác nhau đều có
đường đi giữa chúng. Tuy nhiên, đồ thị G 2 không liên thông. Với cặp đỉnh {a , d }, không
tồn tại đường đi nối giữa chúng.

Định lý 2.2.1. Tồn tại đường đi đơn nối giữa mọi cặp đỉnh khác nhau của đồ thị vô
hướng liên thông.

Chứng minh. Cho u và v là hai đỉnh khác nhau của đồ thị vô hướng liên thông
G=(V , E ) . Vì G là liên thông nên tồn tại ít nhất một đường đi nối giữa u và v . Giả sử
x 0 , x 1 , …, x n−1 , x n , với x 0 =u và x n =v là chuỗi các đỉnh của cạnh nối giữa hai đỉnh u và
v có độ dài bé nhất. Cần chứng minh đường đi trên là đường đi đơn. Giả sử đường đi trên

không là đường đi đơn. Khi đó, tồn tại x i=x j với 0≤i< j . Nghĩa là, tồn tại một đường

TS.Nguyễn Văn Hiệu Page 39


đi nối giữa đỉnh u và đỉnh v x 0 , x 1 , …, x i−1 , x j , …, x n thu được từ
có độ dài ngắn hơn là:
x , …, x j−1 . Điều đó dẫn đến trái ngược
việc loại bỏ đi các cạnh tương ứng với chuỗi đỉnh i
với giả thiết độ dài bé nhất của đường đi ban đầu. ◄

Một thành phần liên thông của đồ thị G là đồ thị con liên thông của G thỏa mãn
điều kiện không là đồ thị con nghiêm ngặt của đồ thị con liên thông khác của G .

Theo định nghĩa, thành phân liên thông của G là đồ thị con liên thông lớn nhất của G
. Một đồ thị G không liên thông có ít nhất hai thành phần liên thông, trong đó các thành
phần liên thông tách rời nhau và hợp của chúng là đồ thị G .

Ví dụ 2.2.2. Đồ thị H ở hình dưới là hợp của 3 thành phần liên thông rời rạc nhau H 1
, H 2 , và H 3 .

Định lý 2.2.2. Nếu đồ thị G có đỉnh v liên thông với một đỉnh thuộc thành phần liên
thông G1 của G thì đỉnh v là một đỉnh thuộc G1 .

Chứng minh.

thuộc G1 thì tồn tại đường đi


'
Nếu đỉnh v liên thông với đỉnh v

'
v=x 0 , x1 ,…, x k =v

trong đồ thị G .

TS.Nguyễn Văn Hiệu Page 40


Từ giả thiết v là một đỉnh thuộc G1 suy ra cạnh ( x k −1 , v ) thuộc G1 , dẫn đến đỉnh x k−1
'
'

thuộc G1 . Tương tự, suy ra đỉnh v thuộc đồ thị G1 .

Ví dụ 2.2.3.

Thành phần liên thông của đồ thị G là G1 ,G2 , G3 và G 4 .

Định lý 2.2.3. Mọi đỉnh của đồ thị G chỉ thuộc một trong các thành phần liên thông.
Tương tự, mọi cạnh của đồ thị cũng chỉ thuộc một trong các thành phần liên thông của G
.

Chứng minh.

Chọn đỉnh v thuộc đồ thị G . Khởi tạo, gán V 1 ={v }, thực hiện lặp đi lặp lại thao tác
dưới:
'
Nếu v là đỉnh thuộc G thoả mãn v ∉V 1 và
' '
- v liền kề với một vài đỉnh thuộc
V 1 thì đưa v ' vào tập V 1 : V 1 ← V 1 ∪{v ' }.

Do đồ thị G có hữu hạn các đỉnh nên quá trình trên sẽ kết thúc sau hữu hạn bước. Tập
V 1 thu được cùng với các cạnh nối giữa chúng thuộc đồ thị G sẽ tạo ra một đồ thị con G1

liên thông chứa đỉnh v . G1 liên thông vì mọi đỉnh thuộc đồ thị đều kết nối được với đỉnh
v nên chúng kết nối với nhau. Theo định lý trên suy ra đỉnh v không thuộc thành phần
liên thông khác.

Chứng minh tương tự với trường hợp cạnh.


TS.Nguyễn Văn Hiệu Page 41
2.3 Tính liên thông mạnh
Định nghĩa 2.3.1. Đồ thị có hướng được gọi là liên thông mạnh nếu với mọi cặp đỉnh
khác nhau {a , b} , luôn tồn tại đường đi từ a đến b và đường đi từ b đến a .

Với đồ thị có hướng liên thông mạnh, luôn tồn tại một chuỗi các cạnh có hướng bắt
đầu từ một đỉnh bất kì đến một đỉnh khác.

Định nghĩa 2.3.2. Đồ thị có hướng được gọi là liên thông yếu nếu với mọi cặp đỉnh
khác nhau, luôn tồn tại đường đi nối giữa hai đỉnh trong điều kiện đồ thị chuyển về đồ thị
vô hướng.

Nói cách khác, đồ thị có hướng được gọi là liên thông yếu khi và chỉ khi luôn tồn tại
đường đi giữa hai đỉnh khi hướng của các cạnh bị xóa đi. Rõ ràng, mọi đồ thị liên thông
mạnh đều là liên thông yếu.

Ví dụ 2.3.1. Kiểm tra tính liên thông của đồ thị G và H ở hình dưới.

Đồ thị G là liên thông mạnh vì tồn tại một đường đi giữa hai đỉnh bất kì của đồ thị.
Suy ra, G cũng là liên thông yếu. Đồ thị H không là liên thông mạnh. Không tồn tại
đường đi từ a đến b trông đồ thị. Tuy nhiên, H là đồ thị liên thông yếu, vì luôn tồn tại
đường đi giữa hai đỉnh bất kì nếu chuyển H thành đồ thị vô hướng.

Đồ thị con của đồ thị có hướng G được gọi là thành phần liên thông mạnh nếu thỏa
mãn hai điều kiện: (i) là đồ thị liên thông mạnh và (ii) là đồ thị con liên thông mạnh lớn
nhất của G , có nghĩa là không tồn tại đồ thị con liên thông mạnh khác của G chứa nó.

Ví dụ 2.3.2. Đồ thị H ở hình trên có 3 thành phần liên thông mạnh gồm: đỉnh a ; đỉnh
e ; và đồ thị con gồm các đỉnh b, c , và d cùng với các cạnh (b , c ) , (c , d ) , và (d , b ) .

Ví dụ 2.3.3. Xét đồ thị G= (V , E )

TS.Nguyễn Văn Hiệu Page 42


Đồ thị G0 =(V 0 , E 0 ) với 0 { 1 2 3 } và 0 { 1 2 3 } là đồ thị con liên thông của đồ
V = x ,x ,x E = e ,e ,e

thị G , nhưng không phải là thành phân lien thông của G .

Đồ thị G1 =(V 1 , E1 )=[ { x 1 , x 2 , x 3 }] với V 1 ={ x 1 , x 2 , x 3 } và E1 ={ e1 , e 2 , e 3 , e 4 } là thành phần


liên thông của G .

Đồ thị G2 =( V 2 , E 2 )=[ { x 4 , x 6 }] với


V 2 ={ x 4 , x6 } E2 ={ e5 }
và là thành phần liên thông của
G.

Đồ thị G3 =( { x 5 } , ∅ ) là thành phần liên thông của G .

Đồ thị G có 3 thành phần liên thông.

Chú ý. Đồ thị liên thông khi và chỉ khi có số thành phần liên thông bằng 1.

Định lý 2.3.1. Cho đồ thị đơn G=(V , E ) với n đỉnh và k thành phần liên thông. Khi
đó số cạnh m của đồ thị thoả mãn bất đẳng thức

(n−k )( n−k + 1)
n−k ≤m≤
2 .

Chứng minh

2 Bất đẳng thức n−k ≤m : chứng minh bằng quy nạp theo m .

Với m=0 , đồ thị không có thành phần liên thông, khi đó n=k , bất đẳng thức đúng.

Với m≥1 , gọi G =( V , E ) là đồ thị thu được từ G bằng cách bỏ bớt 1 cạnh. Kí hiệu
' ' '

' ' ' '


n , k và m là số đỉnh, số thành phần liên thông và số cạnh của G . Có 2 khả năng:

' '
- n =n , k =k và m' =m−1 . Theo giả thiết quy nạp: n−k =n' −k ' ≤ m' ≤ m .
TS.Nguyễn Văn Hiệu Page 43
' '
- n =n , k =k +1 và m' =m−1 . Khi đó, n−k =n' −k ' +1≤ m' +1= m .
(n−k )(n−k +1)
m≤
3 Bất đẳng thức 2 : chứng minh quy nạp theo k .

n(n−1) n(n−1)
m≤
Với k =1 , vì đồ thị đơn với n đỉnh có số cạnh lớn nhất là: 2 , nên 2

Với k > 1 , đồ thị G có k thành phần liên thông:

G i =( V i , Ei )
với ni đỉnh và mi cạnh, với mọi i=1 ,…, k .

Khi đó, ta có

n1 +n2 +⋯+ nk =n

m 1 +m2 +⋯+ mk=m

Đặt h=n1 + n2 và G là đồ thị có n = n−1 đỉnh gồm k −1 thành phần liên thông
' '

K h−1 ,G 3 ,…, Gk

K h−1 là đơn đồ thị đầy đủ với h−1 đỉnh. Theo giả thiết quy nạp

' ( n' −( k−1 ) )( n' −( k −1)+1 ) ( n−k )( n−k +1)


m≤ ⇔ m' ≤
2 2

Tiếp theo ta có

n1 ( n 1−1 ) n2 (n2 −1) h(h−1)


m1 +m2 ≤ + ≤
2 2 2

Dẫn đến

(n−k )( n−k +1)


m≤m' ≤
2 .

TS.Nguyễn Văn Hiệu Page 44


Hệ quả. Mọi đơn đồ thị n đỉnh với số cạnh lớn hơn (n−1)(n−2)/2 là đồ thị liên
thông.

Định nghĩa 2.3.3. Cho G=(V , E ) là đồ thị liên thông. Tập cạnh F ⊂ E gọi là tập
tách cạnh của G nếu G−F không liên thông. F gọi là tập tách cạnh cực tiểu nếu F là
' '
tập tách cạnh và không tồn tại tập F ⊂ F thoả F là tập tách cạnh. Tập tách cạnh chỉ có
1 cạnh được gọi là cầu.

Định nghĩa 2.3.4. Đại lượng λ (G)=min { card ( F ) } , trong đó F là tập tách cạnh của G ,
gọi là số liên thông cạnh của G .

Đồ thị G gọi là k cạnh liên thông nếu mọi tập tách cạnh có ít nhất k cạnh.

Định nghĩa 2.3.5. Tập đỉnh W ⊂ V gọi là tập tách đỉnh của đồ thị liên thông G , nếu
G−W không liên thông. Tập W gọi là tập tách đỉnh cực tiểu nếu W là tập tách đỉnh và
' '
không tồn tại tập W ⊂ W thoả W là tập tách đỉnh. Tập tách đỉnh chỉ có 1 cạnh được gọi
là đỉnh tách.
Định nghĩa 2.3.6. Đại lượng κ (G)=min { card(W ) } , trong đó W là tập tách đỉnh của G
, gọi là số liên thông đỉnh của G .

Đồ thị G gọi là k liên thông nếu mọi tập tách đỉnh có ít nhất k đỉnh.
Ví dụ 2.3.4. Xét đồ thị

Các tập cạnh: {b,c},{e,g},{b,c,d},{d ,e,g},{d} là tập tách cạnh, trong đó tập {d } là
cầu. Số liên thông cạnh λ (G)=1 .
Các tập đỉnh: {2,3},{3,4},{3},{4},{5,7} là tập tách đỉnh, trong đó tập {3} và {4 } là
đỉnh tách. Số liên thông đỉnh κ (G)=1 .
Định nghĩa 2.3.7. Cho G= (V , E , ω ) là đồ thị trọng số. Định nghĩa khoảng cách từ
đỉnh u đến đỉnh v là độ dài đường đi ngắn nhất từ u đến v , kí hiệu d (u , v ) .
Đại lượng e (v )=max { d (v , w )|w∈ V } gọi là độ lệch tâm của đỉnh v ,∀ v ∈ V .Bán kính
của đồ thị G , kí hiệu r (G ) , là độ lệch tâm nhỏ nhất.
r (G )=min { e( v )|v ∈V }
Đỉnh v ∈ V gọi là đỉnh tâm nếu e (v )=r (G ) . Tập hợp tất cả các đỉnh tâm gọi là tâm
của đồ thị, kí hiệu C (G) .
TS.Nguyễn Văn Hiệu Page 45
2.4 Đường đi và Tính đẳng cấu
Dựa vào đường đi và chu trình có thể giúp xác định tính đẳng cấu của hai đồ thị. Ví
dụ, một chu trình đơn với độ dài xác định là bất biến qua phép đẳng cấu và có thể được
dùng để kiểm tra tính đảng cấu của hai đồ thị. Thêm vào đó, đường đi có thể được sử
dụng giúp xây dựng phép đẳng cấu.

Ví dụ 2.4.1. Xác định đồ thị G và đồ thị H ở hình dưới có đẳng cấu hay không?

Cả G và H đều có 6 đỉnh và 8 cạnh. Mỗi đồ thị có 4 đỉnh với bậc 3 và 2 đỉnh với bậc
2. Như vậy, cả 3 đặc điểm bất biến với phép đẳng cấu đều thỏa mãn với hai đồ thị. Tuy
nhiên, H có một chu trình đơn với độ dài 3: v 1 , v 2 , v 6 , v 1 , trong đó G không có chu trình
đơn nào độ dài bằng 3. Kết luận, đồ thị G và H là không đẳng cấu.

Chúng ta vừa chỉ ra ví dụ sử dụng chu trình đơn với độ dài xác định giúp nhận dạng
hai đồ thị có đẳng cấu hay không. Ngoài ra, chúng ta có thể sử dụng đường đi giúp xây
dựng và xác định tính đẳng cấu của hai đồ thị.

Ví dụ 2.4.2. Xác định tính đẳng cấu của đồ thị G và đồ thị H theo hình dưới.

Cả G và H đều có 5 đỉnh và 6 cạnh, trong đó có 2 đỉnh với bậc 3 và 3 đỉnh với bậc 2.
Cả hai đều có 1 chu trình đơn với độ dài 3, 1 chu trình đơn với độ dài 4, và 1 chu trình

TS.Nguyễn Văn Hiệu Page 46


đơn với độ dài 5. Vì mọi đặc điểm bất biến với phép đẳng cấu đều thỏa mãn với hai đồ thị
nên G và H có thể là đẳng cấu. Để xây dựng phép đẳng cấu, chúng ta chỉ ra những
đường đi đi qua tất cả các đỉnh, ảnh của đỉnh tương ứng trong hai đồ thị mà có cùng bậc.
Ví dụ, đường đi u1 , u 4 , u3 , u2 , u5 trong G và đường đi v 3 , v 2 , v 1 , v 5 , v 4 trong H đều đi qua
tất cả các đỉnh của đồ thị tương ứng; bắt đầu bởi đỉnh có bậc là 3; đi qua thứ tự các đỉnh
có bậc 2, 3, và 2; kết thúc tại đỉnh có bậc là 2. Theo hai đường đi trên, chúng ta xác định
phép đẳng cấu như sau: f (u1 )=v 3 , f ( u4 )=v 2 , , , và f (u5 )=v 4 . Dễ
dàng chứng minh f là phép đẳng cấu, và kết luận đồ thị G và H là đẳng cấu.

Định lý 2.4.1. Cho G là đồ thị với ma trận kề A tương ứng với thứ tự các đỉnh là
v 1 , v 2 , …, v n . Số đường đi có độ dài l khác nhau từ đỉnh v i đến đỉnh v j bằng giá trị tại vị

trí (i , j)th của ma trận A .


l

Chứng minh. Định lý chứng minh bàng phương pháp quy nạp. Cho G là đồ thị với
ma trận kề A tương ứng với thứ tự các đỉnh là v 1 , v 2 , …, v n . Số đường đi từ đỉnh v i đến
đỉnh
v j với độ dài 1 chính là giá trị tại vị trí (i , j) của ma trận A .

Giả sử giá trị tại vị trí (i , j) của ma trận A là số đường đi độ dài l khác nhau từ đỉnh
l

v i đến v j . Vì Al+1 =A l A , giá trị tại vị trí (i , j)th của ma trận Al+1 bằng

b i1 a1 j +bi2 a2 j +⋯+bin a nj ,

trong đó, b ik là giá trị tại vị trí (i , k)th của ma trận A . Theo giả thiết quy nạp, b ik là số
l

đường đi độ dài l từ đỉnh v i đến đỉnh v k .

v
Một đường đi độ dài l +1 từ đỉnh v i đến đỉnh j là đường đi độ dài l từ đỉnh v i đến
v
một trong các đỉnh trung gian v k và cạnh nối từ đỉnh v k đến đỉnh j . Theo quy tắc đếm,
số cạnh chính là tích của số cạnh với độ dài l từ v i đến v k , b ik , và số cạnh nối từ đỉnh v k
đến đỉnh
v j , a kj . Như vậy, tổng của tất cả các tích trên tương ứng với mọi trường hợp

đỉnh trung gian v k cho chúng ta kết quả cuối cùng. ◄

Ví dụ 2.4.3. Xác định bao nhiêu đường đi với độ dài 4 từ đỉnh a đến đỉnh d trong đồ
thị G ở hình dưới.

TS.Nguyễn Văn Hiệu Page 47


Ma trận kề của đồ thị G tương ứng với thứ tự các đỉnh: a, b , c, d là

đến đỉnh d là giá trị tại vị trí (1, 4)th của ma trận A .
4
Số cạnh với độ dài 4 từ đỉnh a

nên có chính xác 8 đường đi với độ dài 4 khác nhau từ đỉnh a đến đỉnh d . Có thể liệt
kê ra như sau: a, b , a, b, d ; a, b , a, c, d ; a, b , d, b , d ; a, b , d, c , d ; a, c, a, b, d ; a, c, a, c , d ;
a, c, d , b, d ; và a, c, d , c , d .

Định lý 2 có thể được sử dụng giúp xác định độ dài của đường đi ngắn nhất giữa hai
đỉnh của một đồ thị.

Định lý 2.4.2. Cho G1 =(V 1 , E1 ) và G2 =(V 2 , E 2 ) là hai đơn đồ thị. G1 đẳng cấu với G 2
khi và chỉ khi hai ma trận kề tương ứng bằng nhau sau khi thay đổi thứ tự các hàng và cột
nếu cần thiết.

Chứng minh. Suy ra trực tiếp từ định nghĩa.

Định nghĩa 2.4.1. Tính chất P gọi là bất biến nếu mọi cặp đồ thị đẳng cấu G1 và G 2
thỏa mãn: G1 có tính chất P khi và chỉ khi G 2 có tính chất P .

TS.Nguyễn Văn Hiệu Page 48


Do đó để chứng minh hai đồ thị không đẳng cấu ta phải tìm ra tính chất bất biến nào
đó mà một đồ thị có, còn đồ thị kia không có. Sau đây là một số tính chất bất biến về đồ
thị đẳng cấu.

Định lý 2.4.3. Cho G1 =(V 1 , E1 ) và G2 =(V 2 , E 2 ) là hai đồ thị đẳng cấu. Khi đó

(i) G1 và G 2 có số cạnh và số đỉnh bằng nhau.

(ii) Với mọi số tự nhiên k , số đỉnh bậc k của G1 và G 2 bằng nhau.

(iii) Với mọi số tự nhiên k , số chu trình sơ cấp chiều dài k của G1 và G 2 bằng nhau.

Chứng minh. Suy ra từ định nghĩa.

Mệnh đề. Cho hai đơn đồ thị G1 =(V 1 , E1 ) và G2 =(V 2 , E 2 ) đẳng cấu với nhau. Khi đó
các đồ thị đường của chúng đẳng cấu với nhau.

Chứng minh. Ta có song ánh f : V 1 →V 2 là đẳng cấu từ G1 vào G 2 . Ta xây dựng ánh
xạ g : E1 →E 2 như sau:

∀ e=(u , v )∈ E 1 : g(e )=(f (u ), f ( v ))∈ E 2

Theo tính chất của ánh xạ đẳng cấu của f , ánh xạ g hoàn toàn xác định và là song
ánh. Ta cũng dễ dàng thấy rằng, các cạnh a , b trong G1 kề nhau kéo theo các cạnh
g(a),g(b) trong G2 cũng kề nhau, và ngược lại.

Bây giờ nếu ta coi các cạnh là các đỉnh trong các đồ thị đường tương ứng, thì g chính
là đẳng cấu từ L(G1 ) vào L(G2 ) .

Chú ý. Điều ngược lại là không đúng.

Bài tập

Bài 1. Kiểm tra chuỗi các đỉnh dưới có phải là đường đi, đường đi đơn, chu trình?
Xác định độ dài của từng đường đi.

TS.Nguyễn Văn Hiệu Page 49


a) a, e, b, c , b

b) a, e, a, d , b, c , a

c) e , b, a, d , b, e

d) c , b, d , a, e , c

Bài 2. Kiểm tra chuỗi các đỉnh dưới có phải là đường đi, đường đi đơn, chu trình?
Xác định độ dài của từng đường đi.

a) a, b , e, c , b

b) a, d, a, d, a

c) a, d, b, e , a

d) a, b , e, c ,b, d ,a

Bài 3. Xác định các đồ thị nào dưới đây liên thông

a. b. c.

Bài 4. Xác định các thành phần liên thông của các đồ thị ở bài 3.

Bài 5. Tìm thành phân liên thông mạnh của các đồ thị dưới đây

a.

TS.Nguyễn Văn Hiệu Page 50


b.

c.

Bài 6. Tìm thành phân liên thông mạnh của các đồ thị dưới đây

a.

b.

c.

Bài 7. Tìm tất cả đỉnh cắt trong các đồ thị dưới đây

TS.Nguyễn Văn Hiệu Page 51


a.

b.

c.

TS.Nguyễn Văn Hiệu Page 52


Bài 2. CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI

2.5 Đường đi Euler


Định nghĩa 2.5.1. Một chu trình Euler trong đồ thị G là một chu trình đơn đi qua mọi
cạnh của đồ thị G . Một đường đi Euler trong đồ thị G là một đường đi đơn đi qua mọi
cạnh của đồ thị G .

Ví dụ 2.5.1. Đồ thị G 1 (ở hình dưới) có một chu trình Euler: a, e, c , d, e , b, a . Trong đồ


thị G 2 và G 3 không tồn tại chu trình Euler.

Tuy nhiên, trong đồ thị G 3 có đường đi Euler: a, c, d , e, b , d, a , b .

Trong đồ thị G 2 không có đường đi Euler.

Ví dụ 2.5.2. Trong đồ thị H 2 có một chu trình Euler: a, g, c , b, g, e, d , f , a . Cả H 1 và


H 3 đều không có chu trình Euler. H 3 có đường đi Euler: c , a, b, c , d , b . Trong H 1 không
có đường đi Euler.

Định lý 2.5.1. Một đa đồ thị liên thông có số đỉnh lớn hơn 1 có chu trình Euler khi và
chỉ khi mỗi đỉnh thuộc đồ thị có số bậc chẵn.

TS.Nguyễn Văn Hiệu Page 53


Định lý 2.5.2. Một đa đồ thị liên thông có đường đi Euler nhưng không có chu trình
Euler khi và chỉ khi đồ thị có chính xác 2 đỉnh với số bậc lẻ.

Ví dụ 2.5.3. Những đồ thị nào trong hình dưới có đường đi Euler?

Đồ thị G1 chứa chính xác 2 đỉnh với số bậc lẻ: b và d . Như vậy, G1 có đường đi
Euler tương ứng với 2 đỉnh kết thúc là b và d : d , a , b , c ,d , b . Tương tự, đồ thị G 2
b,a, g,f ,e,d ,c ,g,b,c ,f ,d.
2.6 Đường đi Hamilton
Định nghĩa 2.6.1. Một đường đi đơn trong đồ thị G đi qua tất cả các đỉnh của đồ thị,
mỗi đỉnh đúng một lần được gọi là đường đi Hamilton. Một chu trình đơn trong đồ thị G
đi qua tất cả các đỉnh thuộc đồ thị, mỗi đỉnh đúng một lần được gọi là chu trình
Hamilton.

Cho đồ thị G=(V , E ) , đường đi đơn x 0 , x 1 ,…, x n−1 , x n được gọi là đường đi Hamilton
x ≠x j với 0≤i< j≤n , và chu trình đơn x 0 , x 1 ,…, x n−1 , x n , x 0
nếu V ={x 0 , x 1 ,…, x n−1 , x n } và i
(với n> 0 ) là chu trình Hamilton nếu x 0 , x 1 ,…, x n−1 , x n là đường đi Hamilton.

Ví dụ 2.6.1. Những đồ thị nào dưới đây có chu trình Hamilton hoặc đường đi
Hamilton?

TS.Nguyễn Văn Hiệu Page 54


Đồ thị G1 có chu trình Hamilton: a , b , c , d ,e , a . Không tồn tại chu trình Hamilton
trong đồ thị G 2 . Đường đi Hamilton trong đồ thị G 2 : a , b , c , d . G3 không có chu trình
Hamilton và đường đi Hamilton.

Ví dụ 2.6.2. Hãy chỉ ra rằng không đồ thị nào dưới đây có chu trình Hamilton.

Không tồn tại chu trình Hamilton trong đồ thị G vì G có một đỉnh với bậc là 1
(đỉnh e ). Xét đồ thị H , vì các đỉnh a , b , d và e đều có bậc là 2 nên mọi cạnh đi qua các
đỉnh trên đều là một phần của chu trình Hamilton. Dẫn đến chu trình Hamilton sẽ chứa 4
cạnh nối với đỉnh c . Điều đó là không thể.

Định lý 2.6.1. (Dirac’s Theorem) Nếu G là một đồ thị đơn với n đỉnh (n≥3) thỏa
mãn bậc tại mỗi đỉnh lớn hơn hoặc bằng n /2 thì G có một chu trình Hamilton.

Định lý 2.6.2. (Ore’s Theorem) Nếu G là một đồ thị đơn với n đỉnh (n≥3) thỏa mãn
deg (u)+deg( v )≥n với mọi cặp đỉnh u và v trong G thì G có một chu trình Hamilton.

2.7 Bài toán đường đi ngắn nhất


Đồ thị tương ứng với mỗi cạnh có gắn một trọng số được gọi là đồ thị trọng số. Đồ thị
trọng số thường được sử dụng trong các mô hình mạng máy tính. Chi phí giao tiếp, thời
gian trả lời, hay khoảng cách giữa hai máy tính,… là các trọng số trong đồ thị trọng số
dùng mô tả mạng máy tính.

Một số vấn đề thường xuất hiện với đồ thị trọng số. Xác định đường đi ngắn nhất giữa
hai đỉnh đồ thị.

Vấn đề quan trọng khác liên quan đến đồ thị trọng số đó là xác định chu trình đi qua
tất cả các đỉnh, mỗi đỉnh đúng một lần, có độ dài ngắn nhất. Đó chính là bài toán nổi
tiếng “Người đưa thư”, yêu cầu người đưa thư sẽ đến mỗi thành phố đúng một lần và
thỏa mãn độ dài đường đi là ngắn nhất. Chúng ta sẽ thảo luận bài toán “Người đi thư” ở
phần tiếp theo.

TS.Nguyễn Văn Hiệu Page 55


Ví dụ 2.7.1. Hãy xác định đường đi ngắn nhất giữa hai đỉnh a và z trong đồ thị trọng
số dưới đây.

Nhìn vào đồ thị trọng số ở hình trên không khó để chúng ta xác định được ngay
đường đi ngắn nhất từ đỉnh a đến đỉnh z . Tuy nhiên trong phần này chúng ta hãy cùng
thảo luận một số ý tưởng giúp hiểu rõ hơn thuật toán Dijkstra. Chúng ta hãy giải quyết
bài toán tìm đường đi ngắn nhất từ đỉnh a đến một đỉnh bất kỳ, cho đến khi gặp đỉnh z .

Đường đi xuất phát từ a không chứa đỉnh a chỉ có thể là a,b và a , d . Vì trọng số
đường a , b và a , d tương ứng là 4 và 2 nên rõ ràng khẳng định đỉnh d là đỉnh gần với
đỉnh a nhất.

Chúng ta có thể tìm kiếm đỉnh gần kề tiếp theo với đỉnh a bằng việc quan sát tiếp các
đường chỉ đi qua a và d (chỉ tính các đỉnh kết thúc). Đường đi ngắn nhất đến đỉnh b là:
a,b với trọng số là 4, đường đi ngắn nhất đến đỉnh e là: a , d , e với trọng số là 5. Chú
ý, đường đi: a , b , e không được xét, vì nó đi qua đỉnh b . Như vậy, đỉnh gần kề tiếp theo
với đỉnh a là đỉnh b .

Để xác định đỉnh gần kề thứ ba đối với đỉnh a, chúng ta cần kiểm tra các đường đi
qua các đỉnh a , d và b và cũng chỉ khảo sát các đỉnh kết thúc. Đường đi đến đỉnh c có
trọng số là 7 tương ứng là: a , b , c và đường đi đến đỉnh z có trọng số là 6 tương ứng là:
a , d , e , z . Như vậy, z là đỉnh gần kề tiếp theo của đỉnh a và có trọng số đường đi ngắn
nhất là 6. ◄

Ví dụ 1 đã mô tả nguyên tắc cơ bản được sử dụng trong thuật toán Dijkstra. Chú ý
một đường đi ngắn nhất từ đỉnh a đến đỉnh z có thể xác định bằng cách duyệt và kiểm

TS.Nguyễn Văn Hiệu Page 56


tra tất cả các đường đi khác nhau. Tuy nhiên, với phương pháp đó sẽ gây khó khăn cho
người cũng như máy tính nếu đồ thị có số lượng cạnh khổng lồ.

Giờ chúng ta hãy cùng thảo luận vấn đề tổng quát hơn cho bài toán tìm đường đi ngắn
nhất từ đỉnh a đến đỉnh z trong đồ thị đơn liên thông vô hướng có trọng số. Thuật toán
Dijkstra thực hiện bằng cách xác định đỉnh gần kề với đỉnh a nhất, tiếp đến xác định
đỉnh gần kề với đỉnh a tiếp theo, và cứ tiếp tục cho đến khi đỉnh z được xác định.

Ý tưởng chính của thuật toán dựa trên chuỗi các vòng lặp. Một tập đỉnh đã xét sẽ
được xây dựng bằng cách đưa vào từng đỉnh tương ứng mỗi vòng lặp. Tại mỗi vòng lặp
sẽ thực hiện quá trình gán nhãn cho các đỉnh. Đỉnh v được gán nhãn tương ứng với trọng
số đường đi ngắn nhất từ đỉnh a đến đỉnh v thỏa mãn chỉ đi qua các đỉnh trong tập đã
xét. Đỉnh được đưa vào tập đã xét là đỉnh có nhãn nhỏ nhất trong các đỉnh không thuộc
tập đã xét.

Chúng ta hãy cùng thảo luận chi tiết thuật toán Dijkstra. Bắt đầu, gán nhãn cho đỉnh a
là 0 , còn các đỉnh còn lại gàn nhãn là ∞. Chúng ta dùng kí hiệu: L0 (a)=0 và L0 (v )=∞ , ở
đây chỉ số 0 kí hiệu tại vòng lặp 0 . Nhãn được gán cho mỗi đỉnh chính là độ dài ngắn
nhất từ đỉnh a đến đỉnh đó tính tại vòng lặp đang xét.

Sk là kí hiệu tập các đỉnh đã được xét. Tại vòng 0 , S0 =∅ . Tại vòng thứ k , tập Sk là

hợp của tập Sk−1 và đỉnh u không thuộc tập Sk−1 thỏa mãn có nhãn bé nhất.

Sk =S k−1 ∪{u|u ∉ S k−1 ∧Lk −1 (u)−min} .

TS.Nguyễn Văn Hiệu Page 57


Sau khi đưa đỉnh u vào tập Sk , chúng ta cập nhật lại nhãn cho các đỉnh còn lại (các
đỉnh không thuộc tập Sk ). Nhãn của đỉnh vtại vòng lặp k là độ dài đường đi ngắn nhất
từ đỉnh a đến đỉnh v thỏa mãn chỉ đi qua các đỉnh thuộc tập Sk .

Cho v là đỉnh không thuộc tập Sk . Đường đi ngắn nhất từ đỉnh a đến đỉnh v chỉ chứa
các đỉnh thuộc tập Sk hoặc là đường đi ngắn nhất từ đỉnh a đến đỉnh v chỉ chứa các đỉnh
thuộc tập Sk−1 hoặc là đường đi ngắn nhất từ đỉnh a đến đỉnh u được xác định tại vòng
lặp thứ k −1 cùng với cạnh (u , v ) . Nói cách khác

Lk (a,v )=min {Lk−1 (a,v ), Lk−1 (a,u)+w(u,v )}.

Quá trình được lặp lại cho đến khi đỉnh z được đưa vào tập các đỉnh đã xét. Khi đỉnh
z được đưa vào tập đã xét, nhãn của nó cũng chính là trọng số đường đi ngắn nhất từ

đỉnh a đến đỉnh z . Thuật toán Dijkstra được mô tả cụ thể ở hình trên.

TS.Nguyễn Văn Hiệu Page 58


Ví dụ 2.7.2. Dùng thuật toán Dijkstra tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z

trong đồ thị trọng số ở hình (a) (phía trên).

Các bước trong thuật toán Dijkstra để tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z
lần lượt thể hiện qua các hình (b), (c), (d),… trong hình trên. Tại mỗi vòng lặp, đỉnh được
đưa vào tập Sk là đỉnh được vòng tròn lại. Đường đi ngắn nhất từ đỉnh a đến mỗi đỉnh
trong tập Sk được ghi rõ tại mỗi vòng. Thuật toán kết thúc khi đỉnh z được vòng tròn.
Chúng ta xác định đường đi ngắn nhất từ đỉnh a đến đỉnh z là: a , c , b , d ,e , z với trọng
số là 13.

Bài tập

Bài 1. Xác định những đồ thị nào dưới đây có chu trình Euler

TS.Nguyễn Văn Hiệu Page 59


Bài 2. Xác định những đồ thị nào dưới đây có chu trình Euler

Bài 3. Xác định các đồ thị nào dưới đây có chu trình Hamilton

TS.Nguyễn Văn Hiệu Page 60


Bài 4. Tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong các đồ thị sau

Bài 5. Giải quyết bài toán người đưa thư với đồ thị

TS.Nguyễn Văn Hiệu Page 61


Chương 3. CÂY
Bài 1. CÂY VÔ HƯỚNG

3.1 Khái niệm


Định nghĩa 3.1.1. Cây là đồ thị liên thông không chứa chu trình.

Ví dụ 3.1.1. Những đồ thị nào dưới là cây.

G1 và G 2 là cây vì cả hai đều liên thông và không có chu trình. G3 không là cây vì

chứa chu trình e ,b , a , d , e . G 4 không là cây vì là đồ thị không liên thông.

Định lý 3.1.1. Đồ thị vô hướng là cây khi và chỉ khi tồn tại duy nhất một đường đi từ
hai đỉnh bất kỳ thuộc đồ thị.

Chứng minh.

Đầu tiên, giả sử T là cây. Khi đó T là đồ thị liên thông và không chứa chu trình. Cho
u và v là hai đỉnh thuộc T . Vì T là đồ thị liên thông nên tồn tại đường đi đơn nối giữa
u và v . Ngoài ra, đường đi đó là duy nhất. Giả sử tồn tại đường đi khác nối giữa hai
đỉnh u và v . Khi đó, đường đi được tạo từ đường đi thứ nhất từ u đến v nối với đường
đi thứ hai từ v đến u là một chu trình, dẫn đến mâu thuẫn.

Với giả thiết luôn tồn tại đường đi duy nhất nối giữa 2 đỉnh bất kỳ thuộc T suy ra T
là đồ thị liên thông. Giả sử T có chứa chu trình đơn đi qua hai đỉnh u và v . Khi đó sẽ tồn

TS.Nguyễn Văn Hiệu Page 62


tại hai đường đi đơn nối giữa u và v vì chu trình đơn được tạo thành từ 2 đường đi đơn:
đường đi thứ nhất nối từ đỉnh u đến đỉnh v , và đường đi thứ hai nối từ đỉnh v đến đỉnh
u . Như vậy, T không có chu trình đơn. Vậy T là cây.

Định lý 3.1.2. (Định lý tương đương) Cho T là đồ thị n đỉnh. Các mệnh đề sau là
tương đương

- T là cây.

- T không chứa chu trình và có n−1 cạnh.

- T liên thông và có n−1 cạnh.

- T liên thông và mỗi cạnh là cầu.

- Hai đỉnh bất kỳ được nói với nhau bằng một đường duy nhất trong T .

- T không chứa chu trình và nếu thêm một cạnh nối giữa hai đỉnh bất kỳ thì ta
thu được đúng 1 chu trình.

- T liên thông và nếu thêm một cạnh nối giữa hai đỉnh bất kỳ thì ta thu được
đúng 1 chu trình.

Trong vài ứng dụng của cây, một đỉnh đặc biệt thường được gọi là gốc. Vì giữa hai
đỉnh luôn tồn tại một đường đi duy nhất nối giữa chúng, nên khi xác định một đỉnh gốc
trong cây thì các đường đi cũng xác định được hướng và thường là hướng từ đỉnh gốc đến
các đỉnh còn lại.

Định nghĩa 3.1.2. Cây có gốc là cây trong đó có một đỉnh được chọn làm gốc và mỗi
cạnh được định hướng trùng với hướng đi của đường đi đơn duy nhất từ gốc tới mỗi đỉnh.

Cây có gốc có thể được định nghĩa bằng phép quy nạp. Chúng ta có thể biến một cây
không có gốc thành cây có gốc bằng cách chọn bất kỳ một đỉnh thuộc cây làm gốc.

Ví dụ 3.1.2. Hình dưới mô tả cây có gốc tương ứng với gốc là đỉnh a và gốc là đỉnh c
.

TS.Nguyễn Văn Hiệu Page 63


Chúng ta thường vẽ cây có gốc với gốc ở trên đỉnh của cây. Mũi tên chỉ hướng của
các đường đi từ gốc đến các đỉnh.

Định nghĩa 3.1.3. Cho T là cây có gốc v 0 . Giả sử (v 0 , v 1 ,…, v n ) là một đường đi từ v 0
đến v n trong T . Khi đó ta gọi

- v k−1 là cha của v k , với mọi k =1 ,…, n ;

- v 0 ,…, v k−1 là tiền bối của v k , với mọi k =1 ,…, n ;

- v k là con của v k−1 , với mọi k =1 ,…, n ;

- v k ,…, v n là hậu thế của v k−1 , với mọi k =1 ,…, n .

Cho x , y , z là các đỉnh của T , chúng ta nói x là hậu thế của y nếu y là tiền bối của x
; đỉnh y và z được gọi là anh em nếu tồn tại đỉnh x thoả y con x và z con x ; x gọi là
lá nếu x không có con, ngược lại, x gọi là đỉnh trong.

Ví dụ 3.1.3. Cho cây có gốc T ở hình dưới. Xác định cha của đỉnh c , con của đỉnh g ,
anh em của đỉnh h , tất cả tiền bối của đỉnh e , tất cả hậu bối của đỉnh b , tất cả đỉnh trong
và lá? Cây có gốc con với gốc là đỉnh g ?

TS.Nguyễn Văn Hiệu Page 64


- Cha của đỉnh c là đỉnh b .

- Con của đỉnh g là đỉnh h , i và j .

- Anh em của đỉnh h là đỉnh i và j .

- Tiền bối của đỉnh e là đỉnh c , b và a .

- Hậu bối của đỉnh b là đỉnh c , d và e .

- Các đỉnh trong gồm: a , b , c , g ,h , và j .

- Các đỉnh lá gồm: d , e , f , i , k ,l và m .

- Cây có gốc con với gốc là đỉnh g

TS.Nguyễn Văn Hiệu Page 65


Định nghĩa 3.1.4. Cây có gốc được gọi là cây k − phân nếu mọi đỉnh trong của cây có
không quá k đỉnh con. Cây được gọi là cây k − phân đầy đủ nếu mọi đỉnh trong của cây
có đúng k đỉnh con. Với k =2 , chúng ta gọi là cây nhị phân.

Ví dụ 3.1.4. Trong các cây có gốc ở hình dưới, cây nào là cây k − phân đầy đủ ?

T 1 là cây nhị phân đầy đủ vì mỗi đỉnh trong của nó có đúng 2 đỉnh con. T 2 là cây 3−

phân đầy đủ vì mỗi đỉnh trong của nó có đúng 3 đỉnh con. Trong cây T 3 mỗi đỉnh trong
có 5 đỉnh con nên T 3 là cây 5− phân đầy đủ. T 4 không là cây k − phân đầy đủ với mọi giá
trị nguyên dương k vì trong cây T 4 vừa có đỉnh trong với 2 đỉnh con vừa có đỉnh trong
với 3 đỉnh con.

Cây có gốc thứ tự là cây có gốc trong đó các con của mỗi đỉnh trong được sắp xếp thứ
tự. Cây có gốc thứ tự là cân bằng nếu các đỉnh con của mỗi đỉnh trong thuộc cây được
sắp xếp theo thứ tự từ trái sang phải.

Trong cây nhị phân thứ tự (thường gọi là cây nhị phân), nếu một đỉnh trong có hai
đỉnh con, khi đó đỉnh con thứ nhất được gọi là đỉnh con trái và đỉnh con thứ hai được gọi
là đỉnh con phải. Cây có gốc tại đỉnh con trái được gọi là cây con trái. Tương tự, cây có
gốc tại đỉnh con phải gọi là cây con phải.

Cây có gốc thứ tự có thể định nghĩa bằng phép quy nạp.

Ví dụ 3.1.5. Xác định đỉnh con trái, đỉnh con phải của đỉnh trong d và cây con trái,
cây con phải của đỉnh trong c trong cây nhị phân T ở hình dưới

TS.Nguyễn Văn Hiệu Page 66


- Đỉnh con trái của đỉnh d là đỉnh f .

- Đỉnh con phải của đỉnh d là đỉnh g .

- Cây con trái của đỉnh c :

- Cây con phải của đỉnh c :

Định nghĩa 3.1.5. Rừng là đồ thị mà mỗi thành phần liên thông của nó là cây.

3.2 Tính chất cơ bản của cây vô hướng


Định lý 3.2.1. Cây với n đỉnh có n−1 cạnh.

Chứng minh.

Chứng minh bằng phương pháp quy nạp.


TS.Nguyễn Văn Hiệu Page 67
h dẫn đến phát biểu đúng với n=1 .

Bước quy nạp. Giả sử phát biểu đúng với cây có k đỉnh, trong đó k là số nguyên
dương. Nghĩa là, với mọi cây có k đỉnh thì có đúng k −1 cạnh. Giả sử cây T có k +1
đỉnh và v là lá của T , w là cha của v . Loại bỏ đỉnh v trong cây T và cạnh nối giữa w
và v , thu được cây mới T với k đỉnh, vì vẫn đảm bảo tính liên thông và không có chu
'

trình đơn. Theo giả thiết quy nạp, T có k −1 cạnh. Suy ra T có k cạnh, vì số cạnh của T
'

'
lớn hơn số cạnh của T 1 cạnh, là cạnh nối giữa đỉnh w và đỉnh v . Bước quy nạp đã được
chứng minh.

Số đỉnh trong cây k − phân đầy đủ với số đỉnh trong xác định là xác định.

Định lý 3.2.2. Cây k − phân đầy đủ với m đỉnh trong có n=k ×m+1 đỉnh.

Chứng minh.

Mỗi đỉnh, trừ đỉnh gốc, là con của một đỉnh trong. Vì mỗi đỉnh trong có đúng k đỉnh
con nên với m đỉnh trong sẽ có k ×m đỉnh. Cộng thêm đỉnh gốc, số đỉnh trong cây là
n=k ×m+1 .

Cho T là cây k − phân đầy đủ, m là số đỉnh trong và l là số đỉnh lá của T .

Định lý 3.2.3. Cây cây k − phân đầy đủ với

- n đỉnh có m=(n−1 )/k đỉnh trong và l=[ (k−1 )×n+1 ] /k đỉnh lá,

- m đỉnh trong có n=k ×m+1 đỉnh và l=(k−1 )×m+1 đỉnh lá,

- l đỉnh lá có n=(k ×l−1 )/(k −1) đỉnh và m=(l−1)/(k−1 ) đỉnh trong.

Chứng minh.

Theo định lý trên, ta có n=k ×m+1 và n=l+ m suy ra m=(n−1 )/k và

l=n−m=n−( n−1 )/k=[ (k−1 )×n+1 ] /k

Các vế khác chứng minh tương tự.

TS.Nguyễn Văn Hiệu Page 68


Mức của đỉnh là độ dài đường đi duy nhất từ gốc đến đỉnh đó. Mức của đỉnh gốc bằng
0. Độ cao của cây là mức lớn nhất của các đỉnh thuộc cây. Nói cách khác, độ cao của cây
có gốc là độ dài đường đi dài nhất từ gốc đến đỉnh.

Ví dụ 3.2.1. Xác định mức của mỗi đỉnh trong cây có gốc ở hình dưới. Xác định độ
cao của cây?

Đỉnh gốc a có mức là 0. Đỉnh b , j và k có mức là 1. Đỉnh c , e , f , và l có mức là 2.


Đỉnh d , g ,i , m, và n có mức là 3. Cuối cùng, đỉnh h có mức là 4. Vì mức cao nhất của
các đỉnh trong cây là 4 nên độ cao của cây là 4.

Cây k − phân có gốc với độ cao h được gọi là cân bằng nếu mọi lá đều có mức h
hoặc h−1 .

Ví dụ 3.2.2. Những cây nào dưới đây là cân bằng?

T 1 là cân bằng vì tất cả các đỉnh lá của cây đều có mức là 3 hoặc 4. Cây T 2 không cân

bằng vì nó có đỉnh lá với mức là 2, 3 và 4. Cuối cùng, cây T 3 là cân bằng vì mọi đỉnh lá
trong cây đều có mức là 3.
h
Định lý 3.2.4. Có tối đa k đỉnh lá trong cây k − phân với độ cao h .

TS.Nguyễn Văn Hiệu Page 69


Chứng minh.

Chứng minh quy nạp theo độ cao h . Đầu tiên, giả thiết cây k − phân với độ cao 1. Khi
đó cây gồm 1 gốc với không qua k đỉnh con, mỗi đỉnh con cũng chính là đỉnh lá. Như
1
vậy, có tối đa k =k đỉnh lá trong cây k − phân với độ cao 1. Giả thiết quy nạp đúng với
h=1 .

Bước quy nạp. Giả sử giả thiết đúng với cây k − phân với độ cao nhỏ hơn h . Cần
chứng minh giả thiết đúng với cây k − phân với độ cao h . Cho T là cây k − phân với độ
cao h . Lá thuộc T là lá thuộc các cây con của T nhận được từ việc loại bỏ các cạnh nối
từ đỉnh gốc đến các đỉnh có mức là 1, như hình dưới

Mỗi cây con đều có độ cao nhỏ hơn h . Nên theo giải thiết quy nạp, số lá tối đa cho
h−1 h−1
mỗi cây con là k . Vì cây T có tối đa k cây con với số lá tối đa là k nên số lá tối đa
h−1
của cây T là: k ×k =k h . Bước quy nạp đã được chứng minh.

Hệ quả. Nếu cây k − phân với độ cao h có l lá thì h≥⌈log k l⌉ . Nếu là cây k − phân
đầy đủ thì h=⌈log k l⌉ .

Bài tập

Bài 1. Những đồ thị nào dưới đây là cây?

TS.Nguyễn Văn Hiệu Page 70


a. b.

c. d.

e. f.

Bài 2. Cho cây như hình dưới

a. Xác định gốc của cây?

b. Xác định các đỉnh trong của cây?

c. Xác định các lá của cây?

d. Xác định các đỉnh con của đỉnh j ?

e. Xác định các đỉnh cha của đỉnh h ?


TS.Nguyễn Văn Hiệu Page 71
f. Xác định các đỉnh anh em của đỉnh o ?

g. Xác định các đỉnh tiền bối của đỉnh m ?

h. Xác định các đỉnh hậu bối của đỉnh b ?

Bài 3. Với cây trong bài tập 2, hãy xác định mức của các đỉnh?

Bài 4. Với cây trong bài tập, hãy xác định cây con với gốc là:

a. a b. c c. e

TS.Nguyễn Văn Hiệu Page 72


Bài 2. CÁC ỨNG DỤNG CỦA CÂY

Trong bài này chúng ta sẽ giới thiệu 3 vấn đề ứng dụng của cây. Vấn đề thứ nhất: Xây
dựng hệ thống lưu trữ các đối tượng giúp dễ dàng tìm kiếm hay xác định vị trí đối tượng.
Vấn đề thứ hai: Xây dựng hệ thống ra quyết định cho việc tìm kiếm hay xác định một đối
tượng dựa trên các thuộc tính đã biết. Vấn đề thứ ba: Xây dựng hệ thống mã hoá tối ưu
các chuỗi bit từ tập các kí tự.

3.3 Cây tìm kiếm nhị phân


Tìm kiếm một đối tượng trong một danh sách là nhiệm vụ quan trọng trong khoa học
máy tính. Nhiệm vụ đặt ra là xây dựng hệ thống lưu trữ các đối tượng đã được sắp xếp
cùng với thuật toán tìm kiếm hiệu quả. Trong phần này sẽ giới thiệu cây tìm kiếm nhị
phân, là hệ thống lưu trữ và tìm kiếm đối tượng hiệu quả.

Cây tìm kiếm nhị phân là cây nhị phân trong đó mỗi đỉnh con của một đỉnh trong cây
được phân biệt rõ đỉnh con trái và đỉnh con phải, không đỉnh nào có nhiều hơn một đỉnh
con trái và một đỉnh con phải, mỗi đỉnh được gán một nhãn, là một trong các đối tượng
cần lưu trữ. Ngoài ra, các đỉnh được đánh dấu nhãn thoả mãn điều kiện: nhãn của một
đỉnh phải lớn hơn các nhãn của các đỉnh thuộc cây con trái và nhỏ hơn các nhãn của các
đỉnh trong cây con phải.

Quá trình đệ quy xây dựng cây tìm kiếm nhị phân được mô tả như sau. Đầu tiên, cây
được khởi tạo với chỉ một đỉnh, là đỉnh gốc. Đối tượng đầu tiên trong danh sách được gán
nhãn cho gốc của cây. Quá trình đưa lần lượt các đối tượng trong danh sách vào cây được
thực hiện theo các bước. Đầu tiên, so sánh đối tượng với nhãn của các đỉnh trong cây, bắt
đầu từ đỉnh gốc và di chuyển qua cây con trái nếu đối tượng đang xét nhỏ hơn nhãn của
gốc và di chuyên sang phải nếu đối tượng lớn hơn hoặc bằng nhãn của gốc. Khi đối tượng
được xác định nhỏ hơn nhãn của một đỉnh và đỉnh đó không có đỉnh con trái thì đỉnh mới
được gán nhãn tương ứng với đối tượng đang xét được đưa vào cây tại vị trí con trái của
đỉnh trên. Tương tự, khi đối tượng được xác định lớn hơn nhãn của một đỉnh và đỉnh đó
không có đỉnh con phải thì đỉnh mới được gán nhãn tương ứng với đối tượng đang xét
được đưa vào cây tại vị trí con phải của đỉnh trên. Quá trình được mô tả qua ví dụ dưới.

Ví dụ 3.3.1. Xây dựng cây nhị phân tìm kiếm cho các từ mathematics, physics,
geography, zoology, meteoroly, geology, psychology, và chemistry (theo thứ tự alphabet).

TS.Nguyễn Văn Hiệu Page 73


Hình dưới mô tả các bước xây dựng cây tìm kiếm nhị phân. Từ “mathematics” là
nhãn cho gốc của cây. Vì từ “physics” đứng sau từ “mathematics” và đỉnh gốc chưa có
đỉnh con phải nên đưa thêm đỉnh con phải của đỉnh gốc với nhãn là “physics”. Vì từ
“geography” đứng trước từ “mathematics” và đỉnh gốc chưa có đỉnh con trái nên đưa
thêm đỉnh con trái của đỉnh gốc với nhãn là “geography”. Tiếp tục, đưa đỉnh con phải của
đỉnh có nhãn “physics”, và gán nhãn “zoology”, vì từ “zoology” đứng sau từ
“mathematics” và đứng sau từ “physics”. Tương tự, đưa thêm đỉnh con trái của đỉnh có
nhãn “physics”, và gán nhãn “meteoroly”. Đưa thêm đỉnh con phải của đỉnh có nhãn
“geography”, và gán nhãn “geology”. Đưa thêm đỉnh con trái của đỉnh có nhãn
“zoology”, và gán nhãn “psychology”. Cuối cùng, đưa thêm đỉnh con trái của đỉnh có
nhãn “geography”, và gán nhãn “chemistry”.

Khi chúng ta đã có cây tìm kiếm nhị phân, nhiệm vụ tiếp theo là cần xây dựng thuật
toán xác định vị trí đối tượng trong cây. Thuật toán 1 (theo hình dưới) thoả mãn thực hiện
cả hai nhiệm vụ trên. Thư nhất, xác định vị trí đối tượng x trong cây tìm kiếm nhị phân
nếu đối tượng đã được lưu trữ trong cây. Thư hai, đưa thêm đỉnh mới với nhãn là đối
tượng x nếu đối tượng chưa được lưu trữ trong cây.

Trong pseudocode mô tả thuật toán, v là đỉnh đang xét và label (v ) là nhãn của đỉnh v
. Thuật toán bắt đầu bằng việc kiểm tra đỉnh gốc. Nếu đối tượng x bằng nhãn của đỉnh v
thì thuật toán xác định vị trí của x tại đỉnh v và kết thúc. Nếu x nhỏ hơn nhãn của v ,
thuật toán tiếp tục với đỉnh con trái của v . Nếu x lớn hơn nhãn của v , thuật toán tiếp tục
với đỉnh con phải của v . Nếu không xác định được đỉnh con trái hoặc đỉnh con phải của

TS.Nguyễn Văn Hiệu Page 74


đỉnh v thì kết luận đối tượng x chưa được lưu trữ trong cây và đưa đỉnh mới với nhãn x
vào cây tại vị trí đỉnh con trái hoặc đỉnh con phải tương ứng của đỉnh v .

Ví dụ 3.3.2. Áp dụng thuật toán 1 để đưa từ “oceanography” vào cây tìm kiếm nhị
phân ở ví dụ trên.

Thuật toán 1 bắt đầu với đỉnh v , là đỉnh gốc của cây T , có nhãn label (v )=
“mathematics”. Vì v≠null và label (v )= “mathematics” ¿ “oceanography”, chuyển qua
kiểm tra đỉnh con phải của v . Đỉnh con phải của v tồn tại, gán đỉnh v cho đỉnh con phải
của v , label (v )= “physics”. Vì label (v )= “physics” ¿ “oceanography”, chuyển qua kiểm
tra đỉnh con trái của v . Ta có, v≠null và label (v )= “metereology” ¿ “oceanography”,
tiếp tục kiểm tra với đỉnh con phải của v . Tuy nhiên, đỉnh con phải của v không tồn tại
nên đưa thêm đỉnh mới tại vị trí con phải của v và gán v=null . Thoát vòng lặp while vì
v=null . Vì gốc của T khác null và v=null nên trong câu lệnh else if gán nhãn
“oceanography” cho đỉnh mới.

Tiếp đến, chúng ta khảo sát độ phức tạp của thuật toán. Giả sử chúng ta có cây nhị
phân T lưu trữ danh sách n đối tượng. Chúng ta xây dựng cây nhị phân đầy đủ U từ T
bằng cách đưa thêm vào các đỉnh không gán nhãn sao cho mỗi đỉnh gán nhãn đều có 2
đỉnh con. Hình dưới mô tả cây U tương ứng với cây T

TS.Nguyễn Văn Hiệu Page 75


Số phép so sánh cần để đưa một đối tượng mới vào cây là độ dài của đường đi dài
nhất từ đỉnh gốc đến lá trong U . Các đỉnh trong của U là đỉnh của T . Suy ra số đỉnh
trong của U là n . Theo định lý 4 suy ra U có n+1 đỉnh lá. Theo hệ quả, độ cao của U
phải lớn hơn hoặc bằng h=⌈log( n+1)⌉ . Như vậy, cần thực hiện tối thiểu ⌈log(n+1 )⌉ phép
so sánh để đưa thêm một đối tượng vào cây. Chú ý, nếu U là cây cân bằng, độ cao của U
là ⌈log(n+1 )⌉ . Khi đó, để xác định vị trí một đối tượng hay đưa một đối tượng mới vào
cây cần không quá ⌈log(n+1 )⌉ phép so sánh.

3.4 Cây quyết định


Cây có gốc có thể được dùng để mô hình hóa vấn đề trong đó đưa ra một chuỗi các
quyết định để giải quyết vấn đề. Ví dụ, một cây tìm kiếm nhị phân có thể dùng để xác
định vị trí đối tượng dựa trên chuỗi các phép so sánh, trong đó mỗi phép so sánh cho
chúng ta biết hoặc vị trí của đối tượng hoặc tiếp tục tìm kiếm trên cây con trái, hoặc cây
con phải. Cây có gốc trong đó mỗi đỉnh trong thuộc cây tương ứng với một quyết định,
và mỗi cây con của đỉnh là khả năng kết quả xảy ra của quyết định đó, được gọi là cây
quyết định.

Ví dụ 3.4.1. Giả sử chúng ta có 7 đồng xu với trọng lượng như nhau và một đồng xu
lệch có trọng lượng nhỏ hơn. Hỏi cần bao nhiêu lần cân để xác định đúng đồng xu lệch.
Hãy đưa ra thuật toán xác định đồng xu lệch.

Khi cân các đồng xu, có 3 khả năng xảy ra: (1) hai cân bằng nhau, (2) cân bên trái
nặng hơn cân bên phải, và (3) cân bên phải nặng hơn cân bên trái. Tương ứng với ba khả
năng khi cân, chúng ta chọn cây quyết định cho các phép cân là cây 3− phân.
TS.Nguyễn Văn Hiệu Page 76
Có 8 đồng xu, nên cây sẽ có 8 lá, vì sẽ có 8 khả năng kết quả xảy ra, tương ứng mỗi
đồng xu đều có thể là đồng xu lệch.

Số phép cân tối đa cần để xác định đồng xu lệch chính là độ cao của cây quyết định.
Theo hệ quả, độ cao của cây 3− phân với 8 lá là: ⌈log 3 8 ⌉=2 . Như vậy, cần tối thiểu 2
phép cân để xác định được đồng xu lệch.

Cây quyết định cùng với thứ tự các phép cân được mô tả ở hình dưới.

Độ phức tạp của thuật toán sắp xếp. Một vài thuật toán sắp xếp đã được nghiên cứu
trong khoa học máy tính. Để xác định tính hiệu quả của một thuật toán sắp xếp trong thực
tế thường sử dụng khái niệm độ phức tạp của thuật toán. Trong phần này, chúng tôi sẽ sử
dụng cây quyết định như là mô hình xác định độ phức tạp của thuật toán sắp xếp.

Bài toán đặt ra là sắp xếp dãy gồm n đối tượng. Với n đối tượng, chúng ta có tổng số
n ! các bộ thứ tự khác nhau, chính là n ! bộ hoán vị của n đối tượng. Các thuật toán sắp
xếp thường dựa trên các phép so sánh hai ngôi, là phép so sánh 2 đối tượng tại một thời
điểm. Kết quả của phép so sánh lại cho một tập các khả năng sắp xếp. Như vậy, một thuật
toán sắp xếp dựa trên các phép so sánh hai ngôi có thể được mô hình bởi cây quyết định
nhị phân, mà trong đó mỗi đỉnh trong biểu diễn một phép so sánh 2 đối tượng. Mỗi lá
biểu diễn một trong n ! bộ hoán vị của n đối tượng.

Ví dụ 3.4.2. Hình dưới là cây quyết định cho việc sắp xếp danh sách a , b , c .

TS.Nguyễn Văn Hiệu Page 77


Độ phức tạp của thuật toán sắp xếp xác định dựa trên số phép so sánh được sử dụng.
Số phép so sánh tối đa cần để sắp xếp một danh sách gồm n đối tượng là số phép so sánh
được sử dụng trong trường hợp xấu nhất, và chính là độ dài đường đi dài nhất trong cây
quyết định biểu diễn quá trình sắp xếp. Nói cách khác, số phép so sánh tối đa chính là độ
cao của cây quyết định. Độ cao của cây nhị phân gồm n ! lá luôn lơn hơn hoặc bằng
⌈log(n!)⌉ .

Định lý 3.4.1. Thuật toán sắp xếp dựa trên các phép so sánh đòi hỏi tối thiểu ⌈log(n!)⌉
phép so sánh.

Hệ quả. Số phép so sánh được dùng trong một thuật toán sắp xếp n đối tượng dựa
trên phép so sánh là Ω(n logn ) .

Định lý 3.4.2. Trung bình số phép so sánh được dùng trong một thuật toán sắp xếp n

đối tượng dựa trên phép so sánh nhị phân là Ω(n logn ) .

3.5 Mã tiền tố – Huffman coding


Một vấn đề ứng dụng khác đó là sử dụng chuỗi bit để mã hóa các chữ, chuỗi kí tự
trong bộ kí tự alphabet. Chúng ta biểu diễn mỗi kí tự bằng một chuỗi bít với độ dài là 5,
vì tổng số kí tự trong bộ kí tự alphabet là 26 (tổng số chuỗi bit độ dài 5 là 32). Khi đó,
tổng số bit được dùng để giải mã văn bản sẽ gấp 5 lần số kí tự trong văn bản, vì mỗi kí tự
được mã hóa bởi chuỗi 5 bits. Câu hỏi đặt ra là cần xây dựng một sơ đồ mã hóa các kí tự
thỏa mãn mọi văn bản đều có thể được mã hóa và tổng số bit để mã hóa là ít nhất?
TS.Nguyễn Văn Hiệu Page 78
Một hướng giải quyết đó là sử dụng các chuỗi bit với độ dài khác nhau để mã hóa cho
mỗi kí tự khác nhau. Những kí tự có tần suất xuất hiện cao sẽ được mã hóa bởi các chuỗi
bit có độ dài ngắn, và các kí tự có tần suất xuất hiện thấp hơn sẽ được mã hóa bởi các
chuỗi bít có độ dài dài hơn. Khi các kí tự được mã hóa bởi các chuỗi bit với độ dài khác
nhau, một vài hàm sẽ được sử dụng để xác định chuỗi bit nào mã hóa cho kí tự nào. Ví
dụ, nếu kí tự e được mã hóa bởi chuỗi bit 0 , kí tự a được mã hóa bởi chuỗi bit 1 , và kí
tự t được mã hóa bởi chuỗi bit 01 , khi đó với chuỗi bit 0101 có thể được mã hóa một
trong các chuỗi kí tự: eat ,tea,eaea, hoặc tt . Điều này không đảm bảo được tính mã hóa.

Một nguyên tắc để đảm bảo không có chuỗi bit nào có thể mã hóa hơn một chuỗi kí tự
là sơ đồ mã hóa phải thỏa mãn điều kiện: chuỗi bit mã hóa một kí tự không được xuất
hiện ở phần đầu chuỗi bit mã hóa của kí tự khác. Mã hóa thỏa mãn điều kiện trên được
gọi là mã tiền tố.

Ví dụ, mã hóa kí tự e bằng chuỗi bit 0 , kí tự a bằng chuỗi bit 10 , và kí tự t bằng


chuỗi bit 11 là mã tiền tố. Một từ chỉ có thể được mã hóa bởi một chuỗi bit duy nhất, và
một chuỗi bit cũng chỉ giải mã cho ra tối đa là một chuỗi kí tự. Ví dụ, chuỗi bit 10110
được mã hóa cho chuỗi kí tự ate . Để nhìn rõ hơn, chúng ta thấy bit 1 đầu tiên không
được sử dụng để mã hóa một kí tự nào cả, nhưng chuỗi bit 10 được dung để mã hóa kí tự
a . Như vậy, bit 1 tiếp theo cũng không dung để mã hóa kí tự nào cả, và chuỗi bit 11 dung

để mã hóa kí tự t . Bit cuối cùng 0 để mã hóa kí tự e .

Mã tiền tố có thể được biểu diễn bằng cây nhị phân, trong đó các kí tự là nhãn cho
mỗi lá của cây. Cạnh của cây cũng được gán nhãn theo nguyên tắc: cạnh xuất phát từ
đỉnh trong nối với đỉnh con trái của nó được gán nhãn là 0 , và nối với đỉnh con phải
được gán nhãn là 1 . Một chuỗi bit được dùng mã hóa cho một kí tự là chuỗi nhãn của các
cạnh nằm trên đường đi từ gốc đến lá mang nhãn của kí tự đó. Ví dụ, hình dưới mô tả cây
nhị phân mã hóa kí tự e bằng chuỗi bit 0 , kí tự a bằng chuỗi bit 10 , kí tự t bằng chuỗi
bit 110 , kí tự n bằng chuỗi bit 1110 , và kí tự s bằng chuỗi bit 1111 .

Cây biểu diễn mã tiền tố có thể sử dụng để giải mã một chuỗi bit. Ví dụ, xác định
chuỗi kí tự tương ứng với chuỗi bit 11111011100 theo mã tiền tố ở hình trên. Chuỗi bit
được giải mã bắt đầu từ gốc của cây, đi theo chuỗi bit và dừng lại khi gặp đỉnh lá. Với bit
0 sẽ đi tiếp đến đỉnh con trái của đỉnh hiện thời, và bit 1 thì đi tiếp đến đỉnh con phải. Xét
chuỗi bit trên, với chuỗi bit đầu 1111 sẽ tương ứng bắt đầu từ đỉnh gốc, đi lần lượt qua
các đỉnh con phải 4 lần, gặp đỉnh lá s nên xác định chuỗi bit đầu 1111 được giải mã là kí
tự s . Quay về lại đỉnh gốc để giải mã kí tự tiếp theo. Tiếp tục với bit thứ năm là bit 1 , từ
TS.Nguyễn Văn Hiệu Page 79
đỉnh gốc đi theo đỉnh con phải, tiếp tục với bit thứ sau là bit 0 , đi theo đỉnh con trái của
đỉnh hiện thời, gặp đỉnh lá a , xác định kí tự a là giải mã của chuỗi bit tiếp theo 10 . Tiếp
tục với bit thứ bảy, đi qua đỉnh con phải 3 lần, qua đỉnh con trái 1 lần và gặp đỉnh lá với
nhãn n . Cuối cùng, bit cuối cùng là bit 0 , từ gốc đi qua đỉnh con trái gặp ngay đỉnh lá
với nhãn e . Vậy, chuỗi kí tự được giải mã là same .

Huffman coding. Bài toán đặt ra: Cho đầu vào là chuỗi các kí tự cùng tần suất xuất
hiện của mỗi kí tự; Yêu cầu đầu ra là mã tiền tố mã hóa chuỗi kí tự đầu vào với chuỗi bit
ngắn nhất. Trong phần này, chúng ta sẽ giới thiệu thuật toán, gọi là thuật toán Huffman
coding, giúp giải quyết bài toán trên. Thuật toán Huffman coding là thuật toán nền tảng
cho data compression.

Thuật toán Huffman coding được mô tả ở hình dưới. Cho bộ kí tự cùng với tần suất
xuất hiện của mỗi kí tự, nhiệm vụ là xây dựng cây có gốc nhị phân, trong đó các kí tự là
nhãn cho các lá của cây. Thuật toán bắt đầu với một rừng, trong đó mỗi cây trong rừng là
một đỉnh, mỗi đỉnh được gán nhãn là một kí tự. Trọng số của mỗi đỉnh là tần suất xuất
hiện nhãn (kí tự) của đỉnh đó. Tại mỗi bước, chúng ta nối hai cây có tổng trọng số nhỏ
nhất thành một cây bằng cách thêm một đỉnh gốc, nối với cây con phải là cây con có
trọng số lớn hơn, nối với cây con trái là cây con có trọng số nhỏ hơn. Tiếp đến, gán trọng
số của cây bằng tổng trọng số của hai cây con. Thuật toán kết thúc khi nối các cây trong
rừng thành một cây.

TS.Nguyễn Văn Hiệu Page 80


Ví dụ 3.5.1. Sử dụng thuật toán Huffman coding xây dựng mã tiền tố cho các kí tự
cùng tần suất xuất hiện sau: A :0.08,B :0.10 ,C : 0.12,D :0.15,E : 0.20, F :0.35 . Xác
định số bit trung bình dùng để mã hóa 1 kí tự?

Hình dưới trình bày các bước của thuật toán Huffman coding để xây dựng mã tiền tố
cho các kí tự trên. Mã hóa kí tự A bằng chuỗi bit 111 , mã hóa kí tự B bằng chuỗi bit 110
, mã hóa kí tự C bằng chuỗi bit 011 , mã hóa kí tự D bằng chuỗi bit 010 , mã hóa kí tự E
bằng chuỗi bit 10 , mã hóa kí tự F bằng chuỗi bit 00 . Số bit trung bình dung để mã hóa 1
kí tự: 3×0 .08+ 3×0 . 1+ 3×0 . 12+3×0. 15+2×0. 2+2×0 .35=2. 45 .

Chú ý, thuật toán Huffman coding là một thuật toán tham lam. Việc nối hai cây con
với tổng trọng số nhỏ nhất tại mỗi bước đảm bảo tạo ra mã tối ưu. Thuật toán Huffman
coding sẽ được chứng minh trong phần bài tập.

Có nhiều dạng khác nhau của thuật toán Huffman coding. Ví dụ, thay vì mã hoá cho
từng kí tự riêng lẻ, chúng ta có thể mã hoá cho từng nhóm kí tự với độ dài chuỗi bit cố
định. Ví dụ nhóm hai kí tự lại thành một. Sự cải tiến này có thể làm giảm số bit khi mã
hoá một chuỗi kí tự. Ngoài ra, một phiên bản khác của thuật toán Huffman coding khi tần
suất xuất hiện của mỗi kí tự trong chuỗi là không biết, nên việc xây dựng mã tiền tố sẽ
được thực hiện ngay khi đọc văn bản.

TS.Nguyễn Văn Hiệu Page 81


3.6 Cây trò chơi
Một ứng dụng khác của cây đó là sử dụng để phân tích các trò chơi như: tic-tac-toe,
nim, checkers, và chess. Trong mỗi trò chơi, hai người chơi sẽ thực hiện các hoạt động.
Mỗi hoạt động của người chơi sẽ tác động đến trạng thái của trò chơi. Chúng ta sẽ mô
hình các trò chơi bằng cây trò chơi, trong đó mỗi đỉnh của cây biểu diễn các trạng thái trò
chơi, cạnh biểu diễn sự hoạt động làm thay đổi trạng thái: thay đổi từ trạng thái đỉnh đầu
đến trangjt hái đỉnh cuối. Vì cây trò chơi mô tả toàn bộ các trạng thái của trò chơi nên
thường là rất lớn, để giảm độ lớn của cây trò chơi, chúng ta có thể gộp tất cả các trạng

TS.Nguyễn Văn Hiệu Page 82


thái đối xứng thành một và chỉ lưu trong một đỉnh. Tuy nhiên, một vấn đề xảy ra đó là
các trạng thái tương đồng nhau phải được biểu diễn bởi các đỉnh khác nhau nếu tồn tại
các chuỗi hoạt động khác nhau dẫn đến chúng.

Gốc của cây biểu diễn trạng thái ban đầu. Thường các đỉnh ở mức lẻ được biểu diễn
bằng ô vuông và các đỉnh ở mức chẵn được biểu diễn bằng vòng tròn. Khi trò chơi đang
ở một trạng thái thuộc đỉnh có mức lẻ báo hiệu đến lượt người chơi thứ nhất thực hiện
hoạt động. Ngược lại, khi trò chơi đang ở một trạng thái thuộc đỉnh có mức chẵn báo hiệu
đến lượt người chơi thứ hai thực hiện hoạt động. Cây trò chơi có thể vô hạn khi trò chơi
rơi vào trạng thái không bao giờ kết thúc, ví dụ, trò chơi rơi vào vòng lặp vô hạn. Nhưng
hầu hết các trò chơi phổ biến đều có các quy tắc để đảm bảo cây trò chơi biểu diễn nó
luôn là hữu hạn.

Các lá của cây biểu diễn các trạng thái kết thúc của trò chơi. Các lá được gán một giá
trị, là giá trị nhận được của người chơi thứ nhất nếu trò chơi kết thúc tại trạng thái đó. Ví
dụ, với trò chơi thắng-thua, các giá trị của lá là −1 , báo hiệu người chơi thứ hai chiến
thắng, hoặc 1 , báo hiệu người chơi thứ nhất chiến thắng. Với trò chơi có trạng thái hoà,
các trạng thái hoà được gán giá trị là 0 .

Ví dụ 3.6.1. Chúng ta sẽ trình bày một cây trò chơi cho trò chơi well-known và well-
studied game.

TS.Nguyễn Văn Hiệu Page 83


Nim. Trò chơi Nim được phát biểu như sau: Trên bàn có một số ô cùng với các viên
bi trong đó. Hai người chơi lần lượt thực hiện các thao tác thoả mãn: (i) lấy đi một hoặc
nhiều hơn các viên bi trong một ô, và (ii) luôn để ít nhất một viên bi còn lại trên bàn.
Người chơi nào đến lượt nhưng không thực hiện được thao tác thì coi như thua. Cây trò
chơi biểu diễn trò chơi được trình bày ở hình trên.

Trạng thái ban đầu của trò chơi gồm 3 ô, ô thứ nhất có 2 viên bi, ô thứ hai có 2 viên
bi, và ô thứ ba có 1 viên bi. Chúng ta biểu diễn mỗi trạng thái bằng một danh sách không
thứ tự số viên bi tại mỗi ô. Chú ý, chỉ số của các ô là không quan tâm. Thao tác đầu tiên
của người chơi thứ nhất sẽ dẫn đến 3 trạng thái: hoặc người chơi bốc 1 viên bi ở ô chứa 1
viên bi (2 2 ), hoặc bốc 1 viên bi ở ô chứa 2 viên bi ( 2 1 1 ), hoặc bôc 2 viên bi ở ô chứa
2 viên bi (21 ). Khi chỉ còn 1 ô với 1 viên bi trên bàn, rõ ràng người chơi tiếp theo sẽ
không thể thực hiện được thao tác đúng quy định, và đó là trạng thái kết thúc của trò chơi
Nim. Vì đây là trò chơi thắng-thua nên chúng ta gán giá trị cho trạng thái kết thúc là +1
nếu người chơi thứ nhất thắng, −1 nếu người chơi thứ hai thắng.

TS.Nguyễn Văn Hiệu Page 84


Ví dụ 3.6.2. Tic-tac-toe. Cây trò chơi biểu diễn cho trò chơi tic-tac-toe là rất lớn,
không thể vẽ hết toàn bộ ở đây. Tuy nhiên máy tính có thể dễ dàng xây dựng cây cho trò
chơi. Ở hình dưới, trong hình (a ) mô tả một trạng thái của trò chơi. Chú ý, ở đây các
trạng thái đối xứng đã được gộp lại nên chúng ta chỉ cần quan tâm đến 3 khả năng cho
thao tác đầu tiên (hình (a ) ). Hình (b ) trình bày một cây con của cây trò chơi dẫn đến
trạng thái kết thúc của trò chơi.

Định nghĩa 3.6.1. Giá trị của một đỉnh trong cây trò chơi được định nghĩa quy nạp
như sau:

1. Giá trị của một lá là giá trị nhận được của người chơi thứ nhất khi trò chơi kết
thúc tại trạng thái tương ứng với là đó;

2. Giá trị của đỉnh trong với mức lẻ của cây là giá trị lớn nhất trong các giá trị
đỉnh con của nó, và giá trị đỉnh trong với mức chẵn là giá trị nhỏ nhất trong các
giá trị đỉnh con của nó.

Giá trị của các đỉnh thuộc cây trò chơi thể hiện chiến lược chơi cho cả hai người chơi,
trong đó người chơi thứ nhất sẽ chơi để đạt trạng thái với giá trị lớn nhất và người chơi
thứ hai sẽ chơi để đạt trạng thái với giá trị nhỏ nhất. Chiến lược như trên gọi là chiến
TS.Nguyễn Văn Hiệu Page 85
lược min-max. Chúng ta có thể xác định người nào sẽ chiến thắng dựa trên giá trị đỉnh
gốc của cây, gọi là giá trị cây trò chơi.

Định lý 3.6.1. Giá trị của một đỉnh thuộc cây trò chơi chỉ cho chúng ta biết giá trị
nhận được của người chơi thứ nhất trong trường hợp cả hai người chơi theo chiến lược
min-max và chơi bắt đầu từ trạng thái của đỉnh đó.

Chứng minh.

Chứng minh bằng phương pháp quy nạp.

Bước khởi tạo. Nếu đỉnh đang xét là đỉnh lá, theo định nghĩa, giá trị của đỉnh chính là
giá trị nhận của người chơi thứ nhất.

Bước quy nạp. Giả sử giả thiết quy nạp đúng với giá trị của các đỉnh con của đỉnh
đang xét. Nghĩa là, giá trị của các đỉnh con chính là giá trị nhận được của người chơi thứ
nhất với giả thiết trò chơi bắt đầu tại các trạng thái của các đỉnh con đó. Xét hai trường
hợp. Trường hợp thứ nhất: đến lượt người chơi thứ nhất chơi, và trường hợp thứ hai: đến
lượt người chơi thứ hai chơi.

Với trường hợp thứ nhất, người chơi sẽ theo chiến lược min-max và chọn trạng thái
tiếp theo (trong các trạng thái tại các đỉnh con) với giá trị lớn nhất. Theo giả thiết quy
nạp, giá trị được chọn chính là giá trị nhận được của người chơi thứ nhất khi trò chơi
được bắt đầu từ trạng thái của đỉnh con đạt giá trị lớn nhất. Theo định nghĩa giá trị của
đỉnh trong với mức lẻ (nhận giá trị lớn nhất trong các giá trị của đỉnh con), giá trị của
đỉnh đang xét chính là giá trị nhận được của người chơi thứ nhất khi trò chơi bắt đầu tại
trạng thái của đỉnh đó.

Trường hợp thứ hai, đến lượt người chơi thứ hai, theo chiến lược min-max, người
chơi sẽ chọn trạng thái với giá trị nhỏ nhất trong các trạng thái của các đỉnh con. Theo giả
thiết quy nạp, giá trị này là giá trị nhận được của người chơi thứ nhất nếu trò chơi được
bắt đầu tại trạng thái của đỉnh con có giá trị nhỏ nhất. Theo đỉnh nghĩa của giá trị đỉnh
trong với mức chẵn, giá trị của đỉnh đang xét chính là giá trị nhận được của người chơi
thứ nhất khi trò chơi được bắt đầu tại trạng thái của đỉnh đó.

TS.Nguyễn Văn Hiệu Page 86


Ví dụ dưới đây sẽ mô tả cụ thể chiến lược min-max hoạt động như thế nào. Sẽ chỉ rõ
giá trị của các đỉnh trong với ví dụ cây trò chơi Nim.

Ví dụ 3.6.3. Ở ví dụ trên, chúng ta xây dựng cây trò chơi cho Nim với trạng thái ban
đầu gồm 3 ô: ô thứ nhất có 2 viên bi, ô thứ hai có 2 viên bi, và ô thứ ba có 1 viên bi. Ở
hình trên chỉ rõ giá trị của mỗi đỉnh trong của cây trò chơi. Giá trị của các đỉnh được xác
định ngược lên từ giá trị của các lá theo chiến lược min-max. Ví dụ, khi chúng ta xác
định được giá trị của 3 đỉnh con của đỉnh gốc, tương ứng giá trị 1 , −1 , và −1 , có thể xác
định giá trị của đỉnh gốc là max (1,−1,−1)=1 . Vì giá trị của gốc là 1 nên theo chiến lược
min-max, người chơi thứ nhất luôn nhận được giá trị 1 , nghĩa là người chơi thứ nhất luôn
luôn thắng.

Bài tập

Bài 1. Xây dựng cây nhị phân tìm kiếm cho danh sách các từ sau: banana, peach,
apple, pear, coconut, mango, papaya theo thứ tự alphabet.

Bài 2. Xác định bao nhiêu phép so sánh cần để xác định vị trí hoặc đưa vào cây các từ
dưới đây
TS.Nguyễn Văn Hiệu Page 87
a. pear b. banana

c. kumquat d. orange

Bài 3. Những mã nào dưới đây là mã tiền tố

a. a:11,e: 0,t :101 ,s:100 .

b. a :0 , e: 1, t :01, s:001 .

c. a:101 ,e:11,t :001 , s:011,n:010 .

d. a:010,e :11,t :011,s :1011,n=1001,i:10101 .


Bài 4. Xây dựng cây nhị phân với mã tiền tố sau

a. a:11,e: 0,t :101 ,s:100 .

b. a:1,e:01 ,t :001 ,s: 0001 ,n:00001 .

c. a:1010 ,e: 0,t :11 ,s:1011,n=1001 ,i :10001

Bài 5. Xác định chuỗi bit mã hoá cho các kí tự a , e ,i , k , o , p , và u nếu sơ đồ mã


hoá được biểu diễn theo cây dưới đây

TS.Nguyễn Văn Hiệu Page 88


Bài 6. Cho mã hoá của các kí tự như sau: a:001,b:0001 ,e:1,r: 0000 ,s:0100 , t : 011
và x : 01010 . Giả mã cho các chuỗi bit sau:

a. 01110100011 .

b. 0001110000 .

c. 0100101010 .

d. 01100101010 .

Bài 7. Dùng Huffman coding xây dựng mã tiền tố cho các kí tự cùng tấn suất xuất
hiện như sau: a:0.20,b:0.10,c :0.15,d :0.25,e: 0.30 . Xác định số bit trung bình để mã
hoá một kí tự?

Bài 8. Xây dựng Huffman code cho các kí tự tiếng Anh với bảng tần suất xuất hiện
mỗi kí tự như hình dưới

Bài 9. Vẽ cây con của cây trò chơi tic-tac-toe bắt đầu với mỗi trạng thái dưới đây. Xác
định giá trị của cây?

TS.Nguyễn Văn Hiệu Page 89


a. b.

c. d.

TS.Nguyễn Văn Hiệu Page 90


Bài 3. DUYỆT CÂY

Cây thứ tự có gốc thường được ứng dụng trong việc lưu trữ thông tin. Để tiện truy cập
thông tin, một nhiệm vụ quan trọng đó là xây dựng các hàm, các thủ tục cho phép truy
xuất dữ liệu lưu trữ tại các đỉnh của cây. Ngoài ra, cây thứ tự có gốc còn được sử dụng
trong các phép biểu diễn mệnh đề toán học.

3.7 Universal Address System


Quá trình duyệt hết toàn bộ các đỉnh của một cây thứ tự có gốc phụ thuộc vào thứ tự
các đỉnh con của một đỉnh thuộc cây. Trong cây thứ tự có gốc, các đỉnh con của một đỉnh
trong được sắp xếp theo thứ tự từ trái sang phải. Chúng ta sẽ mô tả một cách có thể tổng
quát thứ tự của các đỉnh trong cây thứ tự có gốc. Chúng ta gán nhãn cho các đỉnh theo
phương pháp quy nạp như sau:

1. Nhãn của gốc là 0 . Khi đó k đỉnh con của nó (có mức 1) từ trái sang phải
được gán nhãn là: 1,2,3,…,k .

2. Với mỗi đỉnh v tại mức n có nhãn là A , k v đỉnh con của nó từ trái sang phải
được gán nhãn là:
A .1, A .2,…, A .k v .

Theo cách gán nhãn trên, một đỉnh v tại mức n , với n≥1 sẽ được gán nhãn là
x 1 .x 2 .…x n , trong đó chỉ có duy nhất một đường đi từ gốc đến v đi qua đỉnh thứ x 1 với

mức 1, đỉnh thứ x 2 với mức 2,… Cách gán nhãn như trên gọi là universal address system
của cây thứ tự có gốc.

Đỉnh có nhãn x 1 .x 2 .…x n gọi là nhỏ hơn đỉnh với nhãn y 1 . y 2 .… y m nếu tồn tại i ,
0≤i≤n , với x 1= y 1 , x 2 = y 2 ,… , x i−1 = y i−1 và x i < y i , hoặc nếu n< m và x i= yi với
i=1,2,…,n .
Ví dụ 3.7.1. Hinh dưới trình bày cách gán nhãn universal address system cho cây thứ
tự có gốc. Thứ tự các nhãn là:

0<1<1 . 1<1. 2<1 .3<2<3<3 .1<3 . 1. 1<3 .1 . 2<3 .1 .2 . 1<3 .1 .2 . 2


¿ 3 .1 . 2. 3<3 . 1. 2. 4 <3 . 1. 3<3 .2<4<4 . 1<5<5 . 1<5. 1 .1<5 . 2<5 .3

TS.Nguyễn Văn Hiệu Page 91


3.8 Thuật toán duyệt cây
Trong phần này sẽ giới thiệu các thuật toán duyệt cây thứ tự có gốc phổ biến. Thuật
toán duyệt cây là thuật toán mô tả quá trình duyệt qua tất cả các đỉnh của cây thứ tự có
gốc. Có 3 thuật toán duyệt cây cơ bản gồm: duyệt theo thứ tự preorder, duyệt theo thứ tự
inorder, và duyệt theo thứ tự postorder. Mỗi thuật toán được định nghĩa theo phương
pháp quy nạp. Đầu tiên, chúng ta định nghĩa thuật toán duyệt theo thứ tự preorder.

Định nghĩa 3.8.1. Cho T là một cây thứ tự có gốc r . Nếu T chỉ chứa mỗi đỉnh r thì
phép duyệt đỉnh r là phép duyệt theo thứ tự preorder của T . Ngược lại, giả sử T 1 ,T 2 ,…,T n
là các cây con của r sắp xếp từ trái sang phải. Khi đó phép duyệt theo thứ tự preorder bắt
đầu duyệt từ gốc r , tiếp đến duyệt T 1 theo thứ tự preorder, duyệt T 2 theo thứ tự preorder,
cứ tiếp tục đến cuối cùng duyệt T n theo thứ tự preorder.

Hình dưới mô tả quá trình duyệt cây theo thứ tự prorder.

TS.Nguyễn Văn Hiệu Page 92


Thuật toán duyệt theo thứ tự preorder.

Ví dụ 3.8.1. Xác định thứ tự duyệt các đỉnh theo thuật toán duyệt preorder tương ứng
với cây T ở hình dưới

TS.Nguyễn Văn Hiệu Page 93


Các bước thực hiện trong quá trình duyệt theo thứ tự preorder với cây T được mô tả ở
hình dưới

TS.Nguyễn Văn Hiệu Page 94


Đầu tiên, bắt đầu duyệt đỉnh gốc a , tiếp đến duyệt danh sách các đỉnh của cây con
gốc b theo thứ tự preorder, duyệt danh sách các đỉnh của cây con gốc c (chỉ có mỗi đỉnh
c ) theo thứ tự preorder, và duyệt danh sách các đỉnh của cây con gốc d theo thứ tự
preorder.

Danh sách theo thứ tự preorder của cây con gốc b bắt đầu từ đỉnh b , tiếp đến là danh
sách các đỉnh của cây con với gốc e theo thứ tự preorder, các đỉnh của cây con với gốc
f theo thứ tự preorder (chỉ có mỗi đỉnh f ). Danh sách theo thứ tự preorder của cây con
gốc d bắt đầu với đỉnh d , tiếp đến là danh sách các đỉnh của cây con gốc g theo thứ tự
preorder, tiếp đến là danh sách các đỉnh của cây con gốc h theo thứ tự preorder (chỉ có
mỗi đỉnh h ), tiếp đến là danh sách các đỉnh của cây con gốc i theo thứ tự preorder (chỉ
có mỗi đỉnh i ).

Danh sách theo thứ tự preorder của cây con với đỉnh gốc e bắt đầu từ đỉnh e , tiếp đến
là danh sách các đỉnh của cây con gốc j theo thứ tự preorder (chỉ mỗi đỉnh j ), tiếp đến
danh sách các đỉnh của cây con gốc k theo thứ tự preorder. Danh sách các đỉnh cây con
gốc g là: g , l, m .
Cuối cùng, danh sách các đỉnh của cây T theo thứ tự preorder là:

TS.Nguyễn Văn Hiệu Page 95


a , b , e , j ,k , n , o , p , f , c , d , g ,l , m ,h , i.
Định nghĩa 3.8.2. Cho T là một cây thứ tự có gốc r . Nếu T chỉ chứa mỗi đỉnh r thì
duyệt đỉnh r là phép duyệt theo thứ tự inorder của T . Ngược lại, giả sử T 1 ,T 2 ,…,T n là các
cây con của r sắp xếp từ trái sang phải. Phép duyệt theo thứ tự inorder bắt đầu từ duyệt
cây con T 1 theo thứ tự inorder, tiếp đến duyệt đỉnh gốc r , duyệt T 2 theo thứ tự inorder, cứ
tiếp tục và cuối cùng duyệt T n theo thứ tự inorder.

Hình dưới mô tả quá trình duyệt cây theo thứ tự inorder.

Thuật toán duyệt theo thứ tự inorder.

TS.Nguyễn Văn Hiệu Page 96


Ví dụ 3.8.2. Xác định thứ tự duyệt các đỉnh của cây T (ở ví dụ trên) theo thứ tự
inorder.

Các bước của phép duyệt cây T theo thứ tự inorder được mô tả ở hình dưới. Quá trình
duyệt bắt đầu từ danh sách các đỉnh của cây con gốc b theo thứ tự inorder, tiếp đến duyệt
gốc a , duyệt danh sách các đỉnh của cây con gốc c theo thứ tự inorder, và cuối cùng
duyệt danh sách các đỉnh cây con gốc d theo thứ tự inorder.

Danh sách các đỉnh của cây con gốc b theo thứ tự inorder bắt đầu bằng danh sách các
đỉnh của cây con gốc e (theo thứ tự inorder), gốc b , và đỉnh f . Danh sách theo thứ tự
inorder của cây con gốc d bắt đầu với danh sách theo thứ tự inorder của cây con gốc g ,
tiếp đến là gốc d , đỉnh h , và đỉnh i .

Danh sách theo thứ tự inorder của cây con gốc e là j , tiếp đến đỉnh gốc e , tiếp đến là
danh sách theo thứ tự inorder của cây con gốc k . Danh sách theo thứ tự inorder của cây
con gốc g là l , g , m . Danh sách theo thứ tự inorder của cây con gốc k là n , k , o , p .

Cuối cùng, danh sách các đỉnh theo thứ tự inorder của cây T là

j , e ,n , k , o , p , b , f , a , c ,l , g ,m , d ,h , i.

TS.Nguyễn Văn Hiệu Page 97


TS.Nguyễn Văn Hiệu Page 98
Định nghĩa 3.8.3. Cho T là một cây thứ tự có gốc r . Nếu T chỉ chứa mỗi đỉnh r thì
r là quá trình duyệt theo thứ tự postorder của T . Ngược lại, giả sử T 1 ,T 2 ,…,T n là các cây
con của r sắp xếp từ trái sang phải. Quá trình duyệt theo thứ tự postorder bắt đầu duyệt
cây con T 1 theo thứ tự postorder, tiếp đến duyệt cây con T 2 theo thứ tự postorder, cứ tiếp
tục duyệt T n theo thứ tự postorder, và cuối cùng duyệt đỉnh gốc r .

Hình dưới mô tả quá trình duyệt cây theo thứ tự postorder.

Thuật toán duyệt theo thứ tự postorder.

Ví dụ 3.8.3. Xác định thứ tự duyệt các đỉnh của cây T (ở ví dụ trên) theo thứ tự
postorder.

TS.Nguyễn Văn Hiệu Page 99


Các bước của phép duyệt cây T theo thứ tự postorder được mô tả ở hình dưới. Quá
trình duyệt bắt đầu từ danh sách các đỉnh của cây con gốc b theo thứ tự postorder, tiếp
đến duyệt danh sách các đỉnh của cây con gốc c và cây con gốc d theo thứ tự postorder,
cuối cùng duyệt đỉnh gốc a .

Danh sách các đỉnh của cây con gốc b theo thứ tự postorder bắt đầu bằng danh sách
các đỉnh của cây con gốc e (theo thứ tự postorder), đỉnh f và gốc b . Danh sách theo thứ
tự postorder của cây con gốc d bắt đầu với danh sách theo thứ tự postorder của cây con
gốc g , đỉnh h , đỉnh i và gốc d .

Danh sách theo thứ tự postorder của cây con gốc e bắt đầu bởi đỉnh j , tiếp đến là
danh sách theo thứ tự postorder của cây con gốc k và đỉnh gốc e . Danh sách theo thứ tự
postorder của cây con gốc g là l , m, g . Danh sách theo thứ tự inorder của cây con gốc
k là n , o , p,k .
Cuối cùng, danh sách các đỉnh theo thứ tự postorder của cây T là

j , n , o , p , k , e , f , b , c ,l , m, g , h ,i , d , a.

TS.Nguyễn Văn Hiệu Page 100


TS.Nguyễn Văn Hiệu Page 101
3.9 Cây biểu diễn biểu thức
Một ứng dụng nữa của cây thứ tự có gốc là biểu diễn các biểu thức, mệnh đề phức tạp
như: các mệnh đề phức trong Toán học, các biểu thức với tập hợp, các biểu thức số học,
… Ví dụ, để biểu diễn một biểu thức số học gồm các dấu + (dấu cộng), − (dấu trừ), ¿
(dấu nhân), ¿ (dấu chia), ↑ (dấu luỹ thừa), chúng ta cần dùng các dấu ngoặc để phân chia
thứ tự cho các phép toán. Cây thứ tự có gốc có thể dùng để biểu diễn các biểu thức số học
trên, trong đó mỗi đỉnh trong của cây biểu diễn các phép toán, và các lá biểu diễn cho các
số và các biến. Mỗi phép toán được thực hiện với các cây con trái và cây con phải của nó
(theo một thứ tự). Cây thứ tự có gốc biểu diễn các biểu thức gọi là cây biểu diễn biểu
thức.

Ví dụ 3.9.1. Xây dựng cây thứ tự có gốc biểu diễn biểu thức số học sau:

(( x + y )↑2 )+((x−4 )/3 )


Cây nhị phân dùng biểu diễn biểu thức trên được xây dựng từ dưới lên. Đầu tiên, xây
dựng cây con cho biểu thức x + y . Tiếp đến, kết nối để xây dựng cây con lớn hơn, biểu
diễn biểu thức ( x+ y )↑2 . Bên cạnh đó, cây con khác được xây dựng để biểu diễn biểu
thức x−4 , tiếp tục nối dài để xây dựng cây con lớn hơn biểu diễn biểu thức ( x−4 )/3 .
Nối hai cây con biểu diễn biểu thức: ( x+ y )↑2 và ( x−4 )/3 , có cây thứ tự có gốc biểu
diễn biểu thức: (( x + y )↑2 )+((x−4 )/3 ) . Các bước được minh hoạ ở hình dưới.

TS.Nguyễn Văn Hiệu Page 102


Phép duyệt theo thứ tự inorder của cây nhị phân biểu diễn một biểu thức số học không
đảm bảo tính logic của biểu thức gốc như trật tự các biến, số và các phép toán, các thành
phần của các phép toán. Ví dụ, cho các cây nhị phân lần lượt biểu diễn các biểu thức
( x+ y )/( x +3 ) , ( x+( y /3 ))+3 , và x +( y /(x +3 )) như hình dưới. Với phép duyệt theo thứ
tự inorder, tất cả các cây trên đều cho kết quả biểu thức là: x + y / x+ 3 , đều không phù
hợp tính logic với các biểu thức gốc ban đầu. Để tránh các trường hợp nhập nhằng, chúng
ta cần thêm các dấu ngoặc đơn đảm bảo phép duyệt cây theo thứ tự inorder chính xác.
Biểu thức được nhận từ phép duyệt cây nhị phân biểu diễn một biểu thức theo thứ tự
inorder và thêm đầy đủ các dấu ngoặc đơn được gọi là infix form.

Prefix form của một biểu thức là kết quả nhận được khi duyệt cây thứ tự có gốc biểu
diễn biểu thức đó theo thứ tự preorder. Biểu thức được viết dưới dạng prefix form còn
được gọi là kí pháp Ba Lan. Đặc điểm cơ bản của cách viết này là không cần dùng đến
các dấu ngoặc và luôn thực hiện từ trái sang phải.

Ví dụ 3.9.2. Xác định ký pháp Ba Lan cho biểu thức (( x + y )↑2 )+((x−4 )/3 ) ?

Dạng prefix form cho biểu thức trên nhận được bằng cách duyệt cây nhị phân biểu
diễn biểu thức (ở hình ví dụ trên) theo thứ tự preorder. Kết quả:

+↑+ xy 2/−x 43 .
Trong dạng ký pháp Ba Lan của một biểu thức, các phép toán hai ngôi như + (phép
cộng) đứng trước hai thành phần của nó theo thứ tự xác định. Như vậy, chúng ta có thể
thực hiện biểu thức dưới dạng ký pháp Ba Lan bằng cách đọc từng kí hiệu từ phải sang
trái. Gặp một phép toán, thực hiện phép toán đó tương ứng với hai thành phần ngay sau

TS.Nguyễn Văn Hiệu Page 103


nó ở phía bên phải. Phép toán thực hiện xong, trả về kết quả là thành phần của phép toán
tiếp theo.

Ví dụ 3.9.3. Xác định giá trị của biểu thức biểu diễn bởi ký pháp Ba Lan sau:

+−¿ 234 /↑234


Các bước thực hiện biểu thức từ phải sang trái được minh hoạ ở hình dưới. Giá trị kết
quả là3 .

Postfix form của một biểu thức là kết quả nhận được khi duyêt cây nhị phân biểu diễn
biểu thức đó theo thứ tự postorder. Biểu thức viết dưới dạng postfix form còn được gọi là
ký pháp Ba Lan ngược. Ký pháp Ba Lan ngược cũng không cần dùng các dấu ngoặc.

Ví dụ 3.9.4. Xác định dạng postfix form của biểu thức (( x + y )↑2 )+((x−4 )/3 ) ?

Dạng postfix form cho biểu thức trên nhận được bằng cách duyệt cây nhị phân biểu
diễn biểu thức (ở hình ví dụ trên) theo thứ tự postorder. Kết quả:

xy +2↑ x 4−3/ + .
Trong biểu thức dạng posrfix form, một phép toán hai ngôi đứng liền sau hai thành
phần của nó. Như vậy, để thực hiện biểu thức dưới dạng posrfix form, đọc biểu thức từ

TS.Nguyễn Văn Hiệu Page 104


trái sang phải, nếu gặp phép toán thì thực hiện phép toán với hai thành phần liền sau.
Sauk hi thực hiện phép toan, kết quả được thay thế cho phép toán tiếp theo.

Ví dụ 3.9.5. Xác định giá trị của biểu thức dạng postfix form sau:

723×−4 ↑93/ +
Các bước thực hiện biểu thức từ phải sang trái được minh hoạ ở hình dưới. Giá trị kết
quả là 4 .

Bài tập

Bài 1. Xây dựng universal address system cho các cây thứ tự có gốc sau

a. b. c.

TS.Nguyễn Văn Hiệu Page 105


Bài 2. Giả sử nhãn của đỉnh v trong cây thứ tự có gốc T là 3 . 4 . 5. 2 . 4

a. Xác định mức của v ?

b. Xác định nhãn đỉnh cha của v ?

c. Xác định số đỉnh an hem tối thiểu của v ?

d. Xác định số đỉnh nhỏ nhất có thể của T ?

Bài 3. Xác định phép duyệt theo thứ tự preorder các cây dưới đây

a. b. c.

TS.Nguyễn Văn Hiệu Page 106


Bài 4. Xác định phép duyệt theo thứ tự inorder các cây ở bài tập 3.

Bài 5. Xác định phép duyệt theo thứ tự postorder các cây ở bài tập 3.

Bài 6. Biểu diễn biểu thức (( x+2 )↑3 )×( y−(3+ x))−5 bằng

a. Cây nhị phân

b. Prefix form.

c. Posrfix form.

d. Infix form.

Bài 7. Biểu diễn biểu thức ¬( p∧q )↔(¬ p∨¬q ) và (¬ p∧(q ↔ ¬ p ))∨¬q bằng

a. Cây nhị phân

b. Prefix form.

c. Posrfix form.

d. Infix form.

Bài 8. Vẽ cây biểu diễn biểu thức cho các biểu thức viết dưới dạng prefix form sau

a. +¿+−53214

b. ↑+23−51

c. ¿ / 93+¿ 24−76
Bài 9. Xác định giá trị của các biểu thức ở bài tập 8.

Bài 10. Xác định giá trị cho các biểu thức dạng postfix form

a. 521−−314 ++¿

b. 93 /5+ 72−¿

TS.Nguyễn Văn Hiệu Page 107


c. 32×2↑53−84 / ¿−

TS.Nguyễn Văn Hiệu Page 108


Chương 4. Cây Khung
Bài 1. CÂY KHUNG

4.1. Cây khung


Định nghĩa 4.1.1. Cho đồ thị G=(V , E ) là đơn đồ thị. Cây T gọi là cây khung hay
cây bao trùm của G nếu T là cây chứa toàn bộ đỉnh của G .

Một đơn đồ thị có cây khung thì phải liên thông, vì tồn tại một đường đi trong cây
khung nối giữa hai đỉnh thuộc đồ thị. Điều ngược cũng đúng, nghĩa là mọi đồ thị liên
thông đều có ít nhất một cây khung.

Ví dụ 4.1.1. Xác định cây khung của đơn đồ thị G ở hình dưới.

Đồ thị G liên thông, nhưng không phải là cây vì có chứa chu trinh đơn. Loại bỏ cạnh
{a , e} để triệt tiêu một chu trình đơn, nhận được đồ thị con vẫn liên thông và chứa toàn bộ
đỉnh của đồ thị G . Tiếp tục loại bỏ cạnh {e , f } để triệt tiêu chu trình đơn thứ hai. Cuối
cùng, loại bỏ cạnh {c , g}, nhận được đơn đồ thị con không chứa chu trình đơn. Đồ thị con
này là cây khung, vì nó là một cây chứa toàn bộ đỉnh đồ thị G . Quá trình loại bỏ các cạnh
được minh hoạ ở hình dưới.

TS.Nguyễn Văn Hiệu Page 109


Định lý 4.1.1. Đồ thị G=(V , E ) có cây khung khi và chỉ khi G liên thông.

Chứng minh.

( ⇒) : Nếu G có cây khung T , T chứa toàn bộ đỉnh thuộc G . Ngoài ra, luôn tồn tại
một đường đi trong T nối giữa hai đỉnh thuộc nó. Vì T là đồ thị con của G , nên đường
đi trong T cũng là đường đi trong G . Vậy luôn tồn tại đường đi nối giữa hai đỉnh thuộc
đồ thị G . Suy ra, G liên thông.

( ⇐) : Giả sử G liên thông. Nếu G không là cây, G phải chứa một chu trình đơn.
Loại bỏ một cạnh thuộc chu trình đơn đó. Đồ thị con nhận được có ít hơn 1 cạnh nhưng
vẫn liên thông và chứa toàn bộ đỉnh thuộc đồ thị G . Nếu đồ thị con không là cây, nó phải
chứa chu trình đơn, và tiếp tục loại bỏ một cạnh trong chu trình đơn, nhận được đồ thị
con mới. Cứ tiếp tục cho đến khi đồ thị con không chứa chu trình đơn. Vì đồ thị G chứa
hữu hạn cạnh nên quá trình luôn kết thúc. Quá trình kết thúc khi không xuất hiện chu
trình đơn. Cây nhận được vẫn bảo đảm tính liên thông và chứa toàn bộ đỉnh của đồ thị G
nên đó là cây khung của G . Vậy G chứa cây khung.

4.2. Thuật toán tìm kiếm theo chiều sâu


Chứng minh định lý 4.1 chính là thuật toán tìm cây khung bằng cách loại bỏ các cạnh
thuộc chu trình đơn. Thuật toán này không hiệu quả vì luôn yêu cầu phải xác định được
chu trình đơn. Thay vào đó, chúng ta sẽ xây dựng cây khung bằng cách xác định từng
cạnh thuộc cây. Hai thuật toán cơ bản dựa trên nguyên lý đó sẽ được giới thiệu ở phần
này.

Đầu tiên, giới thiệu thuật toán tìm kiếm theo chiều sâu để xây dựng cây khung của
đơn đồ thị liên thông. Xem cây khung như là cây có gốc. Khởi tạo, chọn ngẫu nhiên một
đỉnh thuộc đồ thị làm đỉnh gốc của cây khung. Hình thành đường đi bắt đầu từ gốc bằng
cách đưa thêm các đỉnh và các cạnh, trong đó mỗi cạnh mới liên thông với đỉnh xét trước
đó trong đường đi, và đỉnh mới không thuộc đường đi. Tiếp tục thực hiện cho đến khi
không tìm được đỉnh và cạnh thoả mãn điều kiện. Nếu đường đi đi qua tất cả các đỉnh của
đồ thị, cây nhận được từ đường đi này là một cây khung. Ngược lại, nếu đường đi không
đi qua tất cả các đỉnh thuộc đồ thị, cần bổ sung thêm đỉnh mới và cạnh mới. Khi đó, quay
lại đỉnh cuối cùng được xét trong đường đi, hình thành đường đi mới bắt đầu từ đỉnh này
đi qua các đỉnh mà nó chưa đi qua. Nếu không thực hiện được, lại quay lại với đỉnh khác
trong đường đi và tiếp tục.
TS.Nguyễn Văn Hiệu Page 110
Lặp quá trình trên cho đến khi mọi cạnh đều được xét duyệt. Vì đồ thị có hữu hạn
cạnh và là đồ thị liên thông nên quá trình trên sẽ kết thúc, kết quả đường đi là cây khung
của đồ thị.

Thuật toán tìm kiếm theo chiều sâu còn được gọi là backtracking, vì thuật toán quay
lui xét duyệt các đỉnh đã xét để đưa thêm cạnh mới.

Ví dụ 4.2.1. Dùng thuật toán tìm kiếm theo chiều sâu xác định cây khung của đồ thị
G ở hình dưới

Các bước thực hiện theo thuật toán tìm kiếm theo chiều sâu được minh hoạ ở hình
dưới. Chọn ngẫu nhiên đỉnh bắt đầu là đỉnh f . Hình thành đường đi bằng cách đưa thêm
vào các cạnh không tạo thành chu trình và các đỉnh không thuộc đường đi. Đường đi
được hình thành: f , g , h , k , j . Tiếp đến, quay lại đỉnh k . Không có đường đi bắt đầu
từ đỉnh k và chứa các đỉnh chưa xét. Quay lại đỉnh h . Có đường đi: h , i . Backtrack đến
h , và sau đó đến f . Xác định được đường đi: f ,d , e , c , a . Backtrack đến đỉnh c và

xác định đường: c , b . Kết quả thu được cây khung.

TS.Nguyễn Văn Hiệu Page 111


Các cạnh được chọn trong thuật toán tìm kiếm theo chiều sâu của đồ thị gọi là tree
edges. Tất cả cạnh còn lại của đồ thị phải kết nối một đỉnh với một trong các tiền bối
hoặc hậu bối của đỉnh đó trong cây. Những cạnh đó được gọi là back edges.

Ví dụ 4.2.2. Ở hình dưới, cạnh được tô đậm là tree edges được xác định dựa trên thuật
toán tìm kiếm theo chiều sâu bắt đầu tại đỉnh f . Các cạnh back edges: {e , f } và {f , h}.

Thuật toán 1 xây dựng cây khung của đồ thị G gồm các đỉnh v 1 , v 2 ,…, v n . Đầu tiền,
chọn đỉnh v 1 là gốc. Khởi tạo, cây T gồm duy nhất một đỉnh v 1 . Tại mỗi bước, đưa thêm
đỉnh mới vào cây T cùng với một cạnh mới nối giữa một đỉnh thuộc T và một đỉnh
không thuộc T . Chú ý, tại mỗi bước thêm mới đỉnh và cạnh, cây T luôn không chứa chu
trình đơn vì các cạnh đưa vào đều nối với một đỉnh không thuộc T . Hơn nữa T luôn liên
thông. Vì G là liên thông nên mọi đỉnh thuộc G đều được xét duyệt với thuật toán và
được đưa vào cây. Vậy cây T là cây khung của đồ thị G .

Về độ phức tạp của thuật toán tìm kiếm theo chiều sâu, theo thuật toán với mỗi đỉnh v
, hàm visit( v ) sẽ được gọi khi v là đỉnh đầu tiên thoả mãn điều kiện và chưa được đánh
dấu. Hàm visit( v ) sẽ không được gọi lại. Giả sử danh sách đỉnh kề của đồ thị G đã xác
TS.Nguyễn Văn Hiệu Page 112
định, như vậy không cần phép tính toán để xác định các đỉnh kề của v . Như theo các
bước của thuật toán, mỗi cạnh sẽ được kiểm tra không quá 2 lần nhằm xác định điều kiện
để đưa thêm cạnh đó và đỉnh của nó vào trong cây. Vậy hàm DFS xây dựng cây khung sử
2
dụng O(e ) , hoặc O(n ) bước, trong đó e và n là số cạnh và số đỉnh trong đồ thị G .

Thuật toán tìm kiếm theo chiều sâu có thể được sử dụng như là thuật toán cơ bản để
giải quyết các vấn đề khác trong khoa học máy tính. Ví dụ, có thể sử dụng thuật toán để
tìm đường đi và chu trình trong đồ thị, xác định các thành phần liên thông của đồ thị, và
dùng để xác định các đỉnh cắt của đồ thị liên thông.

4.3. Thuật toán tìm kiếm theo chiều rộng


Một thuật toán khác giúp xây dựng cây khung của đơn đồ thị liên thông đó là thuật
toán tìm kiếm theo chiều rộng (breadth-first search). Tương tự như thuật toán tìm kiếm
theo chiều sau, chúng ta xem cây khung như là một cây có gốc. Khởi tạo, chọn ngẫu
nhiên một đỉnh thuộc đồ thị làm gốc. Tiếp đến đưa tất cả các cạnh liên thông với đỉnh gốc
vào cây. Các đỉnh mới được đưa thêm vào cây được đánh dấu mức 1 của cây khung. Sắp
xếp thứ tự các đỉnh. Tiếp đến, xét duyệt mỗi đỉnh mức 1, đưa thêm các cạnh liên thông
với đỉnh đó vào cây thoả mãn điều kiện không tạo chu trinh đơn trong cây. Duyệt hết các
đỉnh mức 1, các đỉnh mới đưa thêm vào cây được đánh dấu mức 2. Tiếp tục quá trình trên
và kết thúc khi mọi đỉnh đã dduuowcj đưa vào cây. Quá trình luôn kết thúc vì đồ thị có
hữu hạn các cạnh. Kết quả thu được cây có gốc, chính là cây khung của đồ thị.

Ví dụ 4.3.1. Sử dụng thuật toán tìm kiếm theo chiều rộng xây dwungj cây khung cho
đồ thị hình dưới.

Các bước theo thuật toán được minh hoạ ở hình dưới. Khởi tạo, chọn ngẫu nhiên đỉnh
e làm đỉnh gốc. Tiếp đến đưa vào cây các cạnh liên thông với đỉnh e , cùng với các đỉnh

TS.Nguyễn Văn Hiệu Page 113


liền kề với đỉnh e gồm: b , d , f , và i . Tương ứng các đỉnh mới đưa thêm vào được đánh
dấu mức 1. Tiếp theo, đưa các cạnh nối với các đỉnh mức 1 và các đỉnh liền kề với chúng
không thuộc cây gồm: {b , a},{b , c }, {d ,h}, {f , j}, {f , g}, và {i, k } . Các đỉnh mới có mức 2
gồm: a , c , h , j , g , và k . Tiếp theo, đưa các cạnh nối giữa các đỉnh mới đưa vào với các
đỉnh không thuộc cây. Hai cạnh mới đưa vào là: {g ,l} và {k , m} .

Thuật toán 2 mô tả thuật toán tìm kiems theo chiều sâu. Trong thuật toán, giả sử các
đỉnh thuộc đồ thị G được sắp xếp theo thứ tự v 1 , v 2 ,…, v n .

Phân tích độ phức tạp của thuật toán, với mỗi đỉnh v trong đồ thị, chúng ta kiểm tra
tất cả các đỉnh liền kề với đỉnh v và đưa những đỉnh chưa đánh dấu vào cây T . Giả sử
chúng ta đã có danh sách đỉnh kề cho mỗi đỉnh, khi đó không cần phép tính toán cho việc
xác định các đỉnh kề cho đỉnh đang xét. Như phân tích ở thuạt toán tìm kiếm theo chiều
sâu, mỗi cạnh sẽ được kiểm tra không quá 2 lần để xác định có đưa cạnh đó cùng các
TS.Nguyễn Văn Hiệu Page 114
đỉnh của nó vào cây hay không. Vậy, độ phức tạp của thuật toán tìm kiếm theo chiều rộng
2
là: O(e ) hoặc O(n ) bước.

Bài tập

Bài 1. Tìm cây khung cho các đồ thị dưới đây theo phương pháp loại bỏ cạnh của chu
trình đơn

a.

b.

c.

d.

Bài 2. Tìm cây khung cho các đồ thị sau

a. K 5 b.
K4, 4 c.
K 1 ,6

d. Q3 e. C 5 f. W 5

Bài 3. Tìm tất cả cây khung của các đồ thị sau

TS.Nguyễn Văn Hiệu Page 115


a.

b.

c.

Bài 4. Xác định có bao nhiêu cây khung khác nhau của đồ thị

a. K 3 b. K 4 c. K 2 , 2 d. C 5

Bài 5. Dùng thuật toán tìm kiếm theo chiều sâu tìm cây khung cho các đồ thị sau

a.

b.

TS.Nguyễn Văn Hiệu Page 116


c.

Bài 6. Dùng thuật toán tìm kiếm theo chiều rộng tìm cây khung cho các đồ thị ở bài
tập 5.

Bài 2. CÂY KHUNG NHỎ NHẤT

Một công ty lên kế hoạch xây dựng một mạng truyền thông kết nối 5 trung tâm máy
tính thành phần. Mỗi cặp trung tâm đều được kết nối bởi đường truyền điện thoại. Cần
xây dựng hệ thống đảm bảo mỗi cặp trung tâm đều có thể kết nối với chi phí xây dựng
mạng là thấp nhất. Chúng ta có thể mô hình hoá vấn đề trên bằng một đồ thị như hình
dưới, trong đó các đỉnh đồ thị là các trung tâm máy tính thành phần, các cạnh biểu diễn
khả năng kết nối cùng với trọng số là chi phí cho việc kết nối. Chúng ta có thể giải quyết
bài toán trên bằng cách tìm cây khung với tổng trọng số của các cạnh thuộc cây là nhỏ
nhất. Tìm cây khung như vây gọi là cây khung nhỏ nhất.

4.4. Thuật toán tìm cây khung nhỏ nhất


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

TS.Nguyễn Văn Hiệu Page 117


Trong phần này, chúng ta sẽ giới thiệu hai thuật toán tìm cây khung nhỏ nhất. Cả hai
thuật toán đều là thuật toán tham lam, dựa trên ý tưởng cơ bản là tìm và đưa những cạnh
với chi phí nhỏ nhất vào cây khung thoả mãn những điều kiện nhất định.

Thuật toán thứ nhất, được gọi là thuật toán Prim, bắt đầu từ việc chọn cạnh với chi phí
thấp nhất, đưa vào cây. Với việc đưa một cạnh vào cây, chúng ta đã có 2 đỉnh thuộc cây,
tương ứng hai đỉnh đầu của cạnh mới đưa vào. Tiếp đến, tìm các cạnh liên thông với các
đỉnh thuộc cây, chọn cạnh có trọng số thấp nhất, thoả mãn không tạo chu trình đơn với
cây. Đưa cạnh vào cây. Quá trình cứ tiếp tục và dừng lại khi n−1 cạnh đã được đưa vào
cây.

Thuật toán 1 mô tả pseudocode của thuật toán Prim.

Định lý 4.4.1. Thuật toán Prim là đúng.

Chứng minh. Cho cây khung T bất kỳ của đồ thị G . Cần chứng minh
'

d (T ' )≥d (T )

Kí hiệu các đỉnh và các cạnh lần lượt đưa vào T là: v 1 , v 2 ,…, v n và e 1 ,e 2 ,…,e n−1 , trong
đó e k =( v k , v k +1 ) .

Nếu các cạnh của cây khung T trùng với cạnh của cây khung T thì rõ ràng
'

d (T ' )=d (T )

Ngược lại, giả sử e m là cạnh đầu tiên trong dãy các cạnh của T không thuộc T . Cạnh
'

e m và các cạnh thuộc T ' tạo thành chu trình duy nhất C .

TS.Nguyễn Văn Hiệu Page 118


Chu trình C chứa đỉnh v m ∈T m , trong đó m { 1
T = v ,…, v m }
là tập các đỉnh có được sau
bước thêm cạnh e m . Chu trình C bắt buộc phải chứa cạnh e nối đỉnh thuộc tập T m với
đỉnh không thuộc tập T m (nếu không C ⊂ T ). Theo thuật toán, cạnh e có trọng số không
nhỏ hơn trọng số của cạnh e m . Vì vậy thay cạnh e bằng cạnh e m , ta thu được cây khung
'' '
có d (T )≤d (T ) . Cứ tiếp tục, suy ra
''
T

' ''
d (T )≥d (T )≥…≥d (T ) . ◄

Ví dụ 4.4.1. Dùng thuật toán Prim thiết kế mạng truyền thông cho ví dụ trên với chi
phí thấp nhất.

Chúng ta giải quyết vấn đề trên bằng cách tìm cây khung nhỏ nhất của đồ thị ở hình
trên. Thuật toán Prim gồm 4 bước tìm và đưa cạnh vào cây khung được minh hoạ ở hình
vẽ trên. Tổng chi phí thấp nhất của cây khung nhỏ nhất là 3.600$.

Ví dụ 4.4.2. Dùng thuật toán Prim tìm cây khung nhỏ nhất của đồ thị ở hình dưới

TS.Nguyễn Văn Hiệu Page 119


Cây khung nhỏ nhất của đồ thị được xây dựng bởi thuật toán Prim cùng các bước
được minh hoạ ở hình dưới.

Thuật toán thứ hai là thuật toán Kruskal, chon một cạnh với trọng số nhỏ nhất, đưa
vào cây. Tiếp đến, chọn cạnh với trọng số nhỏ nhất thoả mãn không tạo chu trình đơn với
các cạnh đã chọn. Quá trình tiếp tục cho đến khi đã chọn được n−1 cạnh.

Thuật toán 2 mô tả pseudocode của thuật toán Kruskal.

TS.Nguyễn Văn Hiệu Page 120


Định lý 4.4.2. Thuật toán Kruskal là đúng.

Chứng minh. Cho e là cạnh bất kỳ không thuộc cây khung T . Cạnh e cùng các cạnh
của T tạo thành chu trình duy nhất C .
'
bất kỳ trên C , ta có w (e )≤w (e ) . Thật vậy, ở bước 3, do điều kiện chọn
'
Với cạnh e

cạnh e thoả mãn w (e) nhỏ nhất trong điều kiện khi thêm vào cây khung T không tạo chu
trình. Vậy cây khung T là cây khung nhỏ nhất. ◄

Sự khác nhau giữa thuật toán Prim và thuật toán Kruskal. Trong thuật toán Prim, các
cạnh với giá trị trọng số nhỏ nhất liên thông với các đỉnh trong cây và không tạo thành
chu trình được chọn, khác với thuật toán Kruskal đó là các cạnh với trọng số nhỏ nhất
không tạo thành chu trình với các cạnh trong cây, không cần thiết phải liên thông với các
đỉnh thuộc cây được chọn.

Ví dụ 4.4.3. Dùng thuật toán Kruskal tìm cây khung nhỏ nhất của đồ thị trọng số ở ví
dụ trên.

Cây khung nhỏ nhất và các bước chọn theo thuật toán Kruskal được minh hoạ ở hình
dưới.

TS.Nguyễn Văn Hiệu Page 121


4.5. Ứng dụng
Bài toán cây khung lớn nhất

Cho G=(V , E , w) là đồ thị liên thông có trọng số. Tìm cây khung T của đồ thị G có
tổng trọng số

d (T )= ∑ w (e )
e ∈T

là lớn nhất.
'
Xét đồ thị liên thông có trọng số G =(V , E ,−w ) . Áp dụng các thuật toán tìm cây
khung nhỏ nhất Prim hoặc Kruskal cho đồ thị G : cây khung T∗¿ ¿. Ta có:
'

∑ −w( e )≥ ∑ ¿
với mọi cây khung T của đồ thị G .
'
e ∈T ' e ∈T∗¿−w( e)

∑ ¿
e ∈ T ' ∗¿ w( e )≥ ∑ w (e)
Tương đương: e∈T với mọi cây khung T của đồ thị G .
¿
Vậy cây khung T là cây khung lớn nhất của đồ thị G .

Bài toán tìm mạng điện với độ tin cậy lớn nhất

Cho lưới điện có n nút. Đường dây nối nút i với nút j có độ tin cậy pij . Hãy tìm cây
khung T với độ tin cậy toàn phần

TS.Nguyễn Văn Hiệu Page 122


p(T )= ∏ pij
( i, j )∈T

là lớn nhất.

Bài toán này dẫn về bài toán tìm cây khung nhỏ nhất với trọng số mỗi cạnh (i , j) là
w (i, j )=−log 2 p ij .

Thật vậy, cho T là cây khung nhỏ nhất và T là cây khung bất kỳ. Ta có
'

∑ (−log2 pij )≤ ∑ (−log2 pij )


( i, j )∈T (i , j) ∈T '

⇔ ∑ log 2 p ij ≥ ∑ log 2 pij


(i , j) ∈T ( i , j) ∈T '

⇔ log2
( ∏ p ) ≥log ( ∏ p )
(i, j)∈T
ij 2
(i, j )∈T
'
ij

⇔ ∏ p ij ≥ ∏ p ij
( i, j)∈T ( i, j)∈T '

'
⇔ p( T )≥p ( T )

Vậy cây khung T là cây khung có độ tin cậy toàn phần lớn nhất.

Bài tập

TS.Nguyễn Văn Hiệu Page 123


Chương 5. LUỒNG VÀ MẠNG
5.1. Khái niệm về luồng và mạng
Định nghĩa 5.1.1. Mạng (network) là đơn đồ thị trọng số có hướng G=(V , E , w) thoả
mãn điều kiện:

- Có duy nhất một đỉnh, gọi là đỉnh nguồn, không liên thuộc với cung vào.

- Có duy nhất một đỉnh, gọi là đỉnh đích, không liên thuộc cung ra.

- Trọng số w (u , v ) của cung (u , v ) là số dương và gọi là khả năng thông qua của
cung.

- Đồ thị liên thông (yếu).

Ví dụ 5.1.1. Đồ thị sau là mạng với nguồn

Định nghĩa 5.1.2. Cho mạng G=(V , E , w) . Tập giá trị

{ f uv|( u , v ) ∈G }
gọi là luồng trên mạng G nếu thoả mãn các điều kiện

1. 0≤f uv ≤w(u , v ) với mọi (u , v )∈ E .

2. Với mọi đỉnh z không là nguồn hoặc đích

∑ f uz= ∑ f zv
(u, z)∈E (z ,v)∈E

Ví dụ 5.1.2. Với đồ thị ở ví dụ trên, tập {


f uv }
sau là luồng

{ f ab=2, f bc =2 , f cz =3 , f ad =3 , f dc=1 , f de =2 , f ez =2 }
được biểu diễn bằng các trọng số trong ngoặc đơn

TS.Nguyễn Văn Hiệu Page 124


Định lý 5.1.1. Cho {
f uv } ,(u , v )∈G
là luồng trên mạng G với a là đỉnh nguồn và z là
đỉnh đích. Khi đó

∑ f au= ∑ f zv
(a ,u )∈ E (z ,v)∈ E

Chứng minh. Gọi V là tập các đỉnh. Với các đỉnh u và v không kề nhau, gán f uv =0 .
Ta có

∑ ∑ f uv= ∑ ∑ f vu
⇔ u ∈V v ∈V v∈V u ∈V

∑ ( ∑ f uv− ∑ f vu )=0
⇔ v ∈V u ∈V u∈V

∑ ¿
(∑ f uv− ∑ f vu)+ ( ∑ f uz− ∑ f zu)+( ∑ f ua− ∑ f au)=0
⇔ v ∈V {a ,z ¿ u ∈V u∈V u ∈V u∈V u ∈V u ∈V

0+ ∑ f uz − ∑ f av =0
⇔ ( u, z) ∈G ( a , v) ∈G

∑ f au= ∑ f vz
⇔ (a ,u )∈G (v ,z )∈G .

5.2. Luồng cức đại


Phát biểu bài toán luồng cuc đại

Trong thực tế ta thường gặp bài toán gọi là bài toán luông cực đại như sau: Cho mạng
G với a là đỉnh nguồn và z là đỉnh đích. Trong số các luồng trên mạng G , tìm luồng có
giá trị lớn nhất.

Ý tưởng xây dựng luồng cực đại. Xuất phát từ một luồng xác định, tìm đường đi
(không định hướng) từ đỉnh nguồn a đến đỉnh đích z thoả mãn sau khi thay đổi giá trị

TS.Nguyễn Văn Hiệu Page 125


luồng trên đường đi nhận được luồng mới có giá trị lớn hơn luồng cũ. Nếu không tìm
thấy được đường như vậy thì luông hiện tại là luông cức đại.

Giả sử S=(a,…,u, v,…,z ) là đường đi không định hướng từ đỉnh nguồn a đến đỉnh
đích Nếu cạnh (u , v ) là cung thuộc đường S thì gọi là cùng hướng với đường S .
z.

Ngược lại, cạnh (v , u ) là cung thuộc đường S thì gọi là ngược hướng với đường S .
+
Tập các cung cùng hướng với S , kí hiệu S , và tập các cung ngược hướng với S , kí

hiệu S .

Định lý 5.2.1. Cho { uv } là luồng trên mạng G . Giả sử S=(a,…,u, v,…,z ) là đường
f
đi không định hướng từ đỉnh nguồn a đến đỉnh đích z thoả mãn các điều kiện:
+
1. Với mỗi cung (u , v )∈ S : f (u , v )<w(u , v ) .

2. Với mỗi cung (u , v )∈ S : 0< f (u , v ) .
+
Đặt δ =min { x|x ∈ M } >0 , trong đó M là tập các giá trị w (u , v )−f (u , v ) , (u , v )∈ S và
f (u , v ) , (u , v )∈ S− .
'
Ta xây dựng luồng f như sau:

{
f (u , v ) ∀(u , v )∉ S
'
f (u , v )= f (u , v )+δ ∀ (u , v )∈ S+
f (u , v )−δ ∀(u , v )∈ S−

Khi đó, luồng f có giá trị lớn hơn giá trị luồng f một lượng δ .
'

Chứng minh.
+
Theo cách xây dựng thì f thoả mãn các điều kiện của luồng. Cung (a , u )∈ S có
'

f ' ( a ,u )=f ( a , u )+ δ nên giá trị

'
v (f )= ∑ '
f (a , u )= ∑ f ( a ,u )+δ=v (f )+δ
( a ,u )∈G ( a , u) ∈G .

Thuật toán (Ford-Fulkerson). Tìm luồng cực đại.

TS.Nguyễn Văn Hiệu Page 126


Đầu vào. Mạng G với đỉnh nguồn a và đỉnh đích z.

Đầu ra. Luồng cực đại f .

Thuật toán.

1. Khởi tạo. Luồng xuất phát: f (u,v)=0,∀(u,v )∈ G . Kí hiệu a=v 0 , v 1 ,… , v n =z .

2. Đặt nhãn cho nguồn. Gán nhãn (a , ∞ ) cho đỉnh nguồn a .

3. Kiểm tra nhãn của đích. Nếu đỉnh đích z có nhãn, chuyển sang bước 6. Ngược
lại, chuyển sang bước 4.

4. Xác định đỉnh đánh dấu. Trong số các đỉnh mang nhãn và chưa được đánh dấu,
chọn đỉnh v i với chỉ số i nhỏ nhất. Nếu không tồn tại đỉnh như vậy, kết luận f
là luồng cực đại. Ngược lại, gán v=v i và đánh dấu đỉnh v .

5. Đặt nhãn các đỉnh chưa có nhãn, kề với đỉnh v . Giả sử (α , Δ) là nhãn của đỉnh
v . Xét các cung có dạng (v , u ) hoặc (u , v ) theo thứ tự (v ,v 0 ),( v 0 ,v ),( v ,v 1 ),( v 1 ,v),
… trong đó u chưa được gán nhãn.

Với cung dạng (v , u ) : nếu f (v , u)<c( v ,u ) : gán nhãn đỉnh u là


(v ,min {Δ, c ( v , u )−f (v , u)}) , nếu f (v , u)=c (v ,u ) : không gán nhãn đỉnh u .

Với cung dạng (u , v ) : nếu f (u , v )>0 : gán nhãn đỉnh u là (v ,min {Δ, f (u , v )}) ,
nếu f (u , v )=0 : không gán nhãn đỉnh u .

Quay lại bước 3.

6. Hiệu chỉnh luồng. Giả sử ( β ,δ ) là nhãn của đỉnh đích z . Đặt 0


u =z ,u 1=β .

Nếu nhãn của ui là ( β , Δ ) thì đặt ui +1= β . Tiếp tục quá trình cho đến khi
' ' '

uk =a . Lúc đó, ta nhận được đường đi S từ đỉnh a đến đỉnh z

S=(a=uk ,u k−1 ,… ,u1 ,u 0=z )

Hiệu chỉnh luồng f trên đường S như sau :

TS.Nguyễn Văn Hiệu Page 127


f (u , v )=
{
f (u , v )+ δ
f (u , v )−δ
∀(u , v )∈ S +
∀ (u , v )∈ S−

Sau đó xóa tất cả nhãn của các đỉnh trên S và quay lại bước 2.

Định lý 5.2.2. Nếu các khả năng thông qua c(u , v ) là số nguyên thì sau hữu hạn bước
quá trình giải kết thúc.

Chứng minh.

Theo định lý, qua mỗi bước hiệu chỉnh luồng, giá trị luồng tăng lên ít nhất 1 đơn vị
(do c(u , v ) nguyên dương, kéo theo δ nguyên dương). Mặt khác, giá trị luồng bị chặn
trên bởi tổng các khả năng thông qua của các cung đi khỏi đỉnh nguồn. Vì vậy qua một số
hữu hạn bước quá trình giải phải kết thúc.

Hệ quả. Nếu giá trị thông qua c(u , v ) là số hữu tỉ với mọi (u , v )∈ E thì sau hữu hạn
bước quá trình giải kết thúc.

Chứng minh.

Quy đồng mẫu số các giá trị thông qua c(u , v ) . Giả sử mẫu số chung là M . Theo định
lý, qua mỗi bước hiệu chỉnh luồng, giá trị luồng tăng lên ít nhất là 1/ M . Mặt khác, giá trị
luồng bị chặn trên bởi tổng các khả năng thông qua của các cung đi khỏi đỉnh nguồn. Vì
vậy qua một số bước hữu hạn quá trình giải kết thúc.

Ví dụ 5.2.1. Tìm luồng cực đại của mạng G sau

Sắp xếp các đỉnh theo thứ tự : a , b , c , d ,e , z .

- Khởi tạo luồng xuất phát : f (u,v)=0,∀(u,v )∈ G ,ρ( f )=0 .

- Đặt nhãn đỉnh nguồn : (, ∞)

TS.Nguyễn Văn Hiệu Page 128


- Kiểm tra nhãn của đích : đích z chưa có nhãn, chuyển sang bước 4.

- Xác định đỉnh đánh dấu. Các đỉnh mang nhãn và chưa đánh dấu là : a . Chọn a
là đỉnh đánh dấu. Đặt v=a .

- Đặt nhãn các đỉnh kề của đỉnh v : b và d .

- Xét cung (a , b ) , ta có f (a , b )=0< c( a , b)=3 và min { ∞ ,3−0 }=3 nên đặt nhãn
đỉnh b là (a , 3 ) . Tương tự, đặt nhãn (a , 5 ) cho đỉnh d .

- Kiểm tra nhãn của đỉnh đích. Đỉnh z chưa được gán nhãn, chuyển sang bước
4.

- Xác định đỉnh đánh dấu. Các đỉnh mang nhãn và chưa đánh dấu là : b và d .
Chọn b là đỉnh đánh dấu. Đặt v=b .

- Đặt nhãn các đỉnh kề của đỉnh v : c .

- Xét cung (b , c ) , ta có f (b , c )=0<c (b , c )=2 và min { 3 ,2−0 }=2 nên đặt nhãn
đỉnh c là (b , 2) .

- Kiểm tra nhãn của đỉnh đích. Đỉnh z chưa được gán nhãn, chuyển sang bước
4.

TS.Nguyễn Văn Hiệu Page 129


- Xác định đỉnh đánh dấu. Các đỉnh mang nhãn và chưa đánh dấu là : c và d .
Chọn c là đỉnh đánh dấu. Đặt v=c .

- Đặt nhãn các đỉnh kề của đỉnh v : z.

- Xét cung (c , z ) , ta có f (c , z )=0<c (c , z )=4 và min { 2, 4−0 }=2 nên đặt nhãn
đỉnh z là (c ,2 ) .

- Kiểm tra nhãn của đỉnh đích. Đỉnh z đã được gán nhãn, chuyển sang bước 6.

- Hiệu chỉnh luồng. Ta có :

u0 =z ,u 1=c , u2 =b , u3 =a

Đường đi S : (a , b , c , z ) .

Ta có , Hiệu chỉnh luồng vói (u , v )∈ S và xóa nhãn ta nhận được


luồng mói

Giá trị luồng : ρ( f )=2 .

- Quay lại bước 2, đặt nhãn a là (, ∞) và tiếp tục lặp lại quá trình trên ta thu
được mạng với nhãn sau :

TS.Nguyễn Văn Hiệu Page 130


Từ đó, xác định đường đi S từ đỉnh a đến đỉnh z: (a , d , c , z) .

Ta có , Hiệu chỉnh luồng vói (u , v )∈ S và xóa nhãn ta nhận được


luồng mới

Giá trị luồng ρ( f )=4 .

- Quay lại bước 2, đặt nhãn a là (, ∞) và tiếp tục lặp lại quá trình trên ta thu
được mạng vói nhãn sau :

Từ đó, xác định đường đi S từ đỉnh a đến đỉnh z: (a , d , e , z ) .

Ta có , Hiệu chỉnh luồng vói (u , v )∈ S và xóa nhãn ta nhận được


luồng mới

Giá trị luồng : ρ( f )=6 .

- Quay lại bước 2, đặt nhãn a là (, ∞) và tiếp tục lặp lại quá trình trên ta thu
được mạng với nhãn sau :

TS.Nguyễn Văn Hiệu Page 131


Đến đây quay lại bước 3 ta không tìm thấy đỉnh có nhãn chưa xét. Quá trình
giải kết thúc. Luồng hiện tại là cực đại.

5.3. Luồng cực đại và lát cắt cực tiểu


Định nghĩa 5.3.1. Cho mạng G=(V , E ,c ) vói đỉnh nguồn a và đỉnh đích z. Với mọi
S , T ⊂V , kí hiệu tập các cung đi từ S vào T là (S , T ) .

(S , T )={(u , v )∈ E|u ∈ S∧v ∈T }

Nếu S , T ⊂V là phân hoạch của V ( S∪ T =V ∧S∩T =∅ ) và a ∈ S , z ∈ T thì tập


(S , T ) gọi là lát cắt (nguồn-đích).

Khả năng thông qua của lát cắt (S , T ) là giá trị

c( S,T )= ∑ ∑ c(u,v)= ∑ c(u, v)


u ∈S v ∈T (u ,v)∈(S ,T )

Ví dụ 5.3.1. Xét mạng G và luồng f ở hình dưới

Cho S={a ,b ,d } , T ={c , e , z }. Lát cắt (S , T ) : { (b , c ),(d , c ),(d ,e ) } , trong đó

c ( S , T )=6 và f (S ,T )=4

Định lý 5.3.1. Cho mạng G=(V , E ,c ) với đỉnh nguồn a và đỉnh đích z. f là luồng
trên mạng G , (S , T ) là lát cắt của G . Khi đó

ρ( f )=f ( S , T )−f (T , S ) .

Chứng minh.
TS.Nguyễn Văn Hiệu Page 132
Với các đỉnh u , v không kề nhau, gán f (u , v )=0 .

Do tính chất của luồng và a ∈ S , ta có

ρ( f )= ∑ f ( a,v)= ∑
v∈V [ ∑ f ( v,u)− ∑ f (u, v)]
v∈ S u ∈V u∈V (vì với mọi v ∈ S {a ¿ ¿ :

∑ f (v ,u )− ∑ f (u , v )=0
u ∈V u ∈V )

¿ ∑ ∑ f (v ,u )− ∑ ∑ f (u , v )
v ∈S u ∈V v ∈ S u ∈V

¿
[ ∑ ∑ f (v ,u)+ ∑ ∑ f (v ,u)]−[ ∑ ∑ f (u,v )+ ∑ ∑ f (u,v )]
v ∈S u ∈S v ∈S u ∈T v∈ S u∈ S v∈ S u∈T

¿
[ ∑ ∑ f (v ,u)− ∑ ∑ f (u,v )]+[ ∑ ∑ f ( v,u)+ ∑ ∑ f (u,v )]
v ∈S u ∈S v∈ S u ∈S v∈ S u∈T v∈ S u∈T

∑ ∑ f (v ,u )= ∑ ∑ f (u ,v)
Ta có : v ∈S u ∈S v ∈S u ∈S

ρ( f )= ∑ ∑ f ( v , u )− ∑ ∑ f (u , v )= f (S ,T )−f (T , S )
Suy ra : v ∈ S u∈T v ∈S u ∈T .

Định lý. Cho mạng G=(V , E ,c ) với đỉnh nguồn a và đỉnh đích z . f là luồng trên
mạng G , (S , T ) là lát cắt của G . Khi đó khả năng thông qua của lát cắt (S , T ) không nhỏ
hơn giá trị của luồng f . Tức là

c ( S , T )≥ρ( f )

Chứng minh.

Theo tính chất luồng và định lý, ta có

ρ( f )=f ( S , T )−f (T , S )≤f (S ,T )= ∑ ∑ f ( v , u )≤ ∑ ∑ c (v , u)=c (S ,T )


v ∈ S u ∈T v ∈S u∈T

Định lý 5.3.2. Cho mạng G=(V , E ,c ) với đỉnh nguồn a và đỉnh đích z. f là luồng
trên mạng G , (S , T ) là lát cắt của G . Khi đó

TS.Nguyễn Văn Hiệu Page 133


- Nếu c ( S , T )=ρ( f ) thì luồng f đạt giá trị cực đại và lát cắt (S , T ) đạt khả năng
thông qua cực tiểu.

- Đẳng thức c ( S , T )=ρ( f ) xảy ra khi và chỉ khi

1. f (u,v)=c(u,v)∀(u, v)∈( S,T ) ;

2. f (u,v)=0∀(u, v)∈(T ,S) .


Chứng minh.

Nếu c ( S , T )=ρ( f ) thì theo định lý trên, rõ ràng luồng đạt giá trị cực đại và lát cắt đạt
giá trị cực tiểu.

Nếu (1) và (2) đúng thì theo chứng minh định lý 2, rõ ràng ta có đẳng thức
c ( S , T )=ρ( f ) .

Ngược lại, nếu có đẳng thức c ( S , T )=ρ( f ) , theo chứng minh định lý 2 ta có

f (S ,T )=c (S ,T ) và f (T , S )=0 .

Từ đó suy ra (1) và (2).

Định lý 5.3.3. Cho mạng G=(V , E ,c ) với đỉnh nguồn a f là luồng


và đỉnh đích z.

nhận được khi kết thúc thuật toán tìm luồng cực đại Ford-Fulkerson. Khi đó, f là luồng
cực đại. Hơn nữa, nếu S là tập các đỉnh mang nhãn thì ( S , V ¿ ) là lát cắt cực tiểu.

Chứng minh.

Gọi S là tập các đỉnh mang nhãn khi kết thúc thuật giải.

Xét cạnh (u , v ) với u ∈ S và v ∈ V ¿ . Vì u mang nhãn nên f (u , v )=c (u , v ) , nếu


không ở bước 5, ta đặt nhãn đỉnh v .

Xét cạnh (v , u ) với u ∈ S và v ∈ V ¿ . Vì u mang nhãn nên f (v , u)=0 , nếu không ở


bước 5 ta đặt nhãn cho v .

Theo định lý trước, luồng f là cực đại và lát cắt ( S , V ¿ ) là cực tiểu.

TS.Nguyễn Văn Hiệu Page 134


Định lý 5.3.4. (Ford-Fulkerson) Cho mạng G với đỉnh nguồn a và đỉnh đích z. Khi
đó, giá trị luông cực đại bằng khả năng thông qua của lát cắt cực tiểu.

Chứng minh.

Suy ra từ định lý 4.7 và định lý 4.8.

5.4. Mạng tổng quát


Định nghĩa 5.4.1. Mạng tổng quát là đơn đồ thị trọng số có hướng G=(V , E ,c ) thoả
mãn

1. Có duy nhất một đỉnh, gọi là nguồn, không liên thuộc cung vào.

2. Có duy nhất một đỉnh, gọi là đích, không liên thuộc cung ra.

3. Trọng số c(u , v ) của cung (u , v )∈ E là số không âm và gọi là khả năng thông


qua của cung (u , v ) .

4. Trọng số c (u ) của đỉnh u ∈V là số không âm và gọi là khả năng thông qua của
đỉnh u .

5. Đồ thị liên thông (yếu).

Ví dụ 5.4.1. Đồ thị dưới đây là mạng tổng quát với nguồn là đỉnh a và đích là đỉnh z.

Định nghĩa 5.4.2. Cho mạng G với khả năng thông qua c(u , v ) , (u , v )∈G . Tập các
giá trị {f (u , v )|(u , v )∈G} gọi là luồng tổng quát trên mạng G nếu thoả mãn

1. 0≤f (u, v)≤c(u,v )∀(u,v )∈ G ,

2. Với mọi đỉnh k không là nguồn và không là đích:

∑ f (u,k )= ∑ f (k ,v)≤c(k )
( u,k )∈G ( k ,v) ∈G

Định nghĩa 5.4.3. Giá trị của luồng tổng quát f trên mạng G là đại lượng
TS.Nguyễn Văn Hiệu Page 135
ρ( f )= ∑ f ( a , v)= ∑ f (u , z )
( a , v) ∈G ( u , z) ∈G

Định nghĩa 5.4.4. Tập X các cạnh và đỉnh của mạng G gọi là lát cắt tổng quát nếu
mọi đường đi có hướng từ nguồn đến đích đều phải chứa ít nhất một phần tử thuộc X .

Định lý 5.4.1. (Định lý luồng cực đại lát cắt cực tiểu tổng quát) Cho mạng tổng quát
G với nguồn là đỉnh a và đích là đỉnh z . Khi đó, giá trị luồng tổng quát cực đại bằng
khả năng thông qua của lát cắt tổng quát cực tiểu.

5.5. Bài toán luồng cực đại chi phí cực tiểu
Định nghĩa 5.5.1. Mạng chi phí cung G=(V , E ,c , p ) là mạng (V , E , c) với p(e ) là đơn
giá chi phí luồng trên cung e với mọi e ∈ E .

Chi phí luồng của luồng f (e ) trên cung e là tích f (e )× p( e ) .

Chi phí của luồng trên mạng G là tổng chi phí luồng của tất cả các cung

∑ f (e )× p( e )
e∈ E

Bài toán luồng cực đại chi phí cực tiểu. Cho mạng chi phí cung G=(V , E ,c , p ) . Tìm
luồng cực đại có chi phí cực tiểu.

Nhiều bài toán có thể đưa về bài toán luồng cực đại chi phí cực tiểu, mà bài toán dưới
đây là một ví dụ quan trọng.

Định nghĩa 5.5.2. Mạng phân phối có dạng G=(V , E ,c , p ,d ) , trong đó (V , E , c, p ) là


mạng chi phí cung và mỗi đỉnh v ∈ V được gán một trọng số d ( v ) được hiểu là luộng
cung nếu nó nhận giá trị dương và lượng cầu nếu nó nhận giá trị âm. Tổng trọng số bằng
0.

Một luồng trên mạng phân phối G gọi là chấp nhận nếu tại mỗi đỉnh: hiệu luồng ra và
luồng vào bằng trọng số của đỉnh.

Bài toán luồng chấp nhận chi phí cực tiểu là tìm luồng chấp nhận có chi phí cực tiểu.

Định lý 5.5.1. Bài toán luồng chấp nhận chi phí cực tiểu có thể đưa về bài toán luồng
cực đại chi phí cực tiểu.

Chứng minh.
TS.Nguyễn Văn Hiệu Page 136
' ' ' ' '
Xây dựng mạng chi phí cung G =(V , E ,c , p ) như sau

V =V ∪{a , z } ; E =E∪{ ( a , v )|d ( v )>0 }∪{ (u , z )|d ( u )< 0 }


' '

{
c( e ) ∀ e ∈ E
'
c (e )= d (u) ∀ e=( a ,u ), d (u )>0
−d (u ) ∀ e=(u , z ), d (u )<0

p' (e )=
{ p(e ) ∀ e ∈ E
0 ∀e∈ E ¿
'

Rõ ràng nếu f là luồng cực đại chi phí cực tiểu có giá trị luồng bằng tổng lượng cung
thì f thu hẹp trên E là luồng chấp nhận chi phí cực tiểu.

Định nghĩa 5.5.3. Cho luồng f trên mạng chi phí cung G=(V , E ,c , p ) . Định nghĩa
mạng thặng dư, kí hiệu
G f , là mạng có tập đỉnh V , tập cạnh E f , khả năng thông qua c f

và đơn giá chi phí


p f như sau :

1. Với mọi cung (u , v )∈ E , nếu f (u , v )>0 thì (v , u )∈ E f với khả năng thông qua
c f ( v ,u )=f (u , v ) và p f ( v ,u )=− p(u , v ) .

2. Với mọi cung (u , v )∈ E , nếu c (u , v )−f (u , v )>0 thì (u , v )∈ E f với khả năng
thông qua c f (u , v )=c(u , v )−f (u , v) và p f (u , v )= p(u , v ) .

Định lý 5.5.2. Luồng cực đại có chi phí cực tiểu khi và chỉ khi mạng thặng dư không
có chu trình có hướng chi phí âm (tổng đơn giá chi phí trên chu trình âm).

Bài tập

TS.Nguyễn Văn Hiệu Page 137

You might also like