187
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA CÔNG NGHỆ THÔNG TIN ĐỀ CƯƠNG BÀI GIẢNG TOÁN RỜI RẠC Trình độ đào tạo: Đại học Hệ đào tạo: Chính qui Hưng Yên, Tháng 8 năm 2016

TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

Embed Size (px)

Citation preview

Page 1: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN

KHOA CÔNG NGHỆ THÔNG TIN

ĐỀ CƯƠNG BÀI GIẢNG

TOÁN RỜI RẠC

Trình độ đào tạo: Đại học

Hệ đào tạo: Chính qui

Hưng Yên, Tháng 8 năm 2016

Page 2: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 1

LỜI NÓI ĐẦU

Toán học rời rạc (tiếng Anh: discrete mathematics) là tên chung của nhiều ngành toán

học có đối tượng nghiên cứu là các tập hợp cấu trúc, đối tượng rời rạc, các ngành này được

tập hợp lại từ khi xuất hiện khoa học máy tính làm thành cơ sở toán học của khoa học máy

tính. Nó còn được gọi là toán học dành cho máy tính. Người ta thường kể đến trong toán

học rời rạc lý thuyết tổ hợp, lý thuyết đồ thị, lý thuyết độ phức tạp, đại số Boolean.

Một quan điểm rộng rãi hơn, gộp tất cả các ngành toán học làm việc với các tập hữu hạn

hoặc đếm được vào toán học rời rạc như số học modulo m, lý thuyết nhóm hữu hạn, lý thuyết

mật mã, ...

Trong các cấu trúc, đối tường rời rạc không có một cấu trúc nào là cơ bản thực sự, bởi

vì hầu hết cấu trúc có thể được định nghĩa thông qua hầu như bất kỳ các kiểu khác. Do vậy,

trong modul này, nội dung sẽ trình bày những cấu trúc cơ bản và quan trọng nhất.

Có thể nói toán học rời rạc là môn tiên quyết và hiệu quả nhất để người học nâng cao tư

duy toán học trong phân tích, thiết kế thuật toán và rèn luyện kỹ năng lập trình với những

thuật toán phức tạp. Không những thế nó còn là “cửa ngõ” để người học có thể tiếp cận với rất

nhiều modul trong khoa học máy tính (như Chương trình dịch, lý thuyết tính toán, Trí tuệ

nhân tạo, ...).

Mặc dù đã rất cẩn trọng trong quá trình biên soạn, tuy nhiên tài liệu không tránh khỏi

những thiếu sót và hạn chế. Chúng tôi rất mong được sự góp ý quí báu của tất cả đọc giả và

các bạn đồng nghiệp.

Mọi góp xin gửi về: Khoa Công nghệ Thông tin – Trường ĐHSPKT Hưng Yên

Page 3: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 2

Mục lục LỜI NÓI ĐẦU ................................................................................................................................ 0 Mục lục ........................................................................................................................................... 2 Danh mục các hình vẽ ..................................................................................................................... 6 Bài 1 Tổng quan môn học ............................................................................................................... 8

1.1 Mở đầu................................................................................................................................... 8 1.2 Tại sao học toán rời rạc ......................................................................................................... 9 1.3 Toán học rời rạc nghiên cứu những gì ................................................................................ 10 1.4 Học toán rời rạc như thế nào ............................................................................................... 12 1.5. Toán rời rạc và ứng dụng ................................................................................................... 13

BÀI 2: Logic mệnh đề (propositional logic) ................................................................................ 14 2.1. Mệnh đề .............................................................................................................................. 14 2.2. Các phép toán lôgic cơ bản ................................................................................................ 16

2.2.1. Phép phủ định .............................................................................................................. 16 2.2.2. Phép hội ....................................................................................................................... 16 2.2.3. Phép tuyển ................................................................................................................... 17 2.2.4. Phép kéo theo ............................................................................................................... 18 2.2.5. Phép tương đương ........................................................................................................ 19

2.3. Sự tương đương lôgic và luật ............................................................................................. 20 2.3.1. Giới thiệu ..................................................................................................................... 20 2.3.2. Sự tương đương lôgic .................................................................................................. 20

2.4. Bài tập................................................................................................................................. 23 Bài 3 Logic vị từ (predicate logic) ................................................................................................ 24

3.1. Vị từ .................................................................................................................................... 24 3.1.1. Định nghĩa ................................................................................................................... 24 3.1.1. Các phép toán vị từ ...................................................................................................... 24

3.2. Lượng từ ............................................................................................................................. 25 3.2.1. Mệnh đề tồn tại ............................................................................................................ 25 3.2.2. Mệnh đề tất cả .............................................................................................................. 26 3.2.3. Quy tắc phủ định mệnh đề có lượng từ........................................................................ 27 3.2.4 Một số lượng từ hai biến ............................................................................................... 28 3.2.5 Một số quy tắc phổ dụng .............................................................................................. 28

3.3. Logic trong tìm kiếm trên mạng ........................................................................................ 29 3.4. Logic trong lập trình .......................................................................................................... 29 3.5. Logic trong đời sống .......................................................................................................... 29 3.6. Logic trong tính toán .......................................................................................................... 30 3.7. Logic trong suy luận ........................................................................................................... 30 3.8. Logic trong giải bài toán trong kĩ thuật .............................................................................. 31

Bài 4 Thảo luận Logic ................................................................................................................... 34 4.1. Logic mệnh đề .................................................................................................................... 34

4.1.1 Logic trong suy luận ..................................................................................................... 34 4.1.2. Mạch logic số ............................................................................................................... 34

4.2. Logic vị từ .......................................................................................................................... 34 4.2.1 Logic trong suy luận ..................................................................................................... 34

4.3. Logic mờ (*) ....................................................................................................................... 34 4.4. Thảo luận ............................................................................................................................ 34

Bài 5 Một số phương pháp chứng minh........................................................................................ 35 5.1. Giới thiệu ............................................................................................................................ 35

5.1.1. Vai trò của chứng minh ............................................................................................... 35 5.1.2. Một số thuật ngữ .......................................................................................................... 35

5.2. Chứng minh nhờ luật suy diễn ........................................................................................... 36 5.2.1. Giới thiệu ..................................................................................................................... 36

Page 4: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 3

5.2.2. Một số ví dụ ................................................................................................................. 38 5.3. Các phương pháp chứng minh cho mệnh đề kéo theo ....................................................... 39

5.3.1. Chứng minh trực tiếp ................................................................................................... 39 5.3.2. Chứng minh gián tiếp .................................................................................................. 40 5.3.3. Chứng minh bằng cách phân chia trường hợp ............................................................. 41 5.3.4. Chứng minh vacuous ................................................................................................... 42 5.3.5. Chứng minh trivial ...................................................................................................... 42

5.4. Chứng minh bằng phản chứng ........................................................................................... 43 5.5. Chứng minh bằng quy nạp ................................................................................................. 44 5.6. Chứng minh bằng cách đưa ra phản ví dụ .......................................................................... 45 5.7. Một số ngộ nhận thường gặp ............................................................................................. 46

Bài 6. Ứng dụng của phương pháp chứng minh nhờ luật suy diễn .............................................. 47 6.1. Ứng dụng ............................................................................................................................ 47 6.2. Bài tập ................................................................................................................................ 47

Bài 7 Số và Ma trận ...................................................................................................................... 49 7.1. Thuật toán .......................................................................................................................... 49

7.1.1. Giới thiệu ..................................................................................................................... 49 7.1.2. Định nghĩa ................................................................................................................... 49 7.1.3. Các đặc trưng của thuật toán: ...................................................................................... 50

7.2. Độ phức tạp của thuật toán ................................................................................................ 50 7.2.1. Khái niệm về độ phức tạp của một thuật toán ............................................................. 50 7.2.2. So sánh độ phức tạp của các thuật toán: ...................................................................... 52

7.3. Số nguyên và thuật toán ..................................................................................................... 55 7.3.1 Thuật toán Euclide ........................................................................................................ 55 7.3.2 Biểu diễn các số nguyên ............................................................................................... 57 7.3.3 Thuật toán cho các phép tính số nguyên ...................................................................... 58

7.4. Số học đồng dư ................................................................................................................... 60 7.5. Ma trận ............................................................................................................................... 62

7.5.1. Giới thiệu ma trận và ứng dụng của ma trận ............................................................... 62 7.5.2. Các phép toán trên ma trận .......................................................................................... 62 7.5.3. Các loại ma trận đặc biệt ............................................................................................. 63

Bài 8 Số nguyên và ứng dụng ....................................................................................................... 65 8.1. Số học đồng dư và ứng dụng .............................................................................................. 65

8.1.1. Hàm băm ..................................................................................................................... 65 8.1.2. Các số giả ngẫu nhiên .................................................................................................. 65 8.1.3. Mật mã ......................................................................................................................... 65

8.2. Số nguyên tố và ứng dụng .................................................................................................. 66 8.2.1. Số nguyên tố ................................................................................................................ 66 8.2.2. Thuật toán sàng số nguyên tố ...................................................................................... 67

8.3. Giải thuật đệ quy ................................................................................................................ 69 8.3.1. Khái niệm đệ quy ......................................................................................................... 69 8.3.2. Thuật toán đệ qui ......................................................................................................... 70 8.3.3. Đệ quy và lặp ............................................................................................................... 71

BÀI 9 Kỹ thuật đếm cơ bản (Count technique) ............................................................................ 74 9.1. Định nghĩa .......................................................................................................................... 74 9.2. Nguyên lý cộng và nguyên lý nhân .................................................................................... 74

9.2.1. Nguyên lý cộng ........................................................................................................... 74 9.2.2. Nguyên lý nhân ........................................................................................................... 76

9.3. Nguyên lý bù trừ ................................................................................................................ 79 9.4. Nguyên lý Dirichlet ............................................................................................................ 80

9.4.1. Nguyên lý Dirichlet tổng quát ..................................................................................... 81 9.4.2. Một số ứng dụng của nguyên lý Dirichlet ................................................................... 81

Page 5: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 4

9.5. Hoán vị, tổ hợp, chỉnh hợp (*) ........................................................................................... 82 9.5.1. Chỉnh hợp .................................................................................................................... 82 9.5.2. Tổ hợp .......................................................................................................................... 83 9.5.3. Hoán vị ........................................................................................................................ 85 9.5.4. Hoán vị lặp ................................................................................................................... 86

9.6. Bài tập................................................................................................................................. 87 Bài 10 Quan hệ truy hồi (Recurrence Relations) .......................................................................... 88

10.1. Định nghĩa ........................................................................................................................ 88 10.2. Một số ví dụ ...................................................................................................................... 88 10.3. Kỹ thuật giải phương trình truy hồi .................................................................................. 90 10.4. Bài tập............................................................................................................................... 90

Bài 11. Thảo luận về kỹ thuật đếm ............................................................................................... 91 11.1. Nhắc lại lý thuyết ............................................................................................................. 91 11.2. Bài tập kỹ thuật đếm cơ bản ............................................................................................. 91 11.3. Bài tập kỹ thuật đếm nâng cao ......................................................................................... 92

Bài 12 Các khái niệm cơ bản của Lý thuyết đồ thị .................................................................... 93 12.1 Định nghĩa cơ bản về đồ thị .............................................................................................. 93 12.2. Đường đi - chu trình - Đồ thị liên thông .......................................................................... 95 12.3. Phân loại đồ thị ................................................................................................................. 98

12.3.1. Đồ thị vô hướng liên thông ........................................................................................ 98 12.3.2. Đồ thị có hướng liên thông ........................................................................................ 99

12.4. Một số loại đồ thị đặc biệt .............................................................................................. 100 Bài 13 Biểu diễn đồ thị trên máy tính ...................................................................................... 104

13.1. Ma trận kề - Ma trận trọng số ......................................................................................... 104 13.2. Danh sách cạnh (cung) ................................................................................................... 106 13.3. Danh sách kề .................................................................................................................. 107 13.4. Bài tập............................................................................................................................. 108

Bài 14 Đồ thị Euler – Hamilton ............................................................................................... 109 14.1 Đồ thị Euler ..................................................................................................................... 109

14.1.1. Định nghĩa ............................................................................................................... 109 14.1.2. Các ví dụ .................................................................................................................. 109 14.1.3. Định lý Euler ............................................................................................................ 110 14.1.4. Thuật toán Flor tìm đường đi chu trình Euler .......................................................... 113 14.1.5. Một số bài toán liên quan(*) .................................................................................... 113

14.2 Đồ thị Hamilton ............................................................................................................... 113 14.2.1 Định nghĩa ................................................................................................................ 114 14.2.2 Định lý Dirak ............................................................................................................ 114 14.2.3 Thuật toán liệt kê tất cả các chu trình Hamilton của đồ thị ...................................... 115

Bài 15 Cài đặt đồ thị, thuật toán tìm chu trình Euler và liệt kê chu trình Hamilton ................ 118 15.1. Cài đặt biểu diễn đồ thị trên máy tính ............................................................................ 118 15.2. Cài đặt thuật toán liệt kê chu trình Euler ........................................................................ 118 15.3. Cài đặt thuật toán liệt kê chu trình Hamilton ................................................................. 119

Bài 16 Thuật toán tìm kiếm trên đồ thị và ứng dụng ............................................................... 120 16.1. Duyệt đồ thị theo chiều rộng (BFS) ............................................................................... 120 16.2. Duyệt đồ thị theo chiều sâu (DFS) ................................................................................. 123 16.3. Bài tập............................................................................................................................. 125 16.4. Ứng dụng ........................................................................................................................ 126

Bài 17 Cây và cây khung ......................................................................................................... 128 17.1. Cây và cây khung ........................................................................................................... 128

17.1.1. Cây ........................................................................................................................... 128 17.1.2. Cây khung của đồ thị ............................................................................................... 129

17.2. Bài toán cây khung nhỏ nhất .......................................................................................... 131

Page 6: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 5

17.3 Xây dựng tập các chu trình cơ bản của đồ thị ................................................................. 132 17.4 Thuật toán Kruskal .......................................................................................................... 133 17.5. Thuật toán Prim .............................................................................................................. 135

Bài 18 Ứng dụng của bài toán đồ thị liên thông liên thông và bài toán cây khung nhỏ nhất .. 137 18.1. Thuật toán duyệt đồ thị và bài toán liên thông ............................................................... 137 18.2. Một số thuật toán xây dựng cây khung(*) ..................................................................... 138 18.3. Ứng dụng của bài toán cây khung nhỏ nhất ................................................................... 139 18.4 Cài đặt thuật toán Prim/Kruskal ...................................................................................... 140

18.4.1. Cài đặt thuật toán Prim ............................................................................................ 140 18.4.2. Cài đặt thuật toán Kruskal ....................................................................................... 142

Bài 19 Bài toán tìm đường đi ngắn nhất .................................................................................. 146 19.1. Các khái niệm mở đầu .................................................................................................... 146 19.2. Đường đi ngắn nhất xuất phát từ một đỉnh. Thuật toán Ford-Bellman .......................... 146 19.3. Trường hợp ma trận trọng số không âm. Thuật toán Dijkstra ....................................... 148 19.4 Đường đi trong đồ thị không có chu trình (*) ................................................................. 150 19.5 Đường đi ngắn nhất giữa tất cả các cặp đỉnh (*) ............................................................. 153

Bài 20. Ứng dụng của bài toán tìm đường đi ngắn nhất ............................................................. 155 20.1. Ứng dụng của bài toán tìm đường đi ngắn nhất ............................................................. 155 20.2. Cài đặt thuật toán Dijkstra .............................................................................................. 155

Bài 21 Bài toán luồng cực đại trong mạng .............................................................................. 158 21.1. Mạng - Luồng trong mạng – Bài toán luồng cực đại ..................................................... 158

21.1.1 Mạng – Luổng trong mạng ....................................................................................... 158 21.2. Bài toán luồng cực đại .................................................................................................... 159 21.3. Lát cắt. đường tăng luồng. Định lý Ford_Fulkerson ...................................................... 159 21.4. Thuật toán tìm luồng cực đại ......................................................................................... 162 21.5 Bài tập ............................................................................................................................. 170

Bài 22 Lý thuyết đồ thị và ứng dụng ....................................................................................... 171 22.1. Một số bài toán liên quan tới đồ thị ............................................................................... 171

22.1.1 Các bài toán liên quan tới bậc của đồ thị .................................................................. 171 22.1.2 Các bài toán liên quan đến tính liên thông của đồ thị .............................................. 172 22.1.3 Các bài toán có liên quan đến đường đi và chu trình Hamilton ............................... 172 22.1.4 Các bài toán liên quan đến đồ thị tô màu ................................................................. 176 22.1.5 Bài toán về cây ......................................................................................................... 180 22.1.6. Bài toán về ghép cặp ................................................................................................ 181 22.1.7. Đồ thị Euler ............................................................................................................. 181 22.1.8. Các bài toán có tính tổng hợp .................................................................................. 182

22.2 Duyệt rộng trên mảng hai chiều ...................................................................................... 183 22.3 Bài toán đám cưới vùng quê ........................................................................................... 185 22.4. Bài tập ............................................................................................................................ 186

Page 7: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 6

Danh mục các hình vẽ

Hình 12.1 Sơ đồ mạng máy tính ................................................................................................... 93

Hình 12.2 Sơ đồ mạng máy tính với đa kênh thoại....................................................................... 93

Hình 12.3 Sơ đồ mạng máy tính với kênh thoại thông báo .......................................................... 94

Hình 12.4 Mạng máy tính với kênh thoại một chiều .................................................................... 94

Hình 12.5 Đường đi trên đồ thị ..................................................................................................... 95

Hình 12.6 Đồ thị G và H ............................................................................................................... 96

Hình 12.7 Đồ thị liên thông mạnh G và đồ thị liên thông yếu H .................................................. 97

Hình 12.8 Đồ thị vô hướng ........................................................................................................... 98

Hình 12.9 Đồ thị có hướng ........................................................................................................... 99

Hình 12.10 Đồ thị đầy đủ ............................................................................................................ 100

Hình 12.11 Đồ thị vòng............................................................................................................... 101

Hình 12.12 Đồ thị bánh xe .......................................................................................................... 101

Hình 12.13 Đồ thị lập phương .................................................................................................... 101

Hình 12.14 Đồ thị hai phía .......................................................................................................... 102

Hình 12.15 Đồ thị K4 là đồ thị phẳng ......................................................................................... 102

Hình 12.16 Các miền tương ứng với biểu diễn phẳng của đồ thị ............................................... 103

Hình 13.1 Đồ thị vô hướng G và Đồ thị có hướng G1 ................................................................ 104

Hình 14.1 Mô hình 7 cây cầu ở Konigsberg ............................................................................... 109

Hình 14.2 Đồ thị G1, G2, G3 ........................................................................................................ 110

Hình 14.3 Đồ thị H1, H2, H3 ........................................................................................................ 110

Hình 14.4 Minh hoạ cho chứng minh định lý 14.1 ..................................................................... 111

Hình 14.5 Du lịch 20 thành phố .................................................................................................. 113

Hình 14.6 Đồ thị Hamilton G3, nửa Hamilton G2, và G1 không là nửa Hamilton ...................... 114

Hình 14.7 Đồ thị đấu loại D5, đấu loại liên thông mạnh D6........................................................ 115

Hình 16.1 Đồ thị vô hướng ......................................................................................................... 121

Hình 16.2 Đồ thị vô hướng ......................................................................................................... 127

Hình 17.1 Cây và rừng ................................................................................................................ 128

Hình 17.2 Đồ thị và các cây khung của nó. ................................................................................ 129

Hình 17.3 Đồ thị và cây khung nhỏ nhất .................................................................................... 136

Hình 18.1 Minh họa từng bước thuật toán Prim tìm cây khung nhỏ nhất .................................. 142

Hình 18.2 Minh họa từng bước thuật toán Kruskal tìm cây khung nhỏ nhất .............................. 145

Hình 19.3 Đồ thị minh hoạ PERT. .............................................................................................. 153

Hình 21.1 Mạng G và luồng f. Đồ thị có trọng số Gf tương ứng. ............................................... 161

Hình 21.2 Mạng G và minh họa từng bước thuật toán ford-Fullkerson ..................................... 166

Hình 21.3 Mạng G với luồng cực đại và lát cắt hẹp nhất ........................................................... 167

Hình 21.4 Ví dụ tồi tệ đối với thuật toán ford_Fulkerson. .......................................................... 169

Hình 21.5 Tăng luồng dọc theo đường tăng. .............................................................................. 170

Hình 22.1 Kết quả thi đấu của 5 đội bóng chuyền A, B, C, B, E ................................................ 173

Hình 22.2 Sơ đồ nhà của 8 học sinh............................................................................................ 174

Hình 22.3 10 thành phố ............................................................................................................... 174

Hình 22.4 bố trí lịch thi cho học sinh THPT với 7 môn thi trong 7 ngày ................................... 175

Hình 22.5 Vị trí nhà ở và đường nối giữa các nhà của 9 học sinh .............................................. 176

Page 8: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 7

Hình 22.6 Bản đồ có 6 miền ....................................................................................................... 177

Hình 22.7 Lập lịch thi 7 môn ...................................................................................................... 179

Hình 22.8 Tô màu cho đồ thị lịch thi .......................................................................................... 180

Hình 22.9 Kết quả xếp hạng của các đội .................................................................................... 181

Hình 22.10 Tuyển chọn biên dịch viên ....................................................................................... 183

Hình 22.11 Hướng di chuyển của robot ...................................................................................... 184

Hình 22.12 Mạng tương ứng với bài toán đám cưới vùng quê. .................................................. 185

Page 9: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 8

Bài 1 Tổng quan môn học

1.1 Mở đầu

Toán học rời rạc ngày nay đã trở thành quen thuộc trong những năm gần đây bởi

những ứng dụng to lớn của nó trong các ngành tin học. Toán học rời rạc là một ngành toán

học giải quyết các đối tượng hay cấu trúc rời rạc. Đối tượng rời rạc là những đối tượng mà

chúng có thể được phân biệt, phân tách ra khỏi nhau để có thể đếm được. Số tự nhiên, số hữu

tỉ (được coi như là tỉ số của 2 số tự nhiên), môtô, nhà, người, … là những đối tượng rời rạc.

Mặt khác số thực bao gồm số vô tỉ là không rời rạc (chúng ta biết rằng giữa hai số thực khác

nhau luôn tồn tại một số thực khác chúng).

Thuật ngữ ”Toán học rời rạc”cũng để phân biệt với”Toán học liên tục”. Trong khi các

đối tượng rời rạc thường được coi như có sự liên quan mật thiết tới số tự nhiên thì các đối

tượng liên tục là số thực Trong modul này, chúng ta sẽ nghiên cứu những đối tượng rời rạc

như số tự nhiên, mệnh đề, tập, quan hệ, hàm, đồ thị, hay lý thuyết số, …tất cả chúng đều rời

rạc. Chúng ta sẽ học các khái niệm, tính chất và quan hệ giữa chúng với nhau và với các đối

tượng khác.

Một quan điểm rộng rãi hơn, gộp tất cả các ngành toán học làm việc với các tập hữu hạn

hoặc đếm được vào toán học rời rạc như số học modulo m, lý thuyết nhóm hữu hạn, lý thuyết

mật mã, ...

Có thể nêu ra đây một vài ví dụ dùng tới toán học rời rạc:

- Có bao nhiêu password hợp lệ cho một hệ thống máy tính?

- Có tồn tại một đường nối giữa 2 máy tính trong một mạng?

- Có bao nhiêu địa chỉ internet hợp lệ?

- Đường đi ngắn nhất giữa 2 máy tính trong một mạng là gì?

- Có bao nhiêu bước trong quá trình sắp xếp?

- Có bao nhiêu mạch để cộng 2 số nguyên được thiết kế?

- Khả năng trúng giải thưởng cho một vé số là bao nhiêu?

- Cách tốt nhất để lập lịch 8 cuộc họp hội đồng các thành viên mà không có bất kỳ sự

cạnh tranh nào, giả thiết đưa ra là 1 vài người có tên trong hơn 1 hội đồng.

- Làm thế nào chúng ta có thể lập lịch tất cả các nhiệm vụ trong dự án lớn này (giống

như 1 dự án xây dựng hoặc dự án để bắt đầu đưa 1 sản phẩm mới ra thị trường).

- Sẽ có đủ số điện thoại để cung cấp tất cả điện thoại, máy fax, và điện thoại di động

trong cho Việt Nam?

- Làm thể nào chúng ta có thể mô hình và phân tích 1 sự thay đổi dân số, hoặc thay

đổi lượng tiền trong một dự án đầu tư

Modul sẽ học những cấu trúc rời rạc và các kỹ thuật để giải quyết những vấn đề

này. Vậy một câu hỏi đặt ra là: Toán rời rạc được dùng khi nào? Thực tế toán học rời rạc

được dùng rất đa dạng trong nhiều chuyên ngành, lĩnh vực. Tuy nhiên, có thể thấy phần

lớn nó được dùng khi liên quan tới:

- Đếm các đối tượng

Page 10: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 9

- Xem xét quan hệ giữa những tập hữu hạn (hoặc đếm được)

- Phân tích quá trình có số bước hữu hạn

- Cơ bản về tất cả những xử lý thông tin số: Những thao tác trên các cấu trúc rời rạc

trong bộ nhớ

- Nó là ngôn ngữ cơ bản và là khái niệm nền tảng cho tất cả các lĩnh vực trong khoa

học máy tính

- Các khái niệm rời rạc cũng được sử dụng rộng rãi trong toán học, kỹ thuật, kinh tế,

sinh học, …

Đặc biệt toán học rời rạc là một công cụ tuyệt vời để suy luận logic.

1.2 Tại sao học toán rời rạc

Có một số lý do quan trọng để nghiên cứu toán học rời rạc.

Thứ nhất, thông qua modul này, người học có thể phát triển khả năng toán học, đó là

khả năng hiểu và tạo ra các chủ đề của toán học. Người học sẽ vô cùng khó khăn để tiến xa

trong ngành tin học mà không có những kiến thức toán học này.

Thứ hai, toán học rời rạc cung cấp cơ sở toán học để mở ra cánh cửa cho người học có

thể tiếp tục với những modul cao hơn cho các khóa học của khoa học máy tính, bao gồm: cấu

trúc dữ liệu, thuật toán, lý thuyết cơ sở dữ liệu, lý thuyết automat, ngôn ngữ hình thức, trình

biên dịch, bảo mật máy tính, thiết kế mạch máy tính, mạng máy tính và hệ điều hành, …sinh

viên có thể nhận thấy những khóa học trên vô cùng khó khăn nếu không có một cơ sở toán

học của modul toán học rời rạc này.

Toán học rời rạc là toán tính toán

Khoa học máy tính hiện đại được xây dựng hầu hết dựa trên toán học rời rạc, đặc

biệt là toán tập hợp và lý thuyết đồ thị. Điều này có nghĩa là: các nhà lập trình máy tính và

sinh viên muốn học các thuật toán cơ bản thì sẽ phải cần một nền tảng toán học rời rạc chắc

chắn. Bởi vậy, tại hầu hết các trường đại học, môn toán học rời rạc là bắt buộc với sinh

viên bậc đại học.

Toán học rời rạc là toán thế giới thực

Nhiều sinh viên than phiền về tính truyền thống của toán cấp 3 như: đại số, đồ thị,

lượng giác, và phần tương tự như vậy- câu hỏi đặt ra là: “học toán cấp 3 với nội dung

truyền thống như vậy tốt ở điểm nào?” Một vài chủ đề trừu tượng của toán học thường

làm sinh viên sợ và không vượt qua được. Ngược lại, toán học rời rạc , đặc biệt là toán đếm

và xác suất, cho phép sinh viên (kể cả h/s đang học cấp 3 nhanh chóng tìm ra vấn đề quan

trọng trong thế giới thực những vấn đề khó nhưng lại rất thú vị).

Toán học rời rạc dạy suy luận toán học và các kỹ thuật chứng minh

Đại số thường dạy sinh viên nhớ chuỗi các công thức và thuật toán (ví dụ, công thức

quadratic, các hệ thống phương trình tuyến tính..), và hình học thường được dạy như là 1

chuỗi các bài tập áp dụng”định nghĩa – định lý – chứng minh”.

Còn với toán học rời rạc, sinh viên sẽ suy nghĩ linh hoạt và sáng tạo. Có các mối

quan hệ giữa 1 vài công thức. Có 1 số khái niệm cơ bản để làm chủ và ứng dụng toán học

Page 11: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 10

rời rạc trong nhiều cách khác nhau.

Toán học rời rạc rất vui

Nhiều sinh viên, đặc biêt là những sinh viên sáng dạ và năng động tìm ra rằng đại số,

hình học và thậm chí cả tích phân không gây thích thú. Hiếm khi những chủ đề này gây thích

thú như những chủ đề toán học rời rạc . Khi chúng ta hỏi sinh viên về chủ đề mà họ thích, hầu

hết đều nhận được trả lời là toán tập hợp hoặc lý thuyết số. (Khi chúng ta hỏi sinh viên về chủ

đề mà ít gây thích thú với họ nhất, phần đa trả lời là”hình học”). Và thật đơn giản hầu hết

sinh viên đều nhận ra rằng toán học rời rạc nhiều niềm vui hơn đại số và hình học.

1.3 Toán học rời rạc nghiên cứu những gì

Toán học rời rạc là tên chung của nhiều ngành toán học có đối tượng nghiên cứu là các

tập hợp rời rạc, các ngành này được tập hợp lại từ khi xuất hiện khoa học máy tính làm thành

cơ sở toán học của khoa học máy tính. Nó còn được gọi là toán học dành cho máy tính.

Có thể nói toán học rời rạc ngày càng có tầm quan trọng trong nhiều ngành khoa học

máy tính cũng như trong công việc lập trình. Có nhiều khái niệm của toán học được nghiên

cứu trong toán học rời rạc. Chúng ta có thể nhắc tới một số chủ đề trong toán học rời rạc sau

đây khi chúng đã được áp dụng rất nhiều trong khoa học máy tính:

Algorithmics – Thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ

thị hay phương cách được định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng

thái ban đầu cho trước; khi các chỉ thị này được áp dụng triệt để thì sẽ dẫn đến kết quả sau

cùng như đã dự đoán.

Nói cách khác, thuật toán là một bộ các qui tắc hay qui trình cụ thể nhằm giải quyết

một vấn đề trong một số bước hữu hạn, hoặc nhằm cung cấp một kết quả từ một tập hợp của

các dữ kiện đưa vào. Thuật toán đôi khi còn được gọi là phương thức, thủ tục, hay kỹ thuật.

Trong ngành khoa học máy tính, thuật toán được thể hiện thông qua một chương trình

máy tính (hay một tập hợp các chương trình máy tính) được thiết kế để giải quyết một số loại

vấn đề một cách có hệ thống. Một ví dụ kinh điển trong ngành khoa học máy tính là thuật

toán đệ quy dùng để giải bài toán tháp Hà Nội.

Boolean Algebra – cách tính toán và biểu diễn các biểu thức trên hệ cơ số, nó cũng

nghiên cứu các khái niệm điện tử học như cổng logic….

Combinatorics – Là một nhánh của toán học nghiên cứu tới liệt kê, tổ hợp, hoán vị

các tập phần tử, những tính chất và những quan hệ của chúng.

Computability and Complexity Theories – Lý thuyết về độ phức tạp và khả năng

tính toán - Liên quan tới combinatorics và algorithmics, nhưng nó tập trung vào những giới

hạn về thực hành cũng như lý thuyết trong các mô hình tính toán khác nhauđể giải quyết

bài toán. Lý thuyết về độ phức tạp và khả năng tính toán. Trong khoa học máy tinh, nó

thường dùng ký hiệu O (Big-O).

Counting – Liên quan tới các khái niệm và kỹ thuật đếm, liệt kê và tính toán trong

các hệ số khác nhau.

Graph Theory – Lý thuyết đồ thị - Đồ thị biểu diễn được rất nhiều cấu trúc, nhiều bài

toán thực tế có thể được biểu diễn bằng đồ thị. Ví dụ, cấu trúc liên kết của một website có

Page 12: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 11

thể được biểu diễn bằng một đồ thị có hướng như sau: các đỉnh là các trang web hiện có

tại website, tồn tại một cạnh có hướng nối từ trang A tới trang B khi và chỉ khi A có chứa 1

liên kết tới B. Do vậy, sự phát triển của các thuật toán xử lý đồ thị là một trong các mối quan

tâm chính của khoa học máy tính.

Information Theory – Lý thuyết thông tin – Áp dụng toán học vào truyền thông, nó

dựa phần lớn vào xác suất và thông kê để nghiên cứu những lĩnh vực như phân tích dữ liệu,

mạng, truyền thông, tính toán lượng tử …

Logic – Theo truyền thống, logic được nghiên cứu như là một nhánh của triết học. Kể

từ giữa thế kỉ 19 logic đã thường được nghiên cứu trong toán học và luật. Gần đây nhất

logic được áp dụng vào khoa học máy tính và trí tuệ nhân tạo. Là một ngành khoa học hình

thức, logic nghiên cứu và phân loại cấu trúc của các khẳng định và các lý lẽ, cả hai đều

thông qua việc nghiên cứu các hệ thống hình thức của việc suy luận và qua sự nghiên cứu lý

lẽ trong ngôn ngữ tự nhiên.

Mathematical Relations (Quan hệ): Phần này liên quan tới lý thuyết tập, các quan hệ

là việc gán một giá trị cho một tổ hợp của k-phần tử.

Number Theory (lý thuyết số): Là một nhánh lớn của toán học nghiên cứu những tính

chất của số nguyên.

Proofs (chứng minh): Dùng lập luận logic toán học để chứng minh một biểu thức là

đúng, sai.

Functions (Hàm): Trong toán học, khái niệm hàm số (hay hàm) được hiểu tương tự

như khái niệm ánh xạ. Nếu như ánh xạ được định nghĩa là một qui tắc tuơng ứng áp dụng lên

hai tập hợp bất kỳ (còn được gọi là tập nguồn và tập đích), mà trong đó mỗi phần tử của tập

hợp này (tập hợp nguồn) tương ứng với một và chỉ một phần tử thuộc tập hợp kia (tập hợp

đích), thì ta hoàn toàn có thể coi hàm số là một trường hợp đặc biệt của ánh xạ, khi tập

nguồn và tập đích đều là tập hợp số.

Set Theory (lý thuyết tập hợp): Nghiên cứu tập các phần tử. Mặc dù bất ký một kiểu

đối tượng nào cũng có thể tập hợp lại thành tập nhưng lý thuyết tập thường áp dụng cho

các đối tượng trong toán học.

Linear algebra (Đại số tuyến tính): Phần này được sử dụng nhiều trong toán học, như

trong đại số đại cương, giải tích hàm, hình học giải tích... để giải các bài toán như phép

quay trong không gian, nội suy bình phương nhỏ nhất, nghiệm của hệ phương trình vi phân,

tìm đường tròn qua ba điểm... Nó cũng có vô vàn ứng dụng trong khoa học tự nhiên (vật lý,

công nghệ...) và khoa học xã hội (kinh tế...), vì các mô hình phi tuyến tính hay gặp trong

tự nhiên và xã hội thường có thể xấp xỉ bằng mô hình tuyến tính.

Ký hiệu “→”:≡”có thể được định nghĩa bởi”

Page 13: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 12

HÌnh 1.1. Mối quan hệ giữa các kiểu dữ liệu

Như đã thảo luận phần trước, các cấu trúc toán học có thể được xây dựng hay chỉ ra

thông qua các cấu trúc đơn giản hơn. Chính biểu đồ trên phác thảo một vài cách mà các

cấu trúc rời rạc (và liên tục) đa dạng cuối cùng cũng được tạo nên từ cấu trúc rời rạc rất

đơn giản là tập (set). Biểu đồ cũng cho chúng ta thấy được phần nào quan hệ của các đối

tượng toán học. Tuy nhiên, biểu đồ đã được đơn giản hóa đi rất nhiều, nhiều cấu trúc khác

cũng như các cách định nghĩa các cấu trúc thông chúng đã được lược bỏ. Ví dụ, các tập có

thể được định nghĩa thông qua các hàm, hoặc các quan hệ. Không có một cấu trúc nào là cơ

bản thực sự, bởi vì hầu hết cấu trúc có thể được định nghĩa thông qua hầu như bất kỳ các

kiểu khác. Các tập chỉ có thể là điểm bắt đầu nhưng chúng phổ cập được bởi vì định nghĩa

của chúng quá đơn giản. Trong modul này sẽ xem xét biểu đồ chi tiết để thấy được các cấu

trúc này liên hệ với nhau như thế nào.

1.4 Học toán rời rạc như thế nào

Một số lời khuyên cho người học để có thể đạt hiệu quả cho modul này như sau:

Thứ nhất, sinh viên hãy coi bài tập như một phần quan trọng trong quá trình học.

Người học sẽ học được phần lớn kiến thức thông qua bài tập, do vậy sinh viên hãy làm càng

nhiều bài tập càng tốt, bao gồm cả bài tập cuối mỗi phần và các bài tập giảng viên cung

cấp. Sinh viên hãy cố gắng tự giải bài tập trước khi xem lời giải. Đây là một yêu cầu rất

quan trọng với sinh viên, người học chỉ có thể đạt được nhiều kiến thức nhất khi trải qua quá

trình tự làm, tự học.

Thứ hai, sinh viên không được bỏ một buổi học nào, thời gian học trên lớp là quá trình

trao đổi rất tốt giữa giảng viên và sinh viên.

Thứ ba, nếu học viên học ít hơn 3 ngày trong tuần trong quá trình học modul này thì

học viên đang lãng phí thời gian của mình, do vậy tốt nhất cho học viên là học tập thường

xuyên.

Thứ tư, hãy tạo cho mình môi trường học tập thoải mái: có thể đan xen giữa việc giải

toán, nghỉ ngơi và … giải toán.

Cuối cùng, không bao giờ quên bài giảng.

Hãy nhớ là: cho dù là có khả năng vượt qua các kỳ thi bằng cách học rất ít trước kỳ

Page 14: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 13

thi, nhưng với cách học như vậy thì kiến thức toán sẽ chỉ đi vào”bộ nhớ tạm thời”mà thôi.

Kết quả cuối cùng là kiến thức toán sẽ ở mức độ mà không tồn tại lâu dài do cách học”sổi”,

và chính thói quen học tập nghiên cứu như vậy sẽ làm hại chính mình.

1.5. Toán rời rạc và ứng dụng

- Ứng dụng của Logic mệnh đề

- Ứng dụng của Logic vị từ

- Ứng dụng của Logic mờ

- Ứng dụng của luật suy diễn

- Ứng dụng của số nguyên

- Ứng dụng của bài toán đếm

- Ứng dụng của lý thuyết đồ thị

Page 15: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 14

BÀI 2: Logic mệnh đề (propositional logic)

Logic sử dụng để biểu diễn những luận điểm chính xác các mênh đề toán học. Những

luật trong logic được dùng để phân biệt những luận điểm đúng và sai. Bài học này cũng

giúp người học cách thức để hiểu và xây dựng các luận điểm toán học đúng đắn.

Logic là nội dung trung tâm của khoa học máy tính từ khi ngành này được hình thành:

công trình của Alan Turing về Entscheidungsproblem theo sau từ công trình của Kurt Gödel

về các định lý về sự không toàn vẹn, và khái niệm của các máy tính dành cho mục đích tổng

quát bắt nguồn từ công trình này đã có tầm quan trọng mang tính nền tảng đối với các nhà

thiết kế máy tính trong những năm 1940.

Trong những năm 1950 và 1960, các nhà nghiên cứu dự đoán rằng khi tri thức của

con người có thể được biểu diễn bằng logic và các ký hiệu toán học, sẽ có khả năng tạo ra

một máy tính có khả năng lập luận, hay nói cách khác là trí tuệ nhân tạo. Điều này hóa ra là

khó khăn hơn đã dự đoán do sự phức tạp trong lập luận của con người. Trong lập trình logic,

một chương trình bao gồm một tập hợp các tiên đề và các luật. Các hệ thống lập trình logic

như Prolog tính toán các hệ quả của các tiên đề và luật để trả lời một truy vấn.

Ngày nay, logic được ứng dụng rộng rãi trong các lãnh vực của trí tuệ nhân tạo, và

khoa học máy tính, và những ngành này cung cấp một nguồn dồi dào các bài toán trong

logic hình thức và phi hình thức. Lý thuyết lý luận là một ví dụ tốt cho thấy logic được áp

dụng vào trí tuệ nhân tạo như thế nào.

Thêm vào đó, máy tính có thể được sử dụng như công cụ cho các nhà logic học. Ví dụ,

trong logic biểu tượng và logic toán học, các chứng minh bởi con người có thể được hỗ trợ

bởi máy tính. Sử dụng chứng minh định lý tự động, máy tính có thể tìm ra và kiểm tra các

chứng minh, cũng như là làm việc với những chứng minh quá dài cho việc viết ra.

2.1. Mệnh đề

Các đối tượng cơ bản mà chúng ta khảo sát ở đây là các phát biểu hay các mệnh đề.

Trong lôgic toán, một phân ngành lôgic học, cơ sở của mọi ngành toán học, mệnh đề,

hay gọi đầy đủ là mệnh đề lôgic là một khái niệm nguyên thủy, không định nghĩa.

Thuộc tính cơ bản của một mệnh đề là giá trị chân lí của nó, được quy định như sau:

Mỗi mệnh đề có đúng một trong hai giá trị chân lí 0 hoặc 1. Mệnh đề có giá trị chân lí 1 là

mệnh đề đúng, mệnh đề có giá trị chân lí 0 là mệnh đề sai.

Kí hiệu:

Người ta thường dùng các chữ cái a, b, c, ... để kí hiệu cho các mệnh đề.

Nếu mệnh đề a có giá trị chân lí là 1 thì ta kí hiệu G(a) = 1, nếu mệnh đề a có giá

trị chân lí là 0 thì ta kí hiệu là G(a) = 0.

Chẳng hạn, để kí hiệu a là mệnh đề”Paris là thủ đô của nước Pháp”ta sẽ viết:

a = “Paris là thủ đô của nước Pháp”hoặc

a: “Paris là thủ đô của nước Pháp”.

Ở đây, a là mệnh đề đúng nên G(a) = 1.

Page 16: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 15

Chú ý:1. Trong thực tế có những mệnh đề mà tính đúng sai của nó luôn gắn với một thời gian

và địa điểm cụ thể: đúng ở thời gian hoặc địa điểm này nhưng sai ở thời gian hoặc địa điểm

khác. Nhưng ở bất kì thời điểm nào, địa điểm nào cũng luôn có giá trị chân lí đúng hoặc

sai. Chẳng hạn:

Sáng nay bạn An đi học.

Trời mưa.

Học sinh tiểu học đang đi nghỉ hè.

2. Ta thừa nhận các luật sau đây của lôgic mệnh đề:

Luật bài trùng: Mỗi mệnh đề phải hoặc đúng, hoặc sai; không có mệnh đề nào

không đúng cũng không sai.

Luật mâu thuẫn: Không có mệnh đề nào vừa đúng lại vừa sai.

3. Có những mệnh đề mà ta không biết (hoặc chưa biết) đúng hoặc sai nhưng biết”chắc

chắc”nó nhận một giá trị. Chẳng hạn: Trên sao Hỏa có sự sống.

Mệnh đề và câu

Mệnh đề có thể là một câu nhưng không phải mọi câu đều là mệnh đề. Có thể chia

các câu trong khoa học cũng như trong cuộc sống ra làm hai loại: loại thứ nhất gồm những

câu phản ánh tính đúng hoặc sai một thực tế khách quan và loại thứ hai gồm những câu

không phản ánh tính đúng hoặc sai một thực tế khách quan nào. Những câu thuộc loại thứ

nhất là chính những mệnh đề. Vì vậy có thể nói: “Mệnh đề là một câu khẳng định có tính chất

hoặc đúng hoặc sai”.

Ví dụ 2.1:

1.”Paris là thủ đô của nước Pháp” là mệnh đề đúng.

2.”Nước Việt Nam nằm ở châu Âu” là mệnh đề sai.

3.”Tháng 12 có 28 ngày” là mệnh đề sai.

4.”Một năm có 12 tháng và mỗi tuần có 7 ngày” là mệnh đề đúng.

5.”20 là số chẵn” là mệnh đề đúng.

6.”Số 123 chia hết cho 3” là mệnh đề đúng.

7.”2 cộng với 3 bằng 7” là mệnh đề sai.

8.”15 lớn hơn 30” là mệnh đề sai.

9. Các câu sau đều không phải là mệnh đề.

“Cuốn sách này giá bao nhiêu tiền?”

“Bao giờ lớp mình đi tham quan Đền Hùng?”

“Ôi! ngôi nhà mới đẹp làm sao!”

“Tất cả hãy anh dũng tiến lên!”

Nhận xét: nói chung những câu nghi vấn, câu cảm thán, câu mệnh lệnh đều không là mệnh

đề.

Mệnh đề lôgic và mệnh đề mờ

Nếu như trong Lôgic toán, một mệnh đề chỉ có thể nhận một trong hai giá trị chân lí 0

hoặc 1 thì trong Trí tuệ nhân tạo người ta dùng lôgic mờ, mà ở đó giá trị chân lí của một

Page 17: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 16

mệnh đề là một số nằm giữa 0 và 1. Mệnh đề có giá trị chân lí 0 là sai, có giá trị chân lí 1

là đúng. Còn giá trị chân lí nằm giữa 0 và 1 chỉ ra mức độ thay đổi của chân lí.

2.2. Các phép toán lôgic cơ bản

Trong toán học, khi có hai số, người ta dùng các phép toán số học (cộng, trừ, nhân,

chia, ...) tác động vào chúng để nhận được những số mới. Tương tự, khi có mệnh đề, người ta

dùng các phép lôgic tác động vào chúng để nhận được những mệnh đề mới. Dưới đây ta trình

bày định nghĩa và các tính chất cơ bản của các phép toán này.

2.2.1. Phép phủ định

Phủ định của mệnh đề a là một mệnh đề, kí hiệu là , đúng khi a sai và sai khi a đúng.

Bảng giá trị chân lý của phép phủ định

a

0 1

1 0

Ví dụ 2.2: Nếu a = “Paris là thủ đô của nước Pháp” thì mệnh đề phủ định có thể diễn đạt

như sau: = “Không phải Paris là thủ đô của nước Pháp” hoặc = “Paris không phải là thủ

đô của nước Pháp”. Ở đây G(a) = 1 còn G( ) = 0.

Nếu qua xác minh mệnh đề a đúng (hoặc sai) thì mệnh đề phủ định sẽ sai (hoặc đúng).

Chú ý: Mệnh đề phủ định a thường được diễn đạt là “không phải a”.

2.2.2. Phép hội

Hội của hai mệnh đề a, b là một mệnh đề, đọc là a và b, kí hiệu a Λ b (hoặc a.b),

đúng khi cả hai mệnh đề a, b cùng đúng và sai trong các trường hợp còn lại.

Bảng giá trị chân lí của phép hội

a b a Λ b

1 1 1

1 0 0

0 1 0

0 0 0

Chú ý: Để thiết lập mệnh đề hội của hai mệnh đề a, b ta ghép hai mệnh đề đó bởi

liên từ “và” hay một liên từ khác cùng loại. Những liên từ đó là: mà, nhưng, song, đồng

thời, vẫn, cùng, ... hoặc dùng dấu phảy hoặc không dùng liên từ gì.

Ví dụ 2.3 “Lúc 8 giờ sáng nay Hà có mặt ở Hà Nội và thành phố Hồ Chí Minh” là hội của

hai mệnh đề a = “Lúc 8 giờ sáng nay Hà có mặt ở Hà Nội”và b = “Lúc 8 giờ sáng nay Hà có

mặt ở thành phố Hồ Chí Minh”. Vì hai mệnh đề này không thể cùng đúng, nên G(a Λ b) =

0.

Ví dụ 2.4 “Thành phố Hồ Chí Minh là thành phố lớn nhất trong cả nước nhưng không phải

Page 18: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 17

là thủ đô” là hội của hai mệnh đề a = “Thành phố Hồ Chí Minh là thành phố lớn nhất trong

cả nước” và b = “Thành phố Hồ Chí Minh không phải là thủ đô”. Rõ ràng là G(a) = 1 và

G(b) = 1 nên G(a Λ b) = 1.

“Số π lớn hơn 2 song nhỏ hơn 3”.

“Chị Nga nói thạo tiếng Pháp mà không biết tiếng Anh”.

“ABC là tam giác vuông cân” là hội của của hai mệnh đề a = “ABC là tam giác

vuông” và b = “ABC là tam giác cân”.

“Không những trời nắng to mà còn gió tây”.

“Chồng cày, vợ cấy, con trâu đi bừa”.

Chú ý: Đôi khi trong mệnh đề có liên từ “và” nhưng không có nghĩa của mệnh đề hội.

Chẳng hạn: “Số lẻ và số chẵn là hai tập con rời nhau của tập số tự nhiên”; “Hùng đạt được tất

cả 20 điểm 9 và 10”.

2.2.3. Phép tuyển

Tuyển của hai mệnh đề a, b là một mệnh đề đọc là a hoặc b, kí hiệu là a ν b (hoặc

a+b), sai khi cả hai mệnh đề cùng sai và đúng trong trường hợp còn lại.

Bảng giá trị chân lí của phép tuyển

a b a ν b

1 1 1

1 0 1

0 1 1

0 0 0

Phép tuyển trên còn được gọi là phép tuyển không loại trừ.

Phép tuyển loại trừ của hai mệnh đề a và b, chỉ đúng khi hoặc a, hoặc b đúng ta thường

kí hiệu là a b.

Chú ý: Để thiết lập mệnh đề tuyển của hai mệnh đề a, b ta ghép hai mệ nh đề đó bởi

liên từ “hoặc” (hay liên từ khác cùng loại).

Ví dụ 2.5

“Tháng 12 có 31 ngày hoặc 2 + 2 = 4” là tuyển của hai mệnh đề a = “Tháng 12 có 31

ngày”và b = “2 + 2 = 4”. Ở đây G(a ν b) = 1.

“3 nhỏ hơn hoặc bằng 4” là mệnh đề đúng

“Số lẻ là số có chữ số tận cùng bằng 1, 3, 5, 7 hoặc 9” là mệnh đề đúng

“20 là số lẻ hoặc chia hết cho 3” là mệnh đề sai

Chú ý: Trong thực tế, liên từ “hoặc” thường được dùng với hai nghĩa “loại trừ” và

“không loại trừ”; Phép tuyển “hoặc a hoặc b” là phép tuyển loại trừ để chỉ a hoặc b nhưng

không thể cả a lẫn b; Phép tuyển “a hoặc b” là phép tuyển không loại trừ để chỉ a hoặc b và

có thể cả a lẫn b.

Chẳng hạn:

“Hôm nay là ngày Chủ nhật hoặc ngày lễ” là phép tuyển không loại trừ.

Page 19: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 18

“20 là số lẻ hoặc nó chia hết cho 2” là phép tuyển loại trừ.

2.2.4. Phép kéo theo

a kéo theo b là một mệnh đề, kí hiệu là a→b, chỉ sai khi a đúng và b sai và đúng

trong các trường hợp còn lại.

Bảng giá trị chân lí của phép kéo theo

a b a →b

1 1 1

1 0 0

0 1 1

0 0 1

Chú ý: Mệnh đề a kéo theo b thường được diễn đạt dưới nhiều hình thức khác nhau, chẳng

hạn:

“Nếu a thì b”

“Có b khi có a”

“Từ a suy ra b”

“a là điều kiện đủ để có b”

“b là điều kiện cần (ắt có) để có a”

Ví dụ 2.6

“15 có chữ số tận cùng bằng 5 suy ra 15 chia hết cho 5” là mệnh đề đúng.

“Nếu dây tóc bóng đèn có dòng điện chạy qua thì bóng đèn sáng” là mệnh đề đúng

Chú ý:

1. Trong lôgic, khi xét giá trị chân lí của mệnh đề a→b người ta không quan tâm đến

mối quan hệ về nội dung của hai mệnh đề a, b. Không phân biệt trường hợp a có phải là

nguyên nhân để có b hay không, mà chỉ quan tâm đến tính đúng, sai của chúng.

Ví dụ 2.7

“Nếu mặt trời quay quanh trái đất thì Việt Nam nằm ở Châu Âu” mệnh đề đúng. Vì ở

đây hai mệnh đề a = “mặt trời quay quanh trái đất”và b = “Việt Nam nằm ở Châu Âu” đều

sai.

“Nếu tháng 12 có 31 ngày thì mỗi năm có 13 tháng” là mệnh đề sai.

2. Theo bảng chân lí trên, ta thấy:

Nếu a sai thì a →b luôn đúng.

Nếu a đúng thì a →b đúng khi b đúng.

Vì vậy để chứng minh mệnh đề a →b đúng ta chỉ cần xét trường hợp a và b cùng

đúng và phép chứng minh mệnh đề a →b được tiến hành theo ba bước:

Bước 1. Giả sử a đúng.

Bước 2. Từ giả thiết a đúng, dùng lập luận và các mệnh đề toán học đã biết, suy ra b

đúng.

Page 20: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 19

Bước 3. Kết luận a →b luôn đúng.

Trong mệnh đề a →b ta gọi a là giả thiết, b là kết luận.

3. Nếu ta coi là mệnh đề thuận thì b→a là mệnh đề đảo,

4. Trong văn học, mệnh đề kéo theo còn được diễn đạt bằng nhiều hình thức phong

phú. Chẳng hạn:

“Bao giờ bánh đúc có xương

Bấy giờ dì ghẻ mới thương con chồng”

hoặc

“Chuồn chuồn bay thấp thì mưa, Bay cao thì nắng bay vừa thì râm”.

2.2.5. Phép tương đương

a tương đương b là một mệnh đề, kí hiệu là a↔b, nếu cả hai mệnh đề a và b cùng

đúng hoặc cùng sai.

Bảng giá trị chân lí của mệnh đề tương đương

a b a↔b

1 1 1

1 0 0

0 1 0

0 0 1

1. Trong thực tế, mệnh đề “a tương đương b” thường được diễn đạt dưới nhiều hình

thức khác nhau. Chẳng hạn:

“a khi và chỉ khi b”

“a nếu và chỉ nếu b”

“a và b là hai mệnh đề tương đương”

“a là điều kiều kiện cần và đủ để có b”

2. Hai mệnh đề a, b tương đương với nhau hoàn toàn không có nghĩa là nội dung của

chúng như nhau, mà nó chỉ nói lên rằng chúng có cùng giá trị chân lí (cùng đúng hoặc cùng

sai).

Ví dụ 2.8

“Tháng 12 có 31 ngày khi và chỉ khi trái đất quay quanh mặt trời” là mệnh đề

đúng.

“12 giờ trưa hôm nay Tuấn có mặt ở Hà Nội nếu và chỉ nếu vào giờ đó anh đang

ở thành phố Hồ Chí Minh” là mệnh đề sai.

“Hình vuông có một góc tù khi và chỉ khi 100 là số nguyên tố” là mệnh đề đúng.

3. Một cách khác, người ta cũng nói rằng a tương đương b khi và chỉ khi cả hai mệnh

đề a→b và b→a cùng đúng. Vì vậy để chứng minh mệnh đề a↔b ta chứng minh hai mệnh

đề a→b và b→a.

Page 21: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 20

4. Các cặp mệnh đề thuận và phản đảo, đảo và phản là những cặp mệnh đề tương

đương. Đây chính là cơ sở của phương pháp chứng minh gián tiếp trong toán học.

2.3. Sự tương đương lôgic và luật

2.3.1. Giới thiệu

Trong phần trên ta đã xét năm phép toán trên các mệnh đề. Như vậy, nếu có các

mệnh đề a, b, c,... khi dùng các phép toán lôgic tác động vào, chúng ta sẽ nhận được những

mệnh đề ngày càng phức tạp hơn. Mỗi mệnh đề như thế và cả những mệnh đề xuất phát ta

gọi là công thức. Hay nói cách khác:

Mỗi công thức được tạo thành từ những mệnh đề dưới tác dụng của các phép toán

lôgic. Như vậy ta gán cho mỗi mệnh đề có mặt trong công thức P một giá trị chân lí, dùng

bảng chân lí của các phép lôgic ta khẳng định được công thức P là mệnh đề đúng hoặc sai.

Nếu P là mệnh đề đúng (hoặc sai) thì ta nói công thức P có giá trị chân lí bằng 1 (hoặc 0).

Ví dụ 2.9

(1) là công thức có giá trị chân lí bằng 1 (với mọi mệnh đề a).

Bảng giá trị chân lí của công thức (1)

a a Λ

0 1 0 1

1 0 0 1

(2) là một công thức có giá trị chân lí bằng 0 (với mọi mệnh đề a, b).

Bảng giá trị chân lí của công thức (2)

2.3.2. Sự tương đương lôgic

Cho P và Q là hai công thức. Ta nói rằng hai công thức P, Q tương đương lôgic với

Page 22: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 21

nhau, kí hiệu là P ≡ Q, nếu với mọi hệ chân lí gán cho các mệnh đề có mặt trong hai công

thức đó thì chúng luôn nhận giá trị chân lí như nhau.

Đặc biệt, hai mệnh đề a, b gọi là tương đương lôgic, kí hiệu là a ≡ b, nếu chúng cùng

đúng hoặc cùng sai.

Chú ý:

1. Kí hiệu a ≡ b là để chỉ hai mệnh đề tương đương lôgic chứ không phải là hai mệnh

đề bằng nhau.

2. Hai mệnh đề tương đương lôgic có thể về nội dung chúng hoàn toàn không có liên

quan.

Chẳng hạn: “Tháng 2 có 31 ngày ≡ 2 + 2 = 11”.

3. Quan hệ P ≡ Q còn được gọi là một đẳng thức.

Page 23: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 22

Dưới đây là một số đẳng thức thường gặp trong lôgic mệnh đề:

Phủ định của phủ định

(1) ≡ a.

Luật Đờ Moócgăng

(2) ≡

(3) ≡

Tính chất kết hợp của các phép lôgic

(4) (a Λ b) Λ c ≡ a Λ (b Λ c)

(5) (a ν b) ν c ≡ a ν (b ν c)

Tính chất giao hoán của các phép lôgic

(6) a Λ b ≡ b Λ a

(7) a ν b ≡ b ν a

(8) a↔b ≡ b↔a

Tính chất phân phối

(9) a Λ (b ν c) ≡ (a Λ b) ν (a Λ c)

(10) a ν (b Λ c) ≡ (a ν b) Λ (a ν c)

Tính lũy đẳng

(11) a Λ a ≡ a

(12) a ν a ≡ a

Biểu diễn phép kéo theo qua các phép lôgic khác

Biểu diễn tương đương qua các phép lôgic khác

Các đẳng thức về 0 và 1

Người ta còn dùng kí hiệu 1 (hoặc 0) để chỉ một mệnh đề luôn luôn đúng (hoặc luôn

luôn sai). Ta có các đẳng thức sau về 0 và 1:

(18) a Λ 0 ≡ 0

(19) a ν 0 ≡ a

(20) a Λ 1 ≡ a

(21) a ν 1 ≡ 1

(22) a ν ≡ 1 (luật bài trung)

(23) a Λ ≡ 0 (luật mâu thuẫn)

Page 24: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 23

2.4. Bài tập

Chứng minh đẳng thức

Để chứng minh một đẳng thức trong lôgic mệnh đề ta có thể dùng phương pháp lập

bảng giá trị chân lí.

Ví dụ 2.10 Chứng minh: ≡

Ta có bảng giá trị chân lí như sau:

Cột 1 2 3 4 5 6 7

a b a Λ b

1 1 1 0 0 0 0

1 0 0 1 0 1 1

0 1 0 1 1 0 1

0 0 0 1 1 1 1

Nhìn cột 4 và 7 trong bảng trên ta thấy hai công thức và luôn nhận giá

trị chân lí như nhau. Vậy ta có điều phải chứng minh.

Ví dụ 2.11 Chứng minh: ≡

Ta có bảng giá trị chân lí

a b

1 1 1 1

1 0 0 0

0 1 1 1

0 0 1 1

Nhìn cột 3 và 4 trong bảng trên ta thấy hai công thức và luôn nhận

giá trị chân lí như nhau. Vậy ta có điều phải chứng minh.

Page 25: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 24

Bài 3 Logic vị từ (predicate logic)

3.1. Vị từ

3.1.1. Định nghĩa

Ta xét các ví dụ sau:

Ví dụ 3.1 “Số tự nhiên n chia hết cho 5”

Về phương diện ngôn ngữ thì đây là một câu. Nhưng câu này chưa phản ánh tính

đúng hoặc sai một thực tế khách quan nào, cho nên nó chưa phải là mệnh đề. Song nếu ta

thay n bằng số tự nhiên cụ thể, chẳng hạn:

Thay n = 100 ta được mệnh đề đúng: “Số 100 chia hết cho 5”.

Thay n = 101 ta được mệnh đề sai: “Số 101 chia hết cho 5”.

Ví dụ 3.2 “x + 3 > 7”

Tương tự như trong ví dụ 3.1 ta có x + 3 > 7 chưa phải là mệnh đề, song nếu ta thay x

bởi một số thực cụ thể, chẳng hạn:

Thay x = 0 ta được mệnh đề sai: “0 + 3 > 7”.

Thay x = 5 ta được mệnh đề đúng: “5 + 3 > 7”.

Ví dụ 3.3 “Ông A là nhà toán học vĩ đại”

Câu trên chưa phải là mệnh đề. Nhưng nếu ta chọn”ông A” là”Gausơ”sẽ được mệnh đề

đúng: “Gausơ là nhà toán học vĩ đại”, nếu ta chọn”ông A” là”Đinh Bộ Lĩnh”thì sẽ được

mệnh đề sai: “Đinh Bộ Lĩnh là nhà toán học vĩ đại”.

Từ các ví dụ trên ta đi đến định nghĩa sau:

Những câu có chứa các biến mà bản thân nó chưa phải là mệnh đề nhưng khi ta thay các

biến đó bởi các phần tử thuộc tập xác định X thì nó trở thành mệnh đề (đúng hoặc sai) ta

sẽ gọi là hàm mệnh đề (hoặc vị từ, hàm phán đoán, mệnh đề không xác định, mệnh đề chứa

biến). Tập X gọi là miền xác định của hàm mệnh đề đó.

Ta dùng kí hiệu: T(n), F(x),... để chỉ các vị từ.

Chẳng hạn:

Vị từ T(n): “Số tự nhiên n chia hết cho 5”có miền xác định là tập các số tự nhiên

N. Tập các số tự nhiên có tận cùng bằng 0 hoặc 5 là miền đúng của T(n).

Vị từ F(x) = “x + 3 > 7”có miền xác định là các số thực. Tập các số thực lớn hơn

4 ta gọi là miền đúng của vị từ F(x).

3.1.1. Các phép toán vị từ

Phép phủ định

Cho p(x,y,..) là một vị từ theo các biến x, y, .. Phủ định của p kí hiệu là p là một vị từ

mà khi thay các biến x, y, .. bởi các phần tử cụ thể a, b, .. tương ứng thì ta có mệnh đề

(p(a,b,..)).

Page 26: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 25

( p)( x,y,..) (p(x,y,..))

Phép hội

Cho p(x,y,..) và q(x,y,..) là các vị từ theo các biến x, y, .. Phép hội của p và q kí hiệu là

p q là một vị từ mà khi thay các biến x, y, .. bởi các phần tử cụ thể a, b, .. tương ứng thì ta có

mệnh đề p(x,y,..) q(x,y,..)

(p q)(x,y,..) p(x,y,..) q(x,y,..)

Phép tuyển

Cho p(x,y,..) và q(x,y,..) là các vị từ theo các biến x, y, .. Phép tuyển của p và q kí hiệu

là p q là một vị từ mà khi thay các biến x, y, .. bởi các phần tử cụ thể a, b, .. tương ứng thì ta

có mệnh đề p(x,y,..) q(x,y,..)

(p q)(x,y,..) p(x,y,..) q(x,y,..)

Phép kéo theo

Cho p(x,y,..) và q(x,y,..) là các vị từ theo các biến x, y, .. Phép p kéo theo q kí hiệu là

pq là một vị từ mà khi thay các biến x, y, .. bởi các phần tử cụ thể a, b, .. tương ứng thì ta

có mệnh đề p(x,y,..) q(x,y,..)

(p q)(x,y,..) p(x,y,..) q(x,y,..)

Phép tương đương

Cho p(x,y,..) và q(x,y,..) là các vị từ theo các biến x, y, .. Phép tương đương của p và q

kí hiệu là pq là một vị từ mà khi thay các biến x, y, .. bởi các phần tử cụ thể a, b, .. tương

ứng thì ta có mệnh đề p(x,y,..) q(x,y,..)

(p q)(x,y,..) p(x,y,..) q(x,y,..)

3.2. Lượng từ

3.2.1. Mệnh đề tồn tại

Cho T(x) là hàm mệnh đề xác định trên miền X. Nếu ta đặt thêm cụm từ “Tồn

tại sao cho ...” vào trước hàm mệnh đề T(x) ta được mệnh đề:

“Tồn tại sao cho T(x)”

Ta gọi mệnh đề có cấu trúc như trên là mệnh đề tồn tại. Kí hiệu là:

hoặc

Kí hiệu gọi là lượng từ tồn tại.

Ví dụ 3.4

“Tồn tại số thực x sao cho x + 4 > 7” là mệnh đề đúng.

Kí hiệu là:

“Tồn tại số tự nhiên n sao cho n chia hết cho 5” là mệnh đề đúng.

Page 27: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 26

Kí hiệu là:

“Tồn tại số thực x sao cho x2 + 1 = 0” là mệnh đề sai.

Kí hiệu là:

1. Trong thực tế, mệnh đề tồn tại còn được diễn đạt dưới những dạng khác nhau, chẳng

hạn:

“Tồn tại ít nhất một sao cho T(x)”.

“Có một sao cho T(x)”.

“Có ít nhất một sao cho T(x)”.

“Ít ra cũng có một người là nhà toán học”.

“Một số người là nhà toán học”.

“Có nhiều người là nhà toán học”

2. Ta dùng kí hiệu với nghĩa “Tồn tại duy nhất một sao cho T(x)”.

3.2.2. Mệnh đề tất cả

Cho T(x) là hàm mệnh đề xác định trên miền X. Nếu ta đặt thêm cụm từ”Với

mọi ta có ...”vào trước hàm mệnh đề T(x) ta được mệnh đề:

“Với mọi ta có T(x)”

Ta gọi mệnh đề có cấu trúc như trên là mệnh đề tổng quát (hoặc toàn thể, phổ biến, phổ

cập,...). Kí hiệu là:

hoặc

hoặc

Kí hiệu gọi là lượng từ tổng quát (hay toàn thể, phổ biến, phổ cập, ...)

Ví dụ 3.5

“Với mọi số tự nhiên n ta có n chia hết cho 5” là mệnh đề sai.

Kí hiệu là:

“Với mọi số thực x ta có x + 3 > 7” là mệnh đề sai.

Kí hiệu là:

“Với mọi số thực x ta có x2 + 1 > 0” là mệnh đề đúng.

Kí hiệu là:

Chú ý: Trong thực tế, mệnh đề tổng quát thường được diễn đạt dưới nhiều hình thức

khác nhau, chẳng hạn:

“Tất cả người Việt Nam đều nói tiếng Anh”.

“Mọi người Việt Nam đều nói thạo tiếng Anh”.

Page 28: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 27

“Người Việt Nam nào cũng nói thạo tiếng Anh”.

“Đã là người Việt Nam thì ai chẳng nói thạo tiếng Anh”.

3.2.3. Quy tắc phủ định mệnh đề có lượng từ

Phủ định các mệnh đề tồn tại và tổng quát được thiết lập theo hai quy tắc dưới đây:

Như vậy, hai mệnh đề:

và là phủ định của nhau.

và là phủ định của nhau.

Ví dụ 3.6

Kí hiệu là:

Kí hiệu là:

Mệnh đề Biểu thức

tương đương

Khi nào đúng Khi nào sai

P(x) sai với mọi giá trị của x Có một giá trị của x sao cho

P(x) đúng

Có một giá trị của x sao cho

P(x) sai

P(x) đúng với mọi giá trị của x

Từ các quy tắc trên có thể nói quy tắc phủ định của mệnh đề có lượng từ như sau:

Nếu trong một mệnh đề có lượng từ thì có thể thay thế lượng từ bởi lượng từ và ngược

lại có thể thay thế lượng từ bởi lượng từ ; Biểu thức vị từ được thay thế bởi phủ định của

nó sẽ được mệnh đề phủ định của mệnh đề có lượng từ ban đầu, quy tắc này cũng có thể áp

dụng cho các mệnh đề với nhiều lượng từ.

Page 29: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 28

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

, , : ( , , )x A y B z C p x y z

Theo quy tắc chung ta có

, , : ( , , )x A y B z C p x y z , ( , : ( , , ))x A y B z C p x y z

, , ( : ( , , ))x A y B z C p x y z , , : ( , , )x A y B z C p x y z

3.2.4 Một số lượng từ hai biến

Mệnh đề Khi nào đúng Khi nào sai

P(x,y) đúng với mọi cặp (x,y) Có một cặp (x,y) sao cho P(x,y)

sai

Với mọi x, có một y sao cho P(x,y)

đúng

Có một x sao cho P(x,y) sai với

mọi y

Có một x sao cho P(x,y) đúng với

mọi y

Với mọi x có một y sao cho P(x,y)

sai

Có một cặp (x,y) sao cho P(x,y)

đúng

Mọi cặp (x,y) sao cho P(x,y) sai

3.2.5 Một số quy tắc phổ dụng

Quy tắc 1 Cho p(x) và q(x) là các vị từ theo biến x, A là miền giá trị, a là một phần tử bất kỳ

thuộc A. Ta có

Quy tắc 2 Cho p(x), q(x) và r(x) là các vị từ theo biến x, A là miền giá trị. Ta có

Page 30: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 29

3.3. Logic trong tìm kiếm trên mạng

Sử dụng kết hợp các toán tử logic như phép and sẽ thu hẹp kết quả tìm kiếm và cho kết

quả chính xác hơn khi kết quả trả về quá nhiều. Ngược lại, thay đổi toán tử logic khác như

phép or hay phép trừ thì cho nhiều kết quả hơn, khi quá ít kết quả trả về.

3.4. Logic trong lập trình

Đặt vấn đề: Bạn muốn đặt điều kiện là nếu 0<x<10 hay x=10 thì tăng x lên 1 đơn vị.

if (0<x<10 OR x=10) x++;

Cách giải quyết: Bạn có thể viết lại câu lệnh như sau if (x>0 AND x < = 10) x++ ;

3.5. Logic trong đời sống

Ví dụ 3.8 Mẹ của bé An nói rằng: “Nếu con ngoan thì con có thể được ăn kem hoặc ăn

bánh bông lan”. Bé An hiểu rằng nếu nó ngoan thì nó sẽ được ăn kem và ăn bánh bông lan.

Tuy nhiên, mẹ của bé An tức giận vì thật sự bà ta chỉ cho phép nó được ăn một trong hai thứ

mà thôi.

Cách giải quyết là mẹ của bé An phải nói như thế này: “Nếu con ngoan thì con sẽ được

ăn hoặc là kem hoặc là bánh bông lan nhưng không được ăn cả hai”.

Ví dụ 3.9 Sau khi nướng 1 chiếc bánh cho 2 đứa cháu trai và 2 đứa cháu gái đến thăm, Dì

Nellie lấy bánh ra khỏi lò nướng và để nguội. Sau đó, cô rời khỏi nhà để đến đóng cửa hàng

ở gần đó. Lúc trở về thì có ai đó đã ăn 1/4 chiếc bánh và thậm chí còn đặt lại cái dĩa dơ

bên phần bánh còn lại. Vì không còn ai đến nhà Dì ngày hôm đó trừ 4 đứa cháu nên Dì biết

ngay là 1 trong 4 đứa đã ăn mà chưa được cho phép. Dì Nellie bèn hỏi 4 đứa thì được các câu

trả lời như sau:

- Charles: Kelly đã ăn phần bánh

- Dawn: Con không ăn bánh

- Kelly: Tyler ăn bánh

- Tyler: Con không ăn, Kelly nói chơi khi bảo rằng con ăn bánh.

Nếu chỉ 1 trong 4 câu trả lời trên là đúng và chỉ 1 trong 4 đứa cháu là thủ phạm, hãy tìm

ra người mà Dì Nellie phải phạt?

Cách giải quyết: Vì chỉ 1 trong 4 câu trả lời trên là đúng nên chúng ta có thể dùng phép

vét cạn để tìm lời giải.

- Giả sử Charles nói đúng nghĩa là Kelly ăn bánh. Ba câu còn lại là sai. Dawn nói” Con

không ăn bánh” là sai nghĩa là Dawn có ăn bánh. Vậy có đến 2 người ăn bánh, điều này

mâu thuẫn giả thiết, giả sử không được chấp thuận.

- Giả sử Dawn nói đúng nghĩa là Dawn không ăn bánh và 3 câu còn lại là sai. Nhận

thấy có mâu thuẫn giữa Kelly và Tyler. Bởi vì Kelly nói”Tyler ăn bánh” là sai nghĩa là Tyler

không ăn. Trong khi đó, Tyler lại nói rằng”Con không ăn...” là sai, vậy thực tế là nó có ăn.

Giả thuyết này là không chấp nhận được.

Page 31: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 30

- Giả sử Kelly nói đúng nghĩa là Tyler ăn bánh và 3 câu còn lại là sai. Như vậy, cũng có

2 thủ phạm là Kelly và Dawn. Mâu thuẫn giả thiết.

- Giả sử sau cùng là Tyler nói đúng nghĩa là nó không ăn bánh và 3 câu còn lại là sai.

Nhận thấy chỉ có một người ăn bánh chính là Dawn. Vậy giả thuyết này là hợp lý và thủ

phạm chính là Dawn.

3.6. Logic trong tính toán

Ví dụ 3.10 Bạn có 3 lần kiểm tra trong lớp học. Nếu bạn đạt được 2 lần điểm A, hoặc chỉ

một lần điểm A nhưng không được có một lần nào rớt trong 3 lần kiểm tra đó thì bạn sẽ

đạt điểm A cho toàn khóa học. Bạn là người không được siêng năng lắm, vậy thì bạn sẽ

chọn cách nào để đạt điểm A cho toàn khóa học ?

Cách giải quyết: Bởi vì điều kiện là OR nên cách giải quyết là bạn có thể đạt 2 điểm A

và rớt lần 3, hay là chỉ cần đạt một điểm A và không rớt lần nào. Bạn sẽ lựa chọn đạt một điểm

A và không rớt lần nào.

3.7. Logic trong suy luận

Ví dụ 3.10 Tìm số tự nhiên a biết rằng trong 3 mệnh đề dưới đây có 2 mệnh đề là đúng và 1

mệnh đề là sai.

1/ a + 51 là số chính phương

2/ Chữ số tận cùng của a là 1

3/ a - 38 là số chính phương

Cách giải quyết: Trước hết, chúng ta sẽ phải xác định xem 2 mệnh đề đúng và 1 mệnh

đề sai là mệnh đề nào? Sau đó từ 2 mệnh đề đúng để tìm ra số tự nhiên a.

Số chính phương là số nguyên dương khi lấy căn bậc hai. Do đó, số chính phương có

các chữ số tận cùng là 0, 1, 4, 5, 6, 9.

- Nhận thấy giữa mệnh đề 1 và 2 có mâu thuẫn. Bởi vì, giả sử 2 mệnh đề này đồng

thời là đúng thì a+51 có chữ số tận cùng là 2 nên không thể là số chính phương. Vậy

trong 2 mệnh đề này phải có 1 mệnh đề là đúng và 1 là sai.

- Tương tự, nhận thấy giữa mệnh đề 2 và 3 cũng có mâu thuẫn. Bởi vì, giả sử mệnh

đề này đồng thời là đúng thì a-38 có chữ số tận cùng là 3 nên không thể là số chính phương.

Vậy trong 3 mệnh đề trên thì mệnh đề 1 và 3 là đúng, còn mệnh đề 2 là sai. Với x > 0 và

y > 0 .

Đặt:

a + 51 = x2

- a - 38 = y2

----------------

89 = 1.89 = x2 - y2 = (x + y)(x - y)

Suy ra:

Page 32: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 31

x + y = 1 (loại vì x, y là nguyên dương nên không thể có x + y = 1)

x - y = 89

Hay là:

x + y = 89

x - y = 1

Giải hệ phuơng trình này ta được x = 45 và y = 44. Vậy a = 1974.

Ví dụ 3.11 Tại Tiger Cup 98 có bốn đội lọt vào vòng bán kết: Việt Nam, Singapo, Thái Lan

và Inđônêxia. Trước khi thi đấu vòng bán kết, ba bạn Dụng, Quang, Trung dự đoán như sau:

Dụng: Singapo nhì, còn Thái Lan ba. Quang: Việt Nam nhì, còn Thái Lan tư. Trung:

Singapo nhất và Inđônêxia nhì.

Kết quả, mỗi bạn dự đoán đúng một đội và sai một đội. Hỏi mỗi đội đã đạt giải mấy?

Giải:

Kí hiệu các mệnh đề:

d1, d2 là hai dự đoán của Dụng.

q1, q2 là hai dự đoán của Quang.

t1, t2 là hai dự đoán của Trung.

Vì Dụng có một dự đoán đúng và một dự đoán sai, nên có hai khả năng:

Nếu G(d1) = 1 thì G(t1) = 0. Suy ra G(t2) = 1. Điều này vô lí vì cả hai đội Singapo

và Inđônêxia đều đạt giải nhì.

Nếu G(d1) = 0 thì G(d2) = 1. Suy ra G(q2) = 0 và G(q1) = 1. Suy ra

G(t2) = 0 và G(t1) = 1.

Vậy Singapo nhất, Việt Nam nhì, Thái Lan ba còn Inđônêxia đạt giải tư.

3.8. Logic trong giải bài toán trong kĩ thuật

Lôgic mệnh đề còn được ứng dụng trong kĩ thuật lắp ráp các mạch điện và thiết bị

trong nhà máy. Dưới đây là một ví dụ minh họa.

Ví dụ 3.12 Giữa công tắc và dây may so của một chiếc Bàn là có rơle tự ngắt (để khi dây

may so nóng đến nhiệt độ quy định cho phép thì rơle tự ngắt mạch điện cho Bàn là được an

toàn). Hãy thiết lập nguyên tắc lôgic của quá trình hoạt động của chiếc Bàn là đó (thiết lập

mối liên hệ giữa việc đóng, ngắt mạch của công tắc, rơle với nhiệt độ cho phép của dây may

so).

Giải:

Kí hiệu các mệnh đề:

c = “Công tắc Bàn là đóng mạch”.

r = “Rơ le Bàn là đóng mạch”.

t = “Dây may so trong Bàn là nóng tới nhiệt độ cho phép”.

Mối liên hệ giữa trạng thái an toàn của Bàn là và giá trị chân lí của các mệnh đề c, r, t

có thể biểu diễn bởi bảng sau:

Page 33: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 32

Trạng thái c r t Trạng thái an toàn

1 1 1 1 không

2 1 1 0 có

3 1 0 1 có

4 1 0 0 không

5 0 1 1 không

6 0 1 0 có

7 0 0 1 có

8 0 0 0 không

Trạng thái 1 và 5 không đảm bảo an toàn, vì khi dây may so đã nóng tới nhiệt độ

quy định cho phép mà rơle vẫn đóng mạch thì dẫn đến hỏng Bàn là hoặc đồ là.

Trạng thái 4 và 8 không đảm bảo an toàn vì dây may so chưa nóng tới nhiệt độ quy

định cho phép mà rơle đã ngắt mạch thì Bàn là không sử dụng được.

Các trạng thái còn lại: 2, 3, 6 và 7 đều đảm bảo an toàn. Các trạng thái đó được mô tả

bằng các công thức lôgic sau:

Trạng thái Công thức

2

3

6

7

Vậy Bàn là hoạt động an toàn khi và chỉ khi:

(1)

Áp dụng các đẳng thức về luật phân phối, các đẳng thức về 0 và 1 cho trạng thái 2

với 6 và 3 với 7, ta có:

(2)

Dùng bảng chân lí ta nhận được:

(3)

(4)

Từ (1), (2), (3) và (4) ta suy ra:

Bàn là hoạt động an toàn khi và chỉ khi

Quy trình trên ta có thể phát biểu thành lời như sau: để Bàn là hoạt động an toàn

phải đảm bảo nguyên tắc: “Công tắc rơle đóng mạch khi và chỉ khi nhiệt độ dây may so chưa

tới hạn cho phép” hay “nhiệt độ dây may so tới hạn cho phép khi và chỉ khi công tắc rơle

ngắt mạch điện”.

Cách giải quyết khác: Công tắc Bàn không đóng mạch bàn thì bàn là luôn ở trạng thái

an toàn. Sau đây ta xét trường hợp bàn là đóng mạch, chỉ quan tâm tới 2 mệnh đề là “Rơ le

Page 34: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 33

Bàn là đóng mạch” và mệnh đề “Dây may so trong Bàn là nóng tới nhiệt độ cho phép” ảnh

hưởng tới trạng thái an toàn của bàn là.

Page 35: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 34

Bài 4 Thảo luận Logic

4.1. Logic mệnh đề

4.1.1 Logic trong suy luận

Trong một phiên tòa xử án 3 bị can có liên quan đến vấn đề tài chánh để xét xem ai là

người có tội? Trước tòa cả 3 bị cáo đều tuyên thệ khai đúng sự thật và lời khai như sau:

Anh A: Chị B có tội hoặc anh C vô tội

Chị B : Nếu anh A có tội thì anh C cũng có tội

Anh C: Tôi vô tội nhưng một trong hai người kia là có tội

4.1.2. Mạch logic số

Trang 64 (Discrete Mathematics with Application, Susana)

4.2. Logic vị từ

4.2.1 Logic trong suy luận

Ví dụ: Kiểm tra suy luận sau: Là người ai cũng phải chết; Ông A là 1 người; Vậy ông A phải

chết.

4.3. Logic mờ (*)

Được phát triển từ lý thuyết tập mờ để thực hiện lập luận một cách xấp xỉ thay vì lập

luận chính xác theo lôgic vị từ cổ điển. Lôgic mờ có thể được coi là mặt ứng dụng của lý

thuyết tập mờ để xử lý các giá trị trong thế giới thực cho các bài toán phức tạp (Klir 1997).

4.4. Thảo luận

Cách giải một bài toán dùng công cụ của lôgic mệnh đề

Các bước tiến hành.

Yêu cầu thảo luận: Hãy thiết lập biểu thức logic tương ứng với các đồ vật trong gia đình như:

máy giặt, nồi cơm điện, ...

(*) Ứng dụng logic vị từ và logic mờ.

Page 36: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 35

Bài 5 Một số phương pháp chứng minh

5.1. Giới thiệu

Suy luận được xem là một trong những nền tảng xây dựng nên các ngành khoa học tự

nhiên. Từ xưa đến nay, nhờ suy luận mà người ta có thể nhận thức được cái chưa biết từ

những cái đã biết. Suy luận còn là cơ sở của sự sáng tạo. Từ các phán đoán, đưa đến các

chứng minh để chấp nhận hay bác bỏ một vấn đề nào đó.

Suy luận toán học dựa trên nền tảng của các phép toán mệnh đề, chủ yếu là phép kéo

theo. Để chứng minh một vấn đề nào đó, thông thường người ta phải xác định điểm ban đầu

(có thể gọi là giả thiết) và điểm kết thúc (gọi là kết luận). Quá trình đi từ giả thiết đến kết

luận gọi là quá trình chứng minh và quá trình này đươc thực thi bằng cách nào thì gọi đó là

phương pháp chứng minh. Một khẳng định mà chưa được chứng minh được gọi là phỏng

đoán.

Trong toán học, chứng minh là công việc đưa ra minh chứng thuyết phục (dựa vào

những kiến thức chuẩn trong ngành học) một mệnh đề toán học là đúng cho mọi trường

hợp, không trừ một trường hợp cụ thể nào. Một mệnh đề đã được chứng minh thì gọi là các

định lý và nó có thể được sử dụng để chứng minh cho các mệnh đề khác.

5.1.1. Vai trò của chứng minh

Các phương pháp chứng minh là rất quan trọng vì không những chúng thường được sử

dụng trong toán học mà còn được áp dụng nhiều trong tin học. Ví dụ, sự kiểm tra tính đúng

đắn của một chương trình, của một hệ điều hành, xây dựng các luật suy diễn trong lĩnh vực

trí tuệ nhận tạo... Do đó, chúng ta cần phải nắm vững các phương pháp chứng minh.

• Trong toán học chứng minh là:

– Một luận cứ đúng đắn (dựa trên lập luận logic vững chắc) and và đầy đủ (rõ ràng và

chi tiết) dựa trên những thiết lập không thể chối cái của các khẳng định toán học.

• Tại sao luận cứ lại phải đúng đắn và đầy đủ lại?

– Đúng đắn sẽ tránh cho chúng ta những ngộ nhận từ chính chúng ta.

– Đầy đủ cho phép bất kỳ ai cũng có thể kiểm định kết quả.

• Trong modul này, một yêu cầu rất quan trọng là tính đúng đắn và đầy đủ cho bất kỳ

một chứng minh nào!

• Các phương pháp chứng minh một luận cứ toán học có thể được công thức hóa

thành các luật suy diến.

• Các chứng minh toán học có thể được thể hiện hình thức như là chính các cấu trúc

rời rạc.

5.1.2. Một số thuật ngữ

Một hệ thống toán học bao gồm

Page 37: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 36

• Định lý (Theorem)

– Một mệnh đề được chứng minh là đúng.

• Tiên đề, giả thiết (Axioms, hypotheses)

– Một giả định (không chứng minh) định nghĩa về các cấu trúc mà chúng ta dùng để lập

luận.

• Luật suy diễn (rules of inferences)

– Một hình thức dùng logic để lập luận từ những giả thiết để đi tới kết luận.

• Bổ đề (Lemma) - Một định lý nhỏ được dùng như là một bước vững chắc để chứng

minh định lý chính.

• Hệ quả (Corollary) – Một định lý nhỏ được chứng minh một cách dễ dàng từ định lý

chính.

• Sự phỏng đoán (Conjecture) – Một khẳng định mà chưa được chứng minh

• Lý thuyết (Theory) – Bao gồm một tập các định lý đã được chứng minh từ một tập

các tiên đề.

Có hai kiểu chứng minh trong chứng minh toán học [3]. Thứ nhất là chứng minh informal

proof, ở đó những diễn tả bằng ngôn ngữ tự nhiên nhằm hướng mọi người tới sự thật của

định lý. Đây là kiểu chứng minh đặc trưng trong toán học. Bởi vì dùng ngôn ngữ tự

nhiên, nó phụ thuộc nhiều vào kiến thức nền tảng chứng minh của người đọc.

Thứ hai là kiểu chứng minh hình thức (formal proof). Đó là việc sử dụng một chuỗi các

ký hiệu và những định nghĩa chính xác. Chứng minh hình thức và tính chất của nó được

nghiên cứu trong lý thuyết chứng minh. Chứng minh hình thức không được phổ biến.

5.2. Chứng minh nhờ luật suy diễn

5.2.1. Giới thiệu

Chúng ta sẽ giới thiệu luật suy diễn cho logic mệnh đề. Những luật này cung cấp

cho chúng ta một chuỗi các bước biến đổi để đi tới kết luận một cách logic nhờ tập các giả

thiết. Phép lặp thừa (p^(p->q))→q được coi là cơ sở cho luật suy diễn modus Ponens

p

p→q

Page 38: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 37

------

q

Modus ponens khẳng định rằng nếu cả giả thiết và phép kéo theo là đúng là đúng thì kết

luận của phép kéo theo là đúng. Giả sử”nếu sinh viên làm hết bài tập vê nhà, thì sinh viên sẽ

đạt kết quả cao”và nếu giả sử có”sinh viên làm hết bài tập về nhà”, khi đó theo luật modus

ponens, kết luận”sinh viên sẽ đạt kết quả cao” là đúng.

Sau đây là một số luật suy diễn hay gặp:

1. Luật thay thế: Bất kỳ một biến nào xuất hiện trong một luận cứ đều có thể được

thay thế bằng một biểu thức cùng kiểu mà không ảnh hưởng tới sự chính xác của luận

điểm với điều kiện là sự thay thế đó phải được làm tại mọi nơi mà biến đó xuất hiện

2. Bảng sau đây đưa ra các luật suy diễn cho các luận điểm

Bảng5.1 Các luật suy diễn trong logic mệnh đề hay sử dụng

3. Bảng sau đây đưa ra các luật suy diễn cho các luận điểm cho các vị từ

Page 39: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 38

5.2.2. Một số ví dụ

Ví dụ 5.1 a

Nếu trời mưa, thì đường ướt. Về mặt hình thức, chúng ta có thể viết:

p → q: Nếu trời mưa, thì đường ướt.

Trong biểu thức này, Nếu trời mưa là tiền đề, còn Đường ướt là hậu đề.

Bây giờ, nếu chúng ta biết rõ một thực tế rằng trời mưa, thì chúng ta phải kết luận rằng

đường ướt. Nếu tiền đề (Trời mưa) đúng, thì hậu đề (Đường ướt) cũng cần phải đúng, theo

Modus Ponens. Chúng ta hãy viết các bước của mình về mặt hình thức:

p → q: Nếu trời mưa, thì đường ướt.

p: Trời mưa.

----------

q: Đường ướt.

Phép kéo theo p → q và p đã cho sẵn là ở trên đường gạch ngang, còn kết luận q

thu được bằng việc áp dụng Modus Ponens ở dưới đường gạch ngang.

Ví dụ 5.1 b

W → C: Nếu các cầu thủ đội Chelsea thắng trận đấu hôm nay, họ sẽ là những nhà vô

địch.

W: Các cầu thủ đội Chelsea thắng trận đấu hôm nay.

----------

C: Các cầu thủ đội Chelsea là những nhà vô địch.

Ví dụ 5.1 c

W → B: Nếu thời tiết tốt, chúng ta có thể đi ra bãi biển.

W: Thời tiết tốt.

----------

B: Chúng ta có thể đi ra bãi biển.

Ví dụ 5.2 Nếu được thưởng cuối năm An sẽ đi Đà Lạt. Nếu An đi Đà Lạt An sẽ đến hồ Than

Thở. An chưa đến hồ Than thở, vậy An không được thưởng cuối năm.

Ví dụ 5.3 Nếu B được lên chức và làm việc chăm chỉ thì B được tăng lương. Nếu B được tăng

lương thì B sẽ mua xe máy SH. Mà B không mua xe máy vậy B không được lên chức hoặc B

không làm việc chăm chỉ. Suy luận trên đúng không?

Page 40: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 39

Ví dụ 5.4

Tất cả sư tử đều hung dữ

Một số sư tử không uống cà phê

----------

Một số sinh vật hung dữ không uống cà phê

Gọi P(x) là “x là sư tử”

Q(x) “x hung dữ”

R(x) “x không uống cà phê”

Trong đó x X, X là không gian tất cả sinh vật

Về mặt hình thức, chúng ta có thể viết:

x (P(x)=>Q(x)) “Tất cả sư tử đều hung dữ”

x (P(x) R(x)) “Một số sư tử không uống cà phê”

x (Q(x) R(x)) “Một số sinh vật hung dữ không uống cà phê”

Chúng ta hãy viết các bước của mình về mặt hình thức:

x (P(x)=>Q(x)) “Tất cả sư tử đều hung dữ”

x (P(x) R(x)) “Một số sư tử không uống cà phê”

----------

x (Q(x) R(x)) “Một số sinh vật hung dữ không uống cà phê”

5.3. Các phương pháp chứng minh cho mệnh đề kéo theo

Bây giờ chúng ta sẽ làm rõ hơn về các phương pháp xây dựng chứng minh,chúng ta

sẽ mô tả các chứng minh cho các loại mệnh đề khác nhau.

Trong nhiều định lý, kỹ thuật chứng minh các mệnh đề kiểu kéo theo là quan trọng. Ta

thấy p→q sẽ luôn đúng trừ khi p là đúng nhưng q sai. Chú ý rằng khi p→q được chứng

minh, nếu chúng ta chỉ cần chỉ ra q là đúng nếu p đúng;

5.3.1. Chứng minh trực tiếp

Ta thấy p→q sẽ được chứng minh bằng cách chỉ ra p là đúng, sau đó q phải là đúng.

Điều này cho thấy rằng không thể có p đúng và q sai cùng xảy ra. Một chứng minh như vậy

được gọi là chứng minh trực tiếp. Để áp dụng chứng minh kiểu này, giả định p là đúng và

dùng luật suy diễn cùng các định lý đã được chứng minh để chỉ ra rằng q phải là đúng.

Chứng minh trực tiếp là phương pháp chứng minh suy diễn trực tiếp dẫn từ giả thiết

đến kết luận thông qua việc áp dụng các luật suy diễn (hay qui tắc suy diễn), các định lý,

các nguyên lý và các kết quả đã biết. Ðây là một kiểu tư duy giải bài toán rất tự nhiên và

người ta thường xuyên sử dụng. Trong khi suy nghĩ để tìm ra cách chứng minh theo

phương pháp này người ta thường phải tự trả lời các câu hỏi sau đây:

- Ta sẽ dùng luật suy diễn nào?

Page 41: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 40

- Các định lý nào, các kết quả nào có thể sử dụng được đề ta suy ra được một điều gì đó

từ những sự kiện, những yếu tố hiện đang có?

- Việc áp dụng định lý có khả năng sẽ dẫn đến kết luận hay kết quả mong muốn hay

không?

- Trong trường hợp ở một bước suy diễn nào đó có nhiều định lý hay nhiều luật nào

đó có thể áp dụng được và cũng có kkhả năng sẽ dẫn đến kết luận hay kết quả mong muốn

thì ta sẽ chọn cách nào?

- Ðến một giai đoạn nào đó, khi gặp phải sự bế tắc thì ta sẽ phải tự hỏi rằng phải

chăng bài toán không có lời giải, hay vì kiến thức của ta chưa đủ, hay ta phải sử dụng một

phương pháp chứng minh nào khác?

Quả thật là không thể trả lời được các câu hỏi một cách đầy đủ và chính xác. Nó phụ

thuộc chủ yếu vào kiến thức, kinh nghiệm của người giải bài toán và cả sự nhạy bén, tính

năng động sáng tạo của họ. Tuy nhiên những câu hỏi trên cho ta một sự định hướng chung

của quá trình suy nghĩ. Ngoài ra, cũng cần nói thêm rằng chúng là cơ sở cho việc phát triển

các hệ chương trình trợ giúp giải toán một cách”thông minh”trên máy tính được thiết kế

theo phương pháp chứng minh này.

Dưới đây, chúng ta sẽ xem xét một vài ví dụ về phương pháp chứng minh trực tiếp.

Ví dụ 5.5 a. Chứng minh rằng {Nếu n là số lẻ thì n2 là số lẻ}

Giải

Giả sử rằng giả thiết của định lý này là đúng, tức là n là số lẻ. Ta có n = 2k + 1 (k=0,1,2,...)

n2 = (2k + 1)2 = 4k2 + 4k + 1 = 2(2k2 + 2k) + 1 là lẻ.

Vậy nếu n là số lẻ thì n2 là số lẻ.

b. Cho hàm mệnh đề P(n) = “Nếu n>1 thì n2 >n”Chứng minh rằng P(n) là đúng với n là số

nguyên dương.

Giải: Giả sử n > 1 là đúng, ta có: n = 1 + k (k ≥ 1)

n2= (1 + k)2 = 1 + 2k + k2 = (1 + k) + k + k2 > n

Vậy nếu n>1 thì n2 >n .

5.3.2. Chứng minh gián tiếp

Vì mệnh đề P→Q ≡ (¬Q → ¬P). Do đó, để chứng minh mệnh đề P→Q là đúng, người

ta có thể chỉ ra rằng mệnh đề ¬Q → ¬P là đúng.

Ví dụ 5.6 Chứng minh định lý {Nếu 3n + 2 là số lẻ thì n là số lẻ}

Giải:

Giả sử ngược lại kết luận của phép kéo theo là sai, tức n là chẳn. Ta có

n = 2k (k∈ N)

Từ đó ta có 3n + 2 = 3.2k + 2 = 2(3k + 1) là số chẵn

Vậy nếu 3n + 2 là số lẻ thì n là số lẻ

Nhận xét

Có những bài toán có thể sử dụng phương pháp chứng minh trực tiếp hay gián tiếp đều

Page 42: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 41

được cả. Tuy nhiên, có những bài toán không thể sử dụng phương pháp chứng minh trực tiếp

được hoặc sử dụng trực tiếp thì bài giải sẽ dài dòng phức tạp hơn là sử dụng chứng minh

gián tiếp (hoặc ngược lại). Đây chính là sự khác biệt của chứng minh trực tiếp và chứng

minh gián tiếp.

Ví dụ 5.7 Sử dụng chứng minh gián tiếp để chứng minh rằng: “Nếu n>1 thì n2 >n”

Giải:

Giả sử ngược lại kết luận của phép kéo theo là sai, tức là n2 < n

Vì n là nguyên dương nên ta có thể chia 2 vế cho n mà bất đẳng thức không đổi chiều. Ta

có: n < 1.

Vậy từ ¬Q đã dẫn đến ¬P. Do đó, Nếu n>1 thì n2 >n.

Ví dụ 5.8 Sử dụng chứng minh trực tiếp để chứng minh rằng “Nếu 3n + 2 là số lẻ thì n là số

lẻ”.

Giải:

Giả sử 3n + 2 là số lẻ là đúng.

Nhận thấy rằng vì 2 là số chẵn nên suy ra được 3n là số lẻ. Vì 3 là số lẻ do đó n là số

lẻ.

Vậy nếu 3n + 2 là số lẻ thì n là số lẻ.

Ở đây chúng ta phải chứng minh thêm định lý là tích của 2 số lẻ là một số lẻ thì bài giải

chặt chẽ hơn. Do đó, trong bài toán này việc sử dụng chứng minh gián tiếp là hay hơn dùng

trực tiếp.

5.3.3. Chứng minh bằng cách phân chia trường hợp

Để chứng minh mệnh đề có dạng:

(P1 v P2v...v Pn) → Q Chúng ta có thể sử dụng hằng đúng sau:

((P1v P2v..v Pn) →Q) ↔ ((P1→Q) v (P2→Q) v....v(Pn→Q))

Cách chứng minh này gọi là chứng minh bằng cách phân chia trường hợp.

Ví dụ 5.9 Chứng minh rằng: “Nếu n không chia hết cho 3 thì n2 không chia hết cho 3”.

Giải:

Gọi P là mệnh đề”n không chia hết cho 3”và Q là mệnh đề” n2 không chia hết cho 3”.

Khi đó, P tương đương với P1 v P2. Trong đó: P1 = “n mod 3 =1” và P2 = “n mod 3 =2”

Vậy, để chứng minh P → Q là đúng, có thể chứng minh rằng:

(P1 v P2) → Q hay là (P1 → Q) v (P2→ Q)

Giả sử P1 là đúng. Ta có, n mod 3 = 1. Đặt n = 3k + 1 (k là số nguyên nào đó).

Suy ra n2 = (3k+1)2 = 9 k2 + 6k + 1 = 3(3k2 + 2k) + 1 không chia hết cho 3.

Do đó, P1→ Q là đúng.

Tương tự, giả sử P2 là đúng. Ta có, n mod 3 = 2. Đặt n = 3k + 2 (k là số nguyên nào đó).

Suy ra n2 = (3k+2)2 = 9k2 + 12k + 4 = 3(3k2 + 4k + 1) + 1 không chia hết cho 3.

Do đó, P2 → Q là đúng.

Page 43: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 42

Do P1 → Q là đúng và P2 → Q là đúng, hay là (P1 → Q) v (P2→ Q). Vậy (P1 v P2) → Q.

Chúng ta hãy trở lại một bài toán về số nguyên đã được trình bày trong phần trước về các ví

dụ áp dụng của logic trong việc lập luận và chứng minh.

Để chứng minh một biểu thức tương đương dạng p↔q, trong đó p và q là các mệnh đề.

Chúng ta có thể sử dụng hằng đúng sau:

(p ↔ q) ≡ [(p → q) (q → p)]

Đôi khi chúng ta muốn chứng minh một vài mệnh đề tương đương nhau ví dụ:

p1↔ p2↔ p3 ↔...↔ pn , ta có thể sử dụng hằng đúng.

Ví dụ 5.10 Hãy áp dụng để chứng minh rằng 3 khẳng định sau là tương đương với n là số tự

nhiên:

p1: n mod 3= 1 hoăc n mod 3= 2

p2: n không chia hết cho 3

p3: n2 -1 chia hết cho 3

5.3.4. Chứng minh vacuous

Giả sử giả thiết p trong phép kéo theo p→q là sai. Khi đó ta có thể suy ra ngay phép

kéo theo p→q luôn đúng, bởi vì câu lệnh có dạng F→T hay F→F, nên nó luôn đúng. Chính vì

vậy, nếu chúng ta chỉ ra p là sai, khi đó phép chứng minh của chúng ta gọi là chứng minh

vacuous.

Chứng minh vacuous thường dùng cho các trường hợp đặc biệt khi phép kéo theo là đúng

cho tất cả các số nguyên dương.

Ví dụ 5.11 a. Chứng minh rằng mệnh đề P(0) là đúng trong đó P(n) là mệnh đề”nếu n>1 thì

n2>n”.

Giải:

Mệnh đề P(0) chỉ ra rằng”nếu 0>1 thì 02>0”. Bởi vì giả thiết 0>1 là sai, do đó P(0) là đúng.

Ví dụ 5.11.b Với mọi n, nếu n vừa lẻ vừa chẵn, thì n2 = n + n.

Giải: Khẳng định”n vừa lẻ vừa chẵn” là sai, bởi vì không có số nào vừa lẻ vừa chẵn.

Do vậy mọi kết luận là đúng.

5.3.5. Chứng minh trivial

Giả sử rằng kết luận q trong phép duy dẫn p→q là đúng. Khi đó p→q là đúng, bởi vì

câu lệnh dạng T→T hay F→T đều là đúng. Vì vậy, nếu để chứng minh q là đúng, thì khi đó

chứng minh được gọi là chứng minh trivial. Chứng minh trivial thường quan trọng trong khi

chứng minh một số trường hợp đặc biệt.

Ví dụ 5.12

Coi P(n) là mệnh đề: “nếu a và b là hai số nguyên dương và a>=b thì an>= bn”. Chứng

minh rằng P(0) là đúng.

Page 44: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 43

Giải: Mệnh đề P(0) là”nếu a>=b, thì a0>= b0”bởi vì a0= b0 =1, vậy P(0) là đúng. Vì

vậy, P(0) là đúng. Đây là một ví dụ của chứng minh trivial. Như vậy là khẳng định a>=b

không cần thiết trong chứng minh.

Ví dụ 5.13

Với mọi số tự nhiên n, nếu n là tổng của hai số nguyên tố, thì hoặc n là chẵn hoặc n

là lẻ.

Giải: Bất kỳ một số tự nhiên n nào cũng hoặc là chẵn hoặc là lẻ. Do vậy kết luận của

phép duy dẫn là đúng bất chấp điều kiện là đúng hay sai. Phép duy dẫn được gọi là phép duy

dẫn trivial.

5.4. Chứng minh bằng phản chứng

Chứng minh bằng phản chứng có thể áp dụng cho dạng suy diễn, p→q, trong phần

trên. Tuy nhiên nó cũng là một phương pháp rất hữu ích cho chứng minh các mệnh đề tổng

quát.

Giả sử rằng phủ định của q có thể được tìm thấy trong ⌐p → q là đúng, khi đó ⌐p→

F đúng thì suy ra ⌐p phải là sai, nghĩa là p phải đúng. Kỹ thuật này được sử dụng trong phản

chứng.

Phương pháp chứng minh trực tiếp không phải bao giờ cũng sử dụng được trong

việc chứng minh ngay cả đối với những bài toán khá đơn giản như bài toán sau đây:

Ðể bằng phản chứng một khẳng định hay một mệnh đề nào đó, ta tìm cách rút ra từ

mệnh đề đó một điều rõ ràng là vô lý hay một sự mâu thuẫn. Về mặt kỹ thuật ta thường

giả sử rằng mệnh đề cần chứng minh là sai rồi từ đó suy ra một điều mâu thuẫn với giả

thiết hay các tiền đề của bài toán, từ đó đi đến kết luận rằng mệnh đề là đúng. Ngoài ra phép

chứng minh phản chứng còn có thể được thực hiện như sau: ta giả sử mệnh đề cần chứng

minh là sai, kết hợp với giả thiết đã cho để suy ra được một điều mâu thuẫn nào đó rồi từ đó

kết luận rằng mệnh đề là đúng.

Ví dụ 5.14 Cho 101 đồ vật và 5 cái hộp, cần đặt hết cả 101 đồ vật vào trong 5 cái hộp. Chứng

minh rằng tồn tại ít nhất 1 hộp có không ít hơn 21 đồ vật.

Giải:

Giả sử điều cần chứng minh là không xảy ra, nghĩa là không tồn tại hộp nào có đến 21 đồ

vật (hay ít hơn 21 đồ vật).

Khi đó, với 5 hộp có thể đựng được thì số đồ vật lớn nhất là 5.20=100<101 (mâu thuẫn)

Vậy điều phải chứng minh là đúng.

Ví dụ 5.15 Cho 7 đoạn thẳng có độ dài lớn hơn 10 và nhỏ hơn 100. Chứng minh rằng luôn

tìm được 3 đoạn để có thể ghép thành một tam giác.

Giải:

Trước hết sắp xếp các đoạn đã cho theo thứ tự tăng dần của độ dài a1, a2,..., a7, và

chứng minh rằng trong dãy đã xếp luôn tìm được 3 đoạn liên tiếp sao cho tổng của 2 đoạn

đầu lớn hơn đoạn cuối (vì điều kiện để 3 đoạn có thể ghép thành một tam giác là tổng của

2 đoạn nhỏ hơn đoạn thứ ba).

Page 45: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 44

Giả sử điều cần chứng minh là không xảy ra, nghĩa là đồng thời xảy ra các bất đẳng

thức sau:

a1 + a2 ≤ a3

a2 + a3 ≤ a4

a3 + a4 ≤ a5

a4 + a5 ≤ a6

a5 + a6 ≤ a7

Từ giả thiết a1, a2 có giá trị lớn hơn 10, ta nhận được a3 > 20 .

Từ a2 >10 và a3 > 20 ta nhận được a4 > 30, a5 > 50, a6 > 80 và a7 > 130.

Điều a7 > 130 là mâu thuẫn với giả thiết các độ dài nhỏ hơn 100. Có mâu thuẫn này làdo giả

sử điểu cần chứng minh không xảy ra.

Vậy, luôn tồn tại 3 đoạn liên tiếp sao cho tổng của 2 đoạn đầu lớn hơn đoạn cuối. Hay

nói cách khác là 3 đoạn này có thể ghép thành một tam giác.

5.5. Chứng minh bằng quy nạp

Định nghĩa

Quy nạp và đệ quy là hai khái niệm cực kì quan trọng trong toán học và trong tin học.

Vì vậy nắm rõ được bản chất về mặt kiến thức, về mặt phương pháp cũng như tư duy là

điều bất cứ ai trong chúng ta đều mong muốn hướng tới. Thêm vào đó, khá nhiều bạn trong

chúng ta còn cho rằng, bản chất của phép quy nạp chính là phép đệ quy đòi hỏi phép quy nạp.

Về mặt định nghĩa, người ta cho rằng, quy nạp là kết luận đi từ trường hợp riêng

đi tới trường hợp tổng quát. Nghĩa là, kết luận tổng quát dựa trên việc nghiên cứu các tính

chất của nhiều sự kiện, nhiều thí nghiệm hay nhiều quan sát riêng lẻ. Nếu kết luận chung dựa

vào nghiên cứu tất cả các sự kiện riêng (các đối tượng, các hình, các số, …) thì quy nạp

được gọi là đầy đủ hay hoàn chỉnh. Nếu kết luận chung dựa vào nghiên cứu một phần của

tâp hợp tất cả các sự kiện (các đối tượng) thì quy nạp được gọi là không đầy đủ hay không

hoàn chỉnh.

Trong nhiều lĩnh vực khác nhau của Toán học (số học, hình học, giải tích...) ta thường

gặp những bài toán với yêu cầu chứng minh mệnh đề chứa biến P(n) là một mệnh đề đúng

với mọi giá trị nguyên dương của biến n.

Ví dụ 5.16 Chứng minh rằng với mọi số nguyên dương n ta có

1.2 + 2.3 + 3.4 + … + n(n+1) = n(n+1)(n+2)/3

Giải

Một cách khái quát, để chứng minh mệnh đề chứa biến P(n) là một mệnh đề đúng

với mọi giá trị nguyên dương của n, ta thực hiện hai bước sau:

Bước 1: (bước cơ sở hay bước mở đầu)

Chứng minh P(n) đúng khi n=1.

Bước 2: (bước quy nạp hay bước di truyền)

Với k là một số nguyên dương, xuất phát từ giả thiết (được gọi là giả thiết quy nạp)

Page 46: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 45

P(n) đúng với n=k, ta chứng minh P(n) cũng là mệnh đề đúng với n=k+1.

Chú ý rằng khi chúng ta sử dụng quy nạp toán học để chứng minh, đầu tiên chúng ta chỉ

ra rằng P(1) là đúng. Khi đó chúng biết rằng P(2) là đúng, bởi vì P(1) đã ngầm dẫn tới P(2).

Hơn nữa, chúng ta cũng chỉ ra được P(3) là đúng vì P(2) đã ngầm dẫn tới P(3). Tiếp tục như

vậy P(k) là đúng cho bất kỳ số nguyên dương k nào. Chú ý thêm rằng trong chứng minh

quy nạp chúng ta không giả định là P(n) đúng với mọi số nguyên dương! Đó chỉ là việc giả

định rằng nếu P(n) mà đúng thì P(n+1) cũng đúng.

5.6. Chứng minh bằng cách đưa ra phản ví dụ

Nói một cách tổng quát, phản ví dụ là việc chỉ ra một tình huống hay trường hợp sai

của một khẳng định phổ quát để chứng tỏ rằng khẳng định phổ quát đó l à sai. Chẳng hạn

như để chứng minh mệnh đề

x ∈ A: P(x) là sai ta chỉ cần đưa ra một phần tử a cụ thể thuộc tập hợp A mà P(a) là

sai. Thật ra làm như vậy tức là ta đã chứng minh mệnh đề

x ∈A: ⌐ P(x)(có cùng chân trị với mệnh đề ⌐ [ x∈A: P(x)]) là đúng.

Chúng ta có thể nêu lên một bài toán khác mà đối với nó ta phải dùng phản ví dụ. Ðó

là bài toán chứng minh một phép suy diễn từ p1, p2, …, pn suy ra q là sai. Ðể chứng minh

phép suy diễn là sai ta phải chứng minh rằng

p1 → p2 → . . .→ pn→ q

không phải là hằng đúng. Ðể làm điều này chúng ta chỉ cần tìm và chỉ ra một trường hợp cụ

thể của các biến mệnh đề mà ứng với chúng ta có các tiền đề p1, p2, …, pn đều đúng nhưng

kết luận q là sai.

Ví dụ 5.17 Hãy kiểm tra suy luận sau đây

Sử dụng các phương pháp để kiểm tra một phép suy luận ta có thể thấy được suy luận

trên là không đúng. Ðể tìm một phản ví dụ ta chỉ cần chỉ ra một trường hợp về chân trị của

các biến mệnh đề sao cho các tiền đề trong phép suy luận là đúng còn kết luận là sai. Về mặt

kỹ thuật ta sẽ tìm p, q, và r thỏa mãn các đẳng thức sau đây:

Dễ dàng tìm thấy một trường hợp phản ví dụ là: p = 1, q = 1, r = 1.

Vậy suy luận đã cho là không đúng.

Page 47: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 46

Ví dụ 5.18 Chứng minh ”mọi số nguyên tố là lẻ” là sai. Sinh viên hãy tự làm bài tập này.

Ví dụ 5.19 Mệnh đề sau đúng hay không?

“Những giá trị của hàm số với n = 0, 1, 2, ... là những số

nguyên tố.”

Giải Ta tính f(0) = 1, f(1) = 41, f(2) = 43, f(3) = 47, f(4) = 53, f(5) = 61, f(6) =71, f(7)

= 83, f(8) = 97, f(9) = 113. Ta có thể tiếp tục tính f(n)cho đến giá trị n = 40,tất cả giá trị này

đề là số nguyên tố. Nhưng với n = 41 ta có f(41) = 412. Kết quả f(41) không phải là số

nguyên tố, nên kết luận của bài toán là không đúng.

5.7. Một số ngộ nhận thường gặp

Một ngộ nhận là một luận suy diễn hay một phương pháp chứng minh khác mà nó

không logic.

• Ngộ nhận khi khẳng định kết luận:

“p→q là đúng, nếu p là đúng, thì p phải là đúng.” (khẳng định này là sai vì F→T là

đúng)

• Ngộ nhận khi bác bỏ giả thiết

“p→q là đúng, và nếu p là sai, thì p phải là sai.” (không phải vì F→T là đúng.)

• Ngộ nhận (có thể là tường minh hoặc không rõ ràng) về việc giả định mỗi luận

cứ phải chứng minh nằm trong yêu cầu phải chứng minh.

Ví dụ 5.20 Chứng minh rằng n là chẵn nếu n2 là chẵn.

“Giả sử n2 là chẵn. khi đó n2

=2k với k là số tự nhiên. Ta suy ra n = (2k)/n = 2(k/n).

Một số nhận xét trong chứng minh

Chúng ta đã mô tả một vài phương pháp chứng minh khác nhau, tuy nhiên không có

thuật toán nào dùng cho chứng minh được nêu ra. Bởi vì không có thuật toán nào như vậy.

Có nhiều định lý mà chứng minh của nó dễ dàng tìm thấy bằng việc phân tích trực

tiếp từ các giả thiết và định nghĩa của các thành phần trong định lý. Tuy nhiên, thông thường

là khó để chứng minh một định lý mà không sử dụng khéo léo một số phương pháp chứng

minh như trực tiếp, phản chứng, quy nạp hay các kỹ thuật khác. Xây dựng các chứng minh

được coi như là một nghệ thuật trong toán học.

Có nhiều định lý tưởng như là đơn giản đã xuất hiện hàng trăm năm mà vẫn chưa

được chứng minh. Ví dụ, có một khẳng định”với mọi số tự nhiên dương lớn hơn bốn thì

đều bằng tổng của hai số nguyên tố”. Nhiều người vẫn chưa tìm ra một phản ví dụ, mặc dù

người ta đã kiểm định tới số 1014.

Còn nhiều cách chứng minh khác, sinh viên có thể tham khảo thêm tại:

http://en.wikipedia.org/wiki/Mathematical_proof

http://en.wikipedia.org/wiki/Inductive_reasoning

Page 48: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 47

Bài 6. Ứng dụng của phương pháp chứng minh nhờ luật suy diễn

6.1. Ứng dụng

Ứng dụng trong suy luận

Ứng dụng trong kiểm tra tính mâu thuẫn của hệ thống

Ứng dụng trong bài toán ra quyết đinh

6.2. Bài tập

Bài 1 Kiểm tra luật suy diễn sau

a. b.

c.

d.

e.

g.

p r

r s

t s

t u

u

p

Bài 2 Quy tắc suy diễn nào đã được dùng trong các suy luận dưới đây?

a. Minh học giỏi môn Tóan. Vậy Minh học giỏi môn Toán hay Minh học giỏi môn Tin học.

b. Bình chơi được cả cờ vua và cờ tướng. Vậy Bình chơi được cờ vua.

c. Bố An khẳng định cho An tiền mua xe máy hay điện thoại di động. Mà An đã không mua

điện thoại di động vì thấy chưa cần thiết. Vậy An mua xe máy.

d. Vào đầu năm học bố Nga hứa chắc sẽ cho Nga đi Đà lạt nghỉ mát nếu Nga đạt kết quả cao

vào cuối năm học. Nga đã đạt kết quả cao vào cuối năm học. Vậy Nga được Bố cho đi Đà lạt

nghỉ mát vào cuối năm học.

e. Nếu đạt kết quả học tập cao Nga sẽ được đi Đà lạt. Nếu đi Đà lạt Nga sẽ thăm Suối vàng.

Vậy, nếu đạt kết quả cao trong học tập Nga sẽ thăm suối vàng.

Bài 3 Suy diễn sau đúng hay sai? Giải thích?

p r

p q

q s

r s

p q r s

r t

t

p

Page 49: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 48

Nếu ca sĩ Hồng Nhung không biểu diễn hay số vé bán ra ít hơn 50 thì đêm biểu diễn ở

triển lãm Giảng võ bị hủy bỏ và trưởng ban tổ chức sẽ lo sợ (lỗ vốn ).

Nếu đêm biểu diễn bị hủy bỏ thì phải trả lại tiền vé cho người xem.

Nhưng tiền vé đã không phải trả lại vậy Hồng Nhung đã biểu diễn.

Bài 4 Cho các câu sau

1. Nếu nghệ sĩ Trương Ba không trình diễn hay số vé bán ra ít hơn 100 thì đêm diễn sẽ bi

hủy bỏ và ông bầu sẽ rất buồn.

2. Nếu đêm diễn bị hủy bỏ thì vé phải trả lại cho người xem.

3. Nhưng vé đã không trả lại cho người xem.

Vậy có kết luân gì?

Bài 5 Trong một phiên tòa xử án 3 bị can có liên quan đến vấn đề tài chánh, trước tòa cả 3 bị

cáo đều tuyên thệ khai đúng sự thật và lời khai như sau :

Anh A: Chị B có tội hoặc anh C vô tội.

Chị B : Nếu anh A có tội thì anh C cũng có tội.

Anh C: Tôi vô tội nhưng một trong hai người kia là có tội.

Hãy xét xem ai là người có tội ?

Bài 6 Suy diễn sau đúng hay sai? Giải thích?

Ông Minh nói rằng nếu không được tăng lương thì ông ta sẽ nghỉ việc.

Nếu ông ấy nghỉ việc và vợ ông ấy bị mất việc thì phải bán xe.

Biết rằng nếu vợ ông Minh hay đi làm trễ thì trước sau gì cũng sẽ bị mất việc và cuối

cùng ông Minh đã được tăng lương.

Vậy, nếu ông Minh không bán xe thì vợ ông ta đã không đi làm trễ.

Bài 7 Các đặc điểm sau có phi mâu thuẫn không?

Nếu hệ thống ở trạng thái nhiều người dùng thì hệ thống ở mode ngắt và ngược lại.

Nếu hệ thống ở trạng thái nhiều người dùng thì hạt nhân của hệ thống hoạt động.

Hạt nhân của hệ thống không hoạt động hoặc hệ thống ở mode ngắt.

Nếu hệ thống không ở trạng thái nhiều người dùng thì hệ thống ở mode ngắt.

Hệ thống không ở mode ngắt.

Bài 5 Suy luận sau có căn cứ hay không?

Nếu muốn dự buổi họp sáng thứ Ba thì Hùng phải dậy sớm.

Nếu tối thứ Hai đi xem kịch thì Hùng sẽ về muộn.

Nếu Hùng về muộn và thức dậy sớm thì Hùng đi họp sáng thứ ba và chỉ được ngủ

không được 7 giờ/ ngày.

Nhưng không thể đi họp nếu ngủ dưới 7 giờ/ngày.

Vậy hoặc Hùng không đi xem kịch tối thứ 2 hoặc hùng phải bỏ họp sáng thứ 3.

Page 50: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 49

Bài 7 Số và Ma trận

7.1. Thuật toán

7.1.1. Giới thiệu

Có nhiều lớp bài toán tổng quát xuất hiện trong toán học rời rạc. Chẳng hạn, cho một

dãy các số nguyên, tìm số lớn nhất; cho một tập hợp, liệt kê các tập con của nó; cho tập hợp

các số nguyên, xếp chúng theo thứ tự tăng dần; cho một mạng, tìm đường đi ngắn nhất giữa

hai đỉnh của nó. Khi được giao cho một bài toán như vậy thì việc đầu tiên phải làm là xây

dựng một mô hình dịch bài toán đó thành ngữ cảnh toán học. Các cấu trúc rời rạc được

dùng trong các mô hình này là tập hợp, dãy, hàm, hoán vị, quan hệ, cùng với các cấu trúc

khác như đồ thị, cây, mạng, …

Lập được một mô hình toán học thích hợp chỉ là một phần của quá trình giải. Để hoàn

tất quá trình giải, còn cần phải có một phương pháp dùng mô hình để giải bài toán tổng

quát. Nói một cách lý tưởng, cái được đòi hỏi là một thủ tục, đó là dãy các bước dẫn tới đáp

số mong muốn. Một dãy các bước như vậy, được gọi là một thuật toán.

Khi thiết kế và cài đặt một phần mềm tin học cho một vấn đề nào đó, ta cần phải đưa

ra phương pháp giải quyết mà thực chất đó là thuật toán giải quyết vấn đề này. Rõ ràng

rằng, nếu không tìm được một phương pháp giải quyết thì không thể lập trình được. Chính

vì thế, thuật toán là khái niệm nền tảng của hầu hết các lĩnh vực của tin học.

7.1.2. Định nghĩa

Thuật toán là một bảng liệt kê các chỉ dẫn (hay quy tắc) cần thực hiện theo từng

bước xác định nhằm giải một bài toán đã cho.

Thuật ngữ”Algorithm”(thuật toán) là xuất phát từ tên nhà toán học Ả Rập

AlKhowarizmi. Ban đầu, từ algorism được dùng để chỉ các quy tắc thực hiện các phép tính

số học trên các số thập phân. Sau đó, algorism chuyển thành algorithm vào thế kỷ 19. Với

sự quan tâm ngày càng tăng đối với các máy tính, khái niệm thuật toán đã được cho một ý

nghĩa chung hơn, bao hàm cả các thủ tục xác định để giải các bài toán, chứ không phải chỉ là

thủ tục để thực hiện các phép tính số học.

Có nhiều cách trình bày thuật toán: dùng ngôn ngữ tự nhiên, ngôn ngữ lưu đồ (sơ đồ

khối), ngôn ngữ lập trình. Tuy nhiên, một khi dùng ngôn ngữ lập trình thì chỉ những lệnh

được phép trong ngôn ngữ đó mới có thể dùng được và điều này thường làm cho sự mô tả các

thuật toán trở nên rối rắm và khó hiểu. Hơn nữa, vì nhiều ngôn ngữ lập trình đều được dùng

rộng rãi, nên chọn một ngôn ngữ đặc biệt nào đó là điều người ta không muốn. Vì vậy ở đây

các thuật toán ngoài việc được trình bày bằng ngôn ngữ tự nhiên cùng với những ký hiệu

toán học quen thuộc còn dùng một dạng giả mã để mô tả thuật toán. Giả mã tạo ra bước

trung gian giữa sự mô tả một thuật toán bằng ngôn ngữ thông thường và sự thực hiện

thuật toán đó trong ngôn ngữ lập trình. Các bước của thuật toán được chỉ rõ bằng cách

dùng các lệnh giống như trong các ngôn ngữ lập trình.

Page 51: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 50

Ví dụ 7.1 Mô tả thuật toán tìm phần tử lớn nhất trong một dãy hữu hạn các số nguyên.

a) Dùng ngôn ngữ tự nhiên để mô tả các bước cần phải thực hiện:

1. Đặt giá trị cực đại tạm thời bằng số nguyên đầu tiên trong dãy. (Cực đại tạm thời

sẽ là số nguyên lớn nhất đã được kiểm tra ở một giai đoạn nào đó của thủ tục.)

2. So sánh số nguyên tiếp sau với giá trị cực đại tạm thời, nếu nó lớn hơn giá trị cực đại

tạm thời thì đặt cực đại tạm thời bằng số nguyên đó.

3. Lặp lại bước trước nếu còn các số nguyên trong dãy.

4. Dừng khi không còn số nguyên nào nữa trong dãy. Cực đại tạm thời ở điểm này

chính là số nguyên lớn nhất của dãy.

b) Dùng đoạn giả mã:

procedure max (a1, a2, ..., an: integers)

max:= a1

for i:= 2 to n

if max <ai then max:= ai

{max là phần tử lớn nhất}

Thuật toán này trước hết gán số hạng đầu tiên a1 của dãy cho biến max. Vòng

lặp”for”được dùng để kiểm tra lần lượt các số hạng của dãy. Nếu một số hạng lớn hơn giá trị

hiện thời của max thì nó được gán làm giá trị mới của max.

7.1.3. Các đặc trưng của thuật toán:

- Đầu vào (Input): Một thuật toán có các giá trị đầu vào từ một tập đã được chỉ rõ.

- Đầu ra (Output): Từ mỗi tập các giá trị đầu vào, thuật toán sẽ tạo ra các giá trị đầu

ra. Các giá trị đầu ra chính là nghiệm của bài toán.

- Tính dừng: Sau một số hữu hạn bước thuật toán phải dừng.

- Tính xác định: Ở mỗi bước, các bước thao tác phải hết sức rõ ràng, không gây nên

sự nhập nhằng. Nói rõ hơn, trong cùng một điều kiện hai bộ xử lý cùng thực hiện một

bước của thuật toán phải cho những kết quả như nhau.

- Tính hiệu quả: Trước hết thuật toán cần đúng đắn, nghĩa là sau khi đưa dữ liệu

vào thuật toán hoạt động và đưa ra kết quả như ý muốn.

- Tính phổ dụng: Thuật toán có thể giải bất kỳ một bài toán nào trong lớp các bài

toán. Cụ thể là thuật toán có thể có các đầu vào là các bộ dữ liệu khác nhau trong một

miền xác định.

7.2. Độ phức tạp của thuật toán

7.2.1. Khái niệm về độ phức tạp của một thuật toán

Page 52: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 51

Thước đo hiệu quả của một thuật toán là thời gian mà máy tính sử dụng để giải bài

toán theo thuật toán đang xét, khi các giá trị đầu vào có một kích thước xác định. Một thước

đo thứ hai là dung lượng bộ nhớ đòi hỏi để thực hiện thuật toán khi các giá trị đầu vào có

kích thước xác định. Các vấn đề như thế liên quan đến độ phức tạp tính toán của một thuật

toán. Sự phân tích thời gian cần thiết để giải một bài toán có kích thước đặc biệt nào đó liên

quan đến độ phức tạp thời gian của thuật toán. Sự phân tích bộ nhớ cần thiết của máy tính

liên quan đến độ phức tạp không gian của thuật toán. Vệc xem xét độ phức tạp thời gian và

không gian của một thuật toán là một vấn đề rất thiết yếu khi các thuật toán được thực

hiện. Biết một thuật toán sẽ đưa ra đáp số trong một micro giây, trong một phút hoặc trong

một tỉ năm, hiển nhiên là hết sức quan trọng. Tương tự như vậy, dung lượng bộ nhớ đòi hỏi

phải là khả dụng để giải một bài toán,vì vậy độ phức tạp không gian cũng cần phải tính

đến.Vì việc xem xét độ phức tạp không gian gắn liền với các cấu trúc dữ liệu đặc biệt

được dùng để thực hiện thuật toán nên ở đây ta sẽ tập trung xem xét độ phức tạp thời gian.

Độ phức tạp thời gian của một thuật toán có thể được biểu diễn qua số các phép toán

được dùng bởi thuật toán đó khi các giá trị đầu vào có một kích thước xác định. Sở dĩ độ

phức tạp thời gian được mô tả thông qua số các phép toán đòi hỏi thay vì thời gian thực

của máy tính là bởi vì các máy tính khác nhau thực hiện các phép tính sơ cấp trong những

khoảng thời gian khác nhau. Hơn nữa, phân tích tất cả các phép toán thành các phép tính bit

sơ cấp mà máy tính sử dụng là điều rất phức tạp.

Ví dụ 7.2

Xét thuật toán tìm số lớn nhất trong dãy n số a1, a2, ..., an. Có thể coi kích thước

của dữ liệu nhập là số lượng phần tử của dãy số, tức là n. Nếu coi mỗi lần so sánh hai số

của thuật toán đòi hỏi một phép toán cơ bản thì trong trường hợp xấu nhất thuật toán cần n -

1 phép toán cơ bản tức độ phức tạp là n-1. Giả sử mỗi phép toán cơ bản cần 1 giây để thực

hiền thì với dãy 64 số, thời gian thực hiện thuật toán nhiều lắm là 63 giây.

Ví dụ 7.3 Thuật toán về trò chơi ”Tháp Hà Nội”

Trò chơi ”Tháp Hà Nội” như sau: Có ba cọc A, B, C và 64 cái đĩa (có lỗ để đặt vào

cọc), các đĩa có đường kính đôi một khác nhau. Nguyên tắc đặt đĩa vào cọc là: mỗi đĩa chỉ

được chồng lên đĩa lớn hơn nó. Ban đầu, cả 64 đĩa được đặt chồng lên nhau ở cột A; hai

cột B, C trống. Vấn đề là phải chuyển cả 64 đĩa đó sang cột B hay C, mỗi lần chỉ được di

chuyển một đĩa.

Xét trò chơi với n đĩa ban đầu ở cọc A (cọc B và C trống). Gọi Sn là số lần chuyển

đĩa để chơi xong trò chơi với n đĩa.

Nếu n=1 thì rõ ràng là S1=1.

Nếu n>1 thì trước hết ta chuyển n-1 đĩa bên trên sang cọc B (giữ yên đĩa thứ n ở dưới

cùng của cọc A). Số lần chuyển n-1 đĩa là Sn-1. Sau đó ta chuyển đĩa thứ n từ cọc A sang

cọc C. Cuối cùng, ta chuyển n-1 đĩa từ cọc B sang cọc C (số lần chuyển là Sn-1).

Như vậy, số lần chuyển n đĩa từ A sang C là:

Sn=Sn-1+1+Sn-1=2Sn-1+1=2(2Sn-2+1)+1=22Sn-2+2+1=.....=2n-1S1+2n-2+...+2+1=2n -1.

Thuật toán về trò chơi”Tháp Hà Nội”đòi hỏi 264 -1 lần chuyển đĩa (xấp xỉ 18,4 tỉ tỉ

lần). Nếu mỗi lần chuyển đĩa mất 1 giây thì thời gian thực hiện thuật toán xấp xỉ 585 tỉ năm!

Page 53: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 52

Hai ví dụ trên cho thấy rằng: một thuật toán phải kết thúc sau một số hữu hạn bước,

nhưng nếu số hữu hạn này quá lớn thì thuật toán không thể thực hiện được trong thực tế.

Ta nói: thuật toán trong ví dụ 8.2 có độ phức tạp là n-1 và là một thuật toán hữu hiệu

(hay thuật toán nhanh); thuật toán trong ví dụ 8.3 có độ phức tạp là 2n-1 và đó là một thuật

toán không hữu hiệu (hay thuật toán chậm).

7.2.2. So sánh độ phức tạp của các thuật toán:

Một bài toán thường có nhiều cách giải, có nhiều thuật toán để giải, các thuật toán đó

có độ phức tạp khác nhau.

Xét bài toán: Tính giá trị của đa thức P(x)=anxn+an-1xn-1+ ... +a1x+a0 tại x0.

Thuật toán 1:

Procedure tính giá trị của đa thức (a0, a1, ..., an, x0: các số thực)

sum:=a0

for i:=1 to n sum:=sum+aix0i

{sum là giá trị của đa thức P(x) tại x0}

Chú ý rằng đa thức P(x) có thể viết dưới dạng:

P(x)=(...((anx+an-1)x+an-2)x...)x+a0.

Ta có thể tính P(x) theo thuật toán sau:

Thuật toán 2:

Procedure tính giá trị của đa thức (a0, a1, ..., an, x0: các số thực)

P:=an

for i:=1 to n

P:=P.x0+an-i

{P là giá trị của đa thức P(x) tại x0}

Ta hãy xét độ phức tạp của hai thuật toán trên.

Đối với thuật toán 1: ở bước 2, phải thực hiện 1 phép nhân và 1 phép cộng với i=1;

2 phép nhân và 1 phép cộng với i=2, ..., n phép nhân và 1 phép cộng với i=n. Vậy số phép

tính (nhân và cộng) mà thuật toán 1 đòi hỏi là:

(1+1)+(2+1)+ ... +(n+1)=n(n+1)/2 + n = n(n+3)/2

Đối với thuật toán 2, bước 2 phải thực hiện n lần, mỗi lần đòi hỏi 2 phép tính (nhân rồi

cộng), do đó số phép tính (nhân và cộng) mà thuật toán 2 đòi hỏi là 2n. Nếu coi thời gian

thực hiện mỗi phép tính nhân và cộng là như nhau và là một đơn vị thời gian thì với mỗi n

cho trước, thời gian thực hiện thuật toán 1 là n(n+3)/2, còn thời gian thực hiện thuật toán 2 là

2n.

Page 54: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 53

Rõ ràng là thời gian thực hiện thuật toán 2 ít hơn so với thời gian thực hiện thuật

toán 1. Hàm f1(n)=2n là hàm bậc nhất, tăng chậm hơn nhiều so với hàm bậc hai

f2(n)=n(n+3)/2.

Ta nói rằng thuật toán 2 (có độ phức tạp là 2n) là thuật toán hữu hiệu hơn (hay

nhanh hơn) so với thuật toán 1 (có độ phức tạp là n(n+3)/2).

Để so sánh độ phức tạp của các thuật toán, điều tiện lợi là coi độ phức tạp của mỗi

thuật toán như là cấp của hàm biểu hiện thời gian thực hiện thuật toán ấy. Các hàm xét sau

đây đều là hàm của biến số tự nhiên n>0.

Đánh giá độ phức tạp của một thuật toán:

Thuật toán tìm kiếm tuyến tính:

Số các phép so sánh được dùng trong thuật toán này cũng sẽ được xem như thước đo

độ phức tạp thời gian của nó. Ở mỗi một bước của vòng lặp trong thuật toán, có hai phép

so sánh được thực hiện: một để xem đã tới cuối bảng chưa và một để so sánh phần tử x với

một số hạng của bảng. Cuối cùng còn một phép so sánh nữa làm ở ngoài vòng lặp. Do đó,

nếu x=ai, thì đã có 2i+1 phép so sánh được sử dụng. Số phép so sánh nhiều nhất, 2n+2,

đòi hỏi phải được sử dụng khi phần tử x không có mặt trong bảng. Từ đó, thuật toán tìm

kiếm tuyến tính có độ phức tạp là O(n).

Thuật toán tìm kiếm nhị phân:

Để đơn giản, ta giả sử rằng có n=2k phần tử trong bảng liệt kê a1, a2, ..., an, với k là số

nguyên không âm (nếu n không phải là lũy thừa của 2, ta có thể xem bảng là một phần của

bảng gồm 2k+1 phần tử, trong đó k là số nguyên nhỏ nhất sao cho n <2k+1)

Ở mỗi giai đoạn của thuật toán vị trí của số hạng đầu tiên i và số hạng cuối cùng j

của bảng con hạn chế tìm kiếm ở giai đoạn đó được so sánh để xem bảng con này còn nhiều

hơn một phần tử hay không. Nếu i < j, một phép so sánh sẽ được làm để xác định x có lớn

hơn số hạng ở giữa của bảng con hạn chế hay không. Như vậy ở mỗi giai đoạn, có sử dụng

hai phép so sánh. Khi trong bảng chỉ còn một phần tử, một phép so sánh sẽ cho chúng ta biết

rằng không còn một phần tử nào thêm nữa và một phép so sánh nữa cho biết số hạng đó có

phải là x hay không. Tóm lại cần phải có nhiều nhất 2k+2=2log2n+2 phép so sánh để thực

hiện phép tìm kiếm nhị phân (nếu n không phải là lũy thừa của 2, bảng gốc sẽ được mở

rộng tới bảng có 2k+1 phần tử, với k=[log2n] và sự tìm kiếm đòi hỏi phải thực hiện nhiều

nhất 2[log2n]+2 phép so sánh). Do đó thuật toán tìm kiếm nhị phân có độ phức tạp là

O(log2n). Từ sự phân tích ở trên suy ra rằng thuật toán tìm kiếm nhị phân, ngay cả trong

trường hợp xấu nhất, cũng hiệu quả hơn thuật toán tìm kiếm tuyến tính.

Chú ý: Một điều quan trọng cần phải biết là máy tính phải cần bao lâu để giải xong

một bài toán. Ví dụ, nếu một thuật toán đòi hỏi 10 giờ, thì có thể còn đáng chi phí thời

gian máy tính đòi hỏi để giải bài toán đó. Nhưng nếu một thuật toán đòi hỏi 10 tỉ năm để giải

một bài toán, thì thực hiện thuật toán đó sẽ là một điều phi lý. Một trong những hiện tượng

lý thú nhất của công nghệ hiện đại là sự tăng ghê gớm của tốc độ và lượng bộ nhớ trong

máy tính. Một nhân tố quan trọng khác làm giảm thời gian cần thiết để giải một bài toán là

sự xử lý song song - đây là kỹ thuật thực hiện đồng thời các dãy phép tính. Do sự tăng tốc

độ tính toán và dung lượng bộ nhớ của máy tính, cũng như nhờ việc dùng các thuật toán lợi

dụng được ưu thế của kỹ thuật xử lý song song, các bài toán vài năm trước đây được xem

Page 55: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 54

là không thể giải được, thì bây giờ có thể giải bình thường.

Page 56: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 55

Bảng 7.1 Các thuật ngữ thường dùng cho độ phức tạp của một thuật toán

Bảng 7.2 Thời gian máy tính được dùng bởi một thuật toán

7.3. Số nguyên và thuật toán

7.3.1 Thuật toán Euclide

Phương pháp tính ước chung lớn nhất của hai số bằng cách dùng phân tích các số

nguyên đó ra thừa số nguyên tố là không hiệu quả. Lý do là ở chỗ thời gian phải tiêu tốn

cho sự phân tích đó. Dưới đây là phương pháp hiệu quả hơn để tìm ước số chung lớn nhất,

gọi là thuật toán Euclide. Thuật toán này đã biết từ thời cổ đại. Nó mang tên nhà toán học

cổ Hy lạp Euclide, người đã mô tả thuật toán này trong cuốn sách”Những yếu tố”nổi tiếng

của ông. Thuật toán Euclide dựa vào 2 mệnh đề sau đây.

Mệnh đề 7.1 (Thuật toán chia): Cho a và b là hai số nguyên và b≠0. Khi đó tồn

tại duy nhất hai số nguyên q và r sao cho a = bq+r, 0 <= r < |b|.

Trong đẳng thức trên, b được gọi là số chia, a được gọi là số bị chia, q được gọi là thương

Page 57: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 56

số và r được gọi là số dư.

Khi b là nguyên dương, ta ký hiệu số dư r trong phép chia a cho b là a mod b.

Mệnh đề 7.2: Cho a = bq + r, trong đó a, b, q, r là các số nguyên. Khi đó

UCLN(a,b) = UCLN(b,r). (Ở đây UCLN(a,b) để chỉ ước chung lớn nhất của a và b.)

Giả sử a và b là hai số nguyên dương với a >= b. Đặt r0 = a và r1 = b. Bằng cách áp dụng

liên tiếp thuật toán chia, ta tìm được:

r0 = r1q1 + r2 0 <= r2 < r1

r1 = r2q2 + r3 0 <= r3 < r2

..................

rn-2 = rn-1qn-1 + rn 0 <= rn < rn-1

rn-1 = rnqn

Cuối cùng, số dư 0 sẽ xuất hiện trong dãy các phép chia liên tiếp, vì dãy các số dư a = r0 > r1

> r2 >... >= 0 không thể chứa quá a số hạng được. Hơn nữa, từ Mệnh đề 2 ở trên ta suy ra:

UCLN(a,b) = UCLN(r0,r1) = UCLN(r1,r2) = ... = UCLN(rn-2, rn-1) = UCLN(rn-1,rn) = rn.

Do đó, ước chung lớn nhất là số dư khác không cuối cùng trong dãy các phép chia.

Ví dụ 7.4 Dùng thuật toán Euclide tìm UCLN(414, 662).

662 = 441.1 + 248

414 = 248.1 + 166

248 = 166.1+ 82

166 = 82.2 + 2

82 = 2.41.

Do đó, UCLN(414, 662) = 2.

Thuật toán Euclide được viết dưới dạng giả mã như sau:

Trong thuật toán trên, các giá trị ban đầu của x và y tương ứng là a và b. Ở mỗi giai

đoạn của thủ tục, x được thay bằng y và y được thay bằng x mod y. Quá trình này được lặp

lại chừng nào y khác 0. Thuật toán sẽ ngừng khi y = 0 và giá trị của x ở điểm này, đó là số

dư khác không cuối cùng trong thủ tục, cũng chính là ước chung lớn nhất của a và b.

Page 58: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 57

7.3.2 Biểu diễn các số nguyên

Mệnh đề 7.3: Cho b là một số nguyên dương lớn hơn 1. Khi đó nếu n là một số nguyên

dương, nó có thể được biểu diễn một cách duy nhất dưới dạng:

n = akbk + ak-1bk-1 + ... + a1b + a0.

Ở đây k là một số tự nhiên, a0, a1, ... , ak là các số tự nhiên nhỏ hơn b và ak ≠ 0.

Biểu diễn của n được cho trong Mệnh đề 3 được gọi là khai triển của n theo cơ số b,

ký hiệu là (akak-1... a1a0)b. Bây giờ ta sẽ mô tả thuật toán xây dựng khai triển cơ số b của số

nguyên n bất kỳ. Trước hết ta chia n cho b để được thương và số dư, tức là

n = bq0 + a0, 0 <= a0 < b.

Số dư a0 chính là chữ số đứng bên phải cùng trong khai triển cơ số b của n. Tiếp

theo chia q0 cho b, ta được:

q0 = bq1 + a1, 0 <= a1 < b.

Số dư a1 chính là chữ số thứ hai tính từ bên phải trong khai triển cơ số b của n. Tiếp

tục quá trình này, bằng cách liên tiếp chia các thương cho b ta sẽ được các chữ số tiếp theo

trong khai triển cơ số b của n là các số dư tương ứng. Quá trình này sẽ kết thúc khi ta nhận

được một thương bằng 0.

Ví dụ 7.5 Tìm khai triển cơ số 8 của (12345)10.

Vậy nếu = 8.1543 + 1

1543 = 8.192 + 7

192 = 8.24 + 0

24 = 8.3 + 0

3 = 8.0 + 3.

Do đó, (12345)10 = (30071)8.

Đoạn giả mã sau biểu diễn thuật toán tìm khai triển cơ số b của số nguyên n.

Page 59: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 58

7.3.3 Thuật toán cho các phép tính số nguyên

Các thuật toán thực hiện các phép tính với những số nguyên khi dùng các khai triển nhị

phân của chúng là cực kỳ quan trọng trong số học của máy tính. Ta sẽ mô tả ở đây các thuật

toán cộng và nhân hai số nguyên trong biểu diễn nhị phân. Ta cũng sẽ phân tích độ phức tạp

tính toán của các thuật toán này thông qua số các phép toán bit thực sự được dùng. Giả sử

khai triển nhị phân của hai số nguyên dương a và b là:

a = (an-1an-2 ... a1 a0)2 và b = (bn-1 bn-2 ... b1 b0)2

sao cho a và b đều có n bit (đặt các bit 0 ở đầu mỗi khai triển đó, nếu cần).

1) Phép cộng: Xét bài toán cộng hai số nguyên viết ở dạng nhị phân. Thủ tục thực

hiện phép cộng có thể dựa trên phương pháp thông thường là cộng cặp chữ số nhị phân với

nhau (có nhớ) để tính tổng của hai số nguyên.

Để cộng a và b, trước hết cộng hai bit ở phải cùng của chúng, tức là:

a0 + b0 = c0.2 + s0.

Ở đây s0 là bit phải cùng trong khai triển nhị phân của a+b, c0 là số nhớ, nó có thể

bằng 0 hoặc 1. Sau đó ta cộng hai bit tiếp theo và số nhớ a1 + b1 + c0 = c1.2 + s1.

Ở đây s1 là bit tiếp theo (tính từ bên phải) trong khai triển nhị phân của a+b và c1 là số

nhớ. Tiếp tục quá trình này bằng cách cộng các bit tương ứng trong hai khai triển nhị phân và

số nhớ để xác định bit tiếp sau tính từ bên phải trong khai triển nhị phân của tổng a+b. Ở giai

đoạn cuối cùng, cộng an-1, bn-1 và cn-2 để nhận được cn-1.2+sn-1. Bit đứng đầu của tổng là

sn=cn-1. Kết quả, thủ tục này tạo ra được khai triển nhị phân của tổng, cụ thể là a+b = (sn sn-

1 sn-2 ... s1 s0)2.

Ví dụ 7.6 Tìm tổng của a = (11011)2 và b = (10110)2

a0 + b0 = 1 + 0 = 0.2 + 1 (c0 = 0, s0 = 1)

a1 + b1 + c0 = 1 + 1 + 0 = 1.2 + 0 (c1= 1, s1 = 0)

a2 + b2 +c1 = 0 + 1 + 1 = 1.2 + 0 (c2 = 1, s2 = 0)

a3 + b3 + c2 = 1 + 0 + 1= 1.2 + 0 (c3 = 1, s3 = 0)

a4 + b4 +c3 = 1 + 1 + 1 = 1.2 + 1 (s5 = c4 =1, s4 = 1).

Do đó, a + b = (110001)2. Thuật toán cộng có thể được mô tả bằng cách dùng đoạn mã như

sau.

Page 60: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 59

Tổng hai số nguyên được tính bằng cách cộng liên tiếp các cặp bit và khi cần phải cộng

cả số nhớ nữa. Cộng một cặp bit và số nhớ đòi ba hoặc ít hơn phép cộng các bit. Như vậy,

tổng số các phép cộng bit được sử dụng nhỏ hơn ba lần số bit trong khai triển nhị phân. Do

đó, độ phức tạp của thuật toán này là O(n).

2) Phép nhân: Xét bài toán nhân hai số nguyên viết ở dạng nhị phân. Thuật toán

thông thường tiến hành như sau. Dùng luật phân phối, ta có:

Ta có thể tính ab bằng cách dùng phương trình trên. Trước hết, ta thấy rằng abj=a

nếu bj=1 và abj=0 nếu bj=0. Mỗi lần ta nhân một số hạng với 2 là ta dịch khai triển nhị

phân của nó một chỗ về phía trái bằng cách thêm một số không vào cuối khai triển nhị

phân của nó. Do đó, ta có thể nhận được (abj)2j bằng cách dịch khai triển nhị phân của abj

đi j chỗ về phía trái, tức là thêm j số không vào cuối khai triển nhị phân của nó. Cuối cùng,

ta sẽ nhận được tích ab bằng cách cộng n số nguyên abj.2j với j=0, 1, ..., n-1.

Ví dụ 7.7 Tìm tích của a = (110)2 và b = (101)2.

Ta có ab0.20 = (110)2.1.20= (110)2

ab1.21 = (110)2.0.21 = (0000)2

ab2.22 =(110)2.1.22 = (11000)2.

Để tìm tích, hãy cộng (110)2, (0000)2 và (11000)2. Từ đó ta có ab= (11110)2.

Thủ tục trên được mô tả bằng đoạn giả mã sau:

Page 61: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 60

Thuật toán trên tính tích của hai số nguyên a và b bằng cách cộng các tích riêng

phần c0, c1, c2, ..., cn-1. Khi bj=1, ta tính tích riêng phần cj bằng cách dịch khai triển nhị

phân của a đi j bit. Khi bj=0 thì không cần có dịch chuyển nào vì cj=0. Do đó, để tìm tất cả

n số nguyên abj.2j với j=0, 1, ..., n-1, đòi hỏi tối đa là

phép dịch chỗ. Vì vậy, số các dịch chuyển chỗ đòi hỏi là O(n2).

Để cộng các số nguyên abj từ j=0 đến n 1, đòi hỏi phải cộng một số nguyên n bit,

một số nguyên n+1 bit, ... và một số nguyên 2n bit. Ta đã biết rằng mỗi phép cộng đó đòi

hỏi O(n) phép cộng bit. Do đó, độ phức tạp của thuật toán này là O(n2).

7.4. Số học đồng dư

Một số tình huống chỉ quan tâm tới số dư của một số nguyên khi chia nó cho 1 số

nguyên dương khác. Ví dụ, giả sư bây giờ là 5h, hỏi 30 tiếng nữa là mấy giờ? 1 ngày có 24

tiếng, do đó ta lấy số dư của 30 cho 24, ta được kết quả là 11h.

Định nghĩa 7.1: Cho a là 1 số nguyên, m là 1 số nguyên dương. Khi đó ta kí hiệu a mod m là

số dư khi chia a cho m.

Từ định nghĩa ta có a=mq+r, 0<=r<m

Ví dụ: 30 mod 24=6; 2000 mod 101=81; -133 mod 9=2

Định nghĩa 7.2: Nếu a và b là hai số nguyên và m là số nguyên dương thì a được gọi là đồng

dư với b theo modul m nếu a-b chia hết cho m. Kí hiệu a=b mod m.

Chú ý: a=b mod m a mod m=b mod m

Page 62: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 61

Định lý 7.1: Cho m là 1 số nguyên dương. Hai số nguyên a và b được gọi là đồng dư theo

modul m nếu và chỉ nếu tồn tại 1 số nguyên k sao cho a=b+km.

Chứng minh: Nếu a=b mod m thì a-b chia hết cho m. Tức là a-b=km hay a=b+km.

Ngược lại, nếu tồn tại k sao cho a=b+km thì km=a-b tức là a-b chia hết cho m hay a=b mod

m.

Định lý 7.2: Cho m là 1 số nguyên dương. Nếu a=b mod m và c=d mod m thì

a +c =b +d mod m

và ac=bd mod m

Chứng minh:

Do a=b mod m và c=d mod m nên tồn tại s, t nguyên dương để b=a+ms và d=c+mt

Từ đó b+d= a+ms + c+mt= (a+c)+m(s+t)

và bd= (a+ms) . (c+mt)=ac+m(at+cs+mst)

Do vậy a+c = (b+d) mod m và ac=bd mod m.

Số ngẫu nhiên là số bất kỳ. Trong toán học, số ngẫu nhiên là số có khả năng xuất hiện

ngang nhau và dựa vào nó không thể đoán được số trước hoặc sau nó. Số giả ngẫu nhiên là số

có tính chất như số ngẫu nhiên nhưng được tạo ra từ một chương trình máy tính nào đó,

thường được gọi là số ngẫu nhiên. Có nhiều phương pháp sinh số ngẫu nhiên, trong đó đồng

dư tuyến tính là một cách đơn giản và hiệu quả để sinh các số ngẫu nhiên.

Giả sử cần số ngẫu nhiên trong khoảng 0 .. m-1. Trạng thái ở bước thứ k là xk được

xác định bởi hàm sinh như sau:

xk = ( a xk-1 + c ) mod m

trong đó: 0<m, 0<a<m, 0<=c<m, 0<=x0 <m.

Giá trị khởi đầu x0 người ta thường gọi là nhân seek. Chu kỳ lớn nhất của LCG là m,

khi LCG có chu kỳ m gọi là chu kỳ đầy đủ. Khi LCG có chu kỳ đầy đủ thì x0 có thể lựa chọn

bất kỳ giá trị nào thỏa mãn 0<=x0 <m, vì giá trị x0 thay đổi thì giá trị dãy các số giả ngẫu

nhiên thu được chỉ là thay đổi điểm bắt đầu.

Định lý 7.3 (về điều kiện cần và đủ để LCG có chu kỳ đầy đủ)

Một bộ sinh LCG có chu kỳ đầy đủ với mọi x0 khi và chỉ khi nó thỏa mãn các điều kiện sau:

1. c và m nguyên tố cùng nhau.

2. a=1 mod p, mọi p là ước nguyên tố của m. Nếu m nguyên tố thì a=1.

3. Nếu m chia hết cho 4 thì a-1 cũng chia hết cho 4.

Định lý này do Hull và Dobell đưa ra và chứng minh năm 1966 [3,4]. Với các tham số (a, c,

m) thỏa mãn các điều kiện của định lý này thì việc lựa chọn giá trị khởi đầu x0 giữa 1 và m-1

không ảnh hưởng tới tính ngẫu nhiên của chuỗi mà chỉ chuyển giá trị khởi đầu của dãy các số

ngẫu nhiên. Ngoài ra, các số giả ngẫu nhiên sinh bởi nó dễ dàng vượt qua hầu hết bộ kiểm tra

tính ngẫu nhiên của các số ngẫu nhiên sinh ra.

Page 63: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 62

7.5. Ma trận

7.5.1. Giới thiệu ma trận và ứng dụng của ma trận

Trong toán học, một ma trận là bảng chữ nhật chứa dữ liệu (thường là số thực hoặc

số phức, nhưng có thể là bất kỳ dữ liệu gì) theo hàng và cột.

Trong đại số tuyến tính, ma trận dùng để lưu trữ các hệ số của hệ phương trình

tuyến tính và biến đổi tuyến tính.

Trong lý thuyết đồ thị, ma trận thường dùng để biểu diễn đồ thị (ví dụ: ma trận

kề), lưu trữ trọng số cho đồ thị có trọng số...

Trong lập trình, ma trận thường được lưu trữ bằng các mảng hai chiều.

Ma trận thông dụng nhất là ma trận hai chiều. Tổng quát hóa của khái niệm ma trận hai

chiều là ma trận khối. Trong lập trình, ma trận khối được lưu trữ bằng các mảng nhiều chiều.

Rất nhiều ứng dụng của ma trận, bao gồm:

• Giải hệ phương trình tuyến tính

• Trong đồ họa máy tính, xử lý ảnh

• Các mô hình trong kỹ nghệ và khoa học tính toán

• Tính toán lượng tử, …

Ma trận có thể được xem như một hàm:

Một ma trận A = [ai,j] là các phần tử của tập S có thể mã hóa thành một hàm

fA: ℕ ℕ→S, sao cho i<m, j<n, fA(i, j) = ai,j.

Mô tả

Các dòng ngang của ma trận gọi là hàng và các cột thẳng đứng là cột. Hình dạng ma

trận được đặc trưng bởi số hàng và số cột (kích thước ma trận). k phần tử. Ma trận thường

được viết thành bảng kẹp giữa 2 dấu ngoặc vuông”[“và”]”(hoặc, hiếm hơn, dấu

goặc”(“và”)”). Ví dụ

7.5.2. Các phép toán trên ma trận

Phép cộng ma trận

Phép nhân ma trận với một số

Page 64: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 63

Phép nhân ma trận

Phép nhân hai ma trận chỉ thực hiện được khi số cột của ma trận bên trái bằng số

dòng của ma trận bên phải. Nếu ma trận A có kích thước m x n và ma trận B có kích thước n

x p, thì ma trận tích AB có kích thước m xp xác định bởi:

Chẳng hạn:

Phép nhân ma trận có các tính chất sau:

(AB)C = A(BC) với mọi ma trận cấp k xm A, ma trận m x n B và ma trận n xp

C (“kết hợp”).

(A + B)C = AC + BC với mọi ma trận cấp m xn các ma trận A và B và ma trận

cấp n x k C (“phân phối bên phải”).

C(A + B) = CA + CB (“phân phối bên trái”).

Rất chú ý rằng phếp nhân ma trận không giao hoán.

7.5.3. Các loại ma trận đặc biệt

Ma trận tam giác là ma trận vuông có tất cả các phần tử nằm phía trên (hoặc tất cả

các phần tử nằm dưới) đường chéo chính đều bằng 0. Như vậy ta có ai,j=0 với mọi i<j hoặc

với mọi i>j.

Ma trận chéo là ma trận vuông trong đó tất cả các phần tử không nằm trên đường

chéo chính bằng 0, nghĩa là ai,j=0 với mọi i ≠ j.

Ma trận đơn vị trên một vành nào đó, là ma trận vuông, có các phần tử nằm trên

một đường chéo mang giá trị là đơn vị nhân của vành đó (nếu là vành số thông thường thì là

số 1), tất cả các phần tử còn lại mang giá trị trung hòa (nếu là vành số thông thường thì là số

0).

Ma trận đối xứng: Là ma trận vuông có các cặp phần tử đối xứng qua đường chéo

chính bằng nhau aịj = aji.

Ma trận chuyển vị: A=[aij] là ma trận m×n, chuyển vị của A (viết là At hay AT) là ma

trận n×m với At = B = [bij] = [aji] (i=1..n, j=1..m) (đổi hàng thành cột và ngược lại).

Ma trận trực giao: Là ma trận có ma trận chuyển vị chính là nghịch đảo của nó. (AT.A

= U = A .AT với A là ma trận vuông và các phần tử là số thực).

Ma trận không là ma trận có các phân tử đều bằng không.

Cài đặt chương trình kiểm tra một ma trận có là ma trận đường chéo? ma trận đơn

Page 65: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 64

vị? ma trận đối xứng? ma trận chuyển vị? ma trận không?

Page 66: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 65

Bài 8 Số nguyên và ứng dụng

8.1. Số học đồng dư và ứng dụng

8.1.1. Hàm băm

Để việc lưu trữ dữ liệu để tốc độ truy cập được nhanh chóng người ta cần dung hàm

băm thích hợp. Ví dụ như trong lưu trữ hồ sơ, mỗi hồ sơ được nhận dạng bằng cách dung 1

chìa khóa tương ứng với 1 hồ sơ duy nhất (mỗi hồ sơ này thường dung mã là chìa khóa). Hàm

băm h(k) gán ô nhớ h(k) cho hồ sơ có chìa khóa là k. Trong thực tế người ta có thể dung nhiều

hàm băm khác nhau. Một trong các hàm băm thường dung nhất là h(k)=k mod m, m là số ô

nhớ

Ví dụ 8.1: m=111, hồ sơ có mã thẻ 064212848 sẽ được gán cho ô nhớ 14 vì

h(064212848)= 064212848 mod 111=14

Hồ sơ có mã thẻ 037149212 sẽ được gán cho ô nhớ 65

Chú ý: Với hàm băm h(k) xảy ra xung đột, có thể gán ô nhớ tự do đầu tiên ngay sau ô nhớ đã

được gán trước.

8.1.2. Các số giả ngẫu nhiên

Các số được chọn một cách ngẫu nhiên rất cần thiết trong việc mô phỏng trên máy

tính. Để tạo ra các số này có nhiều phương pháp khác nhau nhưng phương pháp thông dụng

nhất là phương pháp đồng dư tuyến tính.

Giả sử cần 1 vài số ngẫu nhiên trong khoảng từ 1 đến 6. Dãy các số giả ngẫu nhiên

{xn} với 1<=xn<=6 bằng cách dùng liên tiếp đồng dư xn+1 = 1 +(a xn+c)mod 6, trong đó chọn

1 giá trị cho x0,a và c sao cho 1<=x0<=6, 1<a<=6, 0<=c<6.

8.1.3. Mật mã

Một trong những người dung mật mã sớm nhất là Julius Caesar (Xê da), ông đã làm cho

những bức thư trở thành bí mật bằng cách dịch mỗi chữ cái đi 3 vị trí về phía trước trong bảng

chữ cái.

Quá trình mã hóa của Xê da có thể được biểu diễn bằng toán học như sau:

1. Thay mỗi chữ cái bởi 1 con số tương ứng với thứ tự của nó trong bảng chữ cái ( thay

A bởi 0, B bởi 1,… Z bởi 25)

2. f(p)=(p+3) mod 26, 0<=p<=25

3. Thay mỗi số thu được từ bước 2 bằng 1 chữ cái tương ứng với thứ tự của nó trong

bảng chữ cái ( thay 0 bởi A, 1 bởi B,… 25 bởi Z).

Để phục hồi lại bức thư gốc đã được mã hóa theo mật mã của Xê da chỉ cần dịch mỗi

chữ cái lùi lại 3 vị trí. Về mặt toán học dùng hàm ngược f-1 của f là

f-1(p)=(p-3)mod 26

Page 67: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 66

Do đó quá trình giải mã của Xê da có thể được biểu diễn bằng toán học như sau:

1. Thay mỗi chữ cái bởi 1 con số tương ứng với thứ tự của nó trong bảng chữ cái ( thay

A bởi 0, B bởi 1,… Z bởi 25)

2. f(p)=(p-3)mod 26, 0<=p<=25

3. Thay mỗi số thu được từ bước 2 bằng 1 chữ cái tương ứng với thứ tự của nó trong

bảng chữ cái ( thay 0 bởi A, 1 bởi B,… 25 bởi Z).

Thảo luận: Giải pháp nâng cao bảo mật?

8.2. Số nguyên tố và ứng dụng

8.2.1. Số nguyên tố

Có thể nói rằng số nguyên tố là số được chú ý từ trước đến nay không những của

cộng đồng toán học, mà còn của cộng đồng tin học, không bởi vì tính chất đặc biệt của nó

mà còn vì những ứng dụng hết sức thực tế của số nguyên tố (ví dụ ứng dụng điển hình là

trong mã hóa RSA http://en.wikipedia.org/wiki/RSA)

Định nghĩa 8.1: Số nguyên tố là số tự nhiên lớn hơn 1, chỉ chia hết cho 1 và chia

hết cho chính nó.

Ví dụ: 2, 3, 5, 7, 11..

Định lý 8.1 (cơ bản của số học): Mọi số tự nhiên lớn hơn 1 đều phân tích được thành

tích những thừa số nguyên tố, và sự phân tích này là duy nhất nếu không kể đến thứ tự của

các thừa số.

Từ đó có dạng phân tích tiêu chuẩn của một số tự nhiên bất kỳ là:

Trong đó p1, p2, ..., pm, là các số nguyên tố đôi một khác nhau. Ta có n chia hết cho

(k1+1)(k2+1)...(km+1) số tự nhiên.

Ví dụ: 300 = 22.52.3

300 chia hết cho (2+1)(2+1)(1+1)=18 số tự nhiên.

Tính chất

Tính chất 1: Ước tự nhiên khác 1 nhỏ nhất của 1 số tự nhiên là số nguyên tố

Chứng minh: Giả sử d là ước của số tự nhiên a, d nhỏ nhất khác 1

Nếu d không là số nguyên tố thì d=d1.d2, d1, d2>1. Khi đó d1<d cũng là ước của a

(mâu thuẫn với giả thiết)

Tính chất 2: Cho p là số nguyên tố, a là số nguyên dương. Khi đó

(a,p)=p a chia hết cho p

(a,p)=1 a không chia hết cho p

Tính chất 3: Nếu tích chia hết cho 1 số nguyên tố p thì có ít nhất 1 thừa số chia hết cho

p

Tính chất 4: Ước số dương bé nhất khác 1 của 1 hợp số a là 1 số nguyên tố không vượt

Page 68: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 67

quá a

Tính chất 5: Tập hợp các số nguyên tố là vô hạn

Tuy nhiên, vì tập hợp số nguyên tố là tập con của số tự nhiên, mà tập hợp số tự nhiên là

đếm được nên tập hợp các số nguyên tố là đếm được.

8.2.2. Thuật toán sàng số nguyên tố

Sàng Eratosthene là một giải thuật cổ xưa để lập bảng tất cả các số nguyên tố nhỏ

hơn một số n cho trước. Giải thuật dựa trên tính chất: mọi hợp số n đều có ước nguyên tố

không vượt quá căn của chính nó (sqrt(n)). Giải thuật đầu tiên xóa số 1 ra khỏi tập các số

nguyên tố. Số tiếp theo số 1 là số 2, là số nguyên tố. Bắt đầu từ số 2 xoá tất cả các bội của 2

ra khỏi bảng. Số đầu tiên không bị xoá sau số 2 (số 3) là số nguyên tố. Tiếp theo lại xoá các

bội của 3... Giải thuật tiếp tục cho đến khi găp số nguyên tố nhỏ hơn sqrt(n) thì dừng lại.

Tất cả các số chưa bị xoá là số nguyên tố. Theo ngôn ngữ thuật toán ta có thể diễn đạt giải

thuật sàng Eratosthene như sau: Eratosthene(n)

Câu chuyện về số nguyên tố: Giả thiết Goldbach - Euler

Năm 1742, nhà toán học Đức Goldbach viết thư cho Ơ-le biết rằng ông mạo hiểm

đưa ra bài toán: Mọi số tự nhiên lớn hơn 5 đều biểu diễn được dưới dạng tổng của 3 số

nguyên tố. Ơ-le trả lời rằng theo ông, mọi số chẵn lớn hơn 2 đều biểu diễn được dưới dạng

Page 69: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 68

tổng của 2 số nguyên tố. Nếu chứng minh được một trong hai mệnh đề thì sẽ chứng minh

được mệnh đề còn lại. 200 năm sau, đến năm 1937, nhà toán học Liên Xô Vi-nô-gra-đốp đã

giải quyết gần trọn vẹn bài toán đó bằng cách chứng minh rằng mọi số lẻ đủ lớn đều có thể

biểu diễn được dưới dạng tổng của 3 số

nguyên tố.

Cho đến nay, bài toán Goldbach-Euler vẫn chưa giải được hoàn toàn. Nếu mệnh đề của

Ơle là đúng, hãy chứng minh mệnh đề Gôn-bách. Giải: Cho số tự nhiên n>5, ta sẽ chứng minh

rằng n viết được dưới dạng tổng của 3 số nguyên tố. Xét:

1. Trường hợp 1: Nếu n chẵn thì n=2+m với m chẵn, m>3.

2. Trường hợp 2: nếu n lẻ thì n=3+m với m chẵn, m>2. Theo mệnh đề Ơ-le, m chẵn,

m>2 nên m viết được dưới dạng tổng hai số nguyên tố. Do đó n viết được dưới dạng tổng của

3 số nguyên tố.

Số nguyên tố lớn nhất với hơn 9 triệu chữ số (đây là bài viết năm 2005). Một nhóm các nhà

khoa học thuộc Đại học Missouri, Mỹ, đã sử dụng hơn 700 máy tính để tìm ra số nguyên tố

lớn nhất cho đến nay, một con số khổng lồ với 9.152.052 con số.

Phát hiện này được thực hiện vào ngày 15/12 và đã được xác nhận lại vào ngày 24/12

vừa qua, đánh dấu lần thứ hai trong năm nay dự án kết hợp máy tính có tên. Tìm kiếm số

nguyên tố Mersenne trên Internet (GIMPS - Great Internet Mersenne Prime Search) tìm ra

một số nguyên tố lớn nhất. Nhưng cũng tương tự như phát hiện hồi tháng 2, con số mới được

tìm ra này vẫn chưa đạt được kích thước 10 triệu con số cần thiết để giành được giải thưởng

100.000 USD từ Quỹ điện tử có tên là Electronic Frontier Foundation.

Dự án GIMPS khai thác sức mạnh của hơn 200.000 máy tính được cung cấp một cách

tình nguyện với nhiệm vụ tìm kiếm tất cả các số nguyên tố Mersene. Một số nguyên tố là một

số chỉ có thể chia hết cho 1 và chính nó, và một số nguyên tố Mersenne (Đây là số nguyên tố

Mersenne thứ 43, được đặt tên theo Marin Mersenne, một tu sĩ người Pháp sống vào thế kỷ

thứ 17, người đã nghiên cứu số nguyên tố hiếm cách đây 300 năm). là một dạng đặc biệt có

công thức 2p-1 trong đó p cũng là một số nguyên tố. Ví dụ, 7 cũng là một số nguyên tố

Mersenne bởi nó là một số nguyên tố và bằng

Đã vài năm nay, những số nguyên tố lớn lớn nhất được phát hiện đều là các số

nguyên tố Mersenne. Chúng được đặt tên theo tên của Marin Mersenne, một tu sĩ người Pháp

sinh năm 1588, người đã khám phá ra dạng số này.

Các số nguyên tố Mersenne trong nhiều trường hợp đã được các cá nhân tìm ra,

nhưng lần này thì thành quả lại là của một nhóm tình nguyện viên. Nhóm này tới nay đã cống

hiến một năng lực xử lý nhiều hơn bất cứ ai: tương đương với khả năng xử lý của của một

máy tính Pentium 90MHz chạy liên tục trong 67.000 năm. Hai giáo sư Curtis Cooper và

Steven Boone là những người phụ trách dự án này.

Con số nguyên tố được phát hiện lần này là số nguyên tố Mersenne thứ 43 được tìm

ta bằng 230402457-1. Vào 18/10/2008 số nguyên tố Mersenne thứ 45 được tìm ta bằng 243112609-1

với 12978189 chữ số.

Một thông tin khác về số nguyên tố:

Nhà khoa học Josh Findley đã dùng máy vi tính để tìm ra số nguyên tố lớn nhất từ

Page 70: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 69

trước tới nay với 7.235.733 chữ số - nếu được viết ra. Số này sẽ trải dài đến 25km và thời

gian viết là 6 tuần!

Bảng 8.1 Các số nguyên tố lớn

8.3. Giải thuật đệ quy

8.3.1. Khái niệm đệ quy

Đệ quy (tiếng Anh; Recursion) là một phương pháp dùng trong các chương trình

máy tính trong đó có một hàm tự gọi.

Hình 8.1 Tam giác Sierpinski

Khái niệm hình thức về đệ quy== đầu Trong toán học và khoa học máy tính, các tính

chất (hoặc cấu trúc) được gọi là đệ quy nếu trong đó một lớp các đối tượng hoặc phương

pháp được xác định bằng việc xác định một số rất ít các trường hợp hoặc phương pháp đơn

giản (thông thường chỉ một) và sau đó xác định quy tắc đưa các trường hợp phức tạp về các

trường hợp đơn giản.

Page 71: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 70

Chẳng hạn, định nghĩa sau là định nghĩa đệ quy của tổ tiên:

Bố mẹ của một người là tổ tiên của người ấy ('trường hợp cơ bản);

Bố mẹ của tổ tiên một người bất kỳ là tổ tiên của người ấy (“bước đệ quy).

Các định nghĩa kiểu như vậy cũng thường thấy trong toán học.

Một khái niệm X được định nghĩa theo đệ quy nếu trong định nghĩa X có sử dụng

ngay chính khái niệm X.

8.3.2. Thuật toán đệ qui

Đôi khi chúng ta có thể quy việc giải bài toán với tập các dữ liệu đầu vào xác định về

việc giải cùng bài toán đó nhưng với các giá trị đầu vào nhỏ hơn. Chẳng hạn, bài toán tìm

UCLN của hai số a, b với a > b có thể rút gọn về bài toán tìm ƯCLN của hai số nhỏ hơn, a

mod b và b. Khi việc rút gọn như vậy thực hiện được thì lời giải bài toán ban đầu có thể tìm

được bằng một dãy các phép rút gọn cho tới những trường hợp mà ta có thể dễ dàng nhận

được lời giải của bài toán. Ta sẽ thấy rằng các thuật toán rút gọn liên tiếp bài toán ban đầu

tới bài toán có dữ liệu đầu vào nhỏ hơn, được áp dụng trong một lớp rất rộng các bài toán.

Định nghĩa: Một thuật toán được gọi là đệ quy nếu nó giải bài toán bằng cách rút

gọn liên tiếp bài toán ban đầu tới bài toán cũng như vậy nhưng có dữ liệu đầu vào nhỏ hơn.

Ví dụ Tìm thuật toán đệ quy tính giá trị an với a là số thực khác không và n là số

nguyên không âm.

Ta xây dựng thuật toán đệ quy nhờ định nghĩa đệ quy của an, đó là an+1=a.an với n>0

và khi n=0 thì a0=1. Vậy để tính an ta quy về các trường hợp có số mũ n nhỏ hơn, cho tới

khi n=0.

Ví dụ 8.1 Hãy biểu diễn thuật toán tìm kiếm tuyến tính như một thủ tục đệ quy.

Để tìm x trong dãy tìm kiếm a1,a2,...,an trong bước thứ i của thuật toán ta so sánh x

với ai. Nếu x bằng ai thì i là vị trí cần tìm, ngược lại thì việc tìm kiếm được quy về dãy có

Page 72: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 71

số phần tử ít hơn, cụ thể là dãy ai+1,...,an. Thuật toán tìm kiếm có dạng thủ tục đệ quy như

sau.

Cho search (i,j,x) là thủ tục tìm số x trong dãy ai, ai+1,..., aj. Dữ liệu đầu vào là bộ ba

(1,n,x). Thủ tục sẽ dừng khi số hạng đầu tiên của dãy còn lại là x hoặc là khi dãy còn lại

chỉ có một phần tử khác x. Nếu x không là số hạng đầu tiên và còn có các số hạng khác thì

lại áp dụng thủ tục này, nhưng dãy tìm kiếm ít hơn một phần tử nhận được bằng cách xóa đi

phần tử đầu tiên của dãy tìm kiếm ở bước vừa qua.

Ví dụ Hãy xây dựng phiên bản đệ quy của thuật toán tìm kiếm nhị phân.

Giả sử ta muốn định vị x trong dãy a1, a2, ..., an bằng tìm kiếm nhị phân. Trước tiên ta

so sánh x với số hạng giữa a[(n+1)/2]. Nếu chúng bằng nhau thì thuật toán kết thúc, nếu

không ta chuyển sang tìm kiếm trong dãy ngắn hơn, nửa đầu của dãy nếu x nhỏ hơn giá trị

giữa của của dãy xuất phát, nửa sau nếu ngược lại. Như vậy ta rút gọn việc giải bài toán

tìm kiếm về việc giải cũng bài toán đó nhưng trong dãy tìm kiếm có độ dài lần lượt giảm đi

một nửa.

8.3.3. Đệ quy và lặp

Ví dụ Thủ tục đệ quy sau đây cho ta giá trị của n! với n là số nguyên dương.

Có cách khác tính hàm giai thừa của một số nguyên từ định nghĩa đệ quy của nó.

Page 73: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 72

Thay cho việc lần lượt rút gọn việc tính toán cho các giá trị nhỏ hơn, ta có thể xuất

phát từ giá trị của hàm tại 1và lần lượt áp dụng định nghĩa đệ quy để tìm giá trị của hàm tại

các số nguyên lớn dần. Đó là thủ tục lặp.

Thông thường để tính một dãy các giá trị được định nghĩa bằng đệ quy, nếu dùng phương

pháp lặp thì số các phép tính sẽ ít hơn là dùng thuật toán đệ quy (trừ khi dùng các máy đệ

quy chuyên dụng). Ta sẽ xem xét bài toán tính số hạng thứ n của dãy Fibonacci.

Theo thuật toán này, để tìm fn ta biểu diễn fn = fn-1 + fn-2. Sau đó thay thế cả hai số

này bằng tổng của hai số Fibonacci bậc thấp hơn, cứ tiếp tục như vậy cho tới khi f0 và f1

xuất hiện thì được thay bằng các giá trị của chúng theo định nghĩa. Do đó để tính fn cần

fn+1-1 phép cộng.

Bây giờ ta sẽ tính các phép toán cần dùng để tính fn khi sử dụng phương pháp lặp. Thủ

tục này khởi tạo x là f0 = 0 và y là f1 = 1. Khi vòng lặp được duyệt qua tổng của x và y

được gán cho biến phụ z. Sau đó x được gán giá trị của y và y được gán giá trị của z. Vậy

sau khi đi qua vòng lặp lần 1, ta có x = f1 và y = f0 + f1 = f2. Khi qua vòng lặp lần n-1 thì x

= fn-1. Như vậy chỉ có n – 1 phép cộng được dùng để tìm fn khi n >

1.

Page 74: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 73

Ta đã chỉ ra rằng số các phép toán dùng trong thuật toán đệ quy nhiều hơn khi dùng

phương pháp lặp. Tuy nhiên đôi khi người ta vẫn thích dùng thủ tục đệ quy hơn ngay cả

khi nó tỏ ra kém hiệu quả so với thủ tục lặp. Đặc biệt, có những bài toán chỉ có thể giải

bằng thủ tục đệ quy mà không thể giải bằng thủ tục lặp.

Page 75: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 74

BÀI 9 Kỹ thuật đếm cơ bản (Count technique)

9.1. Định nghĩa

Phép Đếm

Cho A là một tập hợp khác rỗng, để xác định số phần tử của tập hợp A ta thường

thực hiện việc đếm bằng cách lần lượt gán cho các phần tử của A các số tự nhiên kế tiếp

nhau, và số tự nhiên đầu tiên (được dùng để gán cho phần tử đầu tiên được xem xét) là 1.

Nếu quá trình này kết thúc với số tự nhiên n (được gán cho phần tử cuối cùng) thì ta nói A

là một tập hợp hữu hạn và có n phần tử. Thật ra khi thực hiện việc đếm như thế chính là thiết

lập một song ánh từ A vào tập hợp{1, 2, . . ., n}. Từ đó ta có thể định nghĩa phép đếm như

sau:

Định nghĩa:

Cho A là một tập hợp khác rỗng. Nếu tồn tại một số nguyên dương n và một song

ánh f từ A vào{1, 2, . . ., n} thì ta nói A là một tập hợp hữu hạn và A có n phần tử. Khi đó

song ánh

F: A →{1, 2, . . ., n}

sẽ được xem là một phép đếm tập hợp A.

Tập hợp rỗng có số phần tử là 0, và cũng được xem là tập hữu hạn. Số phần tử của

một tập hợp hữu hạn A được ký hiệu là |A|.

Nếu tập hợp A không hữu hạn, ta nói A là một tập vô hạn và viết

| A | = ∞

Ghi chú: Để khái quát hóa khái niệm số phần tử đối với các tập hợp t ùy ý và so sánh

lực lượng của các tập hợp người ta đưa ra định nghĩa về quan hệ đồng lực lượng, và các

quan hệ so sánh lực lượng khác dựa vào khái niệm ánh xạ. Chẳng hạn, hai tập hợp A và B

được nói là đồng lực lượng khi tồn tại một song ánh f từ A vào B.

9.2. Nguyên lý cộng và nguyên lý nhân

9.2.1. Nguyên lý cộng

Hãy xét một ví dụ sau đây

Vòng lặp sau đây thực hiện giải thuật sắp xếp lựa chọn một danh sách theo chiều

tăng dần

Có bao nhiêu phép so sánh A(i)>A(j) được thực hiện? Ta nhận thấy rằng:

Page 76: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 75

Thực hiện n lần, mỗi lần thực hiện (n-i) lần. Số lần thực hiện tổng lại là: (n-1)+(n-

2)+...+1+0

Cơ sở của nguyên lý cộng là mối liên hệ giữa số phần tử của một tập hợp với số phần

tử của các tập hợp con tạo thành phân hoạch của tập hợp đã cho, được phát biểu trong mệnh

đề sau đây:

Mệnh đề: Cho A và B là 2 tập hợp hữu hạn rời nhau, nghĩa là A ∩ B =∅ .

Khi ấy ta có:

| A U B | = | A | + | B |

Một cách tổng quát: Nếu A1, A2, ..., An là các tập hợp hữu hạn rời nhau, nghĩa là

phần giao của hai tập hợp bất kỳ trong n tập hợp là rỗng, thì số phần tử của phần hội của các

tập hợp trên bằng tổng của các số lượng phần tử trong mỗi tập hợp:

| A1 U A2 U . . . U An | = | A1 | + | A2 | + . . . + | An |

Để chứng minh mệnh đề trên cho trường hợp 2 tập hợp A và B ta có thể gọi m là số

phần tử của tập hợp A và n là số phần tử của tập hợp B. Sau đó, từ việc giả sử có các song

ánh

f: A ={1, 2, . . ., m} và g: B ={1, 2, . . ., n} ,

ta có thể lập dễ dàng một song ánh

h: A U B ={1, 2, . . ., m+n}

để đi đến kết luận | A U B | = m+n.

Trong trường hợp tổng quát ta có thể sử dụng nguyên lý qui nạp, với bước cơ sở là

việc chứng minh cho trương hợp 2 tập hợp vừa trình bày ở trên.

Nguyên lý cộng:

Giả sử ta phải thực hiện công việc và để thực hiện công việc này ta có thể chọn một

trong hai biện pháp khác nhau theo nghĩa là cách thực hiện biện pháp thứ nhất luôn luôn

khác cách thực hiện biện pháp thứ hai. Biện pháp thứ nhất có n cách thực hiện, và đối với

biện pháp thứ hai ta có m cách thực hiện. Vậy ta có n+m cách thực hiện công việc.

Ví dụ 9.1 Chúng ta cần chọn một sinh viên toán năm thứ 3 hay năm thứ 4 đi dự một

hội nghị. Hỏi có bao nhiêu cách chọn lựa một sinh viên như thế biết rằng có 100 sinh

viên toán học năm thứ 3 và 85 sinh viên toán học năm thứ tư?

Lời giải: Ta có thể thực hiện một trong 2 việc chọn lựa khác nhau: chọn một sinh viên

toán năm 3, hoặc chọn một sinh viên toán năm 4. Để thực hiện công việc thứ nhất ta có 100

cách, và để thực hiện công việc thứ 2 ta có 85 cách. Vậy để chọn một sinh viên toán theo yêu

cầu ta có 100+85 = 185 cách.

Chúng ta có thể mở rộng nguyên lý cộng cho trường hợp nhiều sự chọn lựa hơn như

Page 77: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 76

sau: Giả sử ta phải thực hiện một công việc bằng cách chọn một trong m sự chọn lựa các

biện pháp khác nhau T1, T2, ..., Tm. Để thực hiện Ti, i=1..m, ta có ni cách. Vậy ta số

cách thực hiện công việc trên là n1 + n2 + ... + nm. Nguyên lý cộng dạng tổng quát này có

thể được chứng minh bằng qui nạp.

Ví dụ 9.2 Một sinh viên có thể chọn một đề tài từ một trong 3 danh sách các đề tài. Số

đề tài trong các danh sách đề tài lần lượt là 23, 15, 19. Hỏi sinh viên có bao nhiêu cách chọn

một đề tài.

Lời giải: Sinh viên có thể chọn một đề tài trong danh sách thứ thứ nhất theo 23 cách,

trong danh sách thứ hai theo 15 cách, và trong danh sách thứ ba theo 19 cách. Do đó số

cách chọn đề tài là 23+15+19 = 57.

Ví dụ 9.3 Xác định giá trị của k sau khi đoạn chương trình sau đây được thực hiện

xong

k:= 0

for i1:= 1 to n1 do k:= k + 1;

for i2:= 1 to n2 do k:= k + 1;

for im:= 1 to nm do k:= k + 1;

Giải Giá trị của k ban đầu là 0. Sau đó là m vòng lặp khác nhau. Mỗi thao tác lặp

trong một vòng lặp là cộng thêm 1 vào k. Vòng lặp thứ i có ni thao tác, và tất cả m vòng lặp

không thể thực hiện 2 vòng lặp nào một cách đồng thời. Do đó số thao tác để thực hiện

xong đoạn chương trình trên là n1 + n2 + ... + nm. Đây cũng chính là giá trị cuối cùng của

k.

9.2.2. Nguyên lý nhân

Chúng ta bắt đầu bằng một số ví dụ:

Vòng lặp sau đây là một phần trong chương trình nhân 2 ma trận:

Có bao nhiêu phép nhân được thực thi?

Cơ sở của nguyên lý nhân là mối liên hệ giữa số phần tử của một tập hợp tích Descartes

với số phần tử của các tập hợp thành phần tạo nên tập hợp tích, được phát biểu trong mệnh đề

sau đây:

Mệnh đề: Cho A và B là 2 tập hợp hữu hạn rời nhau. Khi ấy ta có:

Page 78: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 77

| A x B | = | A | . | B |

Một cách tổng quát: Nếu A1, A2, ..., An là các tập hợp hữu hạn thì số phần tử của

tích Descartes của các tập hợp trên bằng tích của các số lượng phần tử của các tập hợp

trên:

| A1 x A2 x . . . x An | = | A1 | . | A2 | . . . . . | An |

Để chứng minh mệnh đề trên cho trường hợp 2 tập hợp A và B ta có thể gọi m là số

phần tử của tập hợp A và n là số phần tử của tập hợp B. Sau đó, từ việc giả sử có các song

ánh

f: A→{1, 2, . ., m} và g: B →{1, 2, . ., n}

ta có thể lập dễ dàng một song ánh

h: A x B → {1, 2, . ., mn}

để đi đến kết luận | A x B | = mn.

Trong trường hợp tổng quát ta có thể sử dụng nguyên lý qui nạp, với bước cơ sở là

việc chứng minh cho trương hợp 2 tập hợp vừa trình bày ở trên.

Nguyên lý nhân: Giả sử ta phải thực hiện một thủ tục bao gồm hai công việc kế tiếp

nhau. Để thực hiện công việc thứ nhất ta có n1 cách, và ứng với mỗi cách chọn thực hiện

công việc thứ nhất ta có n2 cách thực hiện công việc thứ hai. Vậy ta có số cách thực hiện thủ

tục là n1 x n2.

Nguyên lý nhân trên có thể được mở rộng và có dạng tổng quát như sau: Giả sử một thủ

tục bao gồm m công việc kế tiếp nhau T1, T2, . . ., Tm. Nếu công việc T1 có thể được thực

hiện theo n1 cách, và sau khi chọn cách thực hiện cho T1 ta có n2 cách thực hiện T2,

v.v… cho đến cuối cùng, sau khi chọn cách thực hiện các công việc T1, T2, . . ., Tm-1 ta có

nm cách thực hiện Tm. Vậy ta có n1.n2. ... .nm cách để thực hiện thủ tục. Nguyên lý nhân ở

dạng tổng quát này có thể được chứng minh bằng qui nạp từ qui tắc nhân cho trường hợp

thủ tục gồm 2 công việc.

Ví dụ 9.4 Các ghế ngồi trong một hội trường sẽ được ghi nhãn gồm một mẫu tự và

một số nguyên dương không lớn hơn 100. Hỏi số ghế tối đa có thể được ghi nhãn khác

nhau là bao nhiêu?

Giải Thủ tục ghi nhãn cho một ghế gồm 2 việc: ghi một trong 26 mẫu tự và kế tiếp là

ghi một trong 100 số nguyên dương. Qui tắc nhân cho thấy có 26 x 100 = 2600 cách khác

nhau để ghi nhãn cho một ghế ngồi. Do đó số ghế lớn nhất có thể được ghi nhãn khác nhau

là 2600.

Ví dụ 9.5 Giả sử ta phải đi từ một địa điểm A đến một địa điểm C, ngang qua một địa

điểm B. Để đi từ A đến B ta có 8 cách đi khác nhau, và có 6 cách đi từ B đến C. Hỏi có bao

nhiêu cách để đi từ A đến C ?

Giải Một cách đi từ A đến C gồm 2 việc: đi từ A đến B, rồi đi từ B đến C. Việc thứ

nhất (đi từ A đến B) có 8 cách thực hiện, việc thứ hai có 6 cách thực hiện. vậy, theo

nguyên lý nhân, số cách đi từ A đến C là 8 x 6 = 48.

Ví dụ 9.6 Hỏi có bao nhiêu chuỗi bit khác nhau có độ dài 8 (tức là gồm 8 bits) ?

Giải Mỗi bit có thể được chọn theo 2 cách, vì mỗi bit là 0 hoặc 1. Do đó, qui tắc nhân

cho phép ta kết luận rằng có 28 = 256 chuỗi bit có độ dài 8.

Page 79: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 78

Ví dụ 9.7 Một mã bao gồm 6 ký tự, trong đó gồm 3 mẫu tự rồi đến 3 ký số thập phân.

Hỏi có bao nhiêu mã khác nhau?

Giải Có 26 cách chọn cho mỗi mẫu tự và có 10 cách chọn cho mỗi ký số thập phân.

Do đó, theo qui tắc nhân, có tất cả 26.26.26.10.10.10 = 17 576 000 mã khác nhau.

Ví dụ 9.8 Có bao nhiêu đơn ánh đi từ một tập hợp gồm m phần tử vào một tập hợp

gồm n phần tử ?

Giải Trước hết ta nhận xét rằng khi m > n thì không có một đơn ánh nào đi từ một tập

hợp gồm m phần tử vào một tập hợp gồm n phần tử.

Giả sử các phần tử trong miền xác định của ánh xạ là a1, a2, . . ., am. Có n cách

chọn ảnh qua ánh xạ cho phần tử a1. Vì ánh xạ là đơn ánh nên đối với phần tử a2 ta chỉ có n-

1 cách chọn ảnh tương ứng (do giá trị ảnh được chọn cho a1 không thể được chọn lại cho

a2). Tổng quát, giá trị ảnh của phần tử ak chỉ có thể được chọn theo n-k+1 cách. Theo qui

tắc nhân, có n.(n-1). ... .(n-m+1) đơn ánh đi từ một tập hợp gồm m phần tử vào một tập hợp

gồm n phần tử.

Ví dụ 9.9 Phương án đánh số điện thoại.

Giả sử một số điện thoại gồm 10 ký số được chia thành 3 nhóm: 2 nhóm gồm 3 ký số

và một nhóm 4 ký số. Do một số lý do nào đó, có một số hạn chế trên các ký số của số điện

thoại. Để xác định dạng hợp lệ của một số điện thoại. ta dùng ký hiệu X để chỉ một ký số có

thể lấy giá trị từ 0 đến 9, N để chỉ một ký số từ 2 đến 9, v à Y chỉ một ký số là 0 hoặc 1.

Chúng ta có 2 phương án để đánh số điện thoại: một phương án cũ và một phương án

mới. Theo phương án cũ, số điện thoại có dạng NYX NNX XXXX; và theo phương án

mới thì số điện thoại có dạng NXX NXX XXXX. Hỏi số lượng số điện thoại khác nhau của

mỗi phương án là bao nhiêu?

Giải Do qui tắc nhân, đối với phương án đánh số điện thoại cũ, số trường hợp khác

nhau của mỗi nhóm ký số trong 3 nhóm lần lượt là: 8.2.10 = 160 (ứng với dạng NYX),

8.8.10 = 640 (ứng với dạng NNX), và 10.10.10.10 = 10000 (ứng với dạng XXXX). Vậy,

trong phương án đánh số điện thoại cũ, số lượng số điện thoại là 160. 640.10000 = 1 024 000

000.

Tương tự Số lượng số điện thoại trong phương án đánh số mới là:

(8.10.10).(8.10.10).(10.10.10.10) = 800.800.10000 = 6 400 000 000.

Ví dụ 9.10: Trong một version của ngôn ngữ BASIC tên của một biến là một chuỗi

gồm 1 hoặc 2 ký tự, mỗi ký tự là mẫu tự hoặc ký số thập lục phân và không phân biệt

giữa chữ in hoa và chữ thường. Hơn nữa, một tên biến phải bắt đầu bởi một mẫu tự và tên

biến phải khác với 5 chuỗi gồm 2 ký tự đã được dành riêng cho ngôn ngữ. Hỏi có bao nhiêu

tên biến khác nhau trong version này của BASIC.

Giải Đặt V là số tên biến khác nhau trong version này của BASIC, V1 là số biến gồm

một ký tự, và V2 là số biến gồm hai ký tự. Theo qui tắc cộng ta có V = V1 + V2. Vì

biến gồm một ký tự phải là một mẫu tự nên V1 = 26. Ngoài ra, theo qui tắc nhân ta có

26.36 chuỗi có độ dài 2 với ký tự đi đầu là mẫu tự và ký tự kế là mẫu tự hoặc ký số thập

phân. Tuy nhiên, có 5 chuỗi bị loại ra nên V2 = 26.36 - 5 = 931. Vậy có V = V1 + V2 = 26 +

931 = 957 tên khác nhau cho các biến của version này của BASIC.

Page 80: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 79

Ví dụ 9.11: Mỗi người sử dụng trên một hệ thống máy tính có một”password”dài từ 6

đến 8 ký tự, trong đó mỗi ký tự là một chữ in hoa hoặc là một ký số thập phân.

Mỗi”password”phải có ít nhất một ký số. Hỏi có bao nhiêu password khác nhau ?

Giải Đặt P là số lượng tất cả các”password”, và P6, P7, P8 lần lượt là số

các”password”có độ dài 6, 7, 8. Do qui tắc cộng ta có P = P6 + P7 + P8. Chúng ta sẽ tính

P6, P7, và P8. Tính trực tiếp P6 tương đối khó. Để tính P6 cho dễ, ta tính số chuỗi có độ dài

6 gồm các chữ in hoa hay ký số thập phân, kể cả các chuỗi không có ký số thập phân, và trừ

cho số chuỗi (với độ dài 6) không có ký số thập phân. Theo qui tắc nhân, số chuỗi gồm 6 ký

tự là 366 và số chuỗi không có ký số là 266. Suy ra

P6 = 366 - 266 = 2 176 782 336 - 308 915 776 = 1 867 866 560.

Tương tự, ta có thể tính ra được:

P7 = 367 - 267 = 78 364 164 096 - 8 031 810 176 = 70 332 353 920.

và P8 = 368 - 268 = 2 821 109 907 456 - 208 827 064 576= 2 612 282 842 880.

Từ đó ta tính được: P = P6 + P7 + P8 = 2 684 483 063 360.

9.3. Nguyên lý bù trừ

Khi hai công việc có thể được làm đồng thời, ta không thể dùng quy tắc cộng để

tính số cách thực hiện nhiệm vụ gồm cả hai việc. Để tính đúng số cách thực hiện nhiệm

vụ này ta cộng số cách làm mỗi một trong hai việc rồi trừ đi số cách làm đồng thời cả hai

việc. Ta có thể phát biểu nguyên lý đếm này bằng ngôn ngữ tập hợp. Cho A, B là hai tập

hữu hạn, khi đó

A B A B A B

Từ đó với ba tập hợp hữu hạn A, B, C ta có:

| |A B C A B C A B A C C B A B C

Tổng quát với n tập :

11 2 1 2 2 3... .... ... ( 1)n

n n nA A A A A A N N N

Trong đó:

2 1 2 1 3 1... nN A A A A A A

3 1 2 3 1 2 4 2 1... n n nN A A A A A A A A A

Nn= 1 2| ... |nA A A

Nhận xét: Nguyên lí cộng là một trường hợp đặc biệt của nguyên lí bù trừ.

0 BABA

Ví dụ 9.12 Giả sử trong trường có 1807 sinh viên năm thứ 1. Trong số này có 453 sinh viên

chọn môn tin, 567 sinh viên chọn môn toán, 299 sinh viên chọn 2 môn toán và tin. Hỏi có bao

nhiêu sinh viên không theo toán cũng không theo tin.

Page 81: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 80

Giải

Gọi A: tập sinh viên năm thứ 1 theo học chọn tin: N(A)=453

Gọi B: tập sinh viên năm thứ 1 theo học chọn toán: N(B)=567

BA là tập sinh viên năm thứ 1 theo học cả 2 môn: N( BA )=299

BA là tập sinh viên năm thứ 1 theo 1 trong 2 môn hoặc cả 2

1807 – N( BA ): là số sinh viên không theo toán cũng không theo tin.

Theo nguyên lý bù trừ:

721299567453)()()()( BANBNANBAN

số sinh viên không theo toán cũng không theo tin là:

)(10867211807)(1807 svBAN

Ví dụ 9.13 Giả sử trong chuyên ngữ trường có 1232 sinh viên học tiếng Anh 879 sinh viên

học tiếng Pháp, 114 sinh viên học tiếng Nga, 103 sinh viên học tiếng Anh và Pháp, 23 sinh

viên theo học tiếng Anh và Nga, 14 sinh viên theo học tiếng Pháp và Nga. Giả sử trường có

tất cả 2092 sinh viên đều theo học ít nhất 1 ngoại ngữ hoặc Anh hoặc Pháp hoặc Nga. Hỏi có

bao nhiêu sinh viên học cả 3 thứ tiếng.

Giải:

Goi A: là tập sinh viên học tiếng Anh N(A)=1232

Gọi P: là tập sinh viên học tiếng Pháp N(P)=879

Gọi N: là tập sinh viên học tiếng Nga N(N)=114

PA là tập sinh viên học 2 tiếng Anh và Pháp N( PA )=103

NA là tập sinh viên học 2 tiếng Anh và Nga N( NA )=23

NP là tập sinh viên học 2 tiếng Pháp và Nga N( NP )=14

NPA là tập sinh viên có học ngoại ngữ

Theo gt: tổng số sinh viên 2092 và tất cả sinh viên đều theo học ít nhất 1 ngoại ngữ

2092=N( NPA )

Theo nguyên lý bù trừ

)()]()()([)]()()([)( NPANNPNNANPANNNPNANNPAN

7]1423103[]1148791232[2092)( NPAN

KL: có 7 sinh viên theo học cả 3 thứ tiếng.

9.4. Nguyên lý Dirichlet

Giả sử có một đàn chim bồ câu bay vào chuồng. Nếu số chim nhiều hơn số ngăn

chuồng thì ít nhất trong một ngăn có nhiều hơn một con chim. Nguyên lý này dĩ nhiên là có

thể áp dụng cho các đối tượng không phải là chim bồ câu và chuồng chim.

Mệnh đề (Nguyên lý): Nếu có k+1 (hoặc nhiều hơn) đồ vật được đặt vào trong k

hộp thì tồn tại một hộp có ít nhất hai đồ vật.

Page 82: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 81

Chứng minh: Giả sử không có hộp nào trong k hộp chứa nhiều hơn một đồ vật. Khi đó

tổng số vật được chứa trong các hộp nhiều nhất là bằng k. Điều này trái giả thiết là có ít nhất

k + 1 vật.

Nguyên lý này thường được gọi là nguyên lý Dirichlet, mang tên nhà toán học người

Đức ở thế kỷ 19. Ông thường xuyên sử dụng nguyên lý này trong công việc của mình.

Ví dụ 9.14

1) Trong bất kỳ một nhóm 367 người thế nào cũng có ít nhất hai người có ngày sinh

nhật giống nhau bởi vì chỉ có tất cả 366 ngày sinh nhật khác nhau.

2) Trong kỳ thi học sinh giỏi, điểm bài thi được đánh giá bởi một số nguyên trong

khoảng từ 0 đến 100. Hỏi rằng ít nhất có bao nhiêu học sinh dự thi để cho chắc chắn tìm được

hai học sinh có kết quả thi như nhau?

Theo nguyên lý Dirichlet, số học sinh cần tìm là 102, vì ta có 101 kết quả điểm thi

khác nhau.

3) Trong số những người có mặt trên trái đất, phải tìm được hai người có hàm răng

giống nhau. Nếu xem mỗi hàm răng gồm 32 cái như là một xâu nhị phân có chiều dài 32,

trong đó răng còn ứng với bit 1 và răng mất ứng với bit 0, thì có tất cả 232 =4.294.967.296

hàm răng khác nhau. Trong khi đó số người trên hành tinh này là vượt quá 5 tỉ, nên theo

nguyên lý Dirichlet ta có điều cần tìm.

9.4.1. Nguyên lý Dirichlet tổng quát

Mệnh đề: Nếu có N đồ vật được đặt vào trong k hộp thì sẽ tồn tại một hộp chứa ít

nhất ]N/k[ đồ vật.

(Ở đây, ]x[ là giá trị của hàm trần tại số thực x, đó là số nguyên nhỏ nhất có giá trị lớn

hơn hoặc bằng x. Khái niệm này đối ngẫu với [x] – giá trị của hàm sàn hay hàm phần nguyên

tại x – là số nguyên lớn nhất có giá trị nhỏ hơn hoặc bằng x.)

9.4.2. Một số ứng dụng của nguyên lý Dirichlet

Trong nhiều ứng dụng thú vị của nguyên lý Dirichlet, khái niệm đồ vật và hộp cần

phải được lựa chọn một cách khôn khéo. Trong phần nay có vài ví dụ như vậy.

Ví dụ 9.15

1) Trong một phòng họp có n người, bao giờ cũng tìm được 2 người có số người quen

trong số những người dự họp là như nhau.

Số người quen của mỗi người trong phòng họp nhận các giá trị từ 0 đến n-1. Rõ ràng

trong phòng không thể đồng thời có người có số người quen là 0 (tức là không quen ai) và

có người có số người quen là n-1 (tức là quen tất cả). Vì vậy theo số lượng người quen, ta

chỉ có thể phân n người ra thành n-1 nhóm. Vậy theo nguyên lý Dirichlet tồn tai một nhóm

có ít nhất 2 người, tức là luôn tìm được ít nhất 2 người có số người quen là như nhau.

2) Trong một tháng gồm 30 ngày, một đội bóng chuyền thi đấu mỗi ngày ít nhất 1

trận nhưng chơi không quá 45 trận. Chứng minh rằng tìm được một giai đoạn gồm một số

ngày liên tục nào đó trong tháng sao cho trong giai đoạn đó đội chơi đúng 14 trận.

Page 83: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 82

Gọi aj là số trận mà đội đã chơi từ ngày đầu tháng đến hết ngày j. Khi đó

1 <= a1 < a2 < ... < a30 < 45

15 <= a1+14 < a2+14 < ... < a30+14 < 59.

Sáu mươi số nguyên a1, a2, ..., a30, a1+ 14, a2 + 14, ..., a30+14 nằm giữa 1 và 59.

Do đó theo nguyên lý Dirichlet có ít nhất 2 trong 60 số này bằng nhau. Vì vậy tồn tại i và j

sao cho ai = aj + 14 (j < i). Điều này có nghĩa là từ ngày j + 1 đến hết ngày i đội đã chơi

đúng 14 trận.

3) Chứng tỏ rằng trong n + 1 số nguyên dương không vượt quá 2n, tồn tại ít

nhất một số chia hết cho số khác.

Ta viết mỗi số nguyên a1, a2,..., an+1 dưới dạng aj =2 k j qj trong đó kj là số

nguyên không âm còn qj là số dương lẻ nhỏ hơn 2n. Vì chỉ có n số nguyên dương lẻ nhỏ hơn

2n nên theo nguyên lý Dirichlet tồn tại i và j sao cho qi = qj = q.

Khi đó

Vì vậy, nếu ki <= kj thì aj chia hết cho ai còn trong trường hợp ngược lại ta có ai chia hết

cho aj.

Ví dụ cuối cùng trình bày cách áp dụng nguyên lý Dirichlet vào lý thuyết tổ hợp mà

vẫn quen gọi là lý thuyết Ramsey, tên của nhà toán học người Anh. Nói chung, lý thuyết

Ramsey giải quyết những bài toán phân chia các tập con của một tập các phần tử.

4) Giả sử trong một nhóm 6 người mỗi cặp hai hoặc là bạn hoặc là thù. Chứng tỏ

rằng trong nhóm có ba người là bạn lẫn nhau hoặc có ba người là kẻ thù lẫn nhau.

Gọi A là một trong 6 người. Trong số 5 người của nhóm hoặc là có ít nhất ba người là

bạn của A hoặc có ít nhất ba người là kẻ thù của A, điều này suy ra từ nguyên lý Dirichlet

tổng quát, vì ]5/2[ = 3. Trong trường hợp đầu ta gọi B, C, D là bạn của A. nếu trong ba người

này có hai người là bạn thì họ cùng với A lập thành một bộ ba người bạn lẫn nhau, ngược

lại, tức là nếu trong ba người B, C, D không có ai là bạn ai cả thì chứng tỏ họ là bộ ba người

thù lẫn nhau. Tương tự có thể chứng minh trong trường hợp có ít nhất ba người là kẻ thù của

A.

9.5. Hoán vị, tổ hợp, chỉnh hợp (*)

9.5.1. Chỉnh hợp

Ðịnh nghĩa

Cho X là một tập hợp gồm n phần tử, và r là một số nguyên dương nhỏ hơn hoặc

bằng n. Mỗi phép chọn r phần tử phân biệt của X theo một thứ tự nào đó sẽ cho ta một

chỉnh hợp n chọn r. Nói cách khác, ta có thể xem một chỉnh hợp như là một dãy hay một bộ

gồm r phần tử phân biệt được chọn từ n phần tử cho trước.

Ví dụ 9.16 Cho tập hợp S = {1, 2, 3}. Dãy gồm 2 phần tử 3, 2 là một chỉnh hợp 3 chọn

2. Sự sắp xếp các phần tử thành dãy 3, 1, 2 cho ta một chỉnh hợp 3 chọn 3. Chỉnh hợp 3

chọn 3 này còn được gọi là một hoán vị của 3 phần tử.

Một chỉnh hợp n chọn n được gọi là một hoán vị của n phần tử. Nói cách khác, một

Page 84: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 83

hoán vị n phần tử là một cách sắp xếp n phần tử theo một thứ tự nào đó. Mỗi hoán vị n

phần tử của tập X cũng có thể được xem như một song ánh từ X vào X.

Công thức chỉnh hợp

Ðịnh lý 1 Số các chỉnh hợp n chọn r là

A(n,r) = n(n-1)(n-2)...(n-r+1).

Chứng minh: Mỗi chỉnh hợp của n phần tử chọn r tương ứng với một phép chọn ra r

phần tử phân biệt gồm r bước chọn liên tiếp nhau, và ở mỗi bước ta chọn một phần tử. Phần

tử thứ nhất của chỉnh hợp có thể được chọn theo n cách vì có n phần tử trong tập hợp.

Ðối vớ phần tử thứ 2 ta chỉ có n-1 cách chọn (vì ở lần thứ 2 ta phải loại ra phần tử đã

chọn ở lần thứ nhất trong việc chọn). Cứ tiếp tục như thế, đến phần tử thứ r ta có n-r+1

cách chọn. Do đó, theo nguyên lý nhân, ta có số chỉnh hợp n chọn r là

Ví dụ 9.17 Số trường hợp lấy 4 người của một lớp gồm 10 người vào 4 vị trí (có thứ

tự) đại diện cho lớp là A(10,4) = 10.9.8.7 = 5 040.

Chỉnh hợp có lặp

Một cách sắp xếp có thứ tự k phần tử có thể lặp lại của một tập n phần tử được gọi

là một chỉnh hợp lặp chập k từ tập n phần tử. Nếu A là tập gồm n phần tử đó thì mỗi chỉnh

hợp như thế là một phần tử của tập Ak. Ngoài ra, mỗi chỉnh hợp lặp chập k từ tập n phần

tử là một hàm từ tập k phần tử vào tập n phần tử. Vì vậy số chỉnh hợp lặp chập k từ tập n

phần tử là nk.

9.5.2. Tổ hợp

Ðịnh nghĩa

Cho X là một tập hợp gồm n phần tử, và r là một số nguyên không âm nhỏ hơn hoặc

bằng n. Mỗi phép chọn r phần tử phân biệt của X mà không phân biệt thứ tự trước sau sẽ

cho ta một tổ hợp n chọn r. Nói cách khác, ta có thể xem một tổ hợp n chọn r như là một tập

hợp con gồm r phần tử của một tập hợp có n phần tử.

Ví dụ 9.18 Cho tập hợp S = {1, 2, 3, 4} . Ta có tập S' = {1, 3, 4} là một tổ hợp 4 chọn 3.

Số các tổ hợp n chọn r được ký hiệu là C(n,r). Ví dụ: C(4,2) = 6 vì ta có thể liệt kê ra

tất cả các tập hợp con 2 phần tử của một tập hợp có 4 phần tử và thấy có tất cả là 6 tập con.

Ðịnh lý sau đây cho ta một công thức để tính C(n,r).

Công thức tổ hợp

Ðịnh lý 1 Số các tổ hợp n chọn r , với n và r là các số nguyên thỏa 0 ≤ r ≤ n, là

C(n,r)=n!/(r!(n-r)!)

Chứng minh: Ta sẽ tính số tổ hợp thông qua việc thiết lập công thức li ên hệ giữa

C(n,r) và A(n,r). Các chỉnh hợp n chọn r thể đạt được bằng cách lấy một tổ hợp n chọn r

(hay tập con r phần tử của tập hợp n phần tử cho trước) rồi sau đó chọn một hoán vị của r

phần tử trong tổ hợp. Từ đó, theo qui tắc nhân, ta có:

A(n,r) = C(n,r) . A(r,r) = C(n,r) . r!

Suy ra:

Page 85: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 84

Ghi chú: Số tổ hợp n chọn r C(n,r) còn được ký hiệu bởi

hoặc là

Ví dụ 9.19 Số danh sách không kể thứ tự trước sau gồm 5 người của một lớp học gồm 10

người là C(10,5) = 10! / (5!5!) = 252.

Công thức nhị thức Newton:

Ðịnh lý 2 Cho x và y là 2 biến thực, n là một số nguyên không ấm tùy ý. Ta có:

Chứng minh: Ta có thể khai triển tích của n thừa số trong biểu thức

(x+y)n = (x+y) (x+y) . . . (x+y)

thành tổng của 2n số hạng có dạng t1t2…tn trong đó ti = x hay ti = y, với mọi i từ 1..

Một cách khác, ta có thể dựa vào tam giác Pascal:

Một số tính chất khác của tổ hợp

Dưới đây ta nêu lên một số tính chất của tổ hợp. Các tính chất này có thể được chứng

minh dễ dàng từ công thức tổ hợp.

Với mọi số thự nhiên n ta có: C(n, 0) = 1 và C(n, n) = 1

Cho n và r là 2 số nguyên không âm và r<= n. Ta có: C(n,r) = C(n,n-r)

Cho n và k là 2 số nguyên sao cho 0 < k < n. Khi đó ta có:

C(n, k) = C(n-1, k) + C(n-1, k-1).

Công thức Vandermonde: Cho m, n, và r là các số nguyên không âm với r nhỏ hơn

hoặc bằng m và n. Ta có:

Tổ hợp lặp

Một tổ hợp lặp chập k của một tập hợp là một cách chọn không có thứ tự k phần tử

có thể lặp lại của tập đã cho. Như vậy một tổ hợp lặp kiểu này là một dãy không kể thứ tự

gồm k thành phần lấy từ tập n phần tử. Do đó có thể là k > n.

Ví dụ 9.20

1) Có bao nhiêu cách chọn 5 tờ giấy bạc từ một két đựng tiền gồm những tờ 1000đ,

2000đ, 5000đ, 10.000đ, 20.000đ, 50.000đ, 100.000đ. Giả sử thứ tự mà các tờ tiền được chọn

là không quan trọng, các tờ tiền cùng loại là không phân biệt và mỗi loại có ít nhất 5 tờ.

Page 86: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 85

Vì ta không kể tới thứ tự chọn tờ tiền và vì ta chọn đúng 5 lần, mỗi lần lấy một từ 1

trong 7 loại tiền nên mỗi cách chọn 5 tờ giấy bạc này chính là một tổ hợp chập 5 của 7 phần

tử = 462.

2) Phương trình x1 + x2 + x3 = 15 có bao nhiêu nghiệm nguyên không âm?

Chúng ta nhận thấy mỗi nghiệm của phương trình ứng với một cách chọn 15 phần tử

từ một tập có 3 loại, sao cho có x1 phần tử loại 1, x2 phần tử loại 2 và x3 phần tử loại 3

được chọn. Vì vậy số nghiệm bằng số tổ hợp lặp chập 15 từ tập có 315 phần tử và bằng =

136.

9.5.3. Hoán vị

Trong toán học, đặc biệt là trong đại số trừu tượng và các lĩnh vực có liên quan, một

hoán vị là một song ánh từ một tập hợp hữu hạn X vào chính nó.

Trong lý thuyết tổ hợp, khái niệm hoán vị cũng mang một ý nghĩa truyền thống mà

nay ít còn được dùng, đó là mô tả một bộ có thứ tự không lặp, và không nhất thiết phải

chứa đầy đủ số phần tử.

Khái niệm hoán vị diễn tả ý tưởng rằng những đối tượng phân biệt có thể được sắp

xếp theo những thứ tự khác nhau. Ví dụ, với các số từ một đến sáu, mỗi cách sắp thứ tự sẽ

tạo thành một dãy các số không lặp lại. Một hoán vị như thế là: “3, 4, 6, 1,2, 5”.

Có nhiều cách định nghĩa khái niệm hoán vị một cách chính quy hơn. Một hoán vị là

một dãy có thứ tự chứa mỗi phần tử của một tập hợp một và đúng một lần; như vậy”1, 2,

2, 3, 4, 5, 6”và”1, 2, 4, 5, 6”đều không phải là hoán vị của tập”1, 2, 3, 4, 5, 6”. Do đó, điểm

khác nhau cơ bản giữa một hoán vị và một tập hợp là: những phần tử của một hoán vị được

sắp xếp theo một thứ tự xác định.

Ví dụ 9.21 Ba vận động viên An, Bình và Châu chạy thi. Nếu không kể trường hợp có

hai hay ba vận động viên cùng về đích một lúc thì mọi khả năng đều có khả năng xảy ra.

Kết quả cuộc thi là một danh sách gồm 3 người xếp theo thứ tự nhất, nhì, ba. Danh

sách này là một hoán vị của tập hợp {An, Bình, Châu}. Nếu kí hiệu tập hợp {An, Bình,

Châu} là {a,b,c}thì tập hợp này có tất cả 6 hoán vị là

(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a).

Một cách tổng quát ta có:

Cho tập hợp A có n phần tử (n >0). Khi sắp xếp n phần tử này theo một thứ tự, ta được

1 hoán vị các phần tử của tập A.

Khi xây dựng một tổ hợp, có n khả năng chọn cho phần tử đầu tiên. Sau đó, n-1 còn lại,

vì vậy phần tử thứ hai sẽ có n-1 khả năng. Như vậy để chọn 2 phần tử đầu tiên, sẽ có n × (n

− 1) hoán vị có thể có

Với phần tử thứ ba, còn n − 2 phần tử còn lại, nên sẽ có n × (n − 1) × (n − 2) hoán vị có

thể có.

Tiếp tục như vậy cho tới khi còn 2 phần tử, đến lúc này sẽ có 2 lựa chọn cho phần tử

n-1, nên ta có số hoán vị cho n-1 phần tử n × (n − 1) × (n − 2) × ... × 2.

Đến lúc này chỉ còn duy nhất một phần tử, nên không có sự lựa chọn nào khác. Như

Page 87: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 86

vậy, số hoán vị cho n phần tử là n × (n − 1) × (n − 2) × ... × 2 × 1

Vậy ta có định lý: Số các hoán vị của một tập hợp có n phần tử là

Pn = n! = n(n-1) … 1

Trong phần này, chúng ta sẽ xây dựng hoán vị tổng quát: một hoán vị là một bộ có

thứ tự không lặp, có thể thiếu một số phần tử. Có thể dễ dàng đếm được số hoán vị có kích

thước r khi chọn từ một tập hợp có kích thước n (với r≤n).

Ví dụ, nếu chúng ta có 10 phần tử, các số nguyên {1, 2, ..., 10}, một hoán vị của ba

phần tử từ tập hợp này là {5, 3, 4}. Trong trường hợp này, n=10 và r=3. Vậy có bao nhiêu

cách để thành lập một hoán vị như vậy

1. Để chọn phần tử đầu tiên của một hoán vị, chúng ta có n cách, bởi vì có n phần

tử phân biệt của tập hợp.

2. Tiếp theo, vì chúng ta đã dùng một trong n phần tử, phần tử thứ hai của hoán vi sẽ

có (n − 1) cách để chọn từ tập hợp còn lại.

3. Phần tử thứ ba có thể được chọn bằng (n − 2) cách.

4. Công việc này lặp lại cho đến khi có đủ r phần tử của hoán vị. Nghĩa là phần tử cuối

cùng của hoán vị sẽ có (n - (r - 1)) = (n − r + 1) cách chọn.

Tóm lại, chúng ta có:n(n − 1)(n − 2) ... (n − r + 1) hoán vị khác nhau chứa r phần tử

chọn từ n đối tượng

Trong ví dụ trên, chúng ta có n = 10 và r = 3, vậy số hoán vị là: P(10,3) = 720.

P(n, r) = n × (n − 1) × (n − 2) × ... × (n − r + 1).

Vì vậy:

n! = n × (n − 1) × (n − 2) × ... × 2 × 1

= n × (n − 1) × (n − 2) × ... × (n − r + 1) × (n − r) × ... × 2 × 1

= P(n, r) × (n − r) × ... × 2 × 1

= P(n, r) × (n − r)!.

Nhưng nếu n! = P(n, r) × (n − r)!, thì P(n, r) = n! / (n − r)

9.5.4. Hoán vị lặp

Trong các phần trên ta đã biết một hoán vị của n phần tử là một chỉnh hợp n chọn n

của các phần tử đó và số hoán vị là n!. Tuy nhiên trong nhiều bài toán ta có thể gặp tình

huống xét sự sắp xếp của một danh sách các phần tử mà trong đó có thể có các phần tử bằng

nhau, chẳng hạn như trong ví dụ sau đây:

Ví dụ 9.22 Hãy tính xem có bao nhiêu cách sắp xếp khác nhau của 6 mẫu tự trong

từ PEPPER.

Giải: Trước hết ta nhận xét rằng từ mỗi cách sắp xếp 6 mẫu tự đã cho, nếu ta phân

biệt 3 mẫu tự P (tức là ta đánh chỉ số cho các mẫu tự P và xem chúng khác nhau) thì ta sẽ có

Page 88: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 87

3! = 6 cách sắp xếp khác nhau, 6 cách đó là P1 E P2 P3 E R, P1 E P3 P2 E R, P2 E P1 P3 E

R, P2 E P3 P1 E R, P3 E P1 P2 E R, P3 E P2 P1 E R.

Cả 6 cách sắp xếp này trùng với cách sắp xếp P E P P E R nếu ta bỏ đi việc đánh chỉ

số cho các mẫu tự P. Tiếp theo mỗi cách sắp xếp dãy 6 mẫu tự trong đó các mẫu tự P đã

được đánh chỉ số ta sẽ có 2 cách sắp xếp khác nhau nếu các mẫu tự E được phân biệt bằng

cách đánh chỉ số cho chúng. Chẳng hạn, Nếu phân biệt 2 mẫu tự E thì sự sắp xếp P1 E P2 P3

E R có 2 cách sắp xếp tương ứng là P1 E1 P2 P3 E2 R và P1 E2 P2 P3 E1 R. Từ đó chúng ta

có: (2!).(3!).(Số cách sắp xếp của các mẫu tự trong từ PEPPER) = (Số hoán vị của 6

phần tử P1, E1, P2, P3, E2, R) = 6

Suy ra số cách sắp xếp của các mẫu tự trong từ PEPPER là 6! / (3! 2!) = 60

Trong bài toán đếm, một số phần tử có thể giống nhau. Khi đó cần phải cẩn thận, tránh

đếm chúng hơn một lần. Ta xét ví dụ sau.

9.6. Bài tập

Có thể nhận được bao nhiêu xâu khác nhau bằng cách sắp xếp lại các chữ cái của từ

SUCCESS?

Page 89: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 88

Bài 10 Quan hệ truy hồi (Recurrence Relations)

Trước khi đi vào các kỹ thuật đếm cao cấp ta xét bài toán sau: Số lượng các vi khuẩn

trong một lục địa tăng lên gấp đôi sau mỗi giờ. Giả thiết ban đầu có 5 vi khuẩn trên 1 lục địa.

Hỏi số lượng vi khuẩn sau n giờ? Để giải quyết bài toán này ta gọi an là số vi khuẩn sau n giờ.

Theo giả thiết số vi khuẩn tăng lên gấp đôi sau mỗi giờ nên ta có an=2an-1, n nguyên dương.

Cũng theo giả thiết, ban đầu có 5 vi khuẩn nên a0 = 5. Từ đây ta có thể tìm được một công

thức cho an.

Một số vấn đề được đếm (counting problem) mà không thể được giải quyết bằng cách

sử dụng các kỹ thuật được thảo luận trong bài trước, nhưng chúng lại có thể được giải quyết

bằng cách tinding các mối quan hệ. được gọi là các quan hệ truy hồi (Recurrence Relations).

Giữa các thuật ngữ của một chuỗi, như là đã được làm trong vấn đề bao gồm bacteria.

Chúng ta sẽ tìm hiểu sự đa dạng của các Counting problem mà có thể được mô hình hóa

(làm mẫu) sử dụng các quan hệ truy hồi.

Chúng tôi sẽ phát triển các phương thức trong phần này và trong phần dưới để tìm

công thức rõ ràng cho các thuật ngữ của các chuỗi mà chắc chắn đáp ứng được các loại

quan hệ truy hồi.

10.1. Định nghĩa

Hệ thức truy hồi (hay công thức truy hồi) đối với dãy số {an} là công thức biểu diễn an

qua một hay nhiều số hạng đi trước của dãy.

Dãy số được gọi là lời giải hay nghiệm của hệ thức truy hồi nếu các số hạng của nó

thỏa mãn hệ thức truy hồi này.

10.2. Một số ví dụ

Ví dụ 10.1

Cho {an} là một chuỗi được định nghĩa an= an-1- an-2 với n=2,3,.. và a0=3, a1=5.

Tính a2=? Và a3=?

Giải Ta có a2= a1- a0=2 và a3= a2- a1=2-5=-3

Ví dụ 10.2

Giả sử một người gửi 10000 $ vào tài khoản của mình tại một ngân hang với lãi

suất 11% mỗi năm. Sau 30 năm anh ta có bao nhiêu tiền trong tài khoản của mình?

Giải Gọi Pn là tổng số tiền có trong tài khoản sau n năm. Do số tiền có trong tài khoản

sau n năm bằng số tiền có trong tài khoản sau n-1 năm cộng với lãi suất của năm thứ n, nên Pn

thỏa mãn hệ thức truy hồi sau

Pn= Pn-1+0.11 Pn-1 = 1.11 Pn-1 Với điều kiện đầu P0=10000$.

Từ đó suy ra Pn=1.11n10000

Thay n=30 ta có P30=228922.97$

Page 90: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 89

Ví dụ 10.3

Tìm hệ thức truy hồi và cho điều kiện đầu để tính số các xâu nhị phân độ dài n và

không có hai số 0 liên tiếp. Có bao nhiêu xâu nhị phân như thế có độ dài 5?

Gọi an là số các xâu nhị phân độ dài n và không có 2 số 0 liên tiếp.

Với n=1, có 2 xâu 0 và 1 độ dài 1 không có 2 số 0 liên tiếp hay a1=2.

Với n=2, có 3 xâu 11, 01, 10 độ dài 2 không có 2 số 0 liên tiếp hay a2=3.

Để nhận được hệ thức truy hồi cho an ta thấy theo quy tắc cộng, số các xâu nhị phân

độ dài n và không có 2 số 0 liên tiếp bằng số các xâu nhị phân như thế kết thúc bằng số 1

cộng với số các xâu như thế kết thúc bằng số 0 (n>=3).

Xâu nhị phân độ dài n và không có 2 số 0 liên tiếp kết thúc bằng số 1 chính là xâu

nhị phân độ dài n-1 không có 2 số 0 liên tiếp và them số 1 vào cuối. Có an-1 xâu như vậy.

Xâu nhị phân độ dài n và không có 2 số 0 liên tiếp kết thúc bằng số 0 cần có bít thứ

n-1 là bit 1 (tránh trường hợp 2 bít cuối là 00). Có an-2 xâu như vậy.

Như vậy ta có: an= an-1+ an-2, với n>=3 a1=2, a2=3

Khi đó a5= a4+ a3= (a3+ a2) +a3= 2a3+ a2= 2(a2+a1) + a2= 13.

Ví dụ 10.4 Bài toán tháp Hà Nội

Bài toán thông thường nhất “ người chơi có 3 cái cọc và một số đĩa có kích thước khác nhau

có thể cho vào cái cọc này. Ban đầu các đĩa được sắp theo trật tự là đĩa có kích thước lớn hơn

ở dưới (dạng hình nón). Người chơi phải di chuyển toàn bộ số đĩa sang một cọc khác tuân

theo quy tắc

Mỗi lần chỉ di chuyển 1 đĩa

Mỗi đĩa chỉ có thể đặt lên 1 đĩa lớn hơn (không nhất thiết 2 đĩa này phải có kích

thước liền kề tức là đĩa nhỏ nhất có thể nằm trên đĩa lớn nhất).”

Tìm số lần di chuyển đĩa?

Giả sử có n đĩa, gọi Hn là lần di chuyển cho bài toán n đĩa ta có cách chơi như sau:

Di chuyển n-1 đĩa trên tới cột số 2 (Hn-1 lần di chuyển)

Di chuyển đĩa cuối cùng của cột sáng cột số 3 (1 lần di chuyển)

Di chuyển n-1 đĩa từ cột số 2 sang cột số 3 (Hn-1 lần di chuyển)

Như vậy ta có biểu thức truy hồi tính số lần di chuyển Hn= 2Hn-1+1

Mặt khác ta có

Hn= 2Hn-1+1=2(2Hn-2+1)+1=22Hn-2+21+1

=22(2Hn-3+1)+21+1=23Hn-3+22+21+1

=…

=2n-1H1+…+22+21+1

Mà H1=1 nên Hn=2n-1+…+22+21+1=2n-1

Page 91: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 90

10.3. Kỹ thuật giải phương trình truy hồi

Định nghĩa 2: Một hệ thức truy hồi tuyến tính thuần nhất bậc k với hệ số hằng số là hệ

thức truy hồi có dạng:

Theo nguyên lý của quy nạp toán học thì dãy số thỏa mãn hệ thức truy hồi nêu trong

định nghĩa được xác định duy nhất bằng hệ thức truy hồi này và k điều kiện đầu:

a0 = c0, a1 = c1, .. , ak-1 = ck-1

Phương pháp cơ bản để giải hệ thức truy hồi tuyến tính thuần nhất là tìm nghiệm dưới

dạng an = rn , trong đó r là hằng số. Chú ý rằng an = rn là nghiệm của hệ thức truy hồi trên nếu

và chỉ nếu

Phương trình này được gọi là phương trình đặc trưng của hệ thức truy hồi, nghiệm của

nó gọi là nghiệm đặc trưng của hệ thức truy hồi.

Ví dụ 10.5 Tìm công thức hiển của các số Fibonacci

Dãy các số Fibonacci thỏa mãn hệ thức fn= fn-1 + fn-2, với điều kiện đầu f0=0, f1=1

Ta có phương trình đặc trưng là: r2-r-1=0

Phương trình đặc trưng có 2 nghiệm phân biệt 1

1 5

2r

; 2

1 5

2r

Do đó nghiệm tổng quát của phương trình truy hồi (*) là: fn=k1(r1)n+ k2(r2)

n, k1, k2 là hằng số

Mặt khác ta có f0=k1+ k2=0; f1=1 5

2

k1 +

1 5

2

k2=1 => k1=

1

5; k2=-

1

5

=> Vậy ta có công thức hiển của số Fibonacci là : fn=1

5(1 5

2

)n-

1

5(1 5

2

)n

10.4. Bài tập

Bài 1 Cho biểu thức truy hồi an= an-1 + 2an-2 vơi điều kiện ban đầu a0=2, a1=7. Tìm công thức

tổng quát của biểu thức truy hồi trên.

Bài 2 Tìm công thức tổng quát cho số cây bèo cái trong ao sau 1 tuần biết lúc đầu thả vào 1

cây bèo, sau mỗi giờ số bèo tăng gấp đôi, béo không bị chết đi cũng không bị lấy đi.

Page 92: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 91

Bài 11. Thảo luận về kỹ thuật đếm

11.1. Nhắc lại lý thuyết

11.2. Bài tập kỹ thuật đếm cơ bản

Bài 1 Phương án đánh số điện thoại.

Giả sử một số điện thoại gồm 10 ký số được chia thành 3 nhóm: 2 nhóm gồm 3 ký

số và một nhóm 4 ký số. Do một số lý do nào đó, có một số hạn chế trên các ký số của số

điện thoại. Để xác định dạng hợp lệ của một số điện thoại. ta dùng ký hiệu X để chỉ một ký

số có thể lấy giá trị từ 0 đến 9, N để chỉ một ký số từ 2 đến 9, v à Y chỉ một ký số là 0

hoặc 1. Chúng ta có 2 phương án để đánh số điện thoại : một phương án cũ và một

phương án mới. Theo phương án cũ, số điện thoại có dạng NYX NNX XXXX; và theo

phương án mới thì số điện thoại có dạng NXX NXX XXXX. Hỏi số lượng số điện thoại

khác nhau của mỗi phương án là bao nhiêu?

Bài 2 Nếu ta dùng 4 ký tự để ghi nhãn cho 1 giảng đường (trong đó kí tự đầu là 1 chữ cái in

hoa và 2 kí tự tiếp sau là kí tự số, ký tự cuối cùng là chữ cái thường) thì trong giảng đường có

nhiều nhất bao nhiêu chiếc ghế có thể ghi nhãn khác nhau? Giải thích?

Bài 3 Có bao nhiêu xâu tam phân độ dài 8 có chứa xâu 000 và chứa xâu 1111? Giải thích?

Bài 4 Mỗi người sử dụng trên một hệ thống máy tính có một “password” dài từ 6 đến 8 ký

tự, trong đó mỗi ký tự là một chữ in hoa hoặc là một ký số thập phân.

Mỗi “password” phải có ít nhất một ký số. Hỏi có bao nhiêu password khác nhau?

Bài 5 Có bao nhiêu xâu nhị phân độ dài 10 có năm số 0 liền nhau hoặc năm số 1 liến nhau.

Bài 6 Cần có ít nhất bao nhiêu sinh viên để có thể chắc chắn có 156 sinh viên có cùng điểm

nếu thang điểm được đánh giá là 0,1,2,3,4,5,6,7,8,9,10.

Bài 7 Trong một cuộc điều tra 1000 sinh viên người ta thu được kết quả như sau:

300 sinh viên không thích môn toán rời rạc

400 sinh viên không thích cấu trúc dữ liệu - giải thuật

500 sinh viên không thích toán cao cấp

Mỗi sv không thích ít nhất một môn

Không có sinh viên nào không thích quá 2 môn

120 sinh viên không thích cấu trúc dữ liệu - giải thuật và toán cao cấp

59 sinh viên không thích toán rời rạc và toán cao cấp

Không có sinh viên không thích cả 2 môn toán rời rạc và cấu trúc dữ liệu - giải

thuật.

Hỏi có phải tất cả dữ liệu thu thập được từ cuộc điều tra đều chính xác hay không?

Bài 8 Tìm số các số nguyên dương không vượt quá 1000, mà không chia hết cho bất kỳ số

nào trong 3 số: 2, 3, và 5.

Page 93: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 92

11.3. Bài tập kỹ thuật đếm nâng cao

Bài 9 Một nhân viên bắt đầu làm việc tại công ty từ năm 1987 với mức lương khởi điểm là

50000 đô la. Hàng năm anh ta được nhận thêm 1000 đô la và 5% lương của năm trước.

a)Hãy thiết lập hệ thức truy hồi tính lương của nhân viên đó n năm sau năm 1987.

b)Lương vào năm 1995 của anh ta là bao nhiêu?

c)Hãy tìm công thức tường minh tính lương của nhân viên này n năm sau năm 1987.

Bài 10 a.Tìm hệ thức truy hồi cho số các thông báo khác nhau có thể được truyền đi trong n

micro giây khi chỉ sử dụng hai loại tín hiệu, trong đó tín hiệu 1 truyền mất 1 micro giây, tín

hiệu 2 truyền mất 2 micro giây.

b.Tìm công thức tổng quát tương ứng hệ thức truy hồi tìm được trong câu a.

Bài 11 a.Tìm hệ thức truy hồi tính số cách đi lên n bậc thang nếu một người có thể bước 1

bước hoặc 2 bước một lần.

b.Tìm công thức tổng quát tương ứng hệ thức truy hồi tìm được trong câu a.

Bài 12 Giả sử một máy tính mắc phải một loại virus A, virus A làm tăng gấp 3 dung lượng

đang sử dụng sau mỗi ngày. Nếu ổ cứng của máy tính này có dung lượng 1TB và lúc con

virus A bắt đầu nhiễm vào máy tính thì máy tính đang chứa dữ liệu với tổng dung lượng 32

GB.

a.Tính dung lượng trống của máy tính sau 3 ngày

b.Hỏi sau bao lâu thì bộ nhớ bì đầy?

Bài 13 Giả sử số vi trùng trong một quần thể sẽ tăng gấp 3 lần sau mỗi giờ.

a.Hãy tìm hệ thức truy hồi tính số lượng vi trùng trong quân thể sau n giờ.

b.Có bao nhiêu vi trùng sau 10 giờ.

Bài 14 Giải các hệ thức truy hồi với các điều đầu sau:

a) an = an-1 + 6an-2 với n ≥ 2, a0 = 3, a1 = 6.

b) an = 7an-1 - 6an-2 với n ≥ 2, a0 = 2, a1 = 1.

c) an = 6an-1 - 8an-2 với n ≥ 2, a0 = 4, a1 = 10.

d) an+2 = -4an+1 + 5an với n ≥ 2, a0 = 3, a1 = -3.

Page 94: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 93

Bài 12 Các khái niệm cơ bản của Lý thuyết đồ thị

12.1 Định nghĩa cơ bản về đồ thị

Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh này. Chúng

ta phân biệt các loại đồ thị khác nhau bởi kiểu và số lượng cạnh nối hai đỉnh nào đó của đồ

thị. Để có thể hình dung được tại sao lại cần đến các loại đồ thị khác nhau, chúng ta sẽ nêu ví

dụ sử dụng chúng để mô tả một mạng máy tính. Giả sử ta có một mạng gồm các máy tính và

các kênh điện thoại (gọi tắt là kênh thoại) nối các máy tính này. Chúng ta có thể biểu diễn các

vị trí đặt náy tính bởi các điểm và các kênh thoại nối chúng bởi các đoạn nối, xem hình 12.1.

Hình 12.1 Sơ đồ mạng máy tính

Nhận thấy rằng trong mạng ở hình 12.1, giữa hai máy bất kỳ chỉ có nhiều nhất là một kênh

thoại nối chúng, kênh thoại naỳ cho phép liên lạc cả hai chiều và không có máy tính nào lại

được nối với chính nó. Sơ đồ mạng máy cho trong hình 1 được gọi là đơn đồ thị vô hướng. Ta

đi đến định nghĩa sau

Định nghĩa 12.1

Đơn đồ thị vô hướng G = (V,E) bao gồm V là tập các đỉnh, và E là tập các cặp không có thứ

tự gồm hai phần tử khác nhau của V gọi là các cạnh.

Trong trường hợp giữa hai máy tính nào đó thường xuyên phải truyền tải nhiều thông

tin người ta phải nối hai máy nàu bởi nhiều kênh thoại. Mạng với đa kênh thoại giữa các máy

được cho trong hình 12.2.

Hình 12.2 Sơ đồ mạng máy tính với đa kênh thoại

Định nghĩa 12.2

Page 95: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 94

Đa đồ thị vô hướng G= (V, E) bao gồm V là tập các đỉnh, và E là tập các cặp không có thứ tự

gồm hai phần tử khác nhau của V gọi là các cạnh. Hai cạnh e1 và e2 được gọi là cạnh lặp nếu

chúng cùng tương ứng với một cặp đỉnh.

Hình 12.3 Sơ đồ mạng máy tính với kênh thoại thông báo

Rõ ràng mỗi đơn đồ thị đều là đa đồ thị, nhưng không phải đa đồ thị nào cũng là đơn

đồ thị, vì trong đa đồ thị có thể có hai (hoặc nhiều hơn) cạnh nối một cặp đỉnh nào đó.

Trong mạng máy tính có thể có những kênh thoại nối một náy nào đó với chính nó

(chẳng hạn vời mục đính thông báo). Mạng như vậy được cho trong hình 12.3. Khi đó đa đồ

thị không thể mô tả được mạng như vậy, bởi vì có những khuyên (cạnh nối một đỉnh với chính

nó). Trong trường hợp nàychúng ta cần sử dụng đến khái niệm giả đồ thị vô hướng, được định

nghĩa như sau:

Định nghĩa 12.3

Giả đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các cặp không có thứ

tự gồm hai phần tử (không nhất thiết phải khác nhau) của V gọi là cạnh. Cạnh e được gọi là

khuyên nếu nó có dạng e = (u, u).

Hình 12.4 Mạng máy tính với kênh thoại một chiều

Các kênh thoại trong mạng máy tính có thể chỉ cho phép truyền tin theo một chiều.

Chẳng hạn, trong hình 12.4 máy chủ ở Hà Nội chỉ có thể nhận tin từ các máy ở địa phương,

có một số máy chỉ có thể gửi tin đi, còn các kênh thoại cho phép truyền tin theo cả hai chiều

được thay thế bởi hai cạnh có hướng ngược chiều nhau.

Ta đi đến định nghĩa sau:

Page 96: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 95

Định nghĩa 12.4

Đơn đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các cặp có thứ tự gồm

hai phần tử khác nhau của V gọi là các cung.

Nếu trong mạng có thể có đa kênh thoại một chiều, ta sẽ phải sử dụng đến khái niệm đa đồ thị

có hướng:

Định nghĩa 12.5

Đa đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các cặp có thứ tự gồm

hai phần tử khác nhau của V gọi là các cung. Hai cung e1, e2 tương ứng với cùng một cặp

đỉnh được gọi là cung lặp.

Trong các phần tiếp theo chủ yếu chúng ta sẽ làm việc với đơn đồ thị vô hướng và đơn

đồ thị có hướng. Vì vậy, để cho ngắn gọn, ta sẽ bỏ qua tính từ đơn khi nhắc đến chúng.

12.2. Đường đi - chu trình - Đồ thị liên thông

Định nghĩa 12.6

Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dương, trên đồ thị vô hướng

G = (V, E) là dãy x0, x1,…, xn-1, xn

trong đó u = x0, v = xn, (xi, xi+1) E, i = 0, 1, 2,…, n-1.

Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cạnh:

(x0, x1), (x1, x2), …, (xn-1, xn)

Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh đầu trùng

với đỉnh cuối (tức là u = v) được gọi là chu trình. Đường đi hay chu trình được gọi là đơn

nếu như không có cạnh nào bị lặp lại.

Ví dụ 12.1 Trên đồ thị vô hướng cho trong hình 12.5: a, d, c, f, e là đường đi đơn độ dài 4.

Còn d, e, c, a không là đường đi, do (c,e) không phải là cạnh của đồ thị. Dãy b, c, f, e, b là chu

trình độ dài 4. Đường đi a, b, e, d, a, b có độ dài là 5 không phải là đường đi đơn, do cạnh (a,

b) có mặt trong nó 2 lần.

Hình 12.5 Đường đi trên đồ thị

Khái niệm đường đi và chu trình trên đồ thị có hướng được định nghĩa hoàn toàn

tương tự như trong trường hợp đồ thị vô hướng, chỉ khác là ta có chú ý đến hướng trên các

cung.

Định nghĩa 12.7

Page 97: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 96

Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó, n là số nguyên dương, trên đồ thị có hướng

G = (V, A) là dãy x0, x1,…, xn-1, xn

trong đó u = x0, v = xn, (xi, xi+1) E, i = 0, 1, 2,…, n-1.

Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung:

(x0, x1), (x1, x2), …, (xn-1, xn)

Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh đầu trùng

với đỉnh cuối (tức là u = v) được gọi là chu trình. Đường đi hay chu trình được gọi là đơn

nếu như không có cạnh nào bị lặp lại.

Ví dụ 12.2 Trên đồ thị có hướng cho trong hình 12.5: a, d, c, f, e là đường đi đơn độ dài 4.

Còn d, e, c, a không là đường đi, do (c,e) không phải là cạnh của đồ thị. Dãy b, c, f, e, b là chu

trình độ dài 4. Đường đi a, b, e, d, a, b có độ dài là 5 không phải là đường đi đơn, do cạnh (a,

b) có mặt trong nó 2 lần.

Xét một mạng máy tính. Một câu hỏi đặt ra là hai máy tính bất kỳ trong mạng này có

thể trao đổi thông tin được với nhau hoặc là trực tiếp qua kênh nối chúng hoặc thông qua một

hoặc vài máy tính trung gian trong mạng? Nếu sử dụng đồ thị để biểu diễn mạng máy tính này

(trong đó các đỉnh của đồ thị tương ứng với các máy tính, còn các cạnh tương ứng với các

kênh nối) câu hỏi đó được phát biểu trong ngôn ngữ đồ thị như sau: Tồn tại hay không đường

đi giữa mọi cặp đỉnh của đồ thị.

Định nghĩa 12.8

Đồ thị vô hướng G = (V, E) được gọi là liên thông nếu luôn tìm được đường đi giữa hai đỉnh

bất kỳ của nó.

Như vậy hai máy tính bất kỳ trong mạng có thể trao đổi thông tin được với nhau khi

và chỉ khi đồ thị tương ứng với mạng này là đồ thị liên thông.

Ví dụ 12.3 Trong hình 12.6: Đồ thị G là liên thông, còn đồ thị H là không liên thông.

Hình 12.6 Đồ thị G và H

Định nghĩa 12.9

Ta gọi đồ thị con của đồ thị G = (V, E) là đồ thị H = (W, F), trong đó W V và F E.

Trong trường hợp đồ thị là không liên thông, nó sẽ rã ra thành một số đồ thị con liên

thông đôi một không có đỉnh chung. Những đồ thị con liên thông như vậy ta sẽ gọi là các

thành phần liên thông của đồ thị.

Page 98: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 97

Ví dụ 12.4. Đồ thị H trong hình 2 gồm 3 thành phần liên thông H1, H2, H3.

Trong mạng máy tính có thể có những máy (Những kênh nối) mà sự hỏng hóc của nó

sẽ ảnh hưởng đến việc trao đổi thông tin trong mạng. Các khái niệm tương ứng với tình huống

này được đưa ra trong định nghĩa sau.

Định nghĩa 12.10

Đỉnh v được gọi là đỉnh rẽ nhánh nếu việc loại bỏ v cùng với các cạnh liên thuộc với nó khỏi

đồ thị làm tăng số thành phần liên thông của đồ thị. Cạnh e được gọi là cầu nếu việc loại bỏ

nó khỏi đồ thị làm tăng số thành phần liên thông của đồ thị.

Ví dụ 12.5 Trong đồ thị G ở hình2, đỉnh d và e là đỉnh rẽ nhánh, còn các cạnh (d, g) và (e, f)

là cầu.

Đối với đồ thị có hướng có hai khái niệm liên thông phụ thuộc vào việc ta có xét đến

hướng trên các cung hay không.

Định nghĩa 12.11

Đồ thị có hướng G = (V, A) được gọi là liên thông mạnh nếu luôn tìm được đường đi giữa hai

đỉnh bất kỳ của nó.

Định nghĩa 12.12

Đồ thị có hướng G = (V, A) được gọi là liên thông yếu nếu đồ thị vô hướng tương ứng với nó

là vô hướng liên thông.

Rõ ràng nếu đồ thị là liên thông mạnh thì nó cũng là liên thông yếu, nhưng điều ngược

lại là không luôn đúng, như chỉ ra trong ví dụn dưới đây.

Ví dụ 12.6 Trong hình 12.7 đồ thị G là liên thông mạnh, còn H là liên thông yếu nhưng không

là liên thông mạnh.

Hình 12.7 Đồ thị liên thông mạnh G và đồ thị liên thông yếu H

Một câu hỏi đặt ra là khi nào có thể định hướng các cạnh của một đồ thị vô hướng liên

thông để có thể thu được đồ thị có hướng liên thông mạnh? Ta sẽ gọi đồ thị như vậy là đồ thị

định hướng được. Định lý dưới đây cho ta tiêu chuẩn nhận biết một đồ thị có là định hướng

được hay không.

Định lý 12.1

Đồ thị vô hướng liên thông là định hướng được khi và chỉ khi mỗi cạnh của nó nằm trên ít

nhất một chu trình.

Page 99: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 98

Chứng minh.

Điều kiện cần. Giả sử (u,v) là một cạnh của một đồ thị. Từ sự tồn tại đường đi có hướng từ u

đến v và ngược lại suy ra (u, v) phải nằm trên ít nhất một chu trình.

Điều kiện đủ. Thủ tục sau đây cho phép định hướng các cạnh của đồ thị để thu được đồ thị có

hướng liên thông mạnh. Giả sử C là một chu trình nào đó trong đồ thị. Định hướng các cạnh

trên chu trình này theo một hướng đi vòng theo nó. Nếu tất cả các cạnh của đồ thị là đã được

định hướng thì kết thúc thủ tục. Ngược lại, chọn e là một cạnh chưa định hướng có chung

đỉnh với ít nhất một trong số các cạnh đã định hướng. Theo giả thiết tìm được chu trình C’

chứa cạnh e. Định hướng các cạnh chưa được định hướng của C’ theo một hướng dọc theo

chu trình này (không định hướng lại các cạnh đã có định hướng). Thủ tục trên sẽ được lặp lại

cho đến khi tất cả các cạnh của đồ thị được định hướng. Khi đó ta thu được đồ thị có hướng

liên thông mạnh.

12.3. Phân loại đồ thị

12.3.1. Đồ thị vô hướng liên thông

Trong mục này chúng ta sẽ trình bày một số thuật ngữ cơ bản của lý thuyết đồ thị.

Trước tiên, ta xét các thuật ngữ mô tả các đỉnh và cạnh của đồ thị vô hướng.

Định nghĩa 12.13

Hai đỉnh u và v của đồ thị vô hướng G được gọi là kề nhau nếu (u,v) là cạnh của đồ thị G.

Nếu e = (u, v) là cạnh của đồ thị ta nói cạnh này là liên thuộc với hai đỉnh u và v, hoặc cũng

nói là nối đỉnh u và đỉnh v, đồng thời các đỉnh u và v sẽ được gọi là các đỉnh đầu của cạnh (u,

v).

Để có thể biết có vao nhiêu cạnh liên thuộc với một đỉnh, ta đưa vào định nghĩa sau

Định nghĩa 12.14

Ta gọi bậc của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc với nó và sẽ ký hiệu là

deg(v).

Hình 12.8 Đồ thị vô hướng

Ví dụ 12.7 Xét đồ thị cho trong hình 12.9, ta có

deg(a) = 1, deg(b) = 4, deg(c) = 4, deg(f) = 3,

deg(d) = 1, deg(e) = 3, deg(g) = 0

Page 100: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 99

Đỉnh bậc 0 gọi là đỉnh cô lập. Đỉnh bậc 1 được gọi là đỉnh treo. Trong ví dụ trên đỉnh

g là đỉnh cô lập, a và d là các đỉnh treo. Bậc của đỉnh có tính chất sau:

Định lý 12.2 Giả sử G = (V, E) là đồ thị vô hướng với m cạnh. Khi đó tổng bậc của tất cả các

đỉnh bằng hai lần số cạnh.

Chứng minh. Rõ ràng mỗi cạnh e = (u, v) được tính một lần trong deg(u) và một lần trong

deg(v). Từ đó suy ra tổng tất cả các bậc của các đỉnh bằng hai lần số cạnh.

Ví dụ 12.8 Đồ thị với n đỉnh có bậc là 6 có bao nhiêu cạnh?

Giải: Theo định lý 16.2 ta có 2m = 6n. Từ đó suy ra tổng các cạnh của đồ thị là 3n.

Hệ quả 12.3 Trong đồ thị vô hướng, số đỉnh bậc lẻ (nghĩa là có bậc là số lẻ) là một số chẵn.

Chứng minh. Thực vậy, gọi O và U tương ứng là tập đỉnh bậc lẻ và tập đỉnh bậc chẵn của đồ

thị. Ta có

OvUv

vvm )deg()deg(2

Do deg(v) là chẵn với v là đỉnh trong U nên tổng thứ nhất ở trên là số chẵn. Từ đó suy

ra tổng thứ hai (chính là tổng bậc của các đỉnh bậc lẻ) cũng phải là số chẵn, do tất cả các số

hạng của nó là số lẻ, nên tổng này phải gồm một số chẵn các số hạng. Vì vậy, số đỉnh bậc lẻ

phải là số chẵn.

Ta xét các thuật ngữ tương tự cho đồ thị vô hướng.

12.3.2. Đồ thị có hướng liên thông

Định nghĩa 12.15

Nếu e = (u, v) là cung của đồ thị có hướng G thì ta nói hai đỉnh u và v là kề nhau, và nói cung

(u, v) nối đỉnh u với đỉnh v hoặc cũng nói cung này là đi ra khỏi đỉnh u và vào đỉnh v. Đỉnh

u(v) sẽ được gị là đỉnh đầu (cuối) của cung (u,v).

Tương tự như khái niệm bậc, đối với đồ thị có hướng ta có khái niệm bán bậc ra và

bán bậc vào của một đỉnh.

Định nghĩa 12.16

Ta gọi bán bậc ra (bán bậc vào) của đỉnh v trong đồ thị có hướng là số cung của đồ thị đi ra

khỏi nó (đi vào nó) và ký hiệu là deg+(v) (deg-(v))

Hình 12.9 Đồ thị có hướng

Page 101: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 100

Ví dụ 12.9 Xét đồ thị cho trong hình 12.10. Ta có

deg-(a)=1, deg-(b)=2, deg-(c)=2, deg-(d)=2, deg-(e) = 2.

deg+(a)=3, deg+(b)=1, deg+(c)=1, deg+(d)=2, deg+(e)=2.

Do mỗi cung (u, v) sẽ được tính một lần trong bán bậc vào của đỉnh v và một lần trong

bán bậc ra của đỉnh u nên ta có:

Định lý 12.3. Giả sử G = (V, E) là đồ thị có hướng. Khi đó

2m = deg ( ) deg ( )v v

Rất nhiều tính chất của đồ thị có hướng không phụ thuộc vào hướng trên các cung của

nó. Vì vậy, trong nhiều trường hợp sẽ thuận tiện hơn nếu ta bỏ qua hướng trên các cung của

đồ thị. Đồ thị vô hướng thu được bằng cách bỏ qua hướng trên các cung được gọi là đồ thị vô

hướng tương ứng với đồ thị có hướng đã cho.

12.4. Một số loại đồ thị đặc biệt

Trong mục này ta xét một số đơn đồ thị vô hướng dạng đặc biệt xuất hiện trong nhiều

vấn đề ứng dụng thực tế.

Đồ thị đầy đủ

Đồ thị đầy đủ n đỉnh, ký hiệu bởi Kn, là đơn đồ thị vô hướng mà giữa hai đỉnh bất kỳ

của nó luôn có cạnh nối.

Các đồ thị K3, K4, K5 cho trong hình dưới đây.

Hình 12.10 Đồ thị đầy đủ

Đồ thị đầy đủ Kn có tất cả n(n-1)/2 cạnh, nó là đơn đồ thị có nhiều cạnh nhất.

Đồ thị vòng

Đồ thị vòng Cn, n≥3. gồm n đỉnh v1, v2,. . . .vn và các cạnh (v1,v2), (v2,v3) . . . (vn-1,vn), (vn,v1).

Đồ thị vòng C3, C4, C5, C6 cho trong hình 12.11

Page 102: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 101

Hình 12.11 Đồ thị vòng

Đồ thị bánh xe

Đồ thị Wn thu được từ Cn bằng cách bổ sung vào một đỉnh mới nối với tất cả các đỉnh

của Cn (xem hình 12.12).

Hình 12.12 Đồ thị bánh xe

Đồ thị lập phương

Đồ thị lập phương n đỉnh Qn là đồ thị với các đỉnh biểu diễn 2n xâu nhị phân độ dài n.

Hai đỉnh của nó gọi là kề nhau nếu như hai xâu nhị phân tương ứng chỉ khác nhau 1 bit hình

12.13 cho thấy Qn với n=1,2,3.

Hình 12.13 Đồ thị lập phương

Đồ thị hai phía

Đơn đồ thị G = (V, E) được gọi là hai phía nếu như tập đỉnh V của nó có thể phân

hoạch thành hai tập X và Y sao cho mỗi cạnh của đồ thị chỉ nối một đỉnh nào đó trong X với

một đỉnh nào đó trong Y. Khi đó ta sẽ sử dụng ký hiệu G = (XY, E) để chỉ đồ thị hai phía

với tập đỉnh XY.

Định lý sau đây cho phép nhận biết một đơn đồ thị có phải là hai phía hay không.

Định lý 12.4 Đơn đồ thị là đồ thị hai phía khi và chỉ khi nó không chứa chu trình độ dài lẻ.

Để kiểm tra xem một đồ thị liên thông có phải là hai phía hay không có thể áp dụng

thủ tục sau. Cho v là một đỉnh bất kỳ của đồ thị. Đặt X={v}, còn Y là tập các đỉnh kề của v.

Page 103: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 102

Khi đó các đỉnh kề của các đỉnh trong Y phải thuộc vào X. Ký hiệu tập các đỉnh như vậy là T.

Vì thế nếu phát hiện T Y ≠ thì đồ thị không phải là hai phía, kết thúc. ngược lại, đặt X =

X T. Tiếp tục xét như vậy đối với T’ là tập các đỉnh kề của T,. ..

Đồ thị hai phía G=(X Y, E) với |X|= m, |Y| = n được gọi là đồ thị hai phía đầy đủ và

ký hiệu là K2,3, K3,3, K3,4 được cho trong hình 12.14.

Hình 12.14 Đồ thị hai phía

Đồ thị phẳng

Đồ thị được gọi là đồ thị phẳng nếu ta có thể vẽ nó trên mặt phẳng sao cho các cạnh

của nó không cắt nhau ngoài ở đỉnh. Cách vẽ như vậy sẽ được gọi là biểu diễn phẳng của đồ

thị.

Ví dụ đồ thị K4 là phẳng, vì có thể vẽ nó trên mặt phẳng sao cho các cạnh của nó không cắt

nhau ngoài ở đỉnh (xem hình 12.15).

Hình 12.15 Đồ thị K4 là đồ thị phẳng

Một điều đáng lưu ý nếu đồ thị là phẳng thì luôn có thể vẽ nó trên mặt phẳng với các

cạnh nối là các đoạn thẳng không cắt nhau ngoài ở đỉnh (ví dụ xem cách vẽ K4 trong hình

12.15).

Để nhận biết xem một đồ thị có phải là đồ thị phẳng có thể sử dụng định lý

Kuratovski, mà để phát biểu nó ta cần một số khái niệm sau: Ta gọi một phép chia cạnh (u,v)

của đồ thị là việc loại bỏ cạnh này khỏi đồ thị và thêm vào đồ thị một đỉnh mới w cùng với hai

cạnh (u,w), (w, u) . Hai đồ thị G(V,E) và H=(W,F) được gọi là đồng cấu nếu chúng có thể thu

được từ cùng một đồ thị nào đó nhờ phép chia cạnh.

Định lý 12.5 (Kuratovski). Đồ thị là phẳng khi và chỉ khi nó không chứa đồ thị con đồng cấu

với K3,3 hoặc K5.

Trong trường hợp riêng, đồ thị K3,3 hoặc K5 không phải là đồ thị phẳng. Bài toán về

tính phẳng của đồ thị K3,3 là bài toán đố nổi tiếng về ba căn hộ và ba hệ thống cung cấp năng

Page 104: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 103

lượng cho chúng: Cần xây dựng hệ thống đường cung cấp năng lượng với mỗi một căn hộ nói

trên sao cho chúng không cắt nhau.

Đồ thị phẳng còn tìm được những ứng dụng quan trọng trong công nghệ chế tạo mạch

in.

Biểu diễn phẳng của đồ thị sẽ chia mặt phẳng ra thành các miền, trong đó có thể có cả

miền không bị chặng. Ví dụ, biểu diễn phẳng của đồ thị cho trong Hình 12.16 chia mặt phẳng

ra thành 6 miền R1, R2,. . . .R6.

Hình 12.16 Các miền tương ứng với biểu diễn phẳng của đồ thị

Euler đã chứng minh được rằng các cách biểu diễn phẳng khác nhau của một đồ thị

đều chia mặt phẳng ra thành cùng một số miền. Để chứng minh điều đó, Euler đã tìm được

mối liên hệ giữa số miền, số đỉnh của đồ thị và số cạnh của đồ thị phẳng sau đây.

Định lý 12.6 (Công thức Euler). Giả sử G là đồ thị phẳng liên thông với n đỉnh, m cạnh. Gọi

r là số miền của mặt phẳng bị chia bởi biểu diễn phẳng của G. Khi đó

r = m-n + 2

Có thể chứng minh định lý bằng qui nạp. Xét Ví dụ minh hoạ cho áp dụng công thức

Euler.

Ví dụ 12.10 Cho G là đồ thị phẳng liên thông với 20 đỉnh, mỗi đỉnh đều có bậc là 3. Hỏi mặt

phẳng bị chia làm bao nhiêu phần bởi biểu diễn phẳng của đồ thị G?

Giải. Do mỗi đỉnh của đồ thị đều có bậc là 3, nên tổng bậc của các đỉnh là 3x20=60. Từ đó

suy ra số cạnh của đồ thị m=60/20=30. Vì vậy, theo công thức Euler, số miền cần tìm là

r = 30-20+2=12.

Page 105: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 104

Bài 13 Biểu diễn đồ thị trên máy tính

Để lưu trữ đồ thị và thực hiện các thuật toán khác nhau với đồ thị trên máy tính cần

phải tìm những cấu trúc dữ liệu thích hợp để mô tả đồ thị. Việc chọn cấu trúc dữ liệu nào để

biểu diễn đồ thị có tác động rất lớn đến hiệu quả của thuật toán. Vì vậy, việc chọn lựa cấu trúc

dữ liệu để biểu diễn đồ thị phụ thuộc vào từng tình huống cụ thể (bài toán và thuật toán cụ

thể). Trong mục này chúng ta sẽ xét một số phương pháp cơ bản được sử dụng để biểu diễn

đồ thị trên máy tính, đồng thời cũng phân tích một cách ngắn gọn những ưu điểm cũng như

những nhược điểm của chúng.

13.1. Ma trận kề - Ma trận trọng số

Xét đơn đồ thị vô hướng G =(V,E), với tập đỉnh V={1, 2,. . . ,n}, tập cạnh E= {e1, e2, .

. . ,em } . Ta gọi ma trận kề của đồ thị G là ma trận.

A=( ai,j: i, j = 1, 2, . . . ,n)

Với các phần tử được xác định theo qui tắc sau đây:

ai,j = 1, nếu có cạnh từ i sang j hay (i, j) E, i, j =1, 2,. . ., n.

ai, j = 0, trong trường hợp còn lại tức là không có cạnh(i, j)

Ví dụ 13.1 Ma trận trận kề của đồ thị vô hướng G cho trong Hình 13.1 là:

1 2 3 4 5 6

1 0 1 1 0 0 0

2 1 0 1 0 1 0

3 1 1 0 1 0 0

4 0 0 1 0 1 1

5 0 1 0 1 0 1

6 0 0 0 1 1 0

Hình 13.1 Đồ thị vô hướng G và Đồ thị có hướng G1

Các tính chất của ma trận kề:

Page 106: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 105

1) Rõ ràng ma trận kề của đồ thị vô hướng là ma trận đối xứng, tức là a[i,j]=a[j,i], với i,j

=1,2,. . .,n. Ngược lại, mỗi (0,1)-ma trận đối xứng cấp n sẽ tương ứng, chính xác đến cách

đánh số đỉnh (còn nói là: chính xác đến đẳng cấu), với một đơn đồ thị vô hướng n đỉnh.

2) Tổng các phần từ trên dòng i (cột j) của ma trận kề chính bằng bậc của đỉnh i (đỉnh j).

3) Nếu ký hiệu aịjp, i,j=1, 2,. . . ,n là phần tử của ma trận Ap =A.A. . .A p thừa số. Khi đó

aịjp, i,j=1, 2,. . . ,n cho ta số đường đi khác nhau từ đỉnh i đến đỉnh j qua p-1 đỉnh trung gian.

Ma trận kề của đồ thị có hướng được định nghĩa một cách hoàn toàn tương tự.

Ví dụ 13.2 Đồ thị có hướng G1 cho trong Hình 13.1 có ma trận kề là ma trận sau:

1 2 3 4 5 6

1 0 1 1 0 0 0

2 0 0 0 0 0 0

3 0 1 0 1 0 0

4 0 0 0 0 0 0

5 0 0 0 1 0 1

6 0 0 0 0 1 0

Lưu ý rằng ma trận kề của đồ thị có hướng không phải là ma trận đối xứng.

Chú ý: Trên đây chúng ta chỉ xét đơn đồ thị. Ma trận kề của đa đồ thị có thể xây dựng hoàn

toàn tương tự, chỉ khác là thay vì ghi 1 vào vị trí a[i,j] nếu (i,j) là cạnh của đồ thị, chúng ta sẽ

ghi k là số cạnh nối hai đỉnh i, j.

Trong rất nhiều vấn đề ứng dụng của lý thuyết đồ thị, mỗi cạnh e=(u,v) của đồ thị

được gán với một con số c(e) (còn viết là c(u,v) gọi là trọng số của cạnh e. Đồ thị trong

trường hợp như vậy được gọi là đồ thị có trọng số. Trong trường hợp đồ thị có trọng số, thay

vì mà trận kề, để biểu diễn đồ thị ta sử dụng ma trận trọng số.

C= {c[i,j], i, j = 1, 2,. . ., n}

với c[i,j]=c(i,j) nếu (i,j) E và c[i,j]= nếu (i, j) E

trong đó số , tuỳ từng trường hợp cụ thể, có thể được đặt bằng một trong các giá trị sau: 0,

+ , - .

Ưu điểm lớn nhất của phương pháp biểu diễn đồ thị bằng ma trận kề (hoặc ma trận

trọng số) là để trả lời câu hỏi: Hai đỉnh u, v có kề nhau trên đồ thị hay không, chúng ta chỉ

phải thực hiện một phép so sánh. nhược điểm lớn nhất của phương pháp này là: không phụ

thuộc vào số cạnh của đồ thị, ta luôn phải sử dụng n2 đơn vị bộ nhớ để lưu trữ ma trận kề của

nó.

Page 107: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 106

13.2. Danh sách cạnh (cung)

Trong trường hợp đồ thị thưa (đồ thị có số cạnh m thoả mãn bất dẳng thức: m < 6n)

người ta thường dùng cách biểu diễn đồ thị dưới dạng danh sách cạnh.

Trong cách biểu diễn đồ thị bởi danh sách cạnh (cung) chúng ta sẽ lưu trữ danh sách

tất cả các cạnh (cung) của đồ thị vô hướng (có hướng). Một cạnh (cung) e = (x,y) của đồ thị sẽ

tương ứng với hai biến Dau[e], Cuoi[e]. Như vậy, để lưu trữ đồ thị ta cần sử dụng 2m đơn vị

bộ nhớ. Nhược điểm của cách biểu diễn này là để xác định những đỉnh nào của đồ thị là kề

với một đỉnh cho trước chúng ta phải làm cỡ m phép so sánh (khi duyệt qua danh sách tất cả

các cạnh của đồ thị).

Chú ý: Trong trường hợp đồ thị có trọng số ta cần thêm m đơn vị bộ nhớ để lưu trữ trọng số

của các cạnh.

Ví dụ 13.3 Danh sách cạnh (cung) của đồ thị G (G1) cho trong hình 13.1 là:

Đầu 1 Đầu 2 Đầu Cuối

1 2 1 2

1 3 1 3

2 3 3 2

2 5 3 4

3 4 5 4

4 5 5 6

4 6 6 5

5 6

Danh sách cạnh của G Danh sánh cung của G1

Page 108: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 107

13.3. Danh sách kề

Trong rất nhiều vấn đề ứng dụng của lý thuyết đồ thị, cách biểu diễn đồ thị dưới dạng

danh sách kề là cách biểu diễn thích hợp nhất được sử dụng.

Trong cách biểu diễn này, với mỗi đỉnh v của đồ thị chúng ta lưu trữ danh sách các đỉnh kề

với nó, mà ta sẽ ký hiệu là

Ke(v)= { u V: (v,u) E }

Khi đó vòng lặp thực hiện với mỗi một phần tử trong danh sách này theo thứ tự các

phần tử được sắp xếp trong nó sẽ được viết như sau:

for u Ke(v) do. . .

Ví dụ 13.4 Danh sách kề của các đồ thị trong hình 13.1 được mô tả trong hình sau:

Đỉnh đầu

Đỉnh đầu

Hình 13.2 Danh sách kề của đồ thị G và G1 cho trong hình 13.1

Để ý rằng trong cách biểu diễn này chúng ta cần phải sử dụng cỡ m+n đơn vị bộ nhớ.

Trong các thuật toán mô tả ở các phần tiếp theo hai cấu trúc danh sách kề và ma trận

trọng số được sử dụng thường xuyên.

Page 109: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 108

13.4. Bài tập

Bài 1 Đồ thị G1 là đồ thị vô hướng hay đồ thị có hướng? Tính bậc (bậc vào/bậc ra) các đỉnh

của đồ thị?

Bài 2 Đồ thị G2 là đồ thị vô hướng hay đồ thị có hướng? Tính bậc (bậc vào/bậc ra) các đỉnh

của đồ thị?

Bài 3 Kiểm tra tính liên thông của đồ thị G2?

Bài 4 Đưa ra 1 đường đi đơn độ dài 9 của đồ thị G2 (nếu có)

Bài 5 Xác định đỉnh treo, cạnh cầu của đồ thị G2(nếu có)

Bài 6 Biểu diễn đồ thị G3 dưới dạng ma trận kề, danh sách cạnh, danh sách kề

1

2

3

6

5

4

7

G1

1

2

3

5

4

6

6

7

10 8

5

3

2

9

G3 G4

G2

Page 110: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 109

Bài 14 Đồ thị Euler – Hamilton

14.1 Đồ thị Euler

Có thể coi năm 1736 là năm khai sinh lý thuyết đồ thị, với việc công bố lời giải “bài

toán về các cầu ở Konigsberg” của nhà toán học lỗi lạc Euler (1707-1783). Thành phố

Konigsberg thuộc Phổ (nay gọi là Kaliningrad thuộc Nga) được chia thành bốn vùng bằng các

nhánh sông Pregel, các vùng này gồm hai vùng bên bờ sông, đảo Kneiphof và một miền nằm

giữa hai nhánh của sông Pregel. Vào thế kỷ 18, người ta xây bảy chiếc cầu nối các vùng này

với nhau.

Hình 14.1 Mô hình 7 cây cầu ở Konigsberg

Dân thành phố từng thắc mắc: “Có thể nào đi dạo qua tất cả bảy cầu, mỗi cầu chỉ một lần thôi

không?”. Nếu ta coi mỗi khu vực A, B, C, D như một đỉnh và mỗi cầu qua lại hai khu vực là

một cạnh nối hai đỉnh thì ta có sơ đồ của Konigsberg là một đa đồ thị G như hình trên.

Bài toán tìm đường đi qua tất cả các cầu, mỗi cầu chỉ qua một lần có thể được phát

biểu lại bằng mô hình này như sau: Có tồn tại chu trình đơn trong đa đồ thị G chứa tất cả các

cạnh?

14.1.1. Định nghĩa

Chu trình đơn trong đồ thị G đi qua mỗi cạnh của nó một lần được gọi là chu trình

Euler. Đường đi đơn trong G đi qua mỗi cạnh của nó một lần được gọi là đường đi Euler. Đồ

thị được gọi là đồ thị Euler nếu nó có chu trình Euler, và gọi là đồ thị nửa Euler nếu nó có

đường đi Euler.

Rõ ràng mọi đồ thị Euler luôn là nửa Euler, nhưng điều ngược lại không luôn đúng.

14.1.2. Các ví dụ

Ví dụ 14.1 Đồ thị G1 trong Hình 14.2 là đồ thị Euler vì nó có chu trình Euler a, e, c, d, e, b, a.

Đồ thị G3 không có chu trình Euler nhưng nó có đường đi Euler a, c, d, e, b, d, a, b, vì thế G3

là đồ thị cửa Euler. Đồ thị G2 không có chu trình cũng như đường đi Euler.

Page 111: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 110

Hình 14.2 Đồ thị G1, G2, G3

Ví dụ 14.2 Đồ thị H2 trong Hình 14.3 là đồ thị Euler vì nó có chu trình Euler a, b, c, d, e, a.

Đồ thị H3 không có chu trình Euler nhưng nó có đường đi Euler c, a, b, c, d, b vì thế H3 là đồ

thị nửa Euler. Đồ thị H1 không có chu trình cũng như đường đi Euler.

Hình 14.3 Đồ thị H1, H2, H3

Điều kiện cần và đủ để một đồ thị là một đồ thị Euler được Euler tìm ra vào năm 1736

khi ông giải quyết bài toán hóc búa nổi tiếng thế giới thời đó về bảy cái cầu ở thành phố

Konigsberg và đây là định lý đầu tiên của lý thuyết đồ thị.

14.1.3. Định lý Euler

Định lý 14.1 (Euler). Đồ thị vô hướng liên thông G là đồ thị Euler khi và chỉ khi mọi đỉnh của

G đều có bậc chẵn.

Để chứng minh định lý trước hết ta chứng minh bổ để:

Bổ đề 14.1 Nếu bậc của mỗi đỉnh của đồ thị G không nhỏ hơn 2 thì G chứa chu trình.

Chứng minh.

Nếu G có cạnh lặp thì khẳng định của bồ đề là hiển nhiên. Vì vậy giả sử G là đơn đồ

thị. Gọi v là một đỉnh nào đó của G. Ta sẽ xây dựng theo qui nạp đường đi

v v1 v2 . . .

trong đó v1 là đỉnh kề với v, còn với i ≥ 1 chọn vi+1 ≠ vi-l (có thể chọn vi+1 như vậy là vì deg(vi)

≥2). Do tập đỉnh của G là hữu hạn, nên sau một số hữu hạn bước ta phải quay lại một đỉnh đã

xuất hiện trước đó. Gọi đỉnh đầu tiên như thế là vk. Khi đó, đoạn của đường đi xây dựng nằm

giữa hai đỉnh vk là 1 chu trình cần tìm.

Chứng minh định lý:

Page 112: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 111

Cần. Giả sử G là đồ thị Euler tức là tồn tại chu trình Euler P trong G. Khi đó cứ mỗi

lần chu trình P đi qua một đỉnh nào đó của G bậc của đỉnh đó tăng lên 2. mặt khác mỗi cạnh

của đồ thị xuất hiện trong P đúng một lần, suy ra mỗi đỉnh của đồ thị điều có bậc chẵn.

Đủ. Quy nạp theo số đỉnh và số cạnh của G. Do G liên thông và deg(v) là số chẵn nên

bậc của mỗi đỉnh của nó không nhỏ hơn 2. Từ đó theo bổ đề G phải chứa chu trình C. Nếu C

đi qua tất cả các cạnh của G thì nó chính là chu trình Euler. Giả sử C không đi qua tất cả các

cạnh của G. Khi đó loại bỏ khỏi G tất cả các cạnh thuộc C ta thu được một đồ thị mới H vẫn

có bậc là chẵn. Theo giả thiết qui nạp, trong mỗi thành phần liên thông của H điều tìm được

chu trình Euler. Do G là liên thông nên trong mỗi thành phần của H có ít nhất một đỉnh chung

với chu trình C.

Vì vậy, ta có thể xây dựng chu trình Euler trong G như sau: bắt đầu từ một đỉnh nào

đó của chu trình C, đi theo các cạnh của C chừng nào chưa gặp phải đỉnh không cô lập của H.

Nếu gặp phải đỉnh như vậy ta sẽ đi theo chu trình Euler của thành phần liên thông của H chứa

đỉnh đó. Sau đó lại tiếp tục đi theo cạnh của C cho đến khi gặp phải đỉnh không cô lập của H

thì lại theo chu trình Euler của thành phần liên thông tương ứng trong H v.v… Quá trình sẽ

kết thúc khi ta trở về đỉnh xuất phát, tức là thu được chu trình đi qua mỗi cạnh của đồ thị đúng

một lần.

Hình 14.4 Minh hoạ cho chứng minh định lý 14.1

Hệ quả 14.1 Đồ thị vô hướng liên thông G là nửa Euler khi và chỉ khi nó có không quá 2 đỉnh

bậc lẻ.

Chứng minh. Thực vậy, nếu G có không quá 2 đỉnh bậc lẻ thì số đỉnh bậc lẻ của nó chỉ

có thể là 0 hoặc 2. Nếu G không có đỉnh bậc lẻ thì theo Định lý 18.1, nó là đồ thị Euler. Giả

sử G có 2 đỉnh bậc lẻ là u và v. Gọi H là đồ thị thu được từ G bằng cách thêm vào G một đỉnh

mới w và hai cạnh (w,u) và(w,v). Khi đó tất cả các đỉnh của H điều có bậc chẵn, vì thế theo

Định lý 18.1, nó có chu trình Euler C. Xoá bỏ khỏi chu trình này đỉnh w và hai cạnh kề nó ta

thu được đường đi Euler trong đồ thị G.

Giả sử G là đồ thị Euler, từ chứng minh định lý ta có thủ tục sau để tìm chu trình Euler

trong G.

bool IsCau(x,y);

Page 113: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 112

void Euler_Cycle()

{

CE= ; STACK=;

Chon u la mot dinh nao do cua do thi;

put (u);

while (STACK!=)

{

x=top(STACK); // x la phan tu dau STACK)

ok=false;//chưa chọn được cạnh đưa vào CT Euler

y=dinh dau tien trong danh sach Ke(x);

while (y!=null && !ok)

{

if(!IsCau(x,y) || (IsCau(x,y) && y.link==null)

{

ok=true;

put(y);

(* loai bo canh (x,y) khoi do thi *)

Ke(x)=Ke(x)\ { y} ;

Ke(y)=Ke(y)\{ x} ;

}

y=y.link;

}

if (!ok)//ko chọn được cạnh=> ko tồn tại CT Euler

{

Thông báo ko tồn tại chu trình Euler

Exit(0);

}

Page 114: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 113

}

}

14.1.4. Thuật toán Flor tìm đường đi chu trình Euler

Quy tắc 1: Đi tới đâu xóa tới đó.

Quy tắc 2: Chỉ qua cầu khi không còn cách đi khác

14.1.5. Một số bài toán liên quan(*)

14.2 Đồ thị Hamilton

Để làm quen với chu chình Hamilton xin mở đầu bằng bài toán du lịch kín quanh thế

giới do Hamilton đặt ra: Chon trươc 20 thành phố: A1, A2 ,..., A20. Để đơn giản giả sử rằng các

thành phố này là đỉnh của một Hình 14.5 mặt đều (đó k đa diện có 12 mặt ngũ giác đều và 20

đỉnh) thay cho trái đất, còn các cạnh của đa diện biểu hiện cho đường đi giữa các thành phố,

trên Hình 14.5

Hình 14.5 Du lịch 20 thành phố

Liệu một khách du lịch có thể tham quan tất cả 20 thành phố, qua mỗi thành phố đúng một

lầm rồi lại trở về được điểm xuất phát hay không? và có bao nhiêu cách đi?

Hamilton đã giải bài toán trên bằng cách chỉ ra nguyên tắc đi như sau: khách du lịch khi đến

đầu mút của mỗi cạnh, nếu anh ta chọn cạnh bên trái mình thì phép chọn được ký hiệu bằng

T, chọn cạnh phía phải kí hiệu bằng chữ P, và ơ nguyên tại chỗ ký hiệu băng 1. Tích của phép

chọn đi theo cạnh phải rồi đi tiếp theo cạnh trái, TTT, hay TTP là phép chọn đi theo cạnh trái

hai lần và đi theo cạnh phải 1 lần.v.v... Hai phép chọn bằng nhau, nếu xuất phát từ cùng một

điểm cả hai đều cùng đi tới một điểm. Tích không có tính chất giao hoán (PT TP), nhưng có

tính chất kết hợp ví dụ như (TT)P=T(TP).

Khi đó ta có công thức:

A19 A17

A20 A16

A11

A13 A9

A15

A12 A10

A4 A3

A7

A14 A8

A6

A5

A1 A2

A18

Page 115: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 114

P5 =T5 =1; PT2 P=TPT; TP2 T= PTP; TP2 T= P2 ; PT2 T= T2 ;

Do đó nên ta có

1=P5 = P2 P3 =( TP3 T) P3 =( TP3)2 =[T(TP3 T)P]... =[ T3 P3TPTP]2 =...

=TTTPPPTPTPTTTPPPTPTP

Tích cuối cùng gồm 20 chữ cái, đồng thời không thể tách ra được một đoạn nào có tích bằng

1. Bởi vậy dãy này lập thành một đường du lich khép kín qua cả 20 thành phố và qua mỗi

thành phố đúng một lần.

Sau này lý thuyết về chu trình Hamilton sẽ giúp ta giải quyết các bài toán tương tự như bài

toán du lịch ở trên.

14.2.1 Định nghĩa

Đường đ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. Chu trình bắt đầu từ một đỉnh v nào đó qua tất cả các đỉnh còn lại mỗi đỉnh đúng

một lần rồi quay trở về v được gọi là chu trình Hamilton. Đồ thị G được gọi là đồ thị

Hamilton nếu nó chứa chu trình Hamilton và gọi là đồ thị nữa Hamilton nếu nó có đường đi

Hamilton.

Rõ ràng đồ thị Hamilton là nửa Hamilton, nhưng điều ngược lại không còn đúng.

Ví dụ 14.2 Trong hình 14.6 G3 là Hamilton, G2 là nửa Hamilton còn G1 không là nửa

Hamilton.

Hình 14.6 Đồ thị Hamilton G3, nửa Hamilton G2, và G1 không là nửa Hamilton

Cho đến nay việc tìm một tiêu chuẩn nhận biết đồ thị Hamilton vẫn còn là mở, mặc dù

đây là một vấn đề trung tâm của lý thuyết đồ thị. Hơn thế nứa, cho đến nay cũng chưa có thuật

toán hiệu quả để kiểm tra một đồ thị có là Hamilton hay không. Các kết quả thu được phần

lớn là điều kiện đủ để một đồ thị là đồ thị Hamilton. Phần lớn chúng điều có dạng "nếu G có

số cạnh đủ lớn thì G là Hamilton". Một kết quả như vậy được phát biểu trong định lý sau đây.

14.2.2 Định lý Dirak

Định lý 14.2 (Dirak 1952). Đơn đồ thị vô hướng G với n>2 đỉnh, mỗi đỉnh có bậc không nhỏ

hơn n/2 là đồ thị Hamilton.

Chứng minh:

Thêm vào đồ thị G k đỉnh mới và nối chúng với tất cả các đỉnh của G. giả sử k là số

nhỏ nhất các đỉnh cần thêm vào để cho đồ thị thu được G’ là đồ thị Hamilton. Ta sẽ chỉ ra

rằng k=0. Thực vậy, giả sử ngược lại là k >0. Ký hiệu

Page 116: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 115

v, p, w, . . ., v là chu trình Hamilton trong G’, trong đó v, w là đỉnh của G còn p là một trong

số các đỉnh mới. Khi đó w không kề với v vì nếu ngược lại, ta không cần sử dụng p và điều đó

là mâu thuẫn với giả thiết k nhỏ nhất. Hơn thế nữa đỉnh (w’ chẳng hạn) kề với w không thể đi

liền sau đỉnh v’ (kề với v) vì rằng khi đó có thể thay

v p w . . . v’ w’ . . . v

bởi v v’ . . . w w’ . . . v bằng cách đảo ngược đoạn của chu trình nằm giữa

w và v’. Từ đó suy ra là số đỉnh của đồ thị G’ không kề với w là không nhỏ hơn số đỉnh kề

với v (tức là ít nhất cũng là bằng n/2+k), đồng thời số đỉnh của G’ kề với w ít ra là phải bằng

n/2+k. Do không có đỉnh nào của G’ vừa không kề, lại vừa kề với w, cho nên tổng số đỉnh của

đồ thị G’ (G’ có n+k đỉnh) không ít hơn n+2k. Mâu thuẫn thu được đã chứng minh định lý.

Định lý sau là tổng quát hoá của định lý Dirak cho đồ thị có hướng:

Định lý 14.3 Giả sử G là đồ có hướng liên thông với n đỉnh.

Nếu deg+ (v) ≥ n/2, deg – (v) ≥ n/2, v thì G là Hamilton.

Có một số dạng đồ thị mà ta có thể biết khi nào là đồ thị Hamilton. Một ví dụ như vậy

là đồ thị đấu loại. Đồ thị đấu loại là đồ thị có hướng mà trong đó hai đỉnh bất kỳ của nó được

nối với nhau bởi đúng một cung. Tên đấu loại xuất hiện như vậy vì đồ thị như vậy có thể dùng

để biểu diễn kết quả thi đấu bóng chuyền, bóng bàn hay bất cứ một trò chơi nào mà không

cho phép hoà. Ta có định lý sau:

Định lý 14.34

i) Mọi đồ thị đấu loại là nửa Hamilton.

ii) Mọi đồ thị đấu loại liên thông mạnh là Hamilton.

Ví dụ 14.3 Đồ thị đấu loại D5, D6 được cho trong hình 14.7

Hình 14.7 Đồ thị đấu loại D5, đấu loại liên thông mạnh D6

14.2.3 Thuật toán liệt kê tất cả các chu trình Hamilton của đồ thị

Thuật toán sau đây được xây dựng dựa trên cơ sở thuật toán quay lui cho phép liệt kê tất cả

các chu trình Hamilton của đồ thị.

Page 117: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 116

void Hamilton(k)

{/* liet ke cac chu trinh Hamilton thu duoc bang viec phat trien day dinh (X[1],. . .,

X[k-1]) cua do thi G=(V,E) cho boi danh sach ke: Ke(v), v V */

{

for y Ke(X[k-1])

if( (k =N+1) && (y= X[1])) //chu trình Hamilton

Ghinhan(X[1],. . ., X[n], X[1])

else

if (Chuaxet[y])//y chưa được đưa vào CT

{

X[k]=y;//y là thành phần thứ k trong CT

Chuaxet[y]=false;//đánh dấu y đã được đưa vào CT

Hamilton(k+1);//Gọi đệ quy

Chuaxet[y]=true;//Quay lui

}

}

public static void Main()

{

for v V do Chuaxet[v]=true;

X[1]=v0; (* v0 la mot dinh nao do cua do thi *)

Chuaxet[v0]=false;

Hamilton(2);

}

Ví dụ 14.4 Hình 14.8 dưới đây mô tả cây tìm kiếm theo thuật toán vừa mô tả.

Page 118: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 117

Hình 14.8 Đồ thị và cây liệt kê chu trình Hamilton của nó theo thuật toán quay lui

Trong trường hợp đồ thị có không quá nhiều cạnh thuật toán trên có thể sử dụng để kiểm tra

đồ thị có phải là Hamilton hay không.

Page 119: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 118

Bài 15 Cài đặt đồ thị, thuật toán tìm chu trình Euler và liệt kê chu

trình Hamilton

15.1. Cài đặt biểu diễn đồ thị trên máy tính

Chương trình nhập danh sách kề của đồ thị từ bàn phím và đưa danh sách đó ra màn hình

Phân tích bài toán:

Trong rất nhiều thuật toán làm việc với đồ thị chúng ta thường xuyên phải thực hiện các thao

tác: Thêm hoặc bớt một số cạnh. Trong trường hợp này Cấu trúc dữ liệu dùng ở trên là không

thuận tiện. Khi đó nên chuyển sang sử dụng danh sách kề liên kết (Linked Adjancency List)

như mô tả trong chương trình nhập danh sách kề của đồ thị từ bàn phím và đưa danh sách đó

ra màn hình.

15.2. Cài đặt thuật toán liệt kê chu trình Euler

Tìm chu trình Euler trong đồ thị G

Cài đặt chương trình tìm chu trình Euler trong đồ thị G.

Cho đồ thị G=(X,E) tồn tại chu trình Euler. Hãy tìm chu trình (chi trình Euler là chu trình đi

qua tất cả các cạnh của đồ thị, mỗi cạnh đi qua đúng một lần).

1. Phân tích bài toán:

Đầu vào: Đồ thị G

Đầu ra: Chu trình Euler (nếu có)

2. Thuật toán:

Xuất phát từ một đỉnh u bất kỳ, khi đi qua cạnh nào thì xoá cạnh đó khỏi đồ thị và ghi lại từ

trái sang phải. Khi thực hiện thuật toán cần lưu ý nếu gặp cạnh bắc cầu giữa 2 thành phần liên

thông thì ta phải xoá hết thành phần liên thông rồi mới xoá đến cạnh bắc cầu.

Khi xoá cạnh bắc cầu thì phải loại hết các đỉnh trơ trọi (nghĩa là không kề với bất cứ đỉnh nào

thuộc đồ thị).

Cấu trúc dữ liệu:

Biểu diễn đồ thị bằng ma trận kề a(i,j), do đó lưu ý khi xoá đi một cạnh ta chỉ việc gán

a[i,j]=a[j,i]=0, đồng thời phải lưu cạnh vừa xoá vào một mảng khác: Mảng Ctr.

Mảng int [] lt==new int[n]; dùng trong thủ tục tìm thành phần liên thông (giống như một

thuật toán tìm thành phần liên thông trình bày ở trên, với đồ thị n đỉnh sẽ có tối đa n thành

phần liên thông).

Mảng bool [] dd=new bool[n]; giá trị dd[i] cho biết đỉnh i bị loại khỏi đồ thị hay chưa. Nếu bị

lại thì dd[i]=True; ngược lại dd[i]=False;

Thủ tục cài đặt trong giáo trình bài tập.

Page 120: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 119

15.3. Cài đặt thuật toán liệt kê chu trình Hamilton

Liệt kê tất cả các chu trình Hamilton của đồ thị

Phân tích bài toán:

- Thuật toán sau đây được xây dựng dựa trên cơ sở thuật toán quay lui cho phép liệt kê

tất cả các chu trình Hamilton của đồ thị.

- Trong trường hợp đồ thị có không quá nhiều cạnh thuật toán trên có thể sử dụng để

kiểm tra đồ thị có phải là Hamilton hay không.

Thủ tục cài đặt trong giáo trình bài tập

Page 121: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 120

Bài 16 Thuật toán tìm kiếm trên đồ thị và ứng dụng

Có nhiều thuật toán trên đồ thị được xây dựng để duyệt tất cả các đỉnh của đồ thị sao

cho mỗi đỉnh được viếng thăm đúng một lần. Những thuật toán như vậy được gọi là thuật toán

tìm kiếm trên đồ thị. Chúng ta cũng sẽ làm quen với hai thuật toán tìm kiếm cơ bản, đó là

duyệt theo chiều sâu DFS (Depth First Search) và duyệt theo chiều rộng BFS (Breath First

Search).

16.1. Duyệt đồ thị theo chiều rộng (BFS)

Giả sử ta có đồ thị G với các đỉnh ban đầu được đánh dấu là chưa duyệt (unvisited).

Từ một đỉnh v nào đó ta bắt đầu duyệt như sau: đánh dấu v đã được duyệt, kế đến là duyệt tất

cả các đỉnh kề với v. Khi ta duyệt một đỉnh v rồi đến đỉnh w thì các đỉnh kề của v được duyệt

trước các đỉnh kề của w, vì vậy ta dùng một hàng để lưu trữ các nút theo thứ tự được duyệt để

có thể duyệt các đỉnh kề với chúng. Ta cũng dùng mảng một chiều mark để đánh dấu một nút

là đã duyệt hay chưa, tương tự như duyệt theo chiều sâu. Giải thuật duyệt theo chiều rộng

được viết như sau:

void BFS()

{

for (v = 0; v< n; v++) xet[v] = false;//đánh dấu chưa duyệt tất cả các đỉnh

//n là số đỉnh của đồ thị, các đỉnh đồ thị được đánh số 0, 1, .., n-1

initQ();//Khởi tạo hàng đợi.

put(1); //Đưa xp vào hàng đợi. Có thể chọn xp là 1 đỉnh nào đó của đồ thị

while(!emptyQ()) // lặp cho tới khi hàng đợi rỗng

{

u=pop(); // Lấy 1 đỉnh ra khỏi hàng đợi.

if (xet[u] == false)

{

xet[u]=true; //đánh dấu xét

for(v kề(u)) //Duyệt các đỉnh kề u chưa xét

if(xet[v]==false)

put(v);

}

Page 122: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 121

}

}

Ví dụ 16.1 Duyệt theo chiều rộng đồ thị hình 16.1

Hình 16.1 Đồ thị vô hướng

Giả sử bắt đầu duyệt từ A. Duyệt A, kế đến duyệt tất cả các đỉnh kề với A; đó là B, C,

D theo thứ tự đó. Kế tiếp là duyệt các đỉnh kề của B, C, D theo thứ tự đó. Vậy các nút được

duyệt tiếp theo là F, E,G. Có thể minh hoạ hoạt động của hàng trong phép duyệt trên như sau:

Duyệt A nghĩa là, đánh dấu xét cho E là đỉnh đã xét (đánh dấu visited) và đưa nó vào hàng:

A

Kế đến duyệt tất cả các đỉnh kề với đỉnh đầu hàng mà chưa được duyệt; tức là ta loại

A khỏi hàng, duyệt B, C, D và đưa chúng vào hàng, bây giờ hàng chứa các đỉnh B, C, D

B C D

Kế đến B được lấy ra khỏi hang, đánh dấu xét cho B là đỉnh đã xét và các đỉnh kề với

B mà chưa được duyệt, đó là F, sẽ được duyệt, và F được đưa vào hàng đợi.

C D F

Kế đến thì C được lấy ra khỏi hang, đánh dấu xét cho C là đỉnh đã xét và các đỉnh kề

với C mà chưa được duyệt sẽ được duyệt, đó là D, và D được đưa vào hàng đợi.

D F D

Kế đến thì D được lấy ra khỏi hang, đánh dấu xét cho D là đỉnh đã xét và duyệt các

đỉnh kề chưa duyệt của D, tức là E, F, G được đưa vào hàng đợi.

F D E F G

Tiếp tục, F được lấy ra khỏi hàng, đánh dấu xét cho F là đỉnh đã xét F và duyệt các

đỉnh kề chưa duyệt của F. Không có đỉnh nào kề với F mà chưa được duyệt. Vậy không duyệt

thêm đỉnh nào.

Page 123: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 122

F G

Tiếp tục, D được lấy ra khỏi hàng, D là đỉnh đã xét.

Tiếp tục, E được lấy ra khỏi hàng, đánh dấu xét cho E là đỉnh đã xét. Không có đỉnh

nào kề với F mà chưa được duyệt. Vậy không duyệt thêm đỉnh nào.

Tương tự như F, rồi đến G được lấy ra khỏi hàng. Hàng trở thành rỗng và giải thuật

kết thúc.

G

Ta có thể mô tả kết quả thuật toán duyệt rộng theo từng bước của trong bảng sau:

Trạng thái hàng đợi Đỉnh lấy

ra để xét Các đỉnh đã xét Các đỉnh chưa xét

A

A B, C, D, F, E, G

B C D

B A C, D, F, E, G

C D F

C A, B D, F, E, G

D F D

D A, B, C F, E, G

... F D E F G

F A, B, C, D E, G

D E F G

D, E A, B, C, D, F G

F G

F, G A, B, C, D, F, E

Page 124: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 123

- Hàng đợi rỗng thì dừng lại

A, B, C, D, F, E,

G

16.2. Duyệt đồ thị theo chiều sâu (DFS)

Giả sử ta có đồ thị G=(V,E) với các đỉnh ban đầu được đánh dấu là chưa duyệt

(unvisited).

Từ một đỉnh v nào đó ta bắt đầu duyệt như sau: đánh dấu v đã duyệt, với mỗi đỉnh w

chưa duyệt kề với v, ta thực hiện đệ qui quá trình trên cho w. Sở dĩ cách duyệt này có tên là

duyệt theo chiều sâu vì nó sẽ duyệt theo một hướng nào đó sâu nhất có thể được. Giải thuật

duyệt theo chiều sâu một đồ thị có thể được trình bày như sau, trong đó ta dùng một mảng

mark có n phần tử để đánh dấu các đỉnh của đồ thị là đã duyệt hay chưa.

void DFS()

{

for (v = 0; v< n; v++) xet[v] = false;//đánh dấu chưa duyệt tất cả các đỉnh

//n là số đỉnh của đồ thị, các đỉnh đồ thị được đánh số 0, 1, .., n-1

initS(); //Khởi tạo ngăn xếp.

put(1); //Đưa xp vào ngăn xếp. Có thể chọn xp là 1 đỉnh nào đó của đồ thị

while(!emptyS()) // lặp cho tới khi ngăn xếp rỗng

{

u=pop(); // Lấy 1 đỉnh ra khỏi ngăn xếp.

if (xet[u] == false)

{

xet[u]=true; //đánh dấu xét

for(v kề(u)) //Duyệt các đỉnh kề u chưa xét

if(xet[v]==false)

put(v);

}

}

Page 125: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 124

}

Ví dụ 16.2: Duyệt theo chiều sâu đồ thị hình 16.1 bắt đầu từ đỉnh A

Duyệt A, A có các đỉnh kề là B,C,D; Theo thứ tự đó thì B được duyệt. B có 1 đỉnh kề

chưa duyệt là F, nên F được duyệt. F có các đỉnh kề chưa duyệt là D,G; theo thứ tự đó thì ta

duyệt D. D có các đỉnh kề chưa duyệt là C,E,G; theo thứ tự đó thì C được duyệt. Các đỉnh kề

với C đều đã được duyệt nên giải thuật được tiếp tục duyệt E. E có một đỉnh kề chưa duyệt là

G, vậy ta duyệt G. Lúc này tất cả các nút đều đã được duyệt nên đồ thị đã được duyệt xong.

Ta có thể mô tả kết quả thuật toán duyệt rộng theo từng bước của trong bảng sau:

Trạng thái ngăn xếp Đỉnh lấy ra để xét

Các đỉnh đã xét Các đỉnh chưa xét

A

A B, C, D, E, F, G

B C D

B A C, D, E, F, G

F C D

F A, B C, D, E, G

D G C D

D A, B, F C, E, G

C E G G C D

C A, B, F, D E, G

E A, B, F, D, C G

Page 126: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 125

E G G C D

G G C D

G A, B, F, D, C, E

G C D

G A, B, F, D, C, E, G

C D

C A, B, F, D, C, E, G

D

D A, B, F, D, C, E, G

Ngăn xếp rỗng, thuật toán dừng lại

16.3. Bài tập

Bài 1 Minh họa thuật toán Duyệt đồ thị theo chiều sâu

Bài 2 Minh họa thuật toán Duyệt đồ thị theo chiều rộng

Bài 3 Minh họa thuật toán Duyệt đồ thị (duyệt rộng hoặc duyệt sâu) để tìm cây khung cho đồ

thị.

1

2

3

5

4

6

6

7

10 8

5

3

2

9

Page 127: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 126

16.4. Ứng dụng

Trong một số bài toán, công việc duyệt đồ thị là việc đầu tiên và rất cần thiết. Khi cài

đặt thuật toán duyệt đồ thị thuật toán duyệt rộng và duyệt sâu có thể được cải tiến sao cho mỗi

đĩnh chỉ cần lấy ra để xét tối đa 1 lần.

void BFS2() { for (v = 0; v< n; v++) xet[v] = false;//đánh dấu chưa duyệt tất cả các đỉnh //n là số đỉnh của đồ thị, các đỉnh đồ thị được đánh số 0, 1, .., n-1 initQ();//Khởi tạo hàng đợi. put(1); //Đưa xp vào hàng đợi. Có thể chọn xp là 1 đỉnh nào đó của đồ thị while(!emptyQ()) // lặp cho tới khi hàng đợi rỗng { u=pop(); // Lấy 1 đỉnh ra khỏi hàng đợi. for(v kề(u)) //Duyệt các đỉnh kề u chưa xét if(xet[v]==false) { put(v); xet[u]=true; //đánh dấu xét } } }

void DFS2() { for (v = 0; v< n; v++) xet[v] = false;//đánh dấu chưa duyệt tất cả các đỉnh //n là số đỉnh của đồ thị, các đỉnh đồ thị được đánh số 0, 1, .., n-1 initS(); //Khởi tạo ngăn xếp. put(1); //Đưa xp vào ngăn xếp. Có thể chọn xp là 1 đỉnh nào đó của đồ thị while(!emptyS()) // lặp cho tới khi ngăn xếp rỗng { u=pop(); // Lấy 1 đỉnh ra khỏi ngăn xếp. for(v kề(u)) //Duyệt các đỉnh kề u chưa xét if(xet[v]==false) { put(v); xet[u]=true; //đánh dấu xét } } }

Ví dụ 16.3 Cho đồ thị như trong hình 16.2.

Duyệt đồ thị theo chiều rộng và theo chiều sâu từ đỉnh 2

Page 128: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 127

Hình 16.2 Đồ thị vô hướng

Ta có thể mô tả kết quả thuật toán duyệt rộng 2 theo từng bước của trong bảng sau:

Trạng thái hàng đợi Đỉnh đang xét Các đỉnh đã đánh dấu xét

Các đỉnh chưa xét

2

2 2 1,2,3,4,5, 6

1 4 6

1 2, 1, 4, 6 3, 5

4 6 3

4 2, 1, 4, 6, 3 5

6 3 5

6 1,2,3,4,5, 6

3 5

3 1,2,3,4,5, 6

5

5 1,2,3,4,5, 6

1,2,3,4,5, 6

Ta có thể mô tả kết quả thuật toán duyệt sâu 2 theo từng bước của trong bảng sau:

Trạng thái ngăn xếp Đỉnh đang xét Các đỉnh đã đánh dấu xét

Các đỉnh chưa xét

2

2 2 1,2,3,4,5, 6

6 4 1

6 2, 1, 4, 6 3, 5

5 4 1

5 2, 1, 4, 6, 5 3

3 4 1

3 1,2,3,4,5, 6

4 1

4 1,2,3,4,5, 6

1

1 1,2,3,4,5, 6

1,2,3,4,5, 6

Page 129: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 128

Bài 17 Cây và cây khung

17.1. Cây và cây khung

17.1.1. Cây

Định nghĩa 17.1 Cây là một đồ thị vô hướng liên thông, không chứa chu trình và có ít nhất

hai đỉnh.

Một đồ thị vô hướng không chứa chu trình và có ít nhất hai đỉnh gọi là một rừng.

Trong một rừng, mỗi thành phần liên thông là một cây.

Ví dụ 17.1 Rừng sau có 3 cây:

Hình 17.1 Cây và rừng

Mệnh đề 17.1 Nếu T là một cây có n đỉnh thì T có ít nhất hai đỉnh treo.

Chứng minh: Lấy một cạnh (a,b) tuỳ ý của cây T. Trong tập hợp các đường đi sơ cấp

chứa cạnh (a,b), ta lấy đường đi từ u đến v dài nhất. Vì T là một cây nên u v. Mặt khác, u và

v phải là hai đỉnh treo, vì nếu một đỉnh, u chẳng hạn, không phải là đỉnh treo thì u phải là đầu

mút của một cạnh (u,x), với x là đỉnh không thuộc đường đi từ u đến v. Do đó, đường đi sơ

cấp từ x đến v, chứa cạnh (a,b), dài hơn đường đi từ u đến v, trái với tính chất đường đi từ u

đến v đã chọn.

Định lý 17.1: Cho T là một đồ thị có n 2 đỉnh. Các điều sau là tương đương:

1) T là một cây.

2) T liên thông và có n1 cạnh.

3) T không chứa chu trình và có n1 cạnh.

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

5) Giữa hai đỉnh phân biệt bất kỳ của T luôn có duy nhất một đường đi sơ cấp.

6) T không chứa chu trình nhưng khi thêm một cạnh mới thì có được một chu trình duy

nhất.

Chứng minh: 1)2) Chỉ cần chứng minh rằng một cây có n đỉnh thì có n1 cạnh. Ta

chứng minh bằng quy nạp. Điều này hiển nhiên khi n=2. Giả sử cây có k đỉnh thì có k1 cạnh,

ta chứng minh rằng cây T có k+1 đỉnh thì có k cạnh. Thật vậy, trong T nếu ta xoá một đỉnh

a

b

c f

d

e

g h j

i

k

l

m

n

Page 130: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 129

treo và cạnh treo tương ứng thì đồ thị nhận được là một cây k đỉnh, cây này có k1 cạnh, theo

giả thiết quy nạp. Vậy cây T có k cạnh.

2)3) Nếu T có chu trình thì bỏ đi một cạnh trong chu trình này thì T vẫn liên thông. Làm lại

như thế cho đến khi trong T không còn chu trình nào mà vẫn liên thông, lúc đó ta được một

cây có n đỉnh nhưng có ít hơn n1 cạnh, trái với 2).

3)4) Nếu T có k thành phần liên thông T1, ..., Tk lần lượt có số đỉnh là n1, ..., nk (với n1+n2+

+nk=n) thì mỗi Ti là một cây nên nó có số cạnh là ni1. Vậy ta có

n1=(n11)+(n21)+ ... +(nk1)=(n1+n2+ +nk)k=nk.

Do đó k=1 hay T liên thông. Hơn nữa, khi bỏ đi một cạnh thì T hết liên thông, vì nếu còn liên

thông thì T là một cây n đỉnh với n2 cạnh, trái với điều đã chứng minh ở trên.

4)5) Vì T liên thông nên giữa hai đỉnh phân biệt bất kỳ của T luôn có một đường đi sơ cấp,

nhưng không thể được nối bởi hai đường đi sơ cấp vì nếu thế, hai đường đó sẽ tạo ra một chu

trình và khi bỏ một cạnh thuộc chu trình này, T vẫn liên thông, trái với giả thiết.

5)6) Nếu T chứa một chu trình thì hai đỉnh bất kỳ trên chu trình này sẽ được nối bởi hai

đường đi sơ cấp. Ngoài ra, khi thêm một cạnh mới (u,v), cạnh này sẽ tạo nên với đường đi sơ

cấp duy nhất nối u và v một chu trình duy nhất.

6)1) Nếu T không liên thông thì thêm một cạnh nối hai đỉnh ở hai thành phần liên thông

khác nhau ta không nhận được một chu trình nào. Vậy T liên thông, do đó nó là một cây.

17.1.2. Cây khung của đồ thị

Định nghĩa 17.2. Giả sử G = (V, E) là đồ thị vô hướng liên thông. Cây T = (V, F) với F E

được gọi là cây khung của đồ thị G.

Ví dụ 17.2 Đồ thị G và cây khung của nó được cho trong hình 17.2

Hình 17.2 Đồ thị và các cây khung của nó.

Định lý sau đây cho biết số lượng cây khung của đồ thị đầy đủ Kn:

Định lý 17.2 (Cayley) Số lượng cây khung của đồ thị Kn là nn-2.

Định lý 17.2 cho thấy số lượng cây khung của đồ thị là một số rất lớn.

Page 131: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 130

Bây giờ ta xét áp dụng của thuật toán tìm kiếm theo chiều sâu và theo chiều rộng trên

đồ thị để xây dựng cây khung của đồ thị vô hướng liên thông. Trong cả hai trường hợp mỗi

khi ta đến được đỉnh mới u (tức Chuaxet[u]=true) từ đỉnh v thì cạnh (v, u) sẽ được kết nạp vào

cây khung. Hai thuật toán tương ứng được trình bày trong hai thủ tục sau đây.

void treeDFS(v) {/* tim kiem theo chieu sau ap dung vao tim tap canh cua cay khung T cua do thi vo huong lien thong G cho boi danh sach ke. Cac bien Chuaxet, Ke, T la biến toan cuc*/

Chuaxet[v]:=false; for u Ke(v) if (Chuaxet[u] ) {

Et:=Et (u,v); treeDFS(u);

} } static public void Main() {

for u V Chuaxet[u]:=true; Et:= ; // Et la tap canh cua cay khung treeDFS(root);// root la dinh nao do cua do thi

}

void treeBFS(v) {

/* tim kiem theo chieu rong ap dung tim tap canh cua cau khung T cua do thi vo huong lien thong G/cho boi danh sach Ke */

Queue:=; Queue r; Chuaxet[r]:=false; while (Queue != ) {

V Queue; for r Ke(v) if (Chuaxet[u]) {

Queue u; Chuaxet[u]:=false; Et:= Et (u,v);

} }

} static public void Main()

{ for u V do Chuaxet[u]:=true; Et:= ; (* Et la tap canh cua cay khung *) treeBFS(root); (* root la mot dinh tuy y cua do thi *)

}

Page 132: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 131

17.2. Bài toán cây khung nhỏ nhất

Bài toán cây khung nhỏ nhất của đồ thị là một trong số những bài toán tối ưu trên đồ

thị tìm được ứng dụng trong nhiều lĩnh vực khác nhau của đời sống. Trong mục này chúng ta

trình bày những thuật toán cơ bản để giải bài toán nào. Trước hết chúng ta phát biểu nội dung

bài toán.

Cho G =(V,E) là đồ thị vô hướng liên thông với tập đỉnh V ={1, 2, . . . ,n} và tập cạnh

E gồm m cạnh. Mỗi cạnh e của đồ thị G được gán với một số không âm c(e), gọi là độ dài của

nó. Giả sử H=(V,Et) là cây khung của đồ thị G. Ta gọi độ dài C(H) của cây khung H là tổng

độ dài các cạnh của nó:

( ) ( )e Et

C H c e

Bài toán đặt ra là trong tất cả cây khung của đồ thị G hãy tìm cây khung với độ dài

nhỏ nhất. Cây khung như vậy như vậy được gọi là cây khung nhỏ nhất của đồ thị và bài toán

đặt ra được gọi là bài toán cây khung nhỏ nhất.

Để minh hoạ cho những ứng dụng bài toán cây khung nhỏ nhất, dưới đây, ta phát biểu

hai mô hình thực tế tiêu biểu của nó.

Bài toán xây dựng hệ thống đường sắt. Giả sử ta muốn xây dựng một hệ thống

đường sắt nối n thành phố sao cho hành khách có thể đi từ bất kỳ một thành phố nào đến bất

kỳ một trong các thành phố còn lại. Mặt khác trên quan điểm kinh tế đòi hỏi là chi phí xây

dựng hệ thống đường phải nhỏ nhất. Rõ ràng đồ thị mà đỉnh là các thành phố còn các cạnh là

các tuyến đường sắt nối các thành phố tương ứng với phương án xây dựng tối ưu phải là cây.

Vì vây, bài toán đặt ra dẫn về bài toán tìm cây khung nhỏ nhất trên đồ thị đầy đủ n đỉnh, mỗi

đỉnh tương ứng với một thành phố, với độ dài trên các các cạnh chính là chi phí xây dựng

đường ray nối hai thành phố tương ứng (chú ý là trong bài toán này ta giả thiết là không xây

dựng tuyến đường sắt có các nhà ga phân tuyến nằm ngoài các

thành phố).

Bài toán nối mạng máy tính. Cần nối mạng một hệ thống gồm n máy tính đánh

số từ 1 đến n. Biết chi phí nối máy i với máy j là c[i,j], i,j = 1, 2, . . . ,n ( thông thường chi phí

này phụ thuộc vào độ dài cáp nối cần sử dụng). Hãy tìm cách nối mạng sao cho tổng chi phí

nối mạng là nhỏ nhất.

Để giải bài toán cây khung nhỏ nhất, tất nhiên có thể liệt kê tất cả các cây khung của

đồ thị và chọn trong số cây khung ấy cây khung nhỏ nhất. Phương pháp như vậy, trong trường

hợp đồ thị đầy đủ, sẽ đòi hỏi thời gian cỡ nn-2, và rõ ràng không thể thực hiện được ngay cả

với những đồ thị với số đỉnh cỡ hàng chục. Rất may là đối với bài toán cây khung nhỏ nhất

chúng ta đã có những thuật toán rất hiệu quả để giải chúng. Chúng ta xét hai trong số những

thuật toán như vậy: Thuật toán Kruskal và Thuật toán Prim trong phần 17.4 và 17.5.

Page 133: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 132

17.3 Xây dựng tập các chu trình cơ bản của đồ thị

Bài toán xây dựng cây khung của đồ thị liên quan chặt chẽ đến một số bài toán ứng

dụng khác của lý thuyết đồ thị: bài toán xây dựng tập các chu trình cơ bản của đồ thị mà ta sẽ

xét trong mục này.

Giả sử G=(V, E) là đơn đồ thị vô hướng liên thông, H=(V, T) là cây khung của nó.

Các cạnh của đồ thị thuộc cây khung ta sẽ gọi là các cạnh trong, còn các cạnh còn lại sẽ gọi là

cạnh ngoài.

Định nghĩa 17.3 Nếu thêm một cạnh ngoài e E\T vào cây khung H chúng ta sẽ thu được

đúng một chu trình trong H, ký hiệu chu trình này là Ce. Tập các chu trình = { Ce: e E\T

} được gọi là tập các chu trình cơ bản của đồ thị G.

Giả sử A và B là hai tập hợp, ta đưa vào phép toán sau

A B = ( A B) \ ( A B).

Tập A B được gọi là hiệu đối xứng của hai tập A và B.

Tên gọi chu trình cơ bản gắn liền với sự kiện là mỗi chu trình của đồ thị đều có thể thu

được từ các chu trình cơ bản như chỉ ra trong định lý sau đây:

Định lý 17.3 Giả sử G=(V,E) là đồ thị vô hướng liên thông, H=(V,T) là cây khung của nó.

Khi đó mọi chu trình của đồ thị G điều có thể biểu diễn như là hiệu đối xứng của một số các

chu trình cơ bản.

Việc tìm tập hợp chu trình cơ bản giữ một vai trò quan trọng trong vấn đề giải tích

mạng điện. Cụ thể hơn, theo mỗi chu trình cơ bản của đồ thị tương ứng với mạng điện cần

phân tích ta sẽ thiết lập được một phương trình tuyến tính theo định luật Kirchoff: tổng hiệu

điện thế dọc theo một mạch vòng là bằng không. Hệ thống phương trình tuyến tính thu được

cho phép tính toán hiệu điện thế trên mọi đường dây của lưới điện.

Ta sẽ xây dựng thuật toán xây dựng các chu trình cơ bản dựa trên thủ tục tìm kiếm

theo chiều sâu trên đồ thị. Thuật toán có cấu trúc tương tự như thuật toán xây dựng cây khung

theo thủ tục tìm kiếm theo chiều sâu mô tả trong mục trước.

Thuật toán xây dựng tập các chu trình cơ bản

Giả thiết rằng đồ thị G=(V,E) được mô tả bằng danh sách Ke(v),v V.

Void Cycle(v) /* tim kiem cac chu trinh co ban cua thanh phan lien thong chua dinh v; cac bien d, num, stack, index la bien toan cuc */ {

d=d+1; stack[d]=v; num=num+1;index[v]=num; for u Ke(v) do if (index[u]==0) cycle(u); else if ((u != stack[d-1]) && (index[v]>index[u]))

<Ghi nhan chu trinh stack[d], stack[d-1],. . ., stack[c], voi stack[c]=u>

Page 134: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 133

d=d-1; } static public void Main()

{ for v V Index[v]=0; num=0; d=0; stack[0]=0; for v V do if (Index[v]==0 ) cycle(v);

}.

Chú ý: Độ phức tạp tính toán của thuật toán vừa mô tả là O(|E| |V| ).

17.4 Thuật toán Kruskal

Thuật toán Kruskal làm việc kém hiệu quả với những đồ thị dày (đồ thị với số cạnh m

n(n-1)/2), nhưng sẽ là hiệu quả hơn với những đồ thị mỏng(ít cạnh so với số đỉnh). Thuật

toán sẽ xây dựng tập cạnh T của cây khung nhỏ nhất H=(V,T) theo từng bước. Trước hết sắp

xếp các cạnh của đồ thị G theo thứ tự không giảm của độ dài. Bắt đầu từ tập T=, ở mỗi bước

ta sẽ lần lượt duyệt trong danh sách cạnh đã sắp xếp, từ cạnh có độ dài nhỏ đến cạnh có độ dài

lớn hơn, để tìm ra cạnh mà việc bổ sung nó vào tập T gồm n-1 cạnh. Cụ thể, thuật toán có thể

mô tả như sau:

void Kruskal() {

T=; while( |T| < (n-1) && (E!=) ) {

E=E \ {e} if (T {e} không chứa chu trình) T= T {e} ;

} if (|T| < n-1) Đồ thị không liên thông;

}

Ví dụ 17.3Tìm cây khung nhỏ nhất của đồ thị cho trong hình 17.3 dưới.

Bước khởi tạo. Đặt T= . Sắp xếp các cạnh của đồ thị theo thứ tự không giảm của độ

dài ta có dãy:

(3,5), (4,6), (4,5), (5,6), (3,4), (1,3), (2,3), (2,4), (1,2)

dãy độ dài tương ứng của chúng

4, 8, 9, 14, 16, 17, 18, 20, 23.

Ở ba lần gặp đầu tiên ta lần lượt bổ sung vào tập T các cạnh (3,5), (4,6), (4,5). Rõ ràng

nếu thêm cạnh (5,6) vào T thì sẽ tạo thành 2 cạnh (4,5), (4,6) đã có trong T chu trình. Tình

Page 135: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 134

huống tương tự cũng xảy ra đối với cạnh (3,4) là cạnh tiếp theo của dãy. Tiếp theo ta bổ sung

cạnh (1,3), (2,3) vào T và thu được tập T gồm 5 cạnh:

T = { (3,5), (4,6), (4,5), (1,3), (2,3) }

Chứng minh tính đúng đắn của thuật toán

Rõ ràng đồ thị thu được theo thuật toán có n-1 cạnh và không có chu trình, vì vậy theo

định lý 17.1 nó là cây khung của đồ thị G. Như vậy, chỉ còn phải chỉ ra rằng T có độ dài nhỏ

nhất. Giả sử tồn tại cây S của đồ thị G mà c(S) < c(T). Ký hiệu ek là cạnh đầu tiên trong dãy

các cạnh của T xây dựng theo thuật toán vừa mô tả không thuộc S. khi đó đồ thị con của G

sinh bởi cây S được bổ sung cạnh ek sẽ chứa một chu trình C duy nhất đi qua ek. Do chu trình

C phải chứa cạnh e thuộc S nhưng không thuộc T nên đồ thị con thu được từ S bằng cách thay

cạnh e của nó bởi cạnh ek (ký hiệu đồ thị là S’) sẽ là cây khung. Theo cách xây dựng c(ek) ≤

c(e) do đó c(S’) ≤ c(S), đồng thời số cạnh chung của S’ và T đã tăng thêm 1 so với số cạnh

chung của S và T. Lặp lại quá trình trên từng bước một ta có thể biến đổi S thành T và trong

mỗi bước tổng độ dài không tăng, tức là c(T) ≤ c(S). Mâu thuẫn thu được chúng tỏ T là cây

khung nhỏ nhất.

Về việc lập trình thực hiện thuật toán

Khối lượng tính toán nhiều nhất của thuật toán chính là ở bước sắp xếp các cạnh của

đồ thị theo thứ tự không giảm của độ dài để lựa chọn cạnh bổ sung. Đối với đồ thị m cạnh cần

phải thực hiện mlogm phép toán để sắp xếp các cạnh của đồ thị thành dãy không giảm theo độ

dài. Tuy nhiên, để xây dựng cây khung nhỏ nhất với n-1 cạnh, nói chung ta không cần phải

sắp thứ tự toàn bộ các cạnh mà chỉ cần xét phần trên của dãy đó chứa r < m cạnh. Để làm việc

đó ta có thể sử dụng các thủ tục sắp xếp dạng Vun đống (Heap Sort). Trong thủ tục này, để

tạo đống đầu tiên ta mất cỡ O(m) phép toán, mỗi phần tử tiếp theo trong đống có thể tìm sau

thời gian O(log m). Vì vậy, với cải tiến này thuật toán sẽ mất thời gian cỡ O(m+p) log m) cho

việc sắp xếp các cạnh. Trong thực tế tính toán số p nhỏ hơn rất nhiều so với m.

Vấn đề thứ hai trong việc thể hiện thuật toán Kruskal là việc lựa chọn cạnh để bổ sung

đòi hỏi phải có một thủ tục hiệu quả kiểm tra tập cạnh T {e} có chứa chu trình hay không.

Để ý rằng, các cạnh trong T ở các bước lặp trung gian sẽ tạo thành một rừng. Cạnh e cần khảo

sát sẽ tạo thành chu trình với các cạnh trong T khi và chỉ khi cả hai đỉnh đầu của nó thuộc vào

cùng một cây con của rừng nói trên. Do đó, nếu cạnh e không tạo thành chu trình với các cạnh

trong T, thì nó phải nối hai cây khác nhau trong T. vì thế, để kiểm tra xem có thể bổ sung

cạnh e vào T ta chỉ cần kiểm tra xem nó có nối hai cây khác nhau trong T hay không. Một

trong các phương pháp hiệu quả để thực hiện việc kiểm tra này là ta sẽ phân hoạch tập các

đỉnh của đồ thị ra thành các tập con không giao nhau, mỗi tập xác định bởi một cây con trong

T(được hình thành ở các bước do việc bổ sung cạnh vào T). chẳng hạn, đối với đồ thị trong ví

dụ 3, đầu tiên ta có sáu tập con 1 phần tử: {1}, {2}, {3}, {4}, {5}, {6} . Sau khi bổ sung cạnh

(3, 5), ta có các tập con {1}, {2}, {3,5}, {4}, {6} . Ở bước thứ 3, ta chọn cạnh (4, 5), khi đó

hai tập con được nối lại và danh sách các tập con là {1}, {2}, {3, 5, 4, 6}. Cạnh có độ dài tiếp

theo là (4,6), do hai đầu của nó thuộc vào cùng một tập con {3,4,5,6}, nên nó sẽ tạo thành chu

trình trong tập này. Vì vậy cạnh này không được chọn. Và thuật toán sẽ tiếp tục chọn cạnh

tiếp theo để khảo sát …

Page 136: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 135

Như vậy, để giải quyết vấn đề thứ hai này ta phải xây dựng hai thủ tục: Kiểm tra xem

hai đầu u, v của cạnh e=(u,v) có thuộc vào hai tập con khác nhau hay không, và trong trường

hợp câu trả lời là khẳng định, nối hai tập con tương ứng thành một tập. Chú ý rằng mỗi tập

con trong phân hoạch có thể lưu trữ như là một cây có gốc, và khi đó mỗi gốc sẽ được sử

dụng làm nhãn nhận biết tập con tương ứng.

17.5. Thuật toán Prim

Trong trường hợp đó thuật toán Prim tỏ ra hiệu quả hơn với những đồ thị dày. Thuật

toán Prim còn được gọi là phương pháp lân cận gần nhất. Trong phương pháp này bắt đầu từ

một đỉnh tuỳ ý của đồ thị, đầu tiên ta nối s với đỉnh lân cận gần nó nhất, chẳng hạn là đỉnh y.

Nghĩa là trong số các cạnh kề của đỉnh s, cạnh (s,y) có độ dài nhỏ nhất. Tiếp theo trong số các

cạnh kề với hai đỉnh s hoặc y ta tìm cạnh có độ dài nhỏ nhất, cạnh này dẫn đến đỉnh thứ ba z,

và ta thu được cây bộ phận gồm 3 đỉnh và 2 cạnh. Quá trình này sẽ tiếp tục cho đến khi ta thu

được cây gồm n đỉnh và n-1 cạnh sẽ chính là cây khung nhỏ nhất cần tìm.

Giả sử đồ thị cho bởi ma trận trọng số C = {c[i,j], i, j= 1, 2, . . ., n} . trong quá trình

thực hiện thuật toán, ở mỗi bước để có thể nhanh chóng chọn đỉnh và cạnh cần bổ sung vào

cây khung, các đỉnh của đồ thị sẽ được gán cho các nhãn. Nhãn của một đỉnh v sẽ gồm hai

phần và có dạng [d[v], near[v]], trong đó d[v] dùng để ghi nhận độ dài của cạnh có độ dài nhỏ

nhất trong số các cạnh nối với đỉnh v với các đỉnh của cây khung đang xây dựng (ta sẽ gọi là

khoảng cách từ đỉnh v đến tập đỉnh của cây khung), nói một cách chính xác

d[v]= min {c[v,w]: w VH } ( = c[v,z]),

còn near[v] ghi nhận đỉnh của cây khung gần v nhất (near[v]=z).

Thuật toán Prim được mô tả đầy đủ trong thủ tục sau:

void Prim() {// buoc khoi tao chon s la mot dinh nao do cua do thi;

VH={s} ; T= ; d[s]=0; near[s]=s. for (v V\VH) {

D[v]=c[s,v]; near[v]=s;

}// buoc lap stop=false; while(!stop) {

tim u V\VH thoa man: d[u] =min {d[v]: u V\VH } ;

VH= VH { u} ; T = T {(u, near[u])} ; if( |VH | == n ) {

H=( VH,T) la cay khung nho nhat cua do thi; Stop=true;

Page 137: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 136

} else

for (v V\ VH) if (d[v]>c[u,v]) {

d[v]=c[u,v]; near[v]=u;

}

} }

Ngoài ra, ta có thể thực hiện cũng theo ý tưởng này(chi tiết trong giáo trình bài tập)

Ví dụ 17.4 Tìm cây khung nhỏ nhất cho đồ thị xét trong hình 17.3.

Hình 17.3 Đồ thị và cây khung nhỏ nhất

Ma trận trọng số của đồ thị có dạng

1 2 3 4 5 6

1 0 33 17

2 33 0 18 20

C = 3 17 18 0 16 4

4 20 16 0 9 8

5 4 9 0 14

6 8 14 0

Bảng dưới đây ghi nhãn của các đỉnh trong các bước lặp của thuật toán, đỉnh đánh dấu

* là đỉnh được chọn để bổ sung vào cây khung (khi đó nhãn của nó không còn bị biến đổi

trong các bước lặp tiếp theo, vì vậy ta đánh dấu – để ghi nhận điều đó):

Bước Đỉnh 1 Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 VH T

K.tạo [0,1] [33,1] [17,1]* [- ,1] [- ,1] [- ,1] 1

Page 138: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 137

1 - [18,3] - [16,3] [4,3]* [ ,1] 1,3 (3,1)

2 - [18,3] - [9,5] - [14,5] 1,3,5 (3,1), (5,3)

3 - [18,3] - - - [8,4] 1,3,5,4 (3,1), (5,3), (4,5)

4 - [18,3]* - - - - 1,3,5,4,6 (3,1), (5,3), (4,5), (6,4)

5 - - - - - - 1,3,5,4,6,2 (3,1), 5,3), (4,5), 6,4),

(2,3)

Bài 18 Ứng dụng của bài toán đồ thị liên thông liên thông và bài

toán cây khung nhỏ nhất

18.1. Thuật toán duyệt đồ thị và bài toán liên thông

Bài 1 Duyệt đồ thị theo chiều sâu và duyệt theo chiều rộng trên đồ thị sau:

Bài 2 Có N thành phố với tên từ 1 dến

N, N<100. Giữa một số cặp thành phố đã có thiết kế đường 2 chiều.

1. Liệu thiết kế hệ thống đường đã đảm bảo việc đi lại giữa 2 thành phố bất kì chưa?

2. Nếu câu trả lời của câu 1 là chưa, hãy xét xem cần thiết kế thêm ít nhất những đưòng để có

thể đảm bảo việc đi lại giữa 2 thành phố bất kì.

3. Nếu câu trả lời 1 là rồi, hãy chọn một số đường cần xây dựng để có thể đảm bảo việc đi lại

giữa 2 thành phố bất kì.

Bài 3 Theo thiết kế, 1 mạng giao thông gồm N nút có tên từ 1 đến N, N<=100. Chi phí để xây

dựng đường 2 chiều trực tiếp từ nút i đến nút j bằng a[i,j]=a[j,i], với mọi i, a[i,i]=0. Hai tuyến

đường khác nhau không cắt nhau tại điểm không là đầu mút. Hiện đã xây dựng được k tuyến

đường.

Bài toán đặt ra như sau: Hệ thống đường đã xây dựng đã bảo đảm sự đi lại giữa 2 nút bất kỳ

chưa? Nếu chưa, hãy chọn 1 số tuyến đường cần xây dựng thêm sao: Các tuyến đường sẽ xây

dựng thêm cùng các tuyến đường đã xây dựng bảo đảm sự đi lại giữa 2 nút bất kỳ.

Page 139: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 138

18.2. Một số thuật toán xây dựng cây khung(*)

Xây dựng cây khung bằng thuật toán tìm kiếm trên đồ thị

Sử dụng thuật toán tìm kiếm theo chiều rộng (BFS) hay tìm kiếm theo chiều sâu

(DFS), bắt đầu từ một đỉnh S của đồ thị G. Tại mỗi bước từ đỉnh u đến thăm đỉnh v thì ta ghi

nhận thêm một cạnh (u,v) vào cây khung.

Đồ thị G liên thông, xuất phát từ đỉnh S duyệt qua tất cả các đỉnh còn lại, mỗi đỉnh chỉ

đúng một lần, ghi nhận được n–1 cạnh. Lúc đó, ta đã xây dựng được một cây khung của đồ thị

G.

Trong cả hai trường hợp mỗi khi ta đến được đỉnh mới u (tức Chuaxet[u]=true) từ đỉnh

v thì cạnh (v, u) sẽ được kết nạp vào cây khung. Hai thuật toán tương ứng được trình bày

trong bài 17.

Xây dựng cây khung bằng thuật toán hợp nhất các vùng liên thông

Ý tưởng: đặt T = (V,) không chứa cạnh nào. Có thể xem đồ thị T gồm n thành phân liên

thông, mỗi thành phần liên thông chỉ có một đỉnh. Sau đó, lần lượt xét các cạnh của G. Nếu

cạnh đang xét nối 2 thành phần liên thông khác nhau trong T thì thêm cạnh đó vào đồ thị T

(hợp nhất 2 thành phần liên thông đó thành một thành phần liên thông trong T). Làm như vậy

sẽ đưa n–1 cạnh vào đồ thị T. Lúc đó, đồ thị T là cây khung của đồ thị G.

Thực hiện:

Bước 1: khởi tạo:

Xem mỗi đỉnh u thuộc một thành phần liên thông có mã là c[u]=u (mục đích mã liên thông

để biết 2 đỉnh khác nhau có cùng thuộc một thành phần liên thông không:

2 đỉnh u và v có c[u] = c[v] thì đỉnh u và v cùng thuộc một thành phần liên thông.

2 đỉnh u và v có c[u] != c[v] thì đỉnh u và v thuộc 2 thành phần liên thông khác nhau)

Số cạnh được đưa vào cây khung: sc = 0

Bước 2: Duyệt tất cả các cạnh của đồ thị:

Nếu sc = n – 1 thì dừng vòng duyệt

Nếu cạnh (u,v) có c[u] != c[v] (đỉnh u và v thuộc 2 thành phần liên thông khác nhau, sẽ hợp

nhất 2 thành phần liên thông này thành một thành phần liên thông):

Nếu c[u] < c[v] thì tất cả các đỉnh có cùng mã c[v] được gán lại mã là c[u].

Nếu c[u] > c[v] thì tất cả các đỉnh có cùng mã c[u] được gán lại mã là c[v].

Nạp cạnh (u,v) vào cây khung, tăng sc lên 1.

Xây dựng cây khung bằng thuật toán hợp nhất dần các cây:

Đặt T=( V, ) không chứa cạnh nào. Có thể xem T gồm n cây, mỗi cây chỉ có một đỉnh. Sau

đó, lần lượt xét các cạnh của G. Nếu cạnh đang xét nối 2 cây khác nhau trong T thì thêm cạnh

Page 140: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 139

đó vào đồ thị T (hợp nhất 2 cây đó thành một cây trong T). Làm như vậy sẽ đưa n–1 cạnh vào

đồ thị T. Lúc đó, đồ thị T là cây khung của đồ thị G.

18.3. Ứng dụng của bài toán cây khung nhỏ nhất

Bài 4 Áp dụng thuật toán Prim và Kruskal tìm cây khung nhỏ nhất cho đồ thị sau

Bài 5 Tìm cây khung nhỏ nhất cho đồ thị biểu diễn bởi ma trận kề A sau:

0 21 10 30 ∞ 1 7

21 0 13 3 ∞ ∞ ∞

10 13 0 ∞ 6 ∞ 18

30 3 ∞ 0 ∞ 4 ∞

∞ ∞ 6 ∞ 0 5 12

1 ∞ ∞ 4 5 0 2

7 ∞ 18 ∞ 12 2 0

Bài 6 Tìm cây khung nhỏ nhất cho đồ thị biểu diễn bởi ma trận kề A sau:

tìm cây khung nhỏ nhất cho đồ thị vô hướng G=(V,E), V={1, 2, 3, 4, 5, 6, 7} biểu diễn danh

sách cạnh sau:

Dau Cuoi Trongso Dau Cuoi Trongso Dau Cuoi Trongso

1 2 3 2 3 1 4 6 4

1 3 5 2 6 3 4 7 11

1 7 8 2 7 6 5 6 15

Bài 7 Xây dựng đường ống nước

Page 141: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 140

Có 1 trạm cấp nước và N điểm dân cư. Hãy xây dựng chương trình thiết kế tuyến đường ống

nước cung cấp đến mọi nhà sao cho tổng chiều dài đường ống phải dùng là ít nhất. Giả sử

rằng các đường ống chỉ được nối giữa 2 điểm dân cư hoặc giữa trạm cấp nước với điểm dân

cư.

18.4 Cài đặt thuật toán Prim/Kruskal

18.4.1. Cài đặt thuật toán Prim

Tìm cây bao trùm nhỏ nhất của đồ thị G dùng thuật toán Prim

Thuật toán Prim còn được gọi là phương pháp lân cận gần nhất: Đưa dần các đỉnh vào cây

khung. Mỗi lần, chọn một đỉnh (chưa xét) là đỉnh kề gần nhất (trọng số nhỏ nhất) với

một trong các đỉnh đã được đưa vào cây khung.

Nghĩa là: Đầu tiên đưa một đỉnh tuỳ ý vào cây khung.

Lần lượt đưa n–1 cạnh vào cây khung bằng cách: mỗi lần chọn một cạnh có

trong số nhỏ nhất sao cho cạnh đó chỉ có một đỉnh đã thuộc cây khung.

using System; using System.Text; using System.IO; namespace LTDT { class caykhungNN { static string filename = "d:/g5.dsc"; /* tep luu do thi VH co TrSo theo dinh dang sau: d1: luu so dinh , so canh. d2..dm+1: lan luot luu (dinh dau, dinh cuoi, trong so cua canh)*/ static int[,] E, T; static int n, m; //n la so dinh cua do thi, m la so canh cua do thi G static int[] VT = new int[1]; static bool[] xet; //doc do thi (BD theo ma tran ke) tu tep txt static public void doctep(string filename) //hien thi do thi static private void hien_dt(int[,] x) //ham kiem tra 1 so co nam trong 1 mang ko? //ten n dinh cua dt la 1,2,..n; ta coi nhu ten cac dinh la 0..n-1 static void Prim() { //khoi tao int TSmax; /*lam bien trung gian de tim canh co TS min thuoc 1 trong cac dinh thuoc dinh trong mang VT*/ int d = 0, c = 0; //bien trung gian luu dinh dau va dinh cuoi cua 1 canh khi xet int count = 0; //dem so canh cua cay khung T thu dc Console.Write("nhap ten dinh xuat phat: "); int xp = int.Parse(Console.ReadLine()); //xp--; VT[0] = xp; //dua dinh xp vao tap dinh cua cay

Page 142: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 141

//bat dau lap de tim CKNN theo Prim while (count < n - 1) //lap chon canh+dinh de dua cao cay { TSmax = int.MaxValue; //lan luot xet cac canh cua G, chon ... for (int i = 0; i < m; i++) if ((xet[E[i, 0]]==false) && (xet[E[i, 1]]=true) || (xet[E[i, 1]]==false) && (xet[E[i, 0]]=true) && (E[i, 2] < TSmax)) { d = E[i, 0]; c = E[i, 1]; TSmax = E[i, 2]; } /*sau vong lap for o tren, se tim dc 1 trong cac canh co TS min nhat con lai, va ko tao chu trinh voi cac canh trc do them canh tim dc (tgd,tgc) voi trong so=TSmin =>do vao cay khung */ count++; //tang so canh cua cay if (ktin(d, VT)) // dua them dinh vao cay VT[count] = c; else VT[count] = d; T[count - 1, 0] = d; //them canh vao cay T[count - 1, 1] = c; T[count - 1, 2] = TSmax; } } static void Main() { doctep(filename); Prim(); Console.WriteLine("Do thi G BD theo DSCanh nhu sau:"); hien_dt(E); Console.WriteLine("CKNN cua do thi G o tren nhu sau:"); hien_dt(T); Console.ReadKey(); } } }

Page 143: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 142

Ví dụ minh họa:

Hình 18.1 Minh họa từng bước thuật toán Prim tìm cây khung nhỏ nhất

18.4.2. Cài đặt thuật toán Kruskal

Tìm cây bao trùm nhỏ nhất của đồ thị G dùng thuật toán Kruskal

Thuật toán Kruskal xây dựng cây khung nhỏ nhất bằng cách hợp nhất dần các cây:

Cho đồ thị trọng số G=(V,E) liên thông có n đỉnh. Đặt T=( V, ) không chứa cạnh

nào. Có thể xem T gồm n cây, mỗi cây chỉ có một đỉnh. Sau đó, lần lượt xét các cạnh của đồ

thị G (thứ tự lần lượt xét các cạnh theo trọng số từ nhỏ đến lớn). Nếu cạnh đang xét nối 2 cây

khác nhau trong T thì thêm cạnh đó vào đồ thị T (hợp nhất 2 cây đó thành một cây trong T).

Làm như vậy sẽ đưa được n–1 cạnh vào đồ thị T. Lúc đó, đồ thị T là cây khung nhỏ nhất của

đồ thị liên thông G.

Để sắp xếp các cạnh có trọng số từ nhỏ đến lớn, có thể dùng thuật toán HeapSort.

Để kiểm tra cạnh (u,v) có nối 2 cây khác nhau hay không, sử dụng mảng Root vói

Root[i] là gốc của cây chứa đỉnh i. Ngoài ra, nối 2 cây thành một cây, để tránh suy biến, cây

nào có ít đỉnh hơn sẽ là cây con của cây kia. Do đó, cần thêm thông tin số đỉnh của các cây

con. Ta sử dụng luôn mảng Root, nếu dỉnh i là gốc của cây con thì Root[i] là số đỉnh của cây

con có gốc là đỉnh i (sử dụng giá trị âm để tránh lầm lẫn với gốc của cây chứa đỉnh i).

A B C

E D

F G

5

7 8

5 7 9

15

6 8

11

9

chọn cạnh AD có trọng số nhỏ nhất (5) và có

đỉnh A thuộc cây khung

A B C

E D

F G

5

7 8

5 7 9

15

6

8

11

9

chọn cạnh AF có trọng số nhỏ nhất (6) và có

đỉnh D thuộc cây khung

A B C

E D

F G

5

7 8

5 7 9

15

6

8

11

9

chọn cạnh AB có trọng số nhỏ nhất (7) và có

đỉnh A thuộc cây khung

A B C

E D

F G

5

7 8

5 7 9

15

6

8

11

9

chọn cạnh BE có trọng số nhỏ nhất (7) và có

đỉnh B thuộc cây khung

A B C

E D

F G

5

7 8

5 7 9

15

6

8

11

9

chọn cạnh EC có trọng số nhỏ nhất (5) và có

đỉnh E thuộc cây khung

A B C

E D

F G

5

7 8

5 7 9

15

6

8

11

9

chọn cạnh EG có trọng số nhỏ nhất (9) và có

đỉnh E thuộc cây khung

Page 144: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 143

using System; using System.IO; namespace LTDT { class caykhungNN { static string filename = "d:/g5.dsc"; /* tep luu do thi VH co TrSo theo dinh dang sau: d1: luu so dinh , so canh. d2..dm+1: lan luot luu (dinh dau, dinh cuoi, trong so cua canh) */ static int[,] E, T; //E luu do thi G theo DSC, T luu CKNN thu duoc theo DSCanh static int n, m; //n la so dinh cua do thi, m la so canh cua do thi G static int[] VT = new int[1]; //doc do thi (BD theo ma tran ke) tu tep txt static public void doctep(string filename) //hien thi do thi static private void hien_dt(int[,] x) //ten n dinh cua dt la 1,2,..n //ta coi nhu ten cac dinh la 0..n-1 //sap xep cac canh cua G theo chieu tang dan cua Trong So static void swap(ref int[,] a, int i, int j) { int tam; tam = a[i, 0]; a[i, 0] = a[j, 0]; a[j, 0] = tam; tam = a[i, 1]; a[i, 1] = a[j, 1]; a[j, 1] = tam; tam = a[i, 2]; a[i, 2] = a[j, 2]; a[j, 2] = tam; } static void sort(ref int[,] a) { for (int i = 0; i < a.GetLength(0) - 1; i++) for (int j = i + 1; j < a.GetLength(0); j++) if (a[i, 2] > a[j, 2]) swap(ref a, i, j); } static void kruskal() { //sap xep cac canh cua G tang dan doctep(filename); sort(ref E); //nhat canh dau tien, co TSo min => dua vao cay int countT = 1, countG = 1; //countT:so canh cua cay; countG: thu tu canh cua G dc nhat lay de dua vao CKNN T T[countT - 1, 0] = E[0, 0]; T[countT - 1, 1] = E[0, 1]; \ T[countT - 1, 2] = E[0, 2]; VT[E[0, 1] - 1] = VT[E[0, 0] - 1]; //lap qua trinh them canh, tranh tao chu trinh while (countT < n - 1) //countT = so canh cua cay khung = so dinh G-1=n-1 { //nhat canh (x,y) do neu ko tao chi trinh voi cac canh cua T => (VT[x]!=VT[y]) countG++; if (VT[E[countG - 1, 0] - 1] != VT[E[countG - 1, 1] - 1])

Page 145: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 144

{ //dua canh (x,y) => T countT++; T[countT - 1, 0] = E[countG - 1, 0]; T[countT - 1, 1] = E[countG - 1, 1]; T[countT - 1, 2] = E[countG - 1, 2]; } //dong nhat gia tri cua tap con chua 2 dinh (la 2 dau cua canh vua them vao) int tam = VT[E[countG - 1, 1] - 1]; for (int i = 0; i < n; i++) if (VT[i] == tam) VT[i] = VT[E[countG - 1, 0] - 1]; } } static void Main() { kruskal(); Console.WriteLine("Do thi G BD theo DSCanh nhu sau:"); hien_dt(E); Console.WriteLine("CKNN cua do thi G o tren nhu sau:"); hien_dt(T); Console.ReadKey(); } } }

Page 146: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 145

Ví dụ minh họa:

Hình 18.2 Minh họa từng bước thuật toán Kruskal tìm cây khung nhỏ nhất

A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

đồ thị G

A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

cạnh AD và CE có cùng trọng số 5, chọn cạnh AD

(thường theo thứ tự A,B,C….) A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

cạnh CE có trọng số nhỏ nhất là 5 (trong số các cạnh

chưa xét), chọn cạnh CE

A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

chọn cạnh BE có trọng số nhỏ nhất là 7, và nối cây có

cạnh CE vào cây lớn hơn

A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

cạnh AB và BE có cùng trọng số 7, chọn cạnh AB

(thường theo thứ tự A,B,C….)

A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

cạnh DF có trọng số nhỏ nhất là 6 (trong số các cạnh

chưa xét), chọn cạnh DF

A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

cạnh BC và EF có cùng trọng số là 8, nhưng cả 2 cạnh

đều có các đỉnh cùng thuộc một cây nên không được

chọn

A C 8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

cạnh BD có trọng số là 9 nhưng có 2 đỉnh đều

thuộc một cây nên không chọn. cạnh EG có trọng

số nhỏ nhất là 9 (trong số các cạnh chứa xét), chọn

cạnh EG. A C

8 B 7

5 7 9

D

5

15 E

9

G 11

8

6 F

cây khung nhỏ nhất của đồ thị G

Page 147: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 146

Bài 19 Bài toán tìm đường đi ngắn nhất

Trong các ứng dụng thực tế, bài toán tìm đường đi ngắn nhất giữa 2 đỉnh của 1 đồ thị

liên thông có ý nghĩa to lớn ví dụ như trong bài toán chọn 1 hành trình tiết kiệm nhất trên 1

mạng giao thông, bài toán lập lịch thi công các công đoạn nhỏ trong 1 công trình thi công lớn,

bài toán lựa chọn đường truyền tin với chi phí nhỏ nhất trong mạng thông tin vvv…

19.1. Các khái niệm mở đầu

Ta chỉ xét đồ thị có hướng G =(V,E), |V|=n, |E|=m với các cung được gán trọng số,

nghĩa là, mỗi cung (u,v) E của nó được đặt tương ứng với một số thực a(u,v) gọi là trọng số

của nó. Chúng ta sẽ đặt a(u,v) = , nếu (u,v) E. Nếu dãy v0, v1, . . ., vp là một đường đi trên

G, thì độ dài của nó được định nghĩa là tổng sau

p

a(vi-1, vi).

i=1

tức là, độ dài của đường đi chính là tổng của các trọng số trên các cung của nó. (Chú ý rằng

nếu chúng ta gán trọng số cho tất cả cung đều bằng 1, thì ta thu được định nghĩa độ dài của

đường đi như là số cung của đường đi giống như trong các chương trước đã xét).

Bài toán tìm đường đi ngắn nhất trên đồ thị dưới dạng tổng quát có thể phát biểu như

sau: tìm đường đi có độ dài nhỏ nhất từ một đỉnh xuất phát s V đến đỉnh cuối (đích) t V.

Đường đi như vậy ta sẽ gọi là đường đi ngắn nhất từ s đến t còn độ dài của nó ta sẽ ký

hiệu là d(s,t) và còn gọi là khoảng cách từ s đến t (khoảng cách định nghĩa như vậy có thể là

số âm). Nếu như không tồn tại đường đi từ s đến t thì ta sẽ đặt d(s,t)= (trong ngôn ngữ lập

trình cụ thể ta chỉ cần đặt bằng một giá trị đủ lớn).

Rõ ràng, nếu như mỗi chu trình trong đồ thị đều có độ dài dương, trong đường đi ngắn

nhất không có đỉnh nào bị lặp lại (đường đi không có đỉnh lặp lại sẽ gọi là đường đi cơ bản).

Mặt khác nếu trong đồ thị có chu trình với độ dài âm (chu trình như vậy để gọi ngắn gọn ta

gọi là chu trình âm) thì khoảng cách giữa một số cặp đỉnh nào đó của đồ thị có thể là không

xác định, bởi vì, bằng cách đi vòng theo chu trình này một số đủ lớn lần, ta có thể chỉ ra

đường đi giữa các đỉnh này có độ dài nhỏ hơn bất cứ số thực cho trước nào. Trong những

trường hợp như vậy, có thể đặt vấn đề tìm đường đi cơ bản ngắn nhất, tuy nhiên bài toán đặt

ra sẽ trở nên phức tạp hơn rất nhiều, bởi vì nó chứa bài toán xét sự tồn tại đường đi Hamilton

trong đồ thị như là một trường hợp riêng.

19.2. Đường đi ngắn nhất xuất phát từ một đỉnh. Thuật toán Ford-

Bellman

Page 148: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 147

Phần lớn các thuật toán tìm khoảng cách giữa hai đỉnh s và t được xây dựng nhờ kỹ

thuật tính toán mà ta có thể mô tả đại thể như sau: từ ma trận trọng số a[u,v], u,v V, ta tính

cận trên d[v] của khoảng cách từ s đến tất cả các đỉnh v V. Mỗi khi phát hiện

d[u] + a[u,v] < d[v] (1)

cận trên d[v] sẽ được làm tốt lên: d[v] + a[u,v].

Quá trình đó sẽ kết thúc khi nào chúng ta không làm tốt thêm được bất kỳ cận trên

nào. Khi đó, rõ ràng giá trị của mỗi d[v] sẽ cho khoảng cách từ đỉnh s đến đỉnh v. Khi thể hiện

kỹ thuật tính toán này trên máy tính, cận trên d[v] sẽ được gọi là nhãn của đỉnh v, còn việc

tính lại các cận này sẽ được gọi là thủ tục gán. Nhận thấy rằng để tính khoảng cách từ s đến t,

ở đây, ta phải tính khoảng cách từ s đến tất cả các đỉnh còn lại của đồ thị. Hiện nay vẫn chưa

biết thuật toán nào cho phép tìm đường đi ngắn nhất giữa hai đỉnh làm việc thực sự hiệu quả

hơn những thuật toán tìm đường đi ngắn nhất từ một đỉnh đến tất cả các đỉnh còn lại.

Sơ đồ tính toán mà ta vừa mô tả còn chưa xác định, bởi vì còn phải chỉ ra thứ tự các

đỉnh u và v để kiểm tra điều kiện (1). Thứ tự chọn này có ảnh hưởng rất lớn đến hiệu quả của

thuật toán.

Bây giờ ta sẽ mô tả thuât toán ford-Bellman tìm đường đi ngắn nhất từ đỉnh s đến tất cả

các đỉnh còn lại của đồ thị trong trường hợp trọng số của các cung là tuỳ ý, nhưng giả thiết

rằng trong đồ thị không có chu trình âm.

/* Đầu vào: Đồ thị có hướng G=(V,E) với n đỉnh, s V là đỉnh xuất phát, A[u,v], u, v V, ma trận trọng số;

Giả thiết: Đồ thị không có chu trình âm. Đầu ra: Khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v], v V. Trước[v], v V, ghi nhận đỉnh đi trước v trong đường đi ngắn nhất từ s đến v.*/ void ford_Bellman() {

\(* Khởi tạo *) for (v V ) {

d[v]:=a[s,v]; Truoc[v]:=s;

} d[s]:=0; for (k:=1 to n-2 ) for (v V\{ s} ) for (u V ) if (d[v] > d[u] +a[u,v] ) {

d[v]:=d[u]+a[u,v]; Truoc[v]:=u;

} }

Tính đúng đắn của thuật toán có thể chứng minh trên cơ sở trên nguyên lý tối ưu của

quy hoạch động. Rõ ràng là độ phức tạp tính toán của thuật toán là O(n3). Lưu ý rằng chúng ta

có thể chấm dứt vòng lặp theo k khi phát hiện trong quá trình thực hiện hai vòng lặp trong

Page 149: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 148

không có biến d[v] nào bị đổi giá trị. Việc này có thể xảy ra đối với k<n-2, và điều đó làm

tăng hiệu quả của thuật toán trong việc giải các bài toán thực tế. Tuy nhiên, cải tiến đó không

thực sự cải thiện được đánh giá độ phức tạp của bản thân thuật toán. Đối với đồ thị thưa tốt

hơn là sử dụng danh sách kề Ke(v), v V, để biểu diễn đồ thị, khi đó vòng lặp theo u cần viết

lại dưới dạng

for u Ke(v) do

if( d[v] > d[u] + a[u,v])

{D[v]:=d[u]+a[u,v];Truoc[v]:=u;}

Trong trường hợp này ta thu được thuật toán với độ phức tạp O(n,m).

Ví dụ 19.1 Xét đồ thị trong hình 19.1. Các kết quả tính toán theo thuật toán được mô tả trong

bảng dưới đây

Hình 19.1. Minh họa thuật toán Ford_Bellman

d[1] Truoc[1] d[2] Truoc[2] d[3] Truoc[3] d[4] Truoc[4] d[5] Truoc[5]

0, 1 1, 1 , 1 , 1 3, 1

1 0, 1 1, 1 4, 2 4, 2 -1, 3

2 0, 1 1, 1 4, 2 3, 5 -1, 3

3 0, 1 1, 1 4, 2 3, 5 -1, 3

19.3. Trường hợp ma trận trọng số không âm. Thuật toán Dijkstra

Trong trường hợp trọng số trên các cung là không âm thuật toán do Dijkstra đề nghị

làm việc hữu hiệu hơn rất nhiều so với thuật toán ford_Bellman trình bày trong mục trước.

Thuật toán được xây dựng dựa trên cơ sở gán cho các đỉnh các nhãn tạm thời. Nhãn của mỗi

đỉnh cho biết cận của độ dài đường đi ngắn nhất từ s đến nó. Các nhãn này sẽ được biến đổi

theo một thủ tục lặp, mà ở mỗi bước lặp có một nhãn tạm thời trở thành nhãn cố định. Nếu

2

3 3 8

A= 1 -5

4

Page 150: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 149

nhãn của một đỉnh nào đó trở thành một nhãn cố định thì nó sẽ cho ta không phải là cận trên

mà là độ dài của đường đi ngắn nhất từ đỉnh s đến nó.

Thuật toán Dijkstra có thể mô tả như sau:

Bước 1: Khởi tạo

Với đỉnh v V, gọi nhãn d[v] là đường đi ngắn nhất từ s tới v. Ta sẽ tính các d[v].

Ban đầu d[v] được khởi gán bằng c[s, v]. Nhãn của mỗi đỉnh có hai trạng thái tự do hay cố

định, nhãn tự do có nghĩa là có thể còn tối ưu thêm được nữa và nhãn cố định tức là d[v] đã

bằng độ dài đường đi ngắn nhất từ s tới v nên không thể tối ưu thêm. Để làm điều này ta có

thể dùng kỹ thuật đánh dấu: Free[v]= 1 hay 0 tuỳ theo d[v] tự do hay cố định. Ban đầu các

nhãn đều tự do.

Bước 2: Lặp

Bước lặp bao gồm các thao tác:

1. Cố định nhãn: Chọn trong các nhãn tự do, lấy ra đỉnh u là đỉnh có d[u] nhỏ

nhất, và cố định nhãn u.

2. Sửa nhãn: Dùng đỉnh u, xét tất cả những đỉnh v và sửa lại các d[v] theo

công thức:

d[v]= min(d[v], d[u]+ c[u, v])

Bước lặp sẽ kết thúc khi mà đỉnh đích v được cố định nhãn (tìm được đường đi ngắn

nhất từ s tới v); hoặc lặp lại thao tác cố định nhãn, tất cả các đỉnh tự do đều có nhãn là +

(không tồn tại đường đi).

Bước 3: Kết hợp việc lưu vết đường đi trên từng bước sửa nhãn, thông báo đườn đi

ngắn nhất tìm được hoặc cho biết không tồn tại đường đi (d[v]=+ ).

Ví dụ 19.2: Tìm đường đi ngắn nhất từ dỉnh 1 tới các đỉnh còn lại cho bởi ma trận:

0 3 5 15 4 6

9 0 7 11 9 8

6 4 0 12 17 5

7 10 11 0 8 6

6 7 5 4 0 12

9 8 3 5 15 0

Giải:

bước lặp đỉnh 1 đỉnh 2 đỉnh 3 đỉnh 4 đỉnh 5 đỉnh 6

0 0, 1 3 ,1* 5, 1 15, 1 4, 1 6, 1

Page 151: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 150

1 - - 5, 1 14 ,1 4, 1* 6, 1

2 - - 5, 1* 8, 5 - 6, 1

3 - - - 8, 5 - 6, 1*

4 - - - 8, 5* - -

5 - - - - - -

Từ bảng trên là dò đường được đường đi ngắn nhất như sau:

+ 1 đến 3: 1→ 2 Với độ dài 3

+ 1 đến 3: 1→ 3 Với độ dài 5

+ 1 đến 4: 1→ 5 → 4 Với độ dài 8

+ 1 đến 5: 1 → 5 Với độ dài 4

+ 1 đến 6: 1 → 6 Với độ dài 6.

19.4 Đường đi trong đồ thị không có chu trình (*)

Bây giờ ta xét trường hợp riêng thứ hai của bài toán đường đi ngắn nhất, mà để giải nó

có thể xây dựng thuật toán với độ phức tạp tính toán O(n2), đó là khi đồ thị không có chu trình

(còn trọng số trên các cung có thể là các số thực tuỳ ý). Trước hết ta chứng minh định lý sau.

Định lý 19.1 Giả sử G là đồ thị không có chu trình. Khi đó các đỉnh của nó có thể đánh số sao

cho mỗi cung của đồ thị chỉ hướng từ đỉnh có chỉ số nhỏ hơn đến đỉnh có chỉ số lớn hơn,

nghĩa là mỗi cung của nó có sự biểu diễn dưới dạng (v[i], v[j]), trong đó i < j.

Ví dụ 19.3 Đồ thị trong hình 19.2 có các đỉnh số thoả mãn điều kiện nêu trong định lý.

Hình 19.2 Đồ thị không có chu trình.

Để chứng minh định lý ta mô tả thuật toán sau đây, cho phép tìm ra cách đánh số thoả mãn

điều kiện định lý.

/* Đầu vào: Đồ thị có hướng G=(V,E) với n đỉnh không chứa chu trình được cho bởi danh sách kề Ke(v), v V. Đầu ra: Với mỗi đỉnh v V chỉ số NR [v] thoả mãn:

Page 152: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 151

Với mọi cung (u,v) của đồ thị ta đều có NR [u] < NR [v] */ void Numbering()

{ for( v V) Vao[v]=0; // Tính Vao[v]=deg-(v) for (u V )

for (v Ke(u)) Vao[v]=Vao[v]+1;

Queue= ; for (v V)

if (Vao[v]==0) Queue v;

num=0; while (Queue !=) {

u Queue; num=num+1; NR[u]=num; for (v Ke(u) ) {

Vao[v]=Vao[v]-1; if (Vao[v]==0) Queue v;

} }

}

Thuật toán được xây dựng dựa trên ý tưởng rất đơn giản sau: rõ ràng trong đồ thị

không có chu trình bao giờ cũng tìm được đỉnh có bán bậc vào bằng 0 (không có cung đi vào).

Thực vậy, bắt đầu từ đỉnh v1 nếu có cung đi vào nó từ v2 thì ta lại chuyển sang xét đỉnh v2 .

Nếu có cung từ v3 đi vào v2, thì ta lại chuyển sang xét đỉnh v3. . .Do đồ thị không có chu trình

nên sau một số hữu hạn lần chuyển như vậy ta phải đi đến đỉnh không có cung đi vào. Thoạt

tiên, tìm các đỉnh như vậy của đồ thị. Rõ ràng ta có thể đánh số chúng theo thứ tự tuỳ ý bắt

đầu từ 1. Tiếp theo, loại bỏ khỏi đồ thị những đỉnh đã được đánh số cùng các cung đi ra khỏi

chúng, ta thu được đồ thị mới cũng không có chu trình, và thủ tục được lặp với đồ thị mới

này. Quá trình đó sẽ được tiếp tục cho đến khi tất cả các đỉnh của đồ thị được đánh số.

Chú ý:

1) Rõ ràng trong bước khởi tạo ra phải duyệt qua tất cả các cung của đồ thị khi tính

bán bậc vào của các đỉnh, vì vậy ở đó ta tốn cỡ O(m) phép toán, trong đó m là số cung của đồ

thị. Tiếp theo, mỗi lần đánh số một đỉnh, để thực hiện việc loại bỏ đỉnh đã đánh số cùng với

các cung đi ra khỏi nó, chúng ta lại duyệt qua tất cả các cung này. Suy ra để đánh số tất cả các

đỉnh của đồ thị chúng ta sẽ phải duyệt qua tất cả các cung của đồ thị một lần nữa. Vậy độ

phức tạp của thuật toán là O(m).

2) Thuật toán có thể áp dụng để kiểm tra xem đồ thị có chứa chu trình hay không?

Thực vậy, nếu kết thúc thuật toán vẫn còn có đỉnh chưa được đánh số (num<n) thì điều đó có

nghĩa là đồ thị chứa chu trình.

Do có thuật toán đánh số trên, nên khi xét đồ thị không có chu trình ta có thể giả thiết

là các đỉnh của nó được đánh số sao cho mỗi cung chỉ đi từ đỉnh có chỉ số nhỏ đến đỉnh có chỉ

Page 153: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 152

số lớn hơn. Thuật toán tìm đường đi ngắn nhất trên đồ thị không có chu trình được mô tả

trong sơ đồ sau đây.

/* Tìm đường đi ngắn nhất từ đỉnh nguồn đến tất cả các đỉnh còn lại trên đô thị không có chu trình Đầu vào:

Đồ thị G=(V,E), trong đó V={ v[1], v[2], . . ., v[n]} . Đối với mỗi cung (v[i], v[j]) E, ta có i<j. Đồ thị được cho bởi danh sách kề Ke(v), v V.

Đầu ra: Khoảng cách từ v[1] đến tất cả các đỉnh còn lại được ghi trong mảng d[v[i]], i= 2, 3, . . .,n */

void Critical_Path() {

d[v[1]]=0; for( j=2; j<=n;j++) d[v[j]]=a[v[1], v[j]]; for (j=2; j<=n;j++) for (v Ke[v[j]] ) d[v]=min(d[v], d[v[j]]+a[v[j], v]);

}

Độ phức tạp tính toán của thuật toán là O(m), do mỗi cung của đồ thị phải xét qua

đúng một lần.

Các thuật toán được mô tả ở trên thường được ứng dụng vào việc xây dựng những

phương pháp giải bài toán điều khiển việc thực hiện những dự án lớn, gọi tắt là PERT (Project

Evaluation && Review Technique) hay CDM (Critical path Method). Một ví dụ đơn giản cho

ứng dụng này được mô tả trong ví dụ dưới đây.

Công đoạn t[i] Các công đoạn phải được hoàn

thành trước nó

1 15 Không có

2 30 1

3 80 Không có

4 45 2, 3

5 4 4

6 15 2, 3

7 150 5, 6

8 19 5

Ví dụ 19.4 Việc thi công một công trình lớn được chia thành n công đoạn, đánh số từ 1 đến n.

Có một số công đoạn mà việc thực hiện nó chỉ được tiến hành sau khi một sô công đoạn nào

Page 154: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 153

đó đã hoàn thành. Đối với mỗi cong đoạn i biết t[i]] là thời gian cần thiết để hoàn thành nó

(i=1, 2,. . .,n). Dữ liệu với n=8 được cho trong bảng dưới đây

Giả sử thời điểm bắt đầu tiến hành thi công công trình là 0. Hãy tìm tiến độ thi công

công trình (chỉ rõ mỗi công đoạn phải được bắt đầu thực hiện vào thời điểm nào) cho công

trình được hoàn thành xong trong thời điểm sớm nhất có thể được.

Ta có thể xây dựng đồ thị có hướng n đỉnh biểu diễn hạn chế về trình tự thực hiện các

công việc như sau: Mỗi đỉnh của đồ thị tương ứng với một công việc, nếu công việc i phải

được thực hiện trước công đoạn j thì trên đồ thị có cung (i,j), trọng số trên cung này được gán

bằng t[i], xem hình 19.2 dưới đây.

Hình 19.3 Đồ thị minh hoạ PERT.

Thêm vào đồ thị hai đỉnh 0 và n+1 tương ứng với hai sự kiện đặc biệt: đỉnh 0 tương

ứng với công đoạn lễ khởi công, nó phải được thực hiện trước tất cả các công đoạn khác, và

đỉnh n+1 tương ứng với công đoạn cắt băng khánh thành công trình, nó phải được thực hiện

sau các công đoạn, với t[0]=t[n+1]=0 (trên thực tế chỉ cần nối đỉnh 0 với tất cả các đỉnh có

bán bậc bằng 0 và nối tất cả các đỉnh có bán bậc ra bằng 0 với đỉnh n+1). Gọi đồ thị thu được

là G. Rõ ràng bài toán đặt ra dẫn về bài toán tìm đường đi ngắn nhất từ đỉnh 0 đến tất cả các

đỉnh còn lại trên đồ thị G. Do đồ thị G rõ ràng là không chứa chu trình, nên để giải bài toán

đặt ra có thể áp dụng các thuật toán mô tả trên, chỉ cần đổi dấu tất cả các trọng số trên các

cung thành dấu ngược lại, hoặc đơn giản hơn chỉ cần đổi toán tử Min trong thuật toán

Critcal_Path thành toán tử Max. Kết thúc thuật toán, chúng ta thu được d[v] là độ dài đường

đi dài nhất từ đỉnh 0 đến đỉnh v. Khi đó d[v] cho ta thời điểm sớm nhất có thể bắt đầu thực

hiện công đoạn v, nói riêng d[n+1] là thời điểm sớm nhất có thể cắt băng khánh thành, tức là

thời điểm sớm nhất có thể hoàn thành toàn bộ công trình.

Cây đường đi dài nhất của bài toán trong ví dụ 26.2 tìm được theo thuật toán được chỉ ra trong

hình 19.2.

19.5 Đường đi ngắn nhất giữa tất cả các cặp đỉnh (*)

Rõ ràng ta có thể giải bài toán tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh của đồ

thị bằng cách sử dụng n lần thuật toán mô tả ở mục trước, trong đó ta sẽ chọn s lần lượt là các

đỉnh của đồ thị. Rõ ràng, khi đó ta thu được thuật toán với độ phức tạp O(n4) (nếu sử dụng

Page 155: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 154

thuật toán ford_Bellman) hoặc O(n3) đối với trường hợp trọng số không âm hoặc đồ thị không

có chu trình. Trong trường hợp tổng quát, sử dụng thuật toán ford_Bellman n lần không phải

là cách làm tốt nhất. Ở đây ta sẽ mô tả một thuật toán giải bài toán trên với độ phức tạp tính

toán O(n3): thuật toán Floyd. Thuật toán được mô tả trong thủ tục sau đây.

/* Tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh Đầu vào: Đồ thị cho bởi ma trận trọng số a[i,j], i, j =1, 2,. . ,n. Đầu ra:

Ma trận đường đi ngắn nhất giữa các cặp đỉnh d[i,j]=, i,j = 1, 2. . .,n,trong đó d[i,j] cho độ dài đường đi ngắn nhất từ đỉnh i đến đỉnh j. Ma trận ghi nhận đường đi p[i,j], i, j = 1, 2.. ., n,trong đó p[i,j] ghi nhận đỉnh đi trước đỉnh j trong đường đi ngắn nhất từ i đến j. */ void Floyd() {

(* Khởi tạo *) for i=1 to n do for j=1 to n do {

d[i,j]=a[i.j]; p[i.j]=i;

} // Bước lặp for k=1 to n do for i=1 to n do for j=1 to n do if( d[i,j]>d[i,k]+d[k,j] ) {

d[i,j]+d[i,k]+d[k,j]; p[i,j]>p[k,j];

} }

Rõ ràng độ phức tạp tính toán của thuật toán là O(n3).

Page 156: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 155

Bài 20. Ứng dụng của bài toán tìm đường đi ngắn nhất

20.1. Ứng dụng của bài toán tìm đường đi ngắn nhất

Tìm đường trên Google map

Bài toán lập lịch thi công công trình PERT

20.2. Cài đặt thuật toán Dijkstra

using System; using System.IO; namespace LTDT { //thuat toan Dijkstra: giam trong so 1 lan tai moi dinh public class DijkstragiamTS1lan { static string filename = "d:/b3.mtk"; static int[,] a; //luu do thi mtran ke static int xp, kt, n, countxet; // n la so dinh cua do thi, count dem so thu tu khi duyet static int[] truoc, D, kq, xet; //kq luu thhu tu duyet; xet luu trang thai 1 dinh //n la so dinh cua do thi //doc do thi (BD theo ma tran ke) tu tep txt static public void doctep(string filename) //hien thi do thi (BD theo DScanh hoac Mtran ke) static private void hien_dt(int[,] x) //Duyet do thi => dua ra thu tu duyet //ten n dinh cua dt la 1,2,..n //ta coi nhu ten cac dinh la 0..n-1 static private void init() { //danh dau chua xet cho tat ca cac dinh cua do thi //truoc la mang luu ten dinh truoc dinh do; luc dau gan = xp truoc = new int[n]; xet=new int[n]; countxet = 0; for (int i = 0; i < n; i++) { truoc[i] = xp; xet[i]=0;//chua xet } truoc[xp] = -1; //D la mang luu chi so nhan tai cac dinh; luc dau gan chi so nhan tai moi dinh la 1 so cuc lon, tru dinh xp D = new int[n]; for (int i = 0; i < n; i++) D[i] = 100000; D[xp] = 0; } //tt: moi dinh dc ghi 1 chi so nhan:=> tut tg TT la giam chi so nhan nay toi cuc tieu

Page 157: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 156

/*CTDL: sd mang 2 chieu luu do thi BD theo mtran ke =>a[n,n] sd mang 1 chieu luu chi so nhan tai moi dinh cua do thi =>ts[n] sd mang 1 chieu luu dinh truoc cua dinh do (moi dinh cua do thi co 1 dinh ngay trc no, gtri mang trc nay co the thay doi khi phat hien co cach di ma chi so nhan nho hon (=>truoc[n] sd mang 1 chieu luu ket qua: duong di ngan nhat tu dinh xp =>toi dinh ket thuc */ //Tim d?nh chua xét có nhãn = min, n?u t?t c? các d?nh d?u du?c xét r?i=> tr? l?i -1 static public int findmin() { int nhanmin = 10000,dinhmin=1000; for (int i = 0; i < n; i++) if ((xet[i] == 0) && (D[i] < nhanmin)) { nhanmin = D[i]; dinhmin = i; } return dinhmin; } static private void Dijkstra() { init(); //toi khi hang doi rong thi => stop while (countxet<n-1) //chi can xet n-1 dinh la d? { int u = findmin(); //nhat dinh dau hang doi xet[u] = 1; //dánh d?u xét cho d?nh countxet++; for (int v = 0; v < n; v++)//duyet cac dinh ke u de giam chi so nhan tai moi dinh { //tu dinh u dang xet, neu di qua u chi phi it hon thi gan lai D[i] if ((xet[v]==0) &&(a[u, v] > 0) && (D[v] > D[u] + a[u, v])) { D[v] = D[u] + a[u, v]; //phat hien dh di de giam chi so nhan thi = > gan lai D[i] truoc[v] = u; //danh dau tai buoc hien thoi, truoc dinh i la dinh } } } } // in ket qua duong di ra man hinh static void showduong() { Console.WriteLine("\nduong di ngan nhat tu {0} den {1} nhu sau:", xp + 1, kt + 1); for (int i = kq.Length - 1; i > 0; i--) Console.Write("{0} => ", kq[i] + 1); Console.Write("{0}\n", kt + 1); } //dua vao mang truoc[n]: luu dinh truoc=> do lai duong di ngan nhat tu dinh xp toi dinh kt static void timduong()

Page 158: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 157

{ int tg, count = 0; //count de dem so dinh di qua tren dg : xp=>kt tg = kt; kq = new int[1]; while (tg != xp)//truoc[xp]=-1 { kq[count] = tg; tg = truoc[tg]; count++; Array.Resize(ref kq, count + 1); } kq[count] = xp; showduong(); } static void Main() { doctep(filename); Console.Write("nhap ten dinh xuat phat: "); xp = int.Parse(Console.ReadLine()); xp--; for (kt = 0; kt <n; kt++) { Dijkstra(); timduong(); } Console.ReadKey(); } } }

Page 159: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 158

Bài 21 Bài toán luồng cực đại trong mạng

Nhiều bài toán quy hoạch tuyến tính có thể quy về bài toán làm cực tiểu phí tổn vận

chuyển hàng trong một mạng (gồm các nút và các cung đường) sao cho đảm bảo được các

nhu cầu ở một số nút khi đã biết nguồng cung cấp tại một số nút khác. Các bài toán như vậy

được gọi là các bài toán luồng trên mạng (network flow problem) hoặc bài toán chuyển vận

(transshipment problem). Đây là lớp bài toán quan trọng nhất và hay gặp nhất trong quy

hoạch tuyến tính. Lớp này bao gồm các bài toán quen thuộc trong thực tế như: bài toán vận

tải, các bài toán mạng điện và mạng giao thông, các bài toán quản lý và phân bổ vật tư, bài

toán bổ nhiệm, bài toán kế hoạch tài chính, bài toán đường ngắn nhất, bài toán luồng cực đại

Bài toán luồng cực đại trong mạng là một trong số bài toán tối ưu trên đồ thị tìm được

những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý thuyết tổ

hợp. Bài toán được đề xuất vào đầu năm 1950, và gắn liên với tên tuổi của hai nhà toán học

Mỹ là ford và Fulkerson. Trong chương này chúng ra sẽ trình bày thuật toán ford và

Fulkerson để giải bài toán đặt ra và nêu một sô ứng dụng của bài toán.

21.1. Mạng - Luồng trong mạng – Bài toán luồng cực đại

21.1.1 Mạng – Luổng trong mạng

Định nghĩa 21.1 Ta gọi mạng là đồ thị có hướng G = (V,E), trong đó duy nhất một đỉnh s

không có cung đi vào gọi là đỉnh phát, duy nhất một đỉnh t không có cung đi ra gọi là điểm

thu và mỗi cung e=(v,w) E được gán với một số không âm c(e) =c(v,w) gọi là khả năng

thông qua của cung e.

Để thuận tiện cho việc trình bày ta sẽ qui ước rằng nếu không có cung (v,w) thì khả

năng thông qua c(v,w) được gán bằng 0.

Định nghĩa 21.2 Giả sử cho mạng G=(V,E). Ta gọi mạng f trong mạng G=(V,E) ;là ánh xạ f:

ER+ gán cho mỗi cung e =(v,w) E một số thực không âm f(e)=f(v,w), gọi là luồng trên

cung e, thoả mãn các điểu kiện sau:

- Luồng trên cung e E không vượt quá khả năng thông qua của nó:

0≤ f(e) ≤ c(e),

- Điều kiện cân bằng luồng trên mỗi đỉnh của mạng: Tổng luồng trên các cung đi vào

đỉnh v bằng tổng luồng trên các cung đi ra khỏi đỉnh v, nếu v s, t:

Div f (v) = f(w,v) - f(v,w) = 0

w N-(v) w N+(v)

trong đo N-(v) – tập các đỉnh của mạng mà từ đó có cung đến v, N+(v) - tập các đỉnh của

mạng mà từ v có cung đến nó:

N-(v) = { w V: (w,v) E },

Page 160: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 159

N+(v) = { w V: (v,w) E } .

Giá trị của luồng f là số

Val(f) = f(s,w ) = f(w,t).

w N+(s) w N-(t)

21.2. Bài toán luồng cực đại

Bài toán luồng cực đại trong mạng:

Cho mạng G(V,E). Hãy tìm luồng f* trong mạng với giá trị luồng val(f*) là lớn nhất.

Luồng như vậy ta sẽ gọi là luồng cực đại trong mạng.

Bài toán như vậy có thể xuất hiện trong rất nhiều ứng dụng thực tế. Chẳng hạn khi cần

xác định cường độ lớn nhất của dòng vận tải giữa hai nút của một bản đồ giao thông. Trong ví

dụ này lời giải của bài toán luồng cực đại sẽ chỉ cho ta các đoạn đường đông xe nhất và chúng

tạo thành "chỗ hẹp" tương ứng với dòng giao thông xét theo hai nút được chọn. Một ví dụ

khác là nếu xét đồ thị tương ứng với một hệ thống đường ống dẫn dầu. Trong đó các ống

tương ứng với các cung, điểm phát có thể coi là tầu chở dầu, điểm thu là bể chứa, còn những

điểm nối giữa các ống là các nút của đồ thị. Khả năng thông qua của các cung tương ứng với

tiết diện của các ống. Cần phải tìm luồng dầu lớn nhất có thể bơm từ tàu chở dầu vào bể chứa.

21.3. Lát cắt. đường tăng luồng. Định lý Ford_Fulkerson

Định nghĩa 21.3. Ta gọi lát cắt (X, X*) là một cách phân hoạch tập đỉnh V của mạng ra thành

hai tập X và X* = V\X, trong đó s X, t X* . Khả năng thông qua của lát cắt (X, X*) là số

c(X,X*) = c(v,w)

v X

w X*

Lát cắt với khả năng thông qua nhỏ nhất được gọi là lát cắt hẹp nhất.

Bổ đề 21.1 Giá trị của luồng f trong mạng luôn nhỏ hơn hoặc bằng khả năng thông qua của lát

cắt (X, X*) bất kỳ trong nó: val(f) ≤ c(X, X*).

Chứng minh. Cộng các điều kiện cân bằng luồng Divf(v)=0 với mọi v X. Khi đó ta có

( f(w,v ) - f(v,w) ) = -Val(f)

v X w N-(v) w N+(v)

tổng này sẽ gồm các số hạng dạng f(u,v) với dấu cộng hoặc dấu trừ mà trong đó có ít nhất một

trong hai đỉnh u,v phải thuộc tập X. Nếu cả hai đỉnh u,v đều trong tập X, thì f(u,v) xuất hiện

với dấu cộng trong Divf(v) và với dấu trừ trong Divf(u), vì thế, chúng triệt tiêu lẫn nhau. Do

đó, sau khi giản ước các số hạng như vậy ở vế trái, ta thu được

- f(v,w) + f(v,w) = -val(f),

v X v X*

w X* w X

Page 161: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 160

hay là

val(f) = f(v,w) - f(v,w)

v X v X*

w X* w X

Mặt khác, từ điều kiện 1 rõ ràng là

f(v, w) ≤ c(v, w)

v X v X*

w X* w X

còn

- f(v,w) ≤ 0

v X*

w X

suy ra val(f)≤c(X, X*). Bổ đề được chứng minh.

Hệ quả 21.1 Giá trị luồng cực đại trong mạng không vượt quá khả năng thông qua của lát cắt

hẹp nhất trong mạng.

ford và Fulkerson đã chứng minh rằng giá trị luồng cực đại trong mạng đúng bằng khả

năng thông qua của lát cắt hẹp nhất. Để có thể phát biểu và chứng minh kết quả này chúng ra

sẽ cần thêm một số khái niệm.

Giả sử f là một luồng trong mạng G = (V, E). Từ mạng G =(V, E) ta xây dựng đồ thị

có trọng số trên cung Gf = (V, Ef), với tập cung Ef và trọng số trên các cung được xác định

theo qui tắc sau:

- Nếu e = (v,w) E với f(v,w) = 0, thì (v,w) Ef với trọng số c(v,w);

- Nếu e = (v,w) E với f(v,w) =c(v,w), thì (w,v) Ef với trọng số f(v,w);

- Nếu e = (v,w) E với 0 < f(v,w) < c(v,w), thì (v,w) Ef với trọng số c(v,w) - f

(v,w) và (w,v) Ef với trọng số f(v,w).

Các cung của Gf đồng thời cũng là cung của G được gọi là cung thuận, các cung còn

lại được gọi là cung nghịch. Đồ thị Gf được gọi là đồ thị tăng luồng.

Ví dụ 21.1: Các số viết cạnh các cung của G ở Hình 21.1 theo thứ tự là khả năng thông qua và

luồng trên cung.

Page 162: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 161

Hình 21.1 Mạng G và luồng f. Đồ thị có trọng số Gf tương ứng.

Giả sử P = (s = v0, v1, . . ., vk = t) là một đường đi từ s đến t trên đồ thị tăng luồng Gf. Gọi là

giá trị nhỏ nhất của các trọng số của các cung trên đường đi P. Xây dựng luồng f’ trên mạng

theo qui tắc sau:

f(u,v) + , nếu (u,v) P là cung thuận

f’(u,v) = f(u,v) - , nếu (v,u) P là cung nghịch

f(u,v), nếu (u,v) P

Dễ dàng kiểm tra được rằng f’ được xây dựng như trên là luồng trong mạng và val(f’)

= val(f) + . Ta sẽ gọi thủ tục biến đổi luồng vừa nêu là tăng luồng dọc theo đường P.

Định nghĩa 21.3. Ta gọi đường tăng luồng f là mọi đường đi từ s đến t trên đồ thị tăng luồng

G(f).

Page 163: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 162

Định lý 21.1 Các mệnh đề dưới đây là tương đương:

(i) f là luồng cực đại trong mạng;

(ii) không tìm được đường tăng luồng f;

(iii) val(f) = c(X,X*) với một lát cắt (X, X*) nào đó.

Chứng minh.

(i) (ii). Giả sử ngược lại, tìm được đường tăng luồng P. Khi đó ta có thể tăng giá trị

luồng bằng cách tăng luồng dọc theo đường P. Điều đó mâu thuẫn với tính cực đại của luồng

f.

(ii) (iii). Giả sử không tìm được đường tăng luồng. Ký hiệu X là tập tất cả các đỉnh

có thể đến được từ đỉnh s trong đồ thị Gf, và đặt X*=V\X. Khi đó (X, X*) là lát cắt, và f(v,w) =

0 với mọi v X*, w X nên

val(f) = f(v,w) - f(v,w) = f(v,w)

v X v X* v X

w X* w X w X*

Với v X, w X*, do (v,w) Gf, nên f(v,w) = c(v,w). Vậy

val(f) = f(v,w) = c(v,w) = c(X,X*)

v X v X

w X* w X*

(iii) (i). Theo bổ đề 21.1, val(f) ≤ c(X,X*) với mọi luồng f và với mọi lát cắt (X,X*).

Vì vậy, từ đẳng thức val(f) = c(X,X*) suy ra luồng f là luồng cực đại trong mạng.

21.4. Thuật toán tìm luồng cực đại

Định lý 21.1 là cơ sở để xây dựng thuật toán lặp sau đây để tìm luồng cực đại trong

mạng: Bắt đầu từ luồng với luồng trên tất cả các cung bằng 0 (ta sẽ gọi luồng như vậy là

luồng không), và lặp lại bước lặp sau đây cho đến khi thu được luồng mà đối với nó không

còn đường tăng:

Ý tưởng của thuật toán ford – Fulkerson

10 Xuất phát từ một luồng chấp nhận được f.

20 Tìm một đường đi tăng luồng P. Nếu không có thì thuật toán kết thúc. Nếu có, tiếp

bước 3 dưới đây.

30 Nếu (P) = + thuật toán kết thúc.

Trong đó (P) - Lượng luồng tăng thêm, hay nói khác là làm sự tăng luồng (flow

augmentation) dọc theo đường đi tăng luồng P một lượng thích hợp mà các ràng buộc của bài

toán vẫn thoả.

Page 164: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 163

Cách tìm đường đi tăng luồng. Ta sử dụng thuật toán gán nhãn có nội dung như sau.

Một đường đi P thoả mãn về đường đi tăng luồng, nhưng chỉ đi từ s đến k nào đó (chưa tới t,

nói chung) sẽ được gọi là đường đi chưa bão hoà (unsaturated path).

Ta nói đỉnh u là đã đánh dấu (u is labeled) nếu ta biết là có một đường đi chưa bão hoà

từ s tới u. Bây giờ ta sẽ xét tất cả các đỉnh v có nối trực tiếp đến đỉnh u (sẽ gọi là ở cạnh đỉnh

u) xem chúng có thể được gán nhãn hay không khi u đã gán nhãn. Việc này được gọi là thăm

(scanning) đỉnh u.

Nếu (u,v) có luồng trên cung F(u,v) < C(u,v) thì ta có thể nối thêm cung (u,v) và

đường đi chưa bão hoà P từ s đến u để được đường đi chưa bão hoà tới v. Vậy v có thể gán

nhãn.

Bước lặp tăng luồng ( ford - Fulkerson): Tìm dường tăng P đối với luồng hiện có.

Tăng luồng dọc theo đường P.

Khi đã có luồng cực đại, lát cắt hẹp nhất có thể theo thủ tục mô tả trong chứng minh

Định lý 21.1. Sơ đồ của thuật toán ford-Fulkerson có thể mô tả trong thủ tục sau đây:

void Max_Flow() // Thuật toán ford-Fulkerson *)

{

// Khởi tạo: Bắt đầu từ luồng với giá trị 0 *)

for u V do

for v V do

f(u,v) = 0;

stop = false;

while(!stop)

if <Tìm được đường tăng luồng P>

<Tăng luồng dọc theo P>

else

stop=true;

}

Để tìm đường tăng luồng trong G(f) có thể sử dụng thuật toán tìm kiếm theo chiều

rộng (hay tìm kiếm theo chiều sâu), bắt đầu từ đỉnh s trong đó không cần xây dựng tường

minh đồ thị G(f). ford-Fulkerson đề nghị thuật toán gán nhãn chi tiết sau đây để giải bài toán

luồng cực đại trong mạng. Thuật toán bắt đầu từ luồng chấp nhận được nào đó trong mạng (có

thể bắt đầu từ luồng không), sau đó ta sẽ tăng luồng bằng cách tìm các đường tăng luồng. Để

tìm đường tăng luồng ta sẽ áp dụng phương pháp gán nhãn cho các đỉnh. Mỗi đỉnh trong quá

trình thực hiện thuật toán sẽ ở một trong ba trạng thái: chưa có nhãn, có nhãn chưa xét, có

nhãn đã xét. Nhãn của một đỉnh v gồm hai phần và có một trong hai dạng sau: [ ( )p v , ( )v ]

hoặc [ ( ), ( )p v v ]. Phần thứ nhất +p(v) (-p(v)) chỉ ra là cần tăng giảm luồng theo cung

(p(v),v)( cung (v, p(v)) còn phần thứ hai ( )v chỉ ra lượng lớn nhất có thể tăng hoặc giảm

luồng theo cung này. Đầu tiên chỉ có đỉnh s được khởi tạo nhãn và nhãn của nó là chưa xét,

còn tất cả các đỉnh còn lại đều chưa có nhãn. Từ s ta gán nhãn cho tất cả các đỉnh kề với nó và

nhãn của đỉnh s sẽ trở thành đã xét. Tiếp theo, từ một đỉnh v có nhãn chưa xét ta lại gán nhãn

cho tất cả các đỉnh chưa có nhãn kề với nó và nhãn của đỉnh v trở thành đã xét. Quá trình sẽ

Page 165: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 164

được lặp lại cho đến khi hoặc là đỉnh t trở thành có nhãn hoặc là nhãn của tất cả các đỉnh có

nhãn đầu là đã xét nhưng đỉnh t vẫn không có nhãn. Trong trường hợp thứ nhất ta tìm được

đường tăng luồng, còn trong trường hợp thứ hai đối với luồng đang xét không tồn tại đường

tăng luồng (tức là luồng đã cực đại). Mỗi khi tìm được đường tăng luồng, ta lại tăng luồng

theo đường tìm được, sau đó xoá tất cả các nhãn và đổi với luồng mới thu được lại sử dụng

phép gán nhãn các đỉnh để tìm đường tăng luồng. Thuật toán sẽ kết thúc khi nào đối với luồng

đang có trong mạng không tìm được đường tăng luồng.

Trong đó, thuật toán gán nhãn (The labeling algorithm) có thể được mô tả như sau:

Gọi VT là tập mọi đỉnh đã gán nhãn nhưng chưa được thăm. Ta có thuật toán để tìm

đường đi tăng luồng.

Xuất phát với VT = {s} và s là nút đã đánh dấu duy nhất.

Một bước lặp sẽ có VT hiện hành và gồm ba bước như sau.

10 Nếu t VT hoặc VT = , thuật toán kết thúc. Ngược lại thì chọn một đỉnh u VT để

thăm và đưa nó ra khỏi VT. Xét tất cả các đỉnh cạnh u, tức là xét mọi cung có dạng (u,v) và

(v,u).

20 Nếu (u,v) E, F(u,v) < C(u,v) và v chưa gán nhãn thì gán nhãn nó và đưa v vào

tập VT.

30 Nếu (v,u) E, F(v,u) > 0 và v chưa gán nhãn thì gán nhãn nó và đưa vào tập VT.

Bây giờ ta xét kết quả của thuật toán gán nhãn. Nó có kết thúc hữu hạn hay không?

Nhận xét rằng một đỉnh được vào tập VT chỉ khi chuyển từ chưa gán nhãn. Do đó một đỉnh chỉ

được vào VT nhiều nhất là một lần. Mà mỗi bước lặp bỏ một đỉnh ra khỏi VT. Do đó, vì số đỉnh

của mạng là hữu hạn, thuật toán phải kết thúc hữu hạn.

Hai thủ tục tìm đường tăng luồng có thể mô tả như sau:

Đầu vào

Mạng G

Luồng khởi đầu

Đầu ra Luồng cực đại trong mạng là f[u,v], u,v V

Khi đó Lát cắt hẹp nhất là (VT, V\ VT)

//Thủ tục gán nhãn đường tăng luồng

// p[v], [v] là nhãn của đỉnh v;

//VT là danh sách các đỉnh có nhãn chưa xét ;

//c[u,v] là khả năng thông qua của cung (u,v),u,v V;

//f[u,v] là luồng trên cung (u,v), (u,v V);

void Find-path()

{

Page 166: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 165

p[s] = s ; [s] = ; EnQueue(s);

PathFound=false;

while (!IsEmptyQ() )

{

u=Dequeue();

for vV do

if (v chưa có nhãn)

{

if ((c[u,v] >0) && (f[u,v] < c[u,v] ) )//tìm KN tăng luồng

{

P[v] = +u ; [v] = min { [u],c[u,v]-f[u,v] }

EnQueue(v); // nạp v vào danh sách các đỉnh có nhãn

if (v == t) { PathFound=true;exit; }

}

else//tìm KN giảm luồng

if ((c[v,u] > 0) && (f[v,u] > 0)

{

P[v] = -u ;

[v] = min { [u], f[v,u] }

EnQueue(v);// nạp v vào danh sách các đỉnh có nhãn

if (v == t) { PathFound=true;exit; }

}

}

}

}

void Inc_flow ()//dựa vào p[] tìm đường tăng luồng

{

v = t ; u = t ; tang = [t];//xét các cung (v,u)

while (u != s)

{

v = p[u];

if (v > 0)//tăng luồng

f[v,u] = f[v,u] + tang;

else //giam luồng

{

v = -v;

f[u,v] =f[u,v] –tang;

}

u = v ;

}

}

void FF() // thủ tục thể hiện thuật toán ford_fulkerson

Page 167: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 166

{ // khởi tạo bắt đầu từ luồng với giá trị 0

for u V do

for v V do

f[u,v] =0;

Stop = false;

while (!Stop)

{

Find-path();

if (PathFound==true)

Inc_flow ();

else Stop=true;

}

}

Ta xét ví dụ sau để làm quen với thuật toán ford-Fullkerson

Ví dụ 21.2 Áp dụng thuật toán ford-Fullkerson tìm luồng cực đại bằng cách gán nhãn

cho đỉnh của mạng G với luồng f được cho như Hình 21.2, hai số viết bên cạnh mỗi cung là

khả năng thông qua và luồng của các cung. Kết quả các bước của thuật toán mô tả bởi các đồ

thị và bảng dưới đây. Mạng với luồng cực đại thu được ở Hình 21.2. Lát cắt bé nhất là X =

{s,c}, X* = {b,d,e,t} và giá trị luồng cực đại là 12.

Hình 21.2 Mạng G và minh họa từng bước thuật toán ford-Fullkerson

+ Bước lặp 1: 1 = 1

Bước 1.1 Ghi nhãn

3,0

3,1

c(s+,3) e(b+,1)

t(d+,1)

d(b+,1) b(s+,1)

5,2

1,1

6,1

6,5

6,4

5,4

s

(s,)

3,0

3,1

c e

t

d b

5,2

1,1

6,1

6,5

6,4

5,4

s

Page 168: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 167

Bước 1.2 Tăng luồng

+ Bước lặp 2: 2 = 2

Bước 2.1 Ghi nhãn

Bước 2.1 Tăng luồng

Hình 21.3 Mạng G với luồng cực đại và lát cắt hẹp nhất

Không còn đường tăng luồng, Val(fmax) = 5+4 = 9

Lặp Đỉnh

xét

b c d e t Đường

tăng luồng

Giá trị tăng

luồng

1 s s+,1 S+,3

b b+,1 b+,1

c

d d+,1 sbd t 1

d

3,2

3,3

c e

t

5,4

1,1

6,3

6,6

6,3

5,5

s

,0

3,1

c(s+,3) e(b+,2)

t(e+,2)

d(c+,2) b(d-,2)

5,2

1,1

6,1

6,6

6,5

5,5

s

(-,)

d b

3,0

3,1

c e

t

5,2

1,1

6,1

6,6

6,5

5,5

s

Page 169: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 168

2 s S+,3

c c+,2

d d-,2

b b+,2

e e+,2 scdbet 2

3 s S+,1

Bảng kết quả của thuật toán Ford-Fullkerson

Page 170: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 169

Giả sử là khả năng thông qua của tất cả các khung của đồ thị là các số nguyên. Khi đó

sau mỗi lần tăng luồng, giá trị luồng sẽ tăng lên ít nhất là 1. Từ đó suy ra thuật toán

ford_Fulkerson sẽ dừng sau không quá val(f*) lần tăng luồng và cho ta luồng cực đại trong

mạng. Đồng thời, rõ ràng f*(u,v) sẽ là số nguyên đối với mỗi cung (u,v) E. Từ đó ra có các

kết quả sau:

Định lý 21.2 (Định lý về luồng cực đại trong mạng và lát cắt hẹp nhất). Luồng cực đại trong

mạng bằng khả năng thông qua của lát cắt hẹp nhất.

Định lý 21.3 (Định lý về tính nguyên). Nếu tất cả các khả năng thông qua là các số nguyên thì

luồng tìm được cực đại với luồng trên các cung là các số nguyên.

Tuy nhiên, nếu các khả năng thông qua là các số rất lớn thì giá trị của luồng cực đại

cũng có thể là rất lớn và khi đó thuật toán mô tả ở trên sẽ đòi hỏi thực hiện rất nhiều bước

tăng luồng. Ví dụ trong Hình 21.4 sẽ minh hoạ cho điều này. Hình 21.4(a) mô tả mạng cần xét

với các khả năng thông qua trên các cung. Hình 21.4(b) mô tả luồng trên các cung (số thứ hai

bên cạnh cung) sau khi thực hiện tăng luồng dọc theo đường tăng luồng (s, a, b, t). Hình

21.4(c) mô tả luồng trên các cung sau khi thực hiện tăng luồng dọc theo đường tăng luồng (s,

b, a, t). Rõ ràng, sau 2.106 lần tăng luồng theo đường (s, a, b, t) và (s, b, a, t) một cách luân

phiên ta thu được luồng cực đại.

Hình 21.4 Ví dụ tồi tệ đối với thuật toán ford_Fulkerson.

Hơn thế nữa, nếu các khả năng thông qua là các số vô tỉ, người ta còn xây dựng được

ví dụ để cho thuật toán không dừng, và tệ hơn nếu dãy các giá trị luồng xây dựng theo thuật

toán hội tụ thì nó còn không hội tụ đến giá trị luồng cực đại. Như vậy, muốn thuật toán làm

việc hiệu quả, việc lựa chọn đường tăng luồng cần được tiến hành hết sức cẩn thận.

Edmonds và Karp chỉ ra rằng nếu đường tăng luồng được chọn là đường ngắn nhất từ

s đến t trên đồ thị Gf. Điều đó có thể thực hiện, nếu trong thủ tục tìm đường tăng Find_Path

mô tả ở trên, danh sách VT được tổ chức dưới dạng QUEUE (nghĩa là ta thực hiện tìm đường

tăng bởi thủ tục tìm kiếm theo chiều rộng) thì thuật toán sẽ kết thúc sau không quá mn/2 lần

sử dụng đường tăng luồng. Nếu để ý rằng, tìm kiếm theo chiều rộng trên đồ thị đòi hỏi thời

gian O(m+n), thì thuật toán thu được sẽ có độ phức tạp tính toán là O(nm2).

Nhờ cách tổ chức tìm đường tăng khéo léo hơn, người ta đã xây dựng được thuật toán

với độ phức tạp tính toán tốt hơn như: O(n2m) (Dinic, 1970). O(n3) (Karzanov, 1974),

O(n2m2), (Cherkasky, 1977), O(nm log n) (Sleator, - Tarrjan, 1980).

Page 171: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 170

Ta kết thúc mục này bởi ví dụ minh hoạ cho thuật toán ford_Fulkerson sau đây. Hình

21.5(a) cho mạng G cùng với thông qua của tất cả các cung và luồng giá trị 10 trong nó. Hai

số viết bên cạnh mỗi cung là khả năng thông qua của cung (số trong ngoặc) và luồng trên

cung. Đường tăng luồng có dạng (s, v3, v2, v6, v7, t). Ta tính được (t) = 1, giá trị luồng tăng

từ 10 lên 1. Hình 21.5 (b) cho luồng thu được sau khi tăng luồng theo đường tăng tìm được.

Hình 21.5 Tăng luồng dọc theo đường tăng.

Luồng trong Hình 21.5(b) đã là cực đại. Lát cắt hẹp nhất

X = { s, v2, v3, v5}, X* = { v4, v6, v7, t} .

Giá trị luồng cực đại là 11.

21.5 Bài tập

Page 172: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 171

Bài 22 Lý thuyết đồ thị và ứng dụng

22.1. Một số bài toán liên quan tới đồ thị

22.1.1 Các bài toán liên quan tới bậc của đồ thị

Bài toán 22.1 Có 20 đội bóng thi đấu với nhau, mỗi đội phải đấu một trận với từng đội khác.

Chứng minh rằng vào bất cứ lúc nào cũng có 2 đội đã đấu một số trận như nhau?

Giải:

Bài toán được chuyển qua đồ thị như sau:

- Cho tương ứng mỗi đội bóng với một đỉnh của đồ thị.

- Khi hai đội đã đấu với nhau thì ta nối 2 đỉnh với một cạnh.

Bởi vậy bài toán được phát biểu dưới dạng đồ thị: Cho một đồ thị gồm 20 đỉnh. CMR bao giờ

cũng có hai đỉnh cùng bậc.

Thật vậy, trong 20 đỉnh, không thể có đồng thời một đỉnh bậc 0 (chẳng hạn đỉnh A) và

một đỉnh bậc 19 (chẳng hạn đỉnh B). Nếu đỉnh B có bậc là 19 thì B là đầu mút của 19 cạnh

nối B với 19 đỉnh còn lại, trong đó có A, do đó A là đỉnh có bậc khác 0.Ngược lại nếu A có

đỉnh bậc 0 thì bậc của B có nhiều nhất là 18. Có 20 đỉnh mà mỗi đỉnh chỉ có thể có một trong

19 bậc (từ 0 đến 18 hoặc từ 1 đến 19). Vì vậy theo nguyên tắc Dirichet phải có ít nhất 2 đỉnh

cùng bậc.

Từ cách chứng minh trên ta thấy bất cứ lúc nào cũng có 2 đội bóng trong số 20 đội đã

đấu được một số trận như nhau.

Nếu giả sử dùng định lý: “Trong mọi đồ thị có n đỉnh (n ≥ 2) bao giờ cũng có ít nhất

hai đỉnh cùng bậc ” thì rõ ràng sau khi bài toán chuyển qua đồ thị sẽ được giải quyết hết sức

đơn giản

Bài toán 22.2 Có 20 đội bóng thi đấu với nhau, mỗi đội phải đấu một trận với từng đội khác.

Có một lúc, người ta nhận thấy có đúng 2 đội đã đấu một số trận như nhau. CMR khi đó hoặc

có đúng một đội chưa thi đấu trận nào hoặc có đúng một đội đã thi đấu với tất cả các đội khác.

Giải:

Nếu ta chuyển bài toán về đồ thị, thì bài toán phát biểu như sau: Cho một đồ thị gồm 20 đỉnh.

CMR nếu đồ thị đó có đúng 2 đỉnh cùng bậc thì đồ thị có đúng một đỉnh bậc 0 hoặc có đúng

một đỉnh bậc 19

Trước hết, nếu đồ thị có đúng hai đỉnh cùng bậc thì đó không thể là 0 mà cũng không

thể là 19

Thật vậy, nếu đồ thị có đúng hai đỉnh bậc 0 (các đỉnh khác bậc đôi một khác nhau) thì

loại bỏ hai đỉnh cô lập này ta được đồ thị mới (G’) có 18 đỉnh với bậc đôi một khác nhau, điều

đó trái với kết quả chứng minh ở bài 1.Còn nếu đồ thị có hai đỉnh cùng bậc là 19 thì đồ thị bù

(G’’) của G có hai đỉnh cùng bậc 0 và các đỉnh khác có bậc đôi một khác nhau, điều này

không thể xảy ra như trên đã lý luận

Page 173: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 172

Như vây, đồ thị có đúng 2 đỉnh cùng bậc k với k≠0 và k≠19.

Suy ra đồ thị có đúng một đỉnh bậc 0 hoặc 1 đỉnh bậc 19 (nếu không thì đồ thị phải có

2 đỉnh nữa có cùng bậc k’ ≠k), 1 ≤ k ≤ 18 trái với giả thiết)

22.1.2 Các bài toán liên quan đến tính liên thông của đồ thị

Bài toán 22.3 Một lớp học có 40 học sinh về nghỉ hè. Biết rằng mỗi em có địa chỉ ít nhất của

20 bạn và nếu bạn này có địa chỉ của bạn kia thì bạn kia cũng có địa chỉ của bạn này. CMR

bất cứ 2 em nào trong lớp cũng có thể nhắn tin cho nhau.

Giải: Bài toán được chuyển qua đồ thị như sau:

- Cho mỗi học sinh tương ứng với mỗi đỉnh của đồ thị. Lớp có 40 học sinh tức là đồ

thị có 40 đỉnh.

- Hai học sinh có trao đổi địa chỉ cho nhau thì hai đỉnh tương ứng được nối bởi một

cạnh vô hướng.

- Mỗi em có địa chỉ ít nhất của 20 bạn nghĩa là mỗi đỉnh có bậc ít nhất bằng 20.

- Khi đó 2 bạn có thể nhắn tin cho nhau nếu trên đồ thị tồn tại một đường đi giữa hai

đỉnh tương ứng.

Ta ký hiệu đồ thị trên là G. Theo định lý dirak đồ thị G là đồ thị Halmiton, nên G sẽ liên

thông, mà đồ thị liên thông thì hai đỉnh tùy ý đều có đường nối với nhau. Bới vậy hai bạn bất

kỳ trong lớp đều có thể nhắn tin cho nhau.

Bài toán 22.4 Tại mỗi đỉnh của một đồ thị liên thông ta viết một số thực sao cho số viết tại

mỗi đỉnh bằng trung bình cộng của các số viết tại mỗi đỉnh kề với đỉnh này. CMR tất cả các

số được viết đều bằng nhau

Giải:

Để cho gọn, ta ký hiệu số ghi tại đỉnh x cũng là x

Giả sư a là số nhỏ nhất trong các số được viết tại tất cả các đỉnh và b là số viết tại đỉnh b bất

kỳ, ta sẽ chứng minh a=b.

Vì đồ thị liên thông, nên tồn tại đường đi (a, a1, a2, …..ak). Nếu a được nối với m đỉnh x,

y,…. ,z thì:

a =(x+y+……+z)/m

Song a≤ x; y; …..;z nên a = x = y = …..= z

Điều đó cũng có nghĩa là a = ai

Cho a1 đóng vai trò của a (điều này hoàn toàn có thể được vì a1 = a) nên cũng là số nhỏ nhất

trong các số đã viết) thì a1 =a2 =….. cuối cùng ta có kết quả là a =a1=a2=……ak =b

22.1.3 Các bài toán có liên quan đến đường đi và chu trình Hamilton

Page 174: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 173

Đồ thị đấu loại là đồ thị có hướng, mà trong đó 2 đỉnh bất kỳ được nối với nhau bởi đúng một

cung. Tên gọi đấu loại xuất hiện vì đồ thị như vậy có thể biểu diễn kết quả thi đấu bóng

chuyền, bong bàn hay bất cứ trò chơi nào mà không cho phép hòa

Hãy sử dụng đồ thị trên để giải quyết bài toán sau:

Bài toán 22.5 Có 5 đội bóng chuyền thi đấu với nhau để tranh cúp quốc gia. Biết rằng hai đội

chỉ đấu với nhau đúng một trận và mỗi đội phải đấu với 4 đội khác, đồng thời không có trận

hòa.

Giải:

Ta cho tương ứng mỗi đội bóng là một đỉnh của đồ thị, hai đội đã thi đấu với nhau ta dùng

một cung nối 2 đỉnh tương ứng, chiều của cung đó là đỉnh tương ứng với đội bóng thắng sang

đỉnh tương ứng là đội bóng thua. Như vậy đồ thị thiết lập được là đồ thị đầy đủ có hướng với

5 đỉnh. Đồ thị trong Hình 29.1 mô tả kết quả thi đấu của 5 đội bóng chuyền A, B, C, B, E nào

đó. Theo định lý: “Đồ thị đầy đủ, có hướng luôn luôn có đường Hamilton”. Nên căn cứ vào

một trong những đường Hamilton ta có thể sếp đội trưởng các đội đứng theo hàng dọc như

sau: A,E, C, D, B

Hình 22.1 Kết quả thi đấu của 5 đội bóng chuyền A, B, C, B, E

Bài toán 22.6 Hình 29.2 cho sơ đồ nhà của 8 học sinh A,B, C, D, E, G ,H ,K

Hãy tìm một đường đi từ nhà học sinh A qua mỗi học sinh khác đúng 1 lần để cùng đến sân

vận động S (khi A đến nhà bạn nào thì bạn đó cùng A đến sân vận động)

Giải:

Trước hết ta thấy các đỉnh A, E, C đều có đỉnh bậc 2, bởi vậy đương Hamilton xuất phát từ A

phải đi qua cạnh BC, CD, DE, EG. Khi đó ta xóa đi các cạnh BD, DK, DH (đánh dấu x), đồng

thời cạnh AG cũng được xóa (đánh dấu xx)

A

E B

D C

Page 175: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 174

Hình 22.2 Sơ đồ nhà của 8 học sinh

Tiếp theo học sinh A đi tiếp từ G sang H rồi sang K và cuối cùng từ đỉnh K sang đỉnh S.

Đường Hamilton được tạo thành ABCDEFGHS mô tả toàn bộ hành trình của một học sinh

xuất phát từ A đi tới sân vận động S, theo đúng yêu cầu của bài toán đặt ra.

Bài toán 22.7 Một nước có 10 thành phố. Hãy thiết lập một mạng cầu hàng không (bằng đồ

thị) sao cho:

- Mỗi thành phố có cầu hàng không nối trực tiếp với 3 thành phố khác

- Từ mỗi thành phố có đường hàng không đi tới một thành phố tùy ý khác và trong

hành trình đi tới đích có thể đi qua từng thành phố đúng một lần.

Giải:

Mạng hàng không cần tìm (Hình 29.3) là một đồ thị gồm 10 đỉnh, bậc của mỗi đồ thị

bằng 3 và có chu trình Hamilton

Hình 22.3 10 thành phố

Bài toán 22.8 Dùng phương pháp đồ thị để thể hiện việc bố trí lịch thi cho học sinh THPT với

7 môn thi trong 7 ngày. Yêu cầu phải bố trí lịch thi sao cho hai môn thi của cùng một thầy

giáo không được rơi vào hai ngày liên tiếp nhau. Biết rằng không có thầy giáo nào cùng có

nhiều hơn 4 môn thi

Giải:

D

A

B

K

S

G

H

C

E

Page 176: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 175

Ta xây dựng lược đồ G (Hình 29.4) trong đó các đỉnh tương ứng với các môn thi thuộc 2 thầy

khác nhau. Đồ thị trong Hình 29.4 mô tả trường hợp: một thầy có 4 môn thi (tương ứng với

các đỉnh A,B, D,E) một thầy có 2 môn thi (tương ứng với các đỉnh F, G), còn thầy thứ 3 có

một môn thi (tương ứng với đỉnh C)

Do ít nhất mỗi thầy giáo có số môn thi không vượt quá 4, nen mỗi đỉnh kề với ít nhất 3 đỉnh

.Do đó các đỉnh của đồ thị G có bậc không nhỏ hơn 3, nên tổng bậc của 2 đỉnh bất kỳ không

nhỏ hơn 6. Do đó theo định lý 14.1 đồ thị G có xích Hamilton (gồm các cạnh tô đậm).

Dựa vào đường Hamilton này mà ta lập được lịch thi theo yêu cầu bài toán.

Hình 22.4 bố trí lịch thi cho học sinh THPT với 7 môn thi trong 7 ngày

Bài toán 22.9 Vị trí nhà ở và đường nối giữa các nhà của 9 học sinh A,B,C,D,E,F,G,H,K

được mô tả trong Hình 29.5. CMR: Bạn A không thể đi đến nhà bạn K với điều kiện: Trên

đường đi A phải ghé qua nhà từng bạn khác đúng 1 lần: Mỗi bạn đều có thể qua thăm từng

bạn khác đúng một lần ròi lại trở về được nhà mình.

Giải:

Thực chất bài toán yêu cầu chứng minh đồ thị trên hình .123.5 không có Hamilton nối giữa

đỉnh A với đỉnh K.

Thật vậy, nếu trong đồ thị có xích Hamilton (a) nối giữa 2 đỉnh A và đỉnh K, thì phải đi qua

tất cả các đỉnh còn lại, trong đó các đỉnh bậc bằng 2: E, F, G nghĩa là phải đi qua các cạnh

AE, ED, DF, FK, CG, GH. Có 2 khả năng xảy ra:

Nếu a không đi qua đỉnh nào 2 lần, thì nó không thể đồng thời đi qua được 3 đỉnh E, F, G:

Ngược lại, nếu a đi qua được cả 3 đỉnh E, F, G thì nó phải đi qua một đỉnh nào đó từ 2 lần trở

lên.

Như vậy đã đi tới mâu thuẫn, với tính chất của xích Hamilton nên không tồn tại xích

Hamilton nối giữa đỉnh A và đỉnh K. Bài toán được chứng minh.

B

D

G

A

E I

C

Page 177: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 176

Hình 22.5 Vị trí nhà ở và đường nối giữa các nhà của 9 học sinh

Đồ thị trong Hình 22.5 có chu trình Hamilton, chẳng hạn

β: A, E, D, F, K, H, G, C, B, A

nên mỗi em đều xuất phát từ vị trí của mình, đi theo chu trình β, thì sẽ thăm được từng bạn

đúng một lần rồi lại quay trờ về được nhà mình.

Bài toán 22.10 Trên bàn cờ 4x4 ô vuông. Chứng minh con mã không thể đi qua tất cả các ô,

mỗi ô đúng một lần, rồi trở về ô ban đầu

Giải:

Coi mỗi ô của bàn cờ là một đỉnh của đồ thị, hai ô thực hiện được

một bước đi của con mã tương ứng với 2 đỉnh kề của đồ thị, ta cần

chứng minh: đồ thị không có chu trình Hamilton

Trước hết xét tất cả các nửa yếu tố có thể của đồ thị. Các đỉnh

A1,A3 chỉ kề B2, B4 các đỉnh A2, A4 chỉ kề với B1, B3. Do vậy

bất kỳ nửa yếu tố nào cũng phải chứa hai chu trình không giao này (A1,B2,A3,B4,A1);

(A2,A4,B3,A2). Xem hai chu trình không giao này như các đồ thị con bộ phận, thì chúng là 2

thành phần liên thông của nửa yếu tố, do đó nửa yếu tố là một đồ thị không liên thông nên

không có chu trình Hamilton (theo khẳng định 4.3)

22.1.4 Các bài toán liên quan đến đồ thị tô màu

Những bài toán liên quan đến tô màu bản đồ đã dẫn đến rất nhiều kết quả trong lí

thuyết đồ thị. Khi một bản đồ được tô màu, hai miền có chung biên giới được tô bằng 2 màu

khác nhau. Mỗi bản đồ có thể coi là một đồ thị phẳng. Trong một bản đồ, ta coi hai miền có

chung nhau một đường biên là hai miền kề nhau (hai miền chỉ có chung nhau một điểm biên

không được coi là kề nhau).Một bản đồ thường được tô màu, sao cho hai miền kề nhau được

tô hai màu khác nhau. Ta gọi một cách tô màu bản đồ như vậy là một cách tô màu đúng.

Để đảm bảo chắc chắn hai miền kề nhau không bao giờ có màu trùng nhau, chúng ta

tô mỗi miền bằng một màu khác nhau. Tuy nhiên việc làm đó nói chung là không hợp lý.Nếu

A1 X1 X2 A2

X8 B1 B2 X3

X7 B4 B3 X4

A4 X6 X5 A3

A

H

K

E

B C

G

D

F

Page 178: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 177

bản đồ có nhiều miền thì sẽ rất khó phân biệt những màu gần giống nhau. Do vậy người ta chỉ

dùng một số màu cần thiết để tô bản đồ. Một bài toán được đặt ra là: xác định số màu tối thiểu

cần có để tô màu đúng một bản đồ.

Ta xét ví dụ sau: Bản đồ trong hình 14.1 bên có 6 miền,nhưng chỉ cần có 3 màu (vàng, đỏ,

xanh) để tô đúng bản đồ này. Chẳng hạn, màu vàng được tô cho M1 và M4, màu đỏ được tô

cho M2 và M6, màu xanh được tô cho M3 và M5.

Hình 22.6 Bản đồ có 6 miền

Các định nghĩa:

Định nghĩa 22.1 Tô màu một đồ thị vô hướng là một sự gán màu cho các đỉnh sao cho hai

đỉnh kề nhau phải khác màu nhau.

Một đồ thị có thể được tô màu bắng cách gán các màu khác nhau cho mỗi đỉnh của nó. Tuy

vậy, với hầu hết các đồ thị, ta có thể tô màu chúng với số màu ít hơn số đỉnh. Vậy số màu ít

nhất cần thiết là bao nhiêu ?.

Định nghĩa 22.2 Số màu (sắc số) của một đồ thị là số màu tối thiểu cần thiết để tô màu đồ thị

này.

Mỗi bản đồ trên mặt phẳng có thể biểu diễn bằng một đồ thị, trong đó mỗi miền

của bản đồ được biểu diễn bằng một đỉnh; các cạnh nối hai đỉnh, nếu các miền được biểu diễn

bằng hai đỉnh này là kề nhau. Đồ thị nhận được bằng cách này gọi là đồ thị đối ngẫu của bản

đồ đang xét. Rõ ràng mọi bản đồ trên mặt phẳng đều có đồ thị đối ngẫu phẳng. Bài toán tô

màu các miền của bản đồ là tương đương với bài toán tô màu các đỉnh của đồ thị đối ngẫu sao

cho không có hai đỉnh liền kề nhau có cùng một màu, mà ta gọi là tô màu đúng các đỉnh của

đồ thị.

Số màu ít nhất cần dùng để tô màu đúng đồ thị G được gọi là sắc số của đồ thị G

và ký hiệu là χ(G).

Mệnh đề 22.1: Nếu đồ thị G chứa một đồ thị con đồng phôi với đồ thị đầy đủ Kn thì χ(G) ≥ n.

Mệnh đề 22.2: Nếu đơn đồ thị G không chứa chu trình độ dài lẻ thì χ(G) =2.

Mệnh đề 22.3: Với mỗi số nguyên dương n, tồn tại một đồ thị không chứa K3 và có sắc số

bằng n.

Định lý 22.1:(Định lý 5 màu của Kempe-Heawood): Mọi đồ thị phẳng đều có thể tô đúng

bằng 5 màu.

Định lý 22.2 (Định lý 4 màu của Appel-Haken): Mọi đồ thị phẳng đều có thể tô

Page 179: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 178

đúng bằng 4 màu.

Thuật toán tô màu cho đồ thị thỏa mãn điều kiện số màu ít nhất

Dữ liệu vào: đồ thị G = (V, E).

Dữ liệu ra: đồ thị G = (V, E) có các đỉnh đã được gán màu.

Các bước:

B1: Lập danh sách các đỉnh của đồ thị E’=[v1,v2,…,vn] được sắp xếp theo thứ tự bậc giảm

dần: d(v1) ≥ d(v2) ≥ … ≥ d(vn)

Đặt i = 1;

B2: Tô màu i cho đỉnh đầu tiên trong danh sách. Duyệt lần lượt các đỉnh tiếp theo và tô màu i

cho đỉnh không kề đỉnh đã được tô màu i.

B3: Nếu tất cả các đỉnh đã được tô màu thì kết thúc, đồ thị được tô bằng i màu. Ngược lại,

sang bước B4.

B4: Loại khỏi E’ các đỉnh đã tô màu. Sắp xếp lại các đỉnh trong E’ theo thứ tự bậc giảm dần.

Đặt i = i + 1 và quay lại B2..

Bài toán 22.11 Lập lịch thi

Hãy lập lịch thi trong trường đại học sao cho không có sinh viên nào có hai môn thi

cùng một lúc.

Có thể giải bài toán lập lịch thi bằng mô hình đồ thị, với các đỉnh là các môn thi,

có một cạnh nối hai đỉnh nếu có sinh viên phải thi cả hai môn được biểu diễn bằng hai đỉnh

này. Thời gian thi của mỗi môn được biểu thị bằng các màu khác nhau. Như vậy việc lập lịch

thi sẽ tương ứng với việc tô màu đồ thị này.

Giải pháp:

Biểu diễn bằng đồ thị:

Mỗi môn học là một đỉnh

Nếu 2 môn học nào được dự thi bởi cùng 1 sinh viên thì sẽ

nối bằng 1 cạnh.

Cách lập lịch sẽ tương ứng với bài toán tô màu của đồ thị

này.

Ta xét ví dụ cụ thể: Lập lịch thi cho 7 môn học sao cho các sinh viên không có môn thi nào bị

trùng.. Giả sử các môn học đuợc đánh số từ 1 tới 7 và các cặp môn thi sau có chung sinh viên:

1 và 2, 1 và 3, 1 và 4, 1 và 7, 2 và 3, 2 và 4, 2 và 5, 2 và 7, 3 và 4, 3 và 6, 3 và 7, 4 và 5, 4 và

6, 5 và 6, 5 và 7, 6 và 7.

Giải:

Biểu diễn bằng đồ thị:

Mỗi môn thi là một đỉnh của đồ thị. Như vậy đồ thị của chúng ta có 7 đỉnh.

Page 180: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 179

Hai môn thi có cùng một sinh viên trùng nhau sẽ được nối với nhau bằng một cạnh.

Thực hiện tô màu cho đồ thị thu được khi đó ta thu được số màu cần tô cho đồ thị là số

đợt thi cần tổ chức cho mỗi môn thi.

Ta có đồ thị vẽ được như sau:

Hình 22.7 Lập lịch thi 7 môn

Thực hiện việc tô màu như sau:

B1:Tính và sắp xếp bậc của các đỉnh của đồ thị theo chiều giảm dần ta có danh sách

các đỉnh được sắp xếp như sau: E={2,3,7,1,4,6,5}.

B2:Bắt đầu từ đỉnh 3 tô cho nó màu vàng.Sau đó duyệt tất cả các đỉnh còn lại trong

danh sách nếu đỉnh nào không kề với nó tô cho đỉnh đó màu của đỉnh 3.Nhìn vào đồ thị có

đỉnh 5 không kề với đỉnh 3 nên tô màu vàng cho đỉnh 5.

B3:Loại khỏi E những đỉnh đã tô màu nên E={2,7,1,4,6}

B4: chọn đỉnh 2 là đỉnh bắt đầu và tô màu xanh cho nó.Các đỉnh còn lại trên đồ thị là

7,1,4,6,5.Tuy nhiên các đỉnh này đều kè với đỉnh 2 nên màu xanh chỉ được tô cho đỉnh 2 mà

thôi.

B5: Loại đỉnh 2 ra khỏi E. E={7,1,4,6}

B6: chọn đỉnh 7 là đỉnh bắt đầu.Tô màu nâu cho nó.Các đỉnh còn lại ta thấy chỉ có

đỉnh 4 là không kề với đỉnh 7 nên tô màu nâu cho đỉnh 4.

B7: xóa 2 đỉnh 7 và 4 đã tô màu ra khỏi E. E={1,6}.

B8: E còn lại 2 đỉnh là 1 và 6 không kề với nhau nên có thể tô cùng một màu cho

chúng.Chọn màu đỏ.

Vậy với các bước ở trên ta đã tô màu cho đồ thị tương úng sao cho số màu tô là ít

nhất.

Hình dưới đây biểu diễn đồ thị tương ứng. Việc lập lịch thi chính là việc tô màu đồ thị này. Vì

số màu của đồ thị này là 4 nên cần có 4 đợt thi.

Page 181: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 180

Hình 22.8 Tô màu cho đồ thị lịch thi

Ta có bảng lịch thi như sau:

Đợt Thi Môn Thi

I 1,6

II 2

III 3,5

IV 4,7

22.1.5 Bài toán về cây

Bài toán 22.11 Có 4 đội bóng A, B, C, D lọt vào vòng bán kết trong giải các đội mạnh khu

vực. Có mấy dự đoán sắp xếp như sau:

Đội B vô địch, đội D nhì

Đội B nhì, đội C giải ba

Đội A nhì, đội C tư

Biết rằng mỗi dự đoán trên đúng về một đội. Hãy cho biết kết quả xếp hạng của các đội.

Giải: Ta ký hiệu:

B1: Đội B nhất B2: Đội B nhì D2: Đội D nhì

A2: Đội A nhì C3: Đội C ba C4: Đội C bốn

Để biết kết quả xếp hạng của các đội ta vẽ cây như sau:

Hai nhánh đầu tiên ứng với dự đoán thứ nhất

Từ mỗi nhánh trên lại rẽ thành hai nhánh ứng với dự đoán thứ 2

Tiếp tục rẽ nhánh đối với dự đoán thử 3 theo cách trên ta có một cây:

Page 182: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 181

Hình 22.9 Kết quả xếp hạng của các đội

Ta chọn một đường đi từ “gốc ” O đến “ngọn” trên đó các cạnh không mang chữ trùng nhau .

Vì một đội không thể xếp hai hạng khác nhau và không có chỉ số trùng nhau (vì hai đội không

thể được xếp hạng cùng một hạng), đồng thời thứ tự xếp hạng của các đội thỏa mãn điều kiện

đầu bài. Đường tô nét đậm với dãy ký hiệu B1, C2, A3, D4 cho ta xếp hạng cần tìm.

22.1.6. Bài toán về ghép cặp

Bài toán 22.12 Một đoàn du lịch gồm 2n (n ≥ 1) người. Mỗi người quen (từ trước) với ít nhất

n người trong đoàn. CMR có thể sắp xếp đoàn du lịch ngồi trên một đoàn tầu, sao cho mỗi

ghế có đúng 2 người đã quen nhau(từ trước ) ngồi cạnh nhau.

Giải:

Coi mỗi du khách là một đỉnh của đồ thị. Hai đỉnh kề nhau khi và chỉ khi hai du khách tương

ứng quen nhau (từ trước). Ta được một đồ thị với 2n đỉnh và bậc của mỗi đỉnh không nhở hơn

n. Theo định lý 29.5 tồn tại cặp ghép n đỉnh vào n đỉnh, nên theo cặp ghép này, mà sắp xếp

các du khách ngồi từng cặp trên mỗi ghế sẽ thỏa mãn yêu cầu: hai người quen nhau (từ trước )

ngồi cạnh nhau.

22.1.7. Đồ thị Euler

Bài toán 22.13 Đa diện lồi có k (k ≥ 5) mặt, mà từ mỗi đỉnh có đúng 3 cạnh. Hai người chơi

trò chơi như sau: mỗi người lần lượt tô đỏ một mặt trong các mặt còn lại. Người thắng là

người tô được 3 mặt có chung một đỉnh. CMR tồn tại cách chơi mà người được chơi trước

luôn luôn thắng.

Giải:

Theo nhận xét trên thì đa diện lồi được coi là một đồ thị phẳng. Giả sử tất cả các đa diện đều

có bậc 3. Khi đó: do mỗi cạnh thuộc đúng hai diện nên m=3k/2. Mặt khác từ mỗi đỉnh có

đúng 3 cạnh, nên mỗi đỉnh là chung của 3 diện, đồng thời mỗi diện có đúng 3 đỉnh nên số

đỉnh bằng số diện hay n=k. Sử dụng định lý Euler: n-m+f=2 hay k- (3k/2) + k =2 suy ra k=4.

Điều này trái với giả thiết (k ≥ 5). Như vậy có ít nhất một diện bậc không nhỏ hơn 4 (ký hiệu

diện này là D1). Khi đó có thể chơi như sau:

Bước 1: Gọi a là người được tô trước, anh ta tô diện D1. Ta nhận thấy rằng: diện D1 kề với

không ít nhất 4 diện (vì diện bậc 4); hai diện kề với D1 cùng đi qua một đỉnh của D1, cũng kề

nhau (vì mỗi đỉnh chỉ có đúng 3 cạnh, trong đó đã có 2 cạnh thuộc diện D1 nên cạnh còn lại

phải chung cho 2 diện )

Page 183: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 182

Bước 2: Sau khi người thứ 2 tô, chắc chắn còn ít nhất 3 diện kề với D1 đồng thời kề nhau liên

tiếp đôi một. Không giảm tổng quát, giả sử đó là D2, D3, D4 kề với 2 diện còn lại khi đó A tô

D3

Bước 3: Sau khi người thứ 2 tô, chắc chắn còn lại 1 trong 2 diện D2, D4 đó là diện mà A phải

tô để thắng.

22.1.8. Các bài toán có tính tổng hợp

Bài toán 22.14 Một cơ quan cần tuyển 3 người để lập thành một nhóm có đủ năng lực biên

dịch các tài liệu từ 6 thứ tiếng Anh, Pháp, Nga, Đức, Trung Quốc và Bồ Đào Nha sang tiếng

Việt. Có 7 người đến dự tuyển, trong đó mỗi người đều biết 2 thứ tiếng và chỉ 2 trong số 6 thứ

tiếng đó và bất cứ người nào cũng biết nhiều nhất một thứ tiếng chung trong 6 thứ tiếng đó.

Biết rằng thứ tiếng nào cũng có ít nhất 2 người biết. Hỏi có thể xảy ra bao nhiêu trường hợp

không thể tuyển chọn được như yêu cầu đã nếu không? Tại sao?

Giải:

Ta cho tương ứng mỗi ngoại ngữ là một đỉnh: A,P, N, D, T, B và một người biết 2 thứ tiếng

biểu diễn bằng một cạnh nối 2 đỉnh tương ứng với 2 ngoại ngữ đó. Do mỗi người đều biết 2

ngoại ngữ nên ứng với 7 người đồ thị có 7 cạnh. Mặt khác vì bất cứ người nào cũng biết nhiều

nhất một thứ tiếng chung tức là không có hai cạnh khác nhau cùng nối với 1 cặp đỉnh. Ngoài

ra thứ tiếng nào cũng có ít nhất hai người biết thành thử mỗi đỉnh có bậc ít nhất là 2. Bởi vậy

bài toán có thể phát biểu như sau:

Cho đơn đồ thị có 6 đỉnh và 7 cạnh bậc của mỗi đỉnh không nhỏ hơn 2. Liệu có thể xảy ra

trường hợp không có 3 cạnh nào đôi một không kề nhau hay không? Tại sao ?

Trước hết ta thấy G liên thông vì G có 6 đỉnh và bậc của mỗi đỉnh lớn hơn hoặc bằng 2 nếu

không liên thông thì 6 đỉnh đó cô lập thành 2 tam giác rời nhau và G chỉ có 6 cạnh suy ra g có

chu trình(nếu không thì G là một cây và có cạnh treo, điều này trái với giả thiết). Mặt khác

7x2=14=6x2+2, nên G có 2 đỉnh bậc 3 (hoặc 1 đỉnh bậc 4) và các đỉnh còn lại phải là bậc 2,

đến đây ta xét các trường hợp sau:

Trường hợp G có đỉnh A có bậc 4 (hình a) với 4 cạnh AB, AD, AN, AP. Khi đó T không thể

kề với A mà kề 2 đỉnh khác, P và N chẳng hạn và 2 đỉnh còn lại là B và D phải kề nhau. Đến

đây ta có thể chọn các cạnh BD, NT, PA là không kề nhau

Trường hợp G có 2 đỉnh bậc 3, giả sử là A và P. Do G liên thông nên có ít nhất một đường đi

từ A tới P. Ta tạm bỏ đường đi đó (vẫn giữ các đỉnh A và P). Có thể xảy ra:

G không còn liên thông. Như vậy ta còn hai chu trình cơ bản (còn gọi là sơ cấp) phân biệt,

mỗi chu trình gồm 3 cạnh. Ta chọn cạnh AP và hai cạnh không kề với nó là TB và ND (hình

b)

G vẫn liên thông. Khi đó ta còn một chu trình sơ cấp (vì mỗi đỉnh đều có bậc 2). Ta có 3

đường đi từ A đến P (một đường đã tạm bỏ, hai đường theo chu trình), trong đó đường ngắn

nhất có độ dài bằng 1 (hình c) hoặc độ dài bằng 2 (hình d: APT hoặc ADB)

Page 184: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 183

Trên hình c trên chu trình cơ bản độ dài 6 luôn luôn chọn 3 cạnh kè nhau chẳng hạn AD, PT,

BN.

Trên hình d chỉ việc chọn một cạnh thuộc đường đi ngắn nhất từ A đến P và hai cạnh không

kề với nó trên chu trình sơ cấp còn lại AD, TB, NB, hoặc DP, AT, NB.

Vậy trong mọi trường hợp ta đều tìm được 3 cạnh đôi một kề nhau.

Hình 22.10 Tuyển chọn biên dịch viên

Bài toán 22.15 Một tổ học sinh lớp 10 chuyên toán có 11 học sinh. Buổi họp đầu tiên của tổ

vào dịp đầu năm học, bạn tổ trưởng đã phát hiện ra điều thú vị rằng mỗi bạn trong tổ đã quen

đúng 3 bạn khác. Ngay lập tức bạn A đứng lên bác bỏ phát hiện đó. Vậy trong hai bạn ý ai nói

đúng ? Vì sao ?

Giải:

Giả sử bạn tổ trưởng nói đúng. Khi đó nếu cho tương ứng mỗi đỉnh của đồ thị là một bạn

trong tổ và hai bạn quen nhau sẽ có 1 cạnh nối bởi 2 đỉnh tương ứng. Dễ thấy bậc của đỉnh là

như nhau và bằng 3. Do đó số cạnh của đồ thị là 11x3/2. Phép chia này có thương không

nguyên, bởi vậy phát hiện của tổ trưởng về số người quen của mỗi bạn trong tổ là không đúng

dẫn đến bạn A nói đúng.

22.2 Duyệt rộng trên mảng hai chiều

Trong một số trường hợp, đơn cử như các bài toán robot xén cỏ, lưới ô vuông,.. hay

các bài toán trên bàn cờ, khi đưa những bài toán này về đồ thị(như phần 29.2) ta thấy ngay

rằng số đỉnh của đồ thị tăng lên quá nhanh theo số ô cỏ-hoa hay tăng theo kích thước của bàn

A P

T

N

D

B

D

B

T

P

N

A

T

A P

N

B D

N B

P A

T

D

Hình 22.10.a Hình 22.10.b

Hình 22.10.c Hình 22.10.d

Page 185: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 184

cờ. Một cách giải quyết khác, ta sẽ duyệt trên mảng 2 chiều. Khi đó tên của 1 đỉnh sẽ là (i,j)

tương ứng với 2 chiều. Thậm chí, trong 1 số trường hợp, ta có thể duyệt trên mảng 3 chiều,

với tên mỗi đỉnh của đồ thị là (i,j,k) tương ứng với 3 chiều(bài toán con dế).

Bây giờ ta sẽ xét một bài toán duyệt trên mảng 2 chiều như sau:

Bài toán 22.16 robot

Cho 1 lưới ô vuông trong đó một số có đặt vật cản. Các ô còn lại trống. Từ 1 ô bất kỳ

trên lưới robot chỉ có thể đi đến ô khác theo một quy tắc cho sẵn theo bài toán đặt ra (có thể là

đi đến ô chung cạnh, đi đến ô cùng nằm trên đường chéo hoặc có thể đi theo kiểu con mã…).

Yêu cầu hãy tìm đường đi ngắn nhất cho robot từ ô (xp1, xp2) đến ô (kt1; kt2).

Phân tích bài toán

Để trình bày bài toán đơn giản ta giả sử quan hệ kề giữa 2 ô trên lưới là có chung cạnh.

Thuật toán của bài này hoàn toàn giống với thuật toán duyệt chiều rộng trên đồ thị bình

thường. Ta coi mỗi ô (i,j) trên lưới là một đỉnh. Tuy nhiên có một sự khác biệt lớn là khi

duyệt các đỉnh kề với mỗi ô (i.j) chúng ta biểu diễn quan hệ kề một cách rất khó khăn. Và để

giảm bớt thời gian tính toán người ta đưa ra một cách biểu diễn dữ liệu qua hai mảng dh, dc.

Từ một ô đi đến ô kề với nó ta xác định được một hướng.

Ví dụ: Theo quan hệ kề được xác định như trên từ một ô (i,j) trên lưới có thể đi đến 4 ô: (i,j +

1); (i,j - 1); (i + 1; j); (i - 1; j ).

Như vậy ta có thể quy ước 4 hướng đi từ ô i, j đến các ô khác như hình vẽ:

(i - 1; j )

hướng 2

(i,j - 1)

hướng 3 (i,j)

(i,j + 1)

hướng 1

(i + 1; j)

hướng 4

Hình 22.11 Hướng di chuyển của robot

Như vậy ta quy định hướng bằng một biểu h, h = 1,2,3,4.

- đh [h] chính là độ tăng giảm chỉ số hàng của ô kề với ô (i,j).

- dc [h] là độ tăng giảm chỉ số cột của ô kề với ô (i,j);

Đối với 1 bài toán cụ thể thì 2 mảng dh và dc là cố định không thể thay đổi.

Khi duyệt các đỉnh kề của ô (i,j) ta chỉ cần duyệt tất cả các hướng để có thể đi tới.

Trong trường hợp trên mảng dh và dc khai báo như sau:

int [] dh = {0,-1,0,1};

int[] dc = {1,0,-1,0};

Page 186: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 185

Một sự thay đổi nữa là mảng trước là mảng hai chiều. Giá trị của truoc[i,j] đánh dấu là hướng

để đi từ ô phía trước đó tới ô (i,j). Do đó khi lật ngược lại thì ta phải thay đổi hướng đi 1 góc

bằng 1800.

Vì phải coi các đỉnh là 1 ô nên hàng đợi q và duong cũng phải thay đổi như phần cài đặt dưới

đây.

Chú ý rằng không đi được ra bên ngoài lưới do đó ta coi bên ngoài lưới cũng đặt vật cản. =>

Biểu diễn bằng một ma trận a[i,j] trong đó a[i,j] = 0 nếu ô đó không có vật cản; a[i,j] = 1 nếu

ô đó có vật cản.

22.3 Bài toán đám cưới vùng quê

Có m chàng trai ở một vùng quê nọ. Đối với mỗi chàng trai ta biết các cô gái mà anh

ta vừa ý. Hỏi khi nào thì có thể tổ chức các đám cưới trong đó chàng trai nào cũng sánh duyên

với các cô gái mà mình vừa ý.

Ta có thể xây dựng đồ thị với các đỉnh biểu thị các chàng trai và các cô gái, còn các

cung biểu thị sự vừa ý của các chàng trai với các cô gái. Khi đó ta thu được một đồ thị hai

phía.

Ví dụ 22.1 Có 4 chàng trai { T1, T2, T3,T4} và 5 cô gái { G1, G2, G3,G4, G5} . Sự vừa ý cho

trong bảng sau

Chàng trai Các cô gái mà chàng trai ưng ý

T1 G1, G4, G5

T2 G2

T3 G2, G3,G4

T4 G2, G4

Đồ thị tương ứng được cho trong hình 30.1.

Hình 22.12 Mạng tương ứng với bài toán đám cưới vùng quê.

Đưa vào điểm phát s và điểm thu t. Nối s với tất cả các đỉnh biểu thị các chàng trai, và

nối t với tất cả các đỉnh biểu thị các cô gái. Tất cả các cung của đồ thị đều có khả năng thông

qua bằng 1. Bắt đầu từ luồng 0, ta tìm luồng cực đại trong mạng xây dựng được theo thuật

Page 187: TOÁN RỜI RẠC113.160.134.160/sach/01200023.pdf · học có đối tượng nghiên cứu là các tập hợp cấu trúc, ... Danh mục các hình vẽ ... 17.2. Bài toán

TOÁN RỜI RẠC

Khoa Công nghệ Thông tin - ĐHSPKT Hưng Yên Trang 186

toán ford-Fulkerson. Từ định lý về tính nguyên, luồng trên các cung là các số hoặc 1. Rõ ràng

là nếu luồng cực đại trong đồ thị có giá trị Vmax = m, thì bài toán có lời giải, và các cung với

luồng bằng 1 sẽ chỉ ra cách tổ chức đám cưới thoả mãn điều kiện đặt ra. Ngược lại, nếu bài

toán có lời giải thì Vmax = m. Bài toán về đám cưới vùng quê là một trường hợp riêng của bài

toán về cặp ghép trên đồ thị hai phía mà để giải nó có thể xây dựng thuật toán hiệu quả hơn.

22.4. Bài tập

Bài toán luồng cực đại có rất nhiều ứng dụng trong việc giải bài toán tổ hợp. Khó khăn

chính ở đây là phải xây dựng mạng tương ứng sao cho việc tìm luồng cực đại trong nó sẽ

tương đương với việc giải bài toán tổ hợp đặt ra. Mục này sẽ giới thiệu một số bài toán như

vậy.