Upload
lykhuong
View
229
Download
12
Embed Size (px)
Citation preview
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Ạ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
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
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
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
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
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
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
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
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
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ó
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”
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ỳ
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ị
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.
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
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
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ừ.
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.
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.
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
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.
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)
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.
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,..)).
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.
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”.
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ừ.
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ó
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.
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:
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:
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
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à.
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ờ.
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
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
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ừ
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?
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?
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
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.
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.
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).
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)
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.
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
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
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.
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.
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
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!
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.
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
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.
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
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.
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.
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.
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:
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
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.
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ố
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
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?
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
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
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
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ừ
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.
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ó
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ó.
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.
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.
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:
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ư
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ó:
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.
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.
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.
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.
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.
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
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:
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ờ.
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ư
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ó
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?
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$
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
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.
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.
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.
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
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:
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
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ị.
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.
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
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
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
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.
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
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.
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ề:
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ó.
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
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.
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
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.
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ý:
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);
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);
}
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
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
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ị.
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ả.
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.
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.
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
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);
}
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.
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
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);
}
}
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
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
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
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
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
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.
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 *)
}
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.
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>
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
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 …
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;
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
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ỳ.
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
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
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
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(); } } }
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
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])
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(); } } }
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
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
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
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
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
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:
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ỉ
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
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
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).
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
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()
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(); } } }
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 },
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
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.
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).
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ả.
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ẽ
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()
{
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
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
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
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
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).
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
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
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
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
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
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
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
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ô
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.
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.
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:
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 )
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)
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
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};
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
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.