1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tài liệu học tập

168 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Lý thuyết tổ hợp là một phần quan trọng của toán học rời rạc chuyên nghiên cứu sự phân bố các phần tử vào các tập hợp. Thông thường các phần tử này là hữu hạn và việc phân bố chúng phả[r]

(1)

Bộ giáo dục đào tạo đại học huế

tr−ờng đại học khoa học nguyễn gia nh

giáo trình

Toán rời r¹c

000

100

010

001

011 101

111 110

(2)

LỜI NÓI ĐẦU

Được động viên mạnh mẽ đồng nghiệp Khoa Tốn-Cơ-Tin học, Cơng nghệ Thơng tin Vật lý (Trường Đại học Khoa học-Đại học Huế), Khoa Toán Tin học (Trường Đại học Sư phạm-Đại học Huế) đặc biệt nhu cầu học tập sinh viên Đại học Huế Khoa nói học viên cao học ngành Phương pháp giảng dạy Tốn, chúng tơi mạnh dạn viết giáo trình Tốn rời rạc thị trường sách có nhiều tài liệu liên quan đến Tốn rời rạc Điều mà mong muốn kiến thức học phần phải đưa vào đầy đủ, đọng, xác, cập nhật, bám sát theo yêu cầu đào tạo sinh viên ngành Công nghệ Thơng tin, Tốn-Tin, Vật lý-Tin số ngành kỹ thuật khác trường đại học cao đẳng

Với nổ lực thân, thiết nghĩ tài liệu tham khảo tốt cho giáo viên giảng dạy học phần toán rời rạc, học viên cao học ngành Phương pháp giảng dạy Tốn, thí sinh thi vào cao học ngành công nghệ thông tin, sinh viên thuộc ngành đề cập học sinh thuộc khối chuyên Toán, chuyên Tin

Nội dung tài liệu bố trí phần, khơng kể lời nói đầu, mục lục, tài liệu tham khảo phần phụ lục:

Phần dành cho Chương I đề cập đến Thuật toán; Phần dành cho Chương II nói đến toán đếm;

Phần 3, phần chiếm nhiều trang giáo trình, bàn Lý thuyết đồ thị các ứng dụng gồm chương: Đồ thị, Đồ thị Euler đồ thị Hamilton, Một số toán tối ưu đồ thị, Cây, Đồ thị phẳng tô màu đồ thị;

Phần dành cho Chương 8, chương cuối cùng, đề cập đến Đại số Boole

Trong chương, chứng minh định lý, mệnh đề trình bày chi tiết, ngoại trừ số định lý có phần chứng minh phức tạp chúng tơi bỏ qua Trong phần chương có nhiều ví dụ cụ thể minh hoạ cho khái niệm kết chúng Cuối chương tập chọn lọc từ dễ đến khó, bám theo nội dung chương

Chúng tơi xin chân thành cám ơn đồng nghiệp động viên góp ý cho cơng việc viết giáo trình Tốn rời rạc lời cám ơn đặc biệt xin dành cho Khoa Công nghệ Thông tin giúp đỡ quý báu tạo điều kiện thuận lợi cho việc xuất giáo trình

Tác giả mong nhận giáo đồng nghiệp độc giả thiếu sót khó tránh khỏi sách

(3)

MỤC LỤC

Lời nói đầu

Mục lục

Chương I: Thuật toán

1.1 Khái niệm thuật toán

1.2 Thuật tốn tìm kiếm

1.3 Độ phức tạp thuật toán

1.4 Số nguyên thuật toán 12

1.5 Thuật toán đệ quy 17

Bài tập Chương I 19

Chương II: Bài toán đếm 22

2.1 Cơ sở phép đếm 22

2.2 Nguyên lý Dirichlet 25

2.3 Chỉnh hợp tổ hợp suy rộng 28

2.4 Sinh hoán vị tổ hợp 30

2.5 Hệ thức truy hồi 32

2.6 Quan hệ chia để trị 34

Bài tập Chương II 35

Chương III: Đồ thị 37

3.1 Định nghĩa thí dụ 37

3.2 Bậc đỉnh 39

3.3 Những đơn đồ thị đặc biệt 41

3.4 Biểu diễn đồ thị ma trận đẳng cấu đồ thị 44

3.5 Các đồ thị từ đồ thị cũ 46

3.6 Tính liên thơng 47

Bài tập Chương III 51

Chương IV: Đồ thị Euler Đồ thị Hamilton 54

4.1 Đường Euler đồ thị Euler 54

4.2 Đường Hamilton đồ thị Hamilton 58

Bài tập Chương IV 64

Chương V: Một số toán tối ưu đồ thị 67

5.1 Đồ thị có trọng số tốn đường ngắn 67

5.2 Bài toán luồng cực đại 72

5.3 Bài toán du lịch 79

Bài tập Chương V 84

(4)

Chương VI: Cây 87

6.1 Định nghĩa tính chất 87

6.2 Cây khung tốn tìm khung nhỏ 88

6.3 Cây có gốc 93

6.4 Duyệt nhị phân 94

Bài tập Chương VI 101

Chương VII: Đồ thị phẳng tô màu đồ thị 104

7.1 Đồ thị phẳng 104

7.2 Đồ thị không phẳng 106

7.3 Tô màu đồ thị 107

Bài tập Chương VII 112

Chương VIII: Đại số Boole 114

8.1 Khái niệm đại số Boole 114

8.2 Hàm Boole 117

8.3 Mạch lôgic 120

8.4 Cực tiểu hố mạch lơgic 125

Bài tập Chương VIII 132

Tài liệu tham khảo 134

Phần phụ lục 135

Phụ lục 1 135

Phụ lục 2 158

(5)

CHƯƠNG I:

THUẬT TOÁN

1.1 KHÁI NIỆM THUẬT TỐN

1.1.1 Mởđầu:

Có nhiều lớp toán tổng quát xuất toán học rời rạc Chẳng hạn, cho dãy số nguyên, tìm số lớn nhất; cho tập hợp, liệt kê tập nó; cho tập hợp số nguyên, xếp chúng theo thứ tự tăng dần; cho mạng, tìm đường ngắn hai đỉnh Khi giao cho tốn việc phải làm xây dựng mơ hình dịch tốn thành ngữ cảnh toán học Các cấu trúc rời rạc dùng mơ hình tập hợp, dãy, hàm, hốn vị, quan hệ, với cấu trúc khác nhưđồ thị, cây, mạng - khái niệm sẽđược nghiên cứu

ở chương sau

Lập mô hình tốn học thích hợp phần q trình giải Để

hồn tất q trình giải, cịn cần phải có phương pháp dùng mơ hình để giải tốn tổng qt Nói cách lý tưởng, địi hỏi thủ tục, dãy bước dẫn tới đáp số mong muốn Một dãy bước vậy, gọi thuật toán Khi thiết kế cài đặt phần mềm tin học cho vấn đề đó, ta cần phải

đưa phương pháp giải mà thực chất thuật tốn giải vấn đề Rõ ràng rằng, khơng tìm phương pháp giải khơng thể lập trình

được Chính thế, thuật tốn khái niệm tảng hầu hết lĩnh vực tin học

1.1.2 Định nghĩa: Thuật toán bảng liệt kê dẫn (hay quy tắc) cần thực theo bước xác định nhằm giải toán cho

Thuật ngữ “Algorithm” (thuật toán) xuất phát từ tên nhà toán học Ả Rập Al-Khowarizmi Ban đầu, từ algorism dùng để quy tắc thực phép tính số học số thập phân Sau đó, algorism chuyển thành algorithm vào kỷ 19 Với quan tâm ngày tăng máy tính, khái niệm thuật tốn cho ý nghĩa chung hơn, bao hàm thủ tục xác định để giải toán, thủ tục để thực phép tính số học

Có nhiều cách trình bày thuật tố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, dùng ngơn ngữ lập trình lệnh phép ngơn ngữđó dùng điều thường làm cho

mơ tả thuật tốn trở nên rối rắm khó hiểu Hơn nữa, nhiều ngơn ngữ lập trình

đều dùng rộng rãi, nên chọn ngơn ngữđặc biệt điều người ta khơng muốn Vì thuật tốn ngồi việc trình bày ngơn ngữ tự nhiên với ký hiệu tốn học quen thuộc cịn dùng dạng giả mã để mô tả thuật

(6)

toán Giả mã tạo bước trung gian mơ tả thuật tốn ngơn ngữ thơng thường thực thuật tốn ngơn ngữ lập trình Các bước thuật tốn

được rõ cách dùng lệnh giống ngơn ngữ lập trình

Thí dụ 1: Mơ tả thuật tốn tìm phần tử lớn dãy hữu hạn số nguyên a) Dùng ngôn ngữ tự nhiên để mô tả bước cần phải thực hiện:

Đặt giá trị cực đại tạm thời số nguyên dãy (Cực đại tạm thời số nguyên lớn kiểm tra giai đoạn thủ tục.)

2 So sánh số nguyên tiếp sau với giá trị cực đại tạm thời, lớn giá trị

cực đại tạm thời đặt cực đại tạm thời số nguyên Lặp lại bước trước số nguyên dãy

Dừng khơng cịn số ngun dãy Cực đại tạm thời điểm số nguyên lớn dãy

b) Dùng đoạn giả mã:

procedure max (a1, a2, , an: integers)

max:= a1 for i:= to n

if max <aithen max:=

{max phần tử lớn nhất}

Thuật toán trước hết gán số hạng a1 dãy cho biến max Vòng lặp

“for” dùng để kiểm tra số hạng dãy Nếu số hạng lớn giá trị thời max gán làm giá trị max

1.1.3 Các đặc trưng thuật toán:

Đầu vào (Input): Một thuật tốn có giá trịđầu vào từ tập rõ

Đầu ra (Output): Từ tập giá trịđầu vào, thuật toán tạo giá trịđầu Các giá trị đầu nghiệm tốn

Tính dừng: Sau số hữu hạn bước thuật toán phải dừng

Tính xác định:Ở bước, bước thao tác phải rõ ràng, không gây nên

nhập nhằng Nói rõ hơn, điều kiện hai xử lý thực bước thuật toán phải cho kết

Tính hiệu quả: Trước hết thuật tốn cần đắn, nghĩa sau đưa liệu vào thuật toán hoạt động đưa kết ý muốn

Tính phổ dụng: Thuật tốn giải tốn lớp tốn Cụ thể thuật tốn có đầu vào liệu khác miền xác định

1.2 THUẬT TỐN TÌM KIẾM.

1.2.1 Bài tốn tìm kiếm: Bài tốn xác định vị trí phần tử bảng liệt kê thứ tự thường gặp nhiều trường hợp khác Chẳng hạn chương trình

(7)

kiểm tra tả từ, tìm kiếm từ từ điển, mà từ điển chẳng qua bảng liệt kê thứ tự từ Các toán thuộc loại

được gọi toán tìm kiếm

Bài tốn tìm kiếm tổng qt mơ tả sau: xác định vị trí phần tử x bảng liệt kê phần tử phân biệt a1, a2, , an xác định khơng có

mặt bảng liệt kê Lời giải tốn vị trí số hạng bảng liệt kê có giá trị x (tức i nghiệm x=ai x khơng có mặt bảng

liệt kê)

1.2.2 Thuật tốn tìm kiếm tuyến tính: Tìm kiếm tuyến tính hay tìm kiếm bắt đầu việc so sánh x với a1; x=a1, nghiệm vị trí a1, tức 1; x≠a1, so

sánh x với a2 Nếu x=a2, nghiệm vị trí a2, tức Khi x≠a2, so sánh x với a3 Tiếp

tục trình cách so sánh x với số hạng bảng liệt kê tìm số hạng x, nghiệm vị trí số hạng Nếu tồn bảng liệt kê kiểm tra mà không xác định vị trí x, nghiệm Giả mã thuật tốn tìm kiếm tuyến tính cho đây:

procedure tìm kiếm tuyến tính (x: integer, a1,a2, ,an: integers phân biệt)

i :=

while (i ≤ n and x ≠ ai)

i := i +

if i ≤ n then location := i

else location :=

{location số số hạng x khơng tìm x}

1.2.3 Thuật tốn tìm kiếm nhị phân: Thuật tốn dùng bảng liệt kê có số hạng theo thứ tự tăng dần Chẳng hạn, số hạng số chúng từ số nhỏ đến số lớn chúng từ hay xâu ký tự chúng theo thứ tự từđiển Thuật toán thứ hai gọi thuật tốn tìm kiếm nhị phân Nó tiến hành cách so sánh phần tử cần xác định vị trí với số

hạng bảng liệt kê Sau bảng tách làm hai bảng kê nhỏ có kích thước nhau, hai bảng bảng số hạng Sự

tìm kiếm tiếp tục cách hạn chế tìm kiếm bảng kê thích hợp dựa việc so sánh phần tử cần xác định vị trí với số hạng bảng kê Ta thấy thuật tốn tìm kiếm nhị phân hiệu nhiều so với thuật toán tìm kiếm tuyến tính

Thí dụ Để tìm số 19 bảng liệt kê 1,2,3,5,6,7,8,10,12,13,15,16,18,19,20,22 ta tách bảng liệt kê gồm 16 số hạng thành hai bảng liệt kê nhỏ hơn, bảng có số

hạng, cụ thể là: 1,2,3,5,6,7,8,10 12,13,15,16,18,19,20,22 Sau ta so sánh 19 với số

hạng cuối bảng thứ Vì 10<19, việc tìm kiếm 19 giới hạn bảng liệt kê thứ từ số hạng thứ đến 16 bảng liệt kê ban đầu Tiếp theo, ta

(8)

lại tách bảng liệt kê gồm số hạng làm hai bảng con, bảng có số hạng, cụ

thể 12,13,15,16 18,19,20,22 Vì 16<19, việc tìm kiếm lại giới hạn bảng thứ 2, từ số hạng thứ 13 đến 16 bảng liệt kê ban đầu Bảng liệt kê thứ lại tách làm hai, cụ thể là: 18,19 20,22 Vì 19 khơng lớn số hạng lớn bảng thứ nên việc tìm kiếm giới hạn bảng thứ gồm số 18,19, số hạng thứ 13 14 bảng ban đầu Tiếp theo bảng chứa hai số

hạng lại tách làm hai, bảng có số hạng 18 19 Vì 18<19, tìm kiếm giới hạn bảng thứ 2, bảng liệt kê chứa số hạng thứ 14 bảng liệt kê ban đầu, số hạng số 19 Bây tìm kiếm thu hẹp số

hạng, so sánh tiếp cho thấy19 số hạng thứ 14 bảng liệt kê ban đầu Bây ta rõ bước thuật tốn tìm kiếm nhị phân

Để tìm số nguyên x bảng liệt kê a1,a2, ,an với a1 < a2 < < an, ta bắt đầu

bằng việc so sánh x với số hạng am dãy, với m=[(n+1)/2] Nếu x > am, việc

tìm kiếm x giới hạn nửa thứ hai dãy, gồm am+1,am+2, ,an Nếu x khơng lớn am,

thì tìm kiếm giới hạn nửa đầu dãy gồm a1,a2, ,am

Bây tìm kiếm giới hạn bảng liệt kê có khơng [n/2] phần tử Dùng thủ tục này, so sánh x với số hạng bảng liệt kê hạn chế Sau

đó lại hạn chế việc tìm kiếm nửa thứ nửa thứ hai bảng liệt kê Lặp lại trình nhận bảng liệt kê có số hạng Sau đó, cịn xác định số hạng có phải x hay khơng Giả mã cho thuật tốn tìm kiếm nhị phân

được cho đây:

procedure tìm kiếm nhị phân (x: integer, a1,a2, ,an: integers tăng dần)

i := {i điểm mút trái khoảng tìm kiếm} j := n {j điểm mút phải khoảng tìm kiếm}

while i < j

begin

m:= [(i+j)/2]

if x>amthen i:=m+1 else j := m

end

if x = then location := i

else location :=

{location số số hạng x khơng tìm thấy x}

1.3 ĐỘ PHỨC TẠP CỦA THUẬT TOÁN.

1.3.1 Khái niệm vềđộ phức tạp thuật toán:

Thước đo hiệu thuật toán thời gian mà máy tính sử dụng để giải toán theo thuật toán xét, giá trị đầu vào có kích thước xác định

(9)

Một thước đo thứ hai dung lượng nhớ địi hỏi để thực thuật tốn giá trị đầu vào có kích thước xác định Các vấn đề liên quan đến độ phức tạp tính tốn thuật tốn Sự phân tích thời gian cần thiết để giải tốn có kích thước đặc biệt liên quan đến độ phức tạp thời gian thuật tốn Sự phân tích nhớ cần thiết máy tính liên quan đến độ phức tạp khơng giancủa thuật tốn Vệc xem xét độ phức tạp thời gian không gian thuật toán vấn đề thiết yếu thuật toán thực Biết thuật toán đưa đáp số micro giây, phút tỉ năm, hiển nhiên quan trọng Tương tự vậy, dung lượng nhớ đòi hỏi phải khả dụng để giải tốn,vì độ phức tạp khơng gian 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ấu trúc liệu đặc biệt dùng để thực thuật toán nên ta tập trung xem xét độ phức tạp thời gian

Độ phức tạp thời gian thuật tốn có thểđược biểu diễn qua số phép tốn dùng thuật tốn giá trịđầu vào có kích thước xác định Sở

dĩ độ phức tạp thời gian mô tả thơng qua số phép tốn địi hỏi thay thời gian thực máy tính máy tính khác thực phép tính sơ cấp khoảng thời gian khác Hơn nữa, phân tích tất phép tốn thành phép tính bit sơ cấp mà máy tính sử dụng điều phức tạp

Thí dụ 3: Xét thuật tốn tìm số lớn dãy n số a1, a2, , an Có thể coi kích

thước liệu nhập số lượng phần tử dãy số, tức n Nếu coi lần so sánh hai số thuật tốn địi hỏi đơn vị thời gian (giây chẳng hạn) thời gian thực thuật toán trường hợp xấu n-1 giây Với dãy 64 số, thời gian thực thuật tốn nhiều 63 giây

Thí dụ 4:Thuật tốn trị chơi “Tháp Hà Nội”

Trị chơi “Tháp Hà Nội” sau: Có ba cọc A, B, C 64 đĩa (có lỗ để đặt vào cọc), đĩa có đường kính đơi khác Nguyên tắc đặt đĩa vào cọc là:

đĩa chỉđược chồng lên đĩa lớn Ban đầu, 64 đĩa đặt chồng lên cột A; hai cột B, C trống Vấn đề phải chuyển 64 đĩa sang cột B hay C, lần di chuyển đĩa

Xét trò chơi với n đĩa ban đầu cọc A (cọc B C trống) Gọi Sn số lần

chuyển đĩa để chơi xong trò chơi với n đĩa Nếu n=1 rõ ràng S1=1

Nếu n>1 trước hết ta chuyển n-1 đĩa bên sang cọc B (giữ yên đĩa thứ n

dưới cọc A) Số lần chuyển n-1 đĩa 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 Sn-1)

Như vậy, số lần chuyển n đĩa từ A sang C là:

(10)

Thuật tốn 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 lần chuyển đĩa giây thời gian thực thuật tốn xấp xỉ 585 tỉ

năm!

Hai thí dụ cho thấy rằng: thuật toán phải kết thúc sau số hữu hạn bước, số hữu hạn q lớn thuật tốn khơng thể thực thực tế

Ta nói: thuật tốn Thí dụ có độ phức tạp n-1 thuật toán hữu hiệu (hay thuật toán nhanh); thuật tốn Thí dụ có độ phức tạp 2n−1 thuật tốn khơng hữu hiệu (hay thuật toán chậm)

1.3.2 So sánh độ phức tạp thuật toán:

Một toán thường có nhiều cách giải, có nhiều thuật tốn để giải, thuật tốn có độ phức tạp khác

Xét tốn: Tính giá trị đa thức P(x)=anxn+an-1xn-1+ +a1x+a0 x0 Thuật toán 1:

Procedure tính giá trị đa thức (a0, a1, , an, x0: số thực)

sum:=a0

for i:=1 to n

sum:=sum+aix0i

{sum giá trị đa thức P(x) x0}

Chú ý đa thức P(x) viết dạng: P(x)=( ((anx+an-1)x+an-2)x )x+a0

Ta tính P(x) theo thuật tốn sau:

Thuật tốn 2:

Procedure tính giá trị đa thức (a0, a1, , an, x0: số thực)

P:=an

for i:=1 to n P:=P.x0+an-i

{P giá trị đa thức P(x) x0}

Ta xét độ phức tạp hai thuật toán

Đối với thuật toán 1: bước 2, phải thực phép nhân phép cộng với i=1; phép nhân phép cộng với i=2, , n phép nhân phép cộng với i=n Vậy số phép tính (nhân cộng) mà thuật tốn địi hỏi là:

(1+1)+(2+1)+ +(n+1)=

2 ) (n+

n

+n=

2 ) (n+

n

Đối với thuật toán 2, bước phải thực n lần, lần đòi hỏi phép tính (nhân cộng), số phép tính (nhân cộng) mà thuật tốn địi hỏi 2n

(11)

Nếu coi thời gian thực phép tính nhân cộng

đơn vị thời gian với n cho trước, thời gian thực thuật toán n(n+3)/2, cịn thời gian thực thuật tốn 2n

Rõ ràng thời gian thực thuật tốn so với thời gian thực thuật toán Hàm f1(n)=2n hàm bậc nhất, tăng chậm nhiều so với hàm bậc hai

f2(n)=n(n+3)/2

Ta nói thuật tốn (có độ phức tạp 2n) thuật toán hữu hiệu (hay nhanh hơn) so với thuật tốn (có độ phức tạp n(n+3)/2)

Để so sánh độ phức tạp thuật toán, điều tiện lợi coi độ phức tạp thuật toán cấp hàm biểu thời gian thực thuật toán

Các hàm xét sau hàm biến số tự nhiên n>0

Định nghĩa 1:Ta nói hàm f(n) có cấp thấp hay hàm g(n) tồn số

C>0 số tự nhiên n0 cho

|f(n)| ≤ C|g(n)| với n≥n0

Ta viết f(n)=O(g(n)) nói f(n) thoả mãn quan hệ big-O g(n)

Theo định nghĩa này, hàm g(n) hàm đơn giản được, đại diện cho “sự biến thiên” f(n)

Khái niệm big-O dùng toán học gần kỷ Trong tin học, sử dụng rộng rãi để phân tích thuật tốn Nhà tốn học người Đức Paul Bachmann người đưa khái niệm big-O vào năm 1892

Thí dụ 5: Hàm f(n)=

2 ) (n+

n

hàm bậc hai hàm bậc hai đơn giản n2 Ta có: f(n)=

2 ) (n+

n

=O(n2)

2 ) (n+

n ≤ n2 với mọi n≥3 (C=1, n 0=3)

Một cách tổng quát, f(n)=aknk+ak-1nk-1+ +a1n+a0 f(n)=O(nk) Thật vậy,

với n>1,

|f(n)|| ≤ |ak|nk+|ak-1|nk-1+ +|a1|n+|a0| = nk(|ak|+|ak-1|/n+ +|a1|/nk-1+a0/nk)

≤ nk(|a

k|+|ak-1|+ +|a1|+a0) Điều chứng tỏ |f(n)| ≤ Cnk với mọi n>1

Cho g(n)=3n+5nlog2n, ta có g(n)=O(nlog2n) Thật vậy,

3n+5nlog2n = n(3+5log2n) ≤ n(log2n+5log2n) = 6nlog2n với n≥8 (C=6, n0=8)

Mệnh đề:Cho f1(n)=O(g1(n)) f2(n) O(g2(n)) Khi

(f1 + f2)(n) = O(max(|g1(n)|,|g2(n)|), (f1f2)(n) = O(g1(n)g2(n)) Chứng minh Theo giả thiết, tồn C1, C2, n1, n2 cho

|f1(n)| ≤ C1|g1(n)| |f2(n)| ≤ C2|g2(n)| với n > n1 n > n2

Do |(f1 + f2)(n)| = |f1(n) + f2(n)| ≤ |f1(n)| + |f2(n)| ≤ C1|g1(n)| + C2|g2(n)| ≤ (C1+C2)g(n)

với n > n0=max(n1,n2), đâyC=C1+C2 g(n)=max(|g1(n)| , |g2(n)|)

(12)

Định nghĩa 2: Nếu thuật tốn có độ phức tạp f(n) với f(n)=O(g(n)) ta nói thuật tốn có độ phức tạp O(g(n))

Nếu có hai thuật tốn giải tốn, thuật tốn có độ phức tạp O(g1(n)), thuật tốn có độ phức tạp O(g2(n)), mà g1(n) có cấp thấp g2(n), ta nói

rằng thuật toán hữu hiệu (hay nhanh hơn) thuật toán

1.3.3 Đánh giá độ phức tạp thuật tốn:

1) Thuật tốn tìm kiếm tuyến tính:

Số phép so sánh dùng thuật toán sẽđược xem thước

đo độ phức tạp thời gian Ở bước vịng lặp thuật tốn, có hai phép so sánh thực hiện: để xem tới cuối bảng chưa để so sánh phần tử x với số hạng bảng Cuối cịn phép so sánh làm ngồi vịng lặp Do đó, x=ai, có 2i+1 phép so sánh sử dụng Số phép so sánh nhiều

nhất, 2n+2, đòi hỏi phải sử dụng phần tử x khơng có mặt bảng Từ đó, thuật tốn tìm kiếm tuyến tính có độ phức tạp O(n)

2) Thuật tốn tìm kiếm nhị phân:

Đểđơn giản, ta giả sử có n=2k phần tử bảng liệt kê a1,a2, ,an, với k

số nguyên không âm (nếu n lũy thừa 2, ta xem bảng phần bảng gồm 2k+1 phần tử, k số nguyên nhỏ cho n < 2k+1)

Ở giai đoạn thuật toán vị trí số hạng i số hạng cuối j bảng hạn chế tìm kiếm giai đoạn so sánh để xem bảng cịn nhiều phần tử hay khơng Nếu i < j, phép so sánh sẽđược làm để xác định x có lớn số hạng bảng hạn chế hay không Như giai đoạn, có sử dụng hai phép so sánh Khi bảng phần tử, phép so sánh

cho biết khơng cịn phần tử thêm phép so sánh cho biết số hạng có phải x hay khơng Tóm lại cần phải có nhiều 2k+2=2log2n+2 phép so sánh để thực phép tìm kiếm nhị phân (nếu n khơng phải

lũy thừ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]

tìm kiếm địi hỏi phải thực nhiều 2[log2n]+2 phép so sánh) Do thuật tốn

tìm kiếm nhị phân có độ phức tạp O(log2n) Từ phân tích suy thuật

tốn tìm kiếm nhị phân, trường hợp xấu nhất, hiệu thuật tốn tìm kiếm tuyến tính

3) Chú ý: Một điều quan trọng cần phải biết máy tính phải cần để giải xong tốn Thí dụ, thuật tốn địi hỏi 10 giờ, cịn đáng chi phí thời gian máy tính địi hỏi để giải tốn Nhưng thuật tốn địi hỏi 10 tỉ năm để

giải tốn, thực thuật tốn điều phi lý Một tượng lý thú công nghệ đại tăng ghê gớm tốc độ lượng 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

(13)

bài toán xử lý song song - kỹ thuật thực đồng thời dãy phép tính Do tăng tốc độ tính tốn dung lượng nhớ máy tính, nhờ việc dùng thuật toán lợi dụng ưu kỹ thuật xử lý song song, toán vài năm trước xem khơng thể giải được, giải bình thường

1 Các thuật ngữ thường dùng cho độ phức tạp thuật toán:

Độ phức tạp Thuật ngữ

O(1) Độ phức tạp số

O(logn) Độ phức tạp lơgarit

O(n) Độ phức tạp tuyến tính

O(nlogn) Độ phức tạp nlogn

O(nb) Độ phức tạp đa thức

O(bn) (b>1) Độ phức tạp hàm mũ

O(n!) Độ phức tạp giai thừa

2 Thời gian máy tính dùng thuật tốn:

Kích thước Các phép tính bit sử dụng toán

n logn N nlogn n2 2n n!

10 3.10-9 s 10-8 s 3.10-8 s 10-7 s 10-6 s 3.10-3 s 102 7.10-9 s 10-7 s 7.10-7 s 10-5 s 4.1013năm *

103 1,0.10-8 s 10-6 s 1.10-5 s 10-3 s * *

104 1,3.10-8 s 10-5 s 1.10-4 s 10-1 s * *

105 1,7.10-8 s 10-4 s 2.10-3 s 10 s * *

106 2.10-8 s 10-3 s 2.10-2 s 17 phút * *

1.4 SỐ NGUN VÀ THUẬT TỐN.

1.4.1 Thuật tốn Euclide:

Phương pháp tính ước chung lớn hai số cách dùng phân tích số

ngun thừa số ngun tố khơng hiệu Lý chỗ thời gian phải tiêu tốn cho phân tích Dưới phương pháp hiệu để tìm ước số chung lớn nhất, gọi thuật toán Euclide Thuật toán biết từ thời cổđại Nó mang tên nhà tốn học cổ Hy lạp Euclide, người mô tả thuật toán sách “Những yếu tố” tiếng ơng Thuật tốn Euclide dựa vào mệnh đề sau

Mệnh đề (Thuật toán chia): Cho a b hai số nguyên b≠0 Khi tồn hai số nguyên q r cho

a = bq+r, ≤ r < |b|

Trong đẳng thức trên, b gọi số chia, a gọi số bị chia, q gọi thương số r gọi số dư

(14)

Khi b nguyên dương, ta ký hiệu số dư r phép chia a cho b a mod b

Mệnh đề 2:Cho a = bq + r, a, b, q, r số nguyên Khi UCLN(a,b) = UCLN(b,r)

(Ởđây UCLN(a,b) để ước chung lớn a b.)

Giả sử a b hai số nguyên dương với a ≥ b Đặt r0 = a 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 ≤ r2 < r1

r1 = r2q2 + r3 ≤ r3 < r2

rn-2 = rn-1qn-1 + rn ≤ rn < rn-1

rn-1 = rnqn

Cuối cùng, số dư xuất dãy phép chia liên tiếp, dãy số dư a = r0 > r1 > r2 > ≥

không thể chứa a số hạng Hơn nữa, từ Mệnh đề 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 số dư khác không cuối dãy phép chia

Thí dụ 6: Dùng thuật tốn Euclide tìm UCLN(414, 662) 662 = 441.1 + 248

414 = 248.1 + 166 248 = 166.1+ 82 166 = 82.2 + 82 = 2.41

Do đó, UCLN(414, 662) =

Thuật toán Euclide viết dạng giả mã sau:

procedure ƯCLN (a,b: positive integers) x := a

y := b

while y ≠

begin

r := x mod y

x := y

y := r

end

{UCLN (a,b) x}

Trong thuật toán trên, giá trị ban đầu x y tương ứng a b Ở giai

đoạn thủ tục, x thay y y thay x mody Quá trình lặp lại chừng y ≠ Thuật toán ngừng y = giá trị x ởđiểm này, số dư khác khơng cuối thủ tục, ước chung lớn a b

(15)

1.4.2 Biểu diễn số nguyên:

Mệnh đề 3:Cho b số nguyên dương lớn Khi n số nguyên dương, có thểđược biểu diễn cách dạng:

n = akbk + ak-1bk-1 + + a1b + a0

Ởđây k số tự nhiên, a0, a1, , ak số tự nhiên nhỏ b ak ≠

Biểu diễn n cho Mệnh đề gọi khai triển n theo số

b, ký hiệu (akak-1 a1a0)b Bây ta mô tả thuật toán xây dựng khai triển số b

của số nguyên n Trước hết ta chia n cho b đểđược thương số dư, tức n = bq0 + a0, ≤ a0 < b

Số dư a0 chữ số đứng bên phải khai triển số b n Tiếp theo

chia q0 cho b, ta được:

q0 = bq1 + a1, ≤ a1 < b

Số dư a1 chữ số thứ hai tính từ bên phải khai triển số b n Tiếp tục

quá trình này, cách liên tiếp chia thương cho b ta sẽđược chữ số khai triển số b n số dư tương ứng Quá trình kết thúc ta nhận thương

Thí dụ 7: Tìm khai triển số (12345)10

12345 = 8.1543 + 1543 = 8.192 + 192 = 8.24 + 24 = 8.3 + = 8.0 + Do đó, (12345)10 = (30071)8

Đoạn giả mã sau biểu diễn thuật tốn tìm khai triển số b số nguyên n

procedure khai triển theo số b (n: positive integer) q := n

k :=

while q ≠

begin

ak := q mod b

q := [q b] k := k +

end

1.4.3 Thuật toán cho phép tính số nguyên:

(16)

đây thuật toán cộng nhân hai số nguyên biểu diễn nhị phân Ta

phân tích độ phức tạp tính tốn thuật tốn thơng qua số phép toán bit thực sựđược dùng Giả sử khai triển nhị phân hai số nguyên dương a b là:

a = (an-1an-2 a1 a0)2 b = (bn-1 bn-2 b1 b0)2

sao cho a b có n bit (đặt bit ởđầu khai triển đó, cần)

1) Phép cộng: Xét toán cộng hai số nguyên viết dạng nhị phân Thủ tục thực phép cộng dựa phương pháp thơng thường cộng cặp chữ số nhị phân với (có nhớ) để tính tổng hai số nguyên

Để cộng a b, trước hết cộng hai bit phải chúng, tức là: a0 + b0 = c0.2 + s0

Ởđây s0 bit phải khai triển nhị phân a+b, c0 số nhớ,

0 Sau ta cộng hai bit số nhớ

a1 + b1 + c0 = c1.2 + s1

Ở s1 bit (tính từ bên phải) khai triển nhị phân a+b c1 số

nhớ Tiếp tục trình cách cộng bit tương ứng hai khai triển nhị

phân số nhớ để xác định bit tiếp sau tính từ bên phải khai triển nhị phân tổng a+b Ở giai đoạn cuối cùng, cộng an-1, bn-1 cn-2để nhận cn-1.2+sn-1 Bit đứng đầu tổng sn=cn-1 Kết quả, thủ tục tạo khai triển nhị phân tổng, cụ

thể a+b = (sn sn-1 sn-2 s1 s0)2

Thí dụ 8: Tìm tổng a = (11011)2 b = (10110)2

a0 + b0 = + = 0.2 + (c0 = 0, s0 = 1), a1 + b1 + c0 = + + = 1.2 + (c1 = 1,

s1 = 0), a2 + b2 +c1 = + + = 1.2 + (c2 = 1, s2 = 0), a3 + b3 + c2 = + + = 1.2 +

0 (c3 = 1, s3 = 0), a4 + b4 +c3 = + + = 1.2 + (s5 = c4 =1, s4 = 1)

Do đó, a + b = (110001)2

Thuật tốn cộng có thểđược mơ tả cách dùng đoạn giả mã sau

procedure cộng (a,b: positive integers) c :=

for j := to n-1

begin

d := ⎥

⎦ ⎤ ⎢

⎡ + +

2 c b

aj j

sj := aj + bj + c − 2d

c := d

end

sn := c

(17)

Tổng hai số nguyên tính cách cộng liên tiếp cặp bit cần phải cộng số nhớ Cộng cặp bit số nhớ đòi ba phép cộng bit Như vậy, tổng số phép cộng bit sử dụng nhỏ ba lần số bit khai triển nhị phân Do đó, độ phức tạp thuật toán O(n)

2) Phép nhân: Xét toán nhân hai số nguyên viết dạng nhị phân Thuật tốn thơng thường tiến hành sau Dùng luật phân phối, ta có:

ab = a

=

2

n j

j j

b =

=

) (

n j

j j

b

a

Ta tính ab cách dùng phương trình Trước hết, ta thấy abj=a

bj=1 abj=0 bj=0 Mỗi lần ta nhân số hạng với ta dịch khai triển nhị phân

của chỗ phía trái cách thêm số không vào cuối khai triển nhị phân Do đó, ta nhận (abj)2j cách dịch khai triển nhị phân abjđi j

chỗ phía trái, tức thêm j số không vào cuối khai triển nhị phân Cuối cùng, ta nhận tích ab cách cộng n số nguyên abj.2j với j=0, 1, , n-1

Thí dụ 9: Tìm tích a = (110)2 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, cộng (110)2, (0000)2 (11000)2 Từ ta có

ab= (11110)2

Thủ tục mô tả đoạn giả mã sau:

procedure nhân (a,b: positive integers)

for j := to n-1

begin

if bj = then cj := a dịch j chỗ else cj :=

end

{c0, c1, , cn-1 tích riêng phần}

p :=

for j := to n-1 p := p + cj

{p giá trị tích ab}

Thuật tốn tính tích hai số nguyên a b cách cộng tích riêng phần c0, c1, c2, , cn-1 Khi bj=1, ta tính tích riêng phần cj cách dịch khai triển nhị

phân a j bit Khi bj=0 khơng cần có dịch chuyển 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

0 + + + + n−1 =

) (nn

phép dịch chỗ Vì vậy, số dịch chuyển chỗđịi hỏi O(n2)

(18)

Để cộng số nguyên abj từ j=0 đến n−1, đòi hỏi phải cộng số nguyên n bit,

một số nguyên n+1 bit, số nguyên 2n bit Ta biết phép cộng

địi hỏi O(n) phép cộng bit Do đó, độ phức tạp thuật tốn O(n2)

1.5 THUẬT TỐN ĐỆ QUY.

1.5.1 Khái niệm đệ quy:

Đôi quy việc giải tốn với tập liệu đầu vào xác

định việc giải tốn với giá trịđầu vào nhỏ Chẳng hạn, tốn tìm UCLN hai số a, b với a > b rút gọn tốn tìm ƯCLN hai số

nhỏ hơn, a mod b b Khi việc rút gọn thực lời giải tốn ban

đầu tìm dãy phép rút gọn trường hợp mà ta dễ dàng nhận lời giải toán Ta thấy thuật toán rút gọn liên tiếp toán ban đầu tới tốn có liệu đầu vào nhỏ hơn, áp dụng lớp rộng toán

Định nghĩa: Một thuật toán gọi đệ quy giải tốn cách rút gọn liên tiếp toán ban đầu tới toán có liệu đầu vào nhỏ Thí dụ 10:Tìm thuật tốn đệ quy tính giá trị an với a số thực khác không n số

nguyên không âm

Ta xây dựng thuật toán đệ quy nhờ định nghĩa đệ quy an, an+1=a.an với n>0 n=0 a0=1 Vậy để tính an ta quy trường hợp có số mũ n nhỏ hơn, n=0

procedure power (a: số thực khác không; n: số nguyên không âm)

if n = then power(a,n) :=

else power(a,n) := a * power(a,n-1)

Thí dụ 11: Tìm thuật tốn đệ quy tính UCLN hai số ngun a,b khơng âm a > b

procedure UCLN (a,b: số nguyên không âm, a > b)

if b = then UCLN (a,b) := a

else UCLN (a,b) := UCLN (a mod b, b)

Thí dụ 12:Hãy biểu diễn thuật tốn tìm kiếm tuyến tính thủ tục đệ quy

Để tìm x dãy tìm kiếm a1,a2, ,an bước thứ i thuật toán ta so sánh

x với Nếu x i vị trí cần tìm, ngược lại việc tìm kiếm quy dãy

có số phần tử hơn, cụ thể dãy ai+1, ,an Thuật tốn tìm kiếm có dạng thủ tục đệ quy

như sau

Cho search (i,j,x) thủ tục tìm số x dãy ai, ai+1, , aj Dữ liệu đầu vào

ba (1,n,x) Thủ tục dừng số hạng dãy lại x dãy lại có phần tử khác x Nếu x khơng số hạng cịn có số hạng khác lại áp dụng thủ tục này, dãy tìm kiếm phần tử nhận cách xóa phần tửđầu tiên dãy tìm kiếm bước vừa qua

(19)

procedure search (i,j,x)

if ai = x then loacation := i else if i = j then loacation :=

else search (i+1,j,x)

Thí dụ 13:Hãy xây dựng phiên đệ quy thuật tốn tìm kiếm nhị phân

Giả sử ta muốn định vị x dãy a1, a2, , an tìm kiếm nhị phân Trước

tiên ta so sánh x với số hạng a[(n+1)/2] Nếu chúng thuật tốn kết thúc,

nếu khơng ta chuyển sang tìm kiếm dãy ngắn hơn, nửa đầu dãy x nhỏ giá trị của dãy xuất phát, nửa sau ngược lại Như ta rút gọn việc giải tốn tìm kiếm việc giải tốn dãy tìm kiếm có độ dài giảm nửa

procedure binary search (x,i,j) m := [(i+j)/2]

if x = am then loacation := m

elseif (x < am and i < m) then binary search (x,i,m-1) elseif (x > am and j > m) then binary search (x,m+1,j) else loacation :=

1.5.2 Đệ quy lặp:

Thí dụ 14 Thủ tục đệ quy sau cho ta giá trị n! với n số nguyên dương

procedure factorial (n: positive integer)

if n = then factorial(n) :=

else factorial(n) := n * factorial(n-1)

Có cách khác tính hàm giai thừa số nguyên từđịnh nghĩa đệ quy Thay cho việc rút gọn việc tính tốn cho giá trị nhỏ hơn, ta xuất phát từ giá trị hàm 1và áp dụng định nghĩa đệ quy để tìm giá trị hàm số

nguyên lớn dần Đó thủ tục lặp

procedure iterative factorial (n: positive integer) x :=

for i := to n x := i * x

{x n!}

Thơng thường để tính dãy giá trịđược định nghĩa đệ quy, dùng phương pháp lặp số phép tính dùng thuật toán đệ quy (trừ dùng máy đệ quy chun dụng) Ta xem xét tốn tính số hạng thứ n dãy Fibonacci

procedure fibonacci (n: nguyên không âm)

(20)

if n = the fibonacci(n) :=

else if n = then fibonacci(n) :=

else fibonacci(n) := fibonacci(n - 1) + fibonacci(n - 2)

Theo thuật tốn này, để tìm fn ta biểu diễn fn = fn-1 + fn-2 Sau thay hai số

này tổng hai số Fibonacci bậc thấp hơn, tiếp tục f0 f1

xuất thay giá trị chúng theo định nghĩa Do để tính fn cần

fn+1-1 phép cộng

Bây ta tính phép tốn cần dùng để tính fn sử dụng phương pháp

lặp Thủ tục khởi tạo x f0 = y f1 = Khi vòng lặp duyệt qua tổng

x y gán cho biến phụ z Sau x gán giá trị y y gán giá trị

của z Vậy sau qua vòng lặp lần 1, ta có x = f1 y = f0 + f1 = f2 Khi qua vòng lặp

lần n-1 x = fn-1 Như có n – phép cộng dùng để tìm fn n > procedure Iterative fibonacci (n: nguyên không âm)

if n = then y :=

else

begin

x := ; y :=

for i := to n -

begin

z := x + y x := y ; y := z

end end

{y số Fibonacci thứ n}

Ta số phép toán dùng thuật toán đệ quy nhiều dùng phương pháp lặp Tuy nhiên người ta thích dùng thủ tục đệ quy tỏ hiệu so với thủ tục lặp Đặc biệt, có tốn giải thủ tục đệ quy mà giải thủ tục lặp

BÀI TẬP CHƯƠNG I:

1. Tìm số nguyên n nhỏ cho f(x) O(xn) hàm f(x) sau:

a) f(x) = 2x3 + x2log x

b) f(x) = 2x3 + (log x)4

c) f(x) =

1

3

+ + + x

x x

(21)

d) f(x) =

1 log

4

+ + x

x x

2 Chứng minh

a) x2 + 4x + O(x3), x3 không O(x2 +4x + 17)

b) xlog x O(x2), x2 không O(xlog x)

3.Cho đánh giá big-O hàm cho Đối với hàm g(x) đánh giá f(x) O(g(x)), chọn hàm đơn giản có bậc thấp

a) nlog(n2 + 1) + n2logn

b) (nlogn + 1)2 + (logn + 1)(n2 + 1)

c) n2n +nn2

4.Cho Hn sốđiều hoà thứ n:

Hn = +

2

+

+ + n Chứng minh Hn O(logn)

5. Lập thuật tốn tính tổng tất số nguyên bảng

6. Lập thuật tốn tính xn với x số thực n số nguyên

7. Mơ tả thuật tốn chèn số ngun x vào vị trí thích hợp dãy số nguyên a1, a2, , an xếp theo thứ tự tăng dần

8 Tìm thuật tốn xác định vị trí gặp phần tử lớn bảng liệt kê số ngun, số khơng thiết phải khác

9. Tìm thuật tốn xác định vị trí gặp cuối phần tử nhỏ bảng liệt kê số nguyên, số không thiết phải khác

10. Mơ tả thuật tốn đếm số số xâu bit cách kiểm tra bit xâu để xác định có bit hay khơng

11. Thuật tốn tìm kiếm tam phân Xác định vị trí phần tử bảng liệt kê số nguyên theo thứ tự tăng dần cách tách liên tiếp bảng liệt kê thành ba bảng liệt kê có kích thước (hoặc gần có thểđược) giới hạn việc tìm kiếm bảng liệt kê thích hợp Hãy rõ bước thuật tốn

12. Lập thuật tốn tìm dãy số nguyên số hạng số hạng đứng trước dãy

(22)

13. Lập thuật tốn tìm dãy số nguyên tất số hạng lớn tổng tất số hạng đứng trước dãy

14. Cho đánh giá big-O số phép so sánh dùng thuật toán Bài tập 10

15.Đánh giá độ phức tạp thuật tốn tìm kiếm tam phân cho Bài tập 11

16.Đánh giá độ phức tạp thuật tốn Bài tập 12

17. Mơ tả thuật tốn tính hiệu hai khai triển nhị phân

18. Lập thuật toán để xác định a > b, a = b hay a < b hai số nguyên a b

dạng khai triển nhị phân

19.Đánh giá độ phức tạp thuật tốn tìm khai triển theo số b số nguyên n qua số phép chia dùng

20. Hãy cho thuật tốn đệ quy tìm tổng n số nguyên dương lẻđầu tiên

21. Hãy cho thuật tốn đệ quy tìm số cực đại tập hữu hạn số nguyên

22. Mô tả thuật tốn đệ quy tìm xn mod m với n, x, m số nguyên dương

23. Hãy nghĩ thuật tốn đệ quy tính a số thực n số

nguyên dương

n

a2

24 Hãy nghĩ thuật tốn đệ quy tìm số hạng thứ n dãy xác định sau: a0=1, a1 = an = an-1 an-2 với n = 2, 3, 4,

25. Thuật toán đệ quy hay thuật tốn lặp tìm số hạng thứ n dãy Bài tập 24 có hiệu hơn?

(23)

CHƯƠNG II

BÀI TOÁN

ĐẾ

M

Lý thuyết tổ hợp phần quan trọng toán học rời rạc chuyên nghiên cứu phân bố phần tử vào tập hợp Thông thường phần tử hữu hạn việc phân bố chúng phải thoả mãn điều kiện định đó, tùy theo u cầu tốn cần nghiên cứu Mỗi cách phân bố gọi cấu hình tổ hợp Chủ đề nghiên cứu từ kỹ 17, câu hỏi tổ hợp nêu cơng trình nghiên cứu trò chơi may rủi Liệt kê, đếm đối tượng có tính chất phần quan trọng lý thuyết tổ hợp Chúng ta cần phải đếm đối tượng để giải nhiều toán khác Hơn kỹ thuật đếm dùng nhiều tính xác suất biến cố

2.1 CƠ SỞ CỦA PHÉP ĐẾM 2.1.1 Những nguyên lý đếm bản:

1) Quy tắc cộng: Giả sử có k cơng việc T1, T2, , Tk Các việc làm tương ứng n1, n2, , nk cách giả sử khơng có hai việc làm đồng thời Khi số cách làm k việc n1+n2+ + nk

Thí dụ 1: 1) Một sinh viên chọn thực hành máy tính từ ba danh sách tương ứng có 23, 15 19 Vì vậy, theo quy tắc cộng có 23 + 15 + 19 = 57 cách chọn thực hành

2) Giá trị biến m sau đoạn chương trình sau thực hiện? m :=

for i1 := to n1

m := m+1

for i2 :=1 to n2

m := m+1

for ik := to nk

m := m+1

Giá trị khởi tạo m Khối lệnh gồm k vòng lặp khác Sau bước lặp vòng lặp giá trị k tăng lên đơn vị Gọi Ti việc thi hành vịng lặp thứ i Có thể làm Ti ni cách vịng lặp thứ i có ni bước lặp Do vịng lặp khơng thể thực đồng thời nên theo quy tắc cộng, giá trị cuối m số cách thực số nhiệm vụ Ti, tức m = n1+n2+ + nk

(24)

tập Ai với i=1,2, , k Có |Ai| cách làm Ti khơng có hai việc làm lúc Số cách chọn phần tử hợp tập hợp này, mặt số phần tử nó, mặt khác theo quy tắc cộng |A1|+|A2|+ +|Ak| Do ta có:

|A1 ∪ A2 ∪ ∪ Ak| = |A1| + |A2| + + |Ak|

2) Quy tắc nhân: Giả sử nhiệm vụ tách thành k việc T1, T2, , Tk Nếu việc Ti làm ni cách sau việc T1, T2, Ti-1 làm, có n1.n2 nk cách thi hành nhiệm vụ cho

Thí dụ 2: 1) Người ta ghi nhãn cho ghế giảng đường chữ số nguyên dương không vượt 100 Bằng cách vậy, nhiều có ghế ghi nhãn khác nhau?

Thủ tục ghi nhãn cho ghế gồm hai việc, gán 26 chữ sau gán 100 số nguyên dương Quy tắc nhân có 26.100=2600 cách khác để gán nhãn cho ghế Như nhiều ta gán nhãn cho 2600 ghế

2) Có xâu nhị phân có độ dài n

Mỗi n bit xâu nhị phân chọn hai cách bit hoặc Bởi theo quy tắc nhân có tổng cộng 2n xâu nhị phân khác có độ dài n

3) Có thể tạo ánh xạ từ tập A có m phần tử vào tập B có n phần tử? Theo định nghĩa, ánh xạ xác định A có giá trị B phép tương ứng phần tử A với phần tử B Rõ ràng sau chọn ảnh i - phần tử đầu, để chọn ảnh phần tử thứ i A ta có n cách Vì theo quy tắc nhân, ta có n.n n=nm ánh xạ xác định A nhận giá trị B

4) Có đơn ánh xác định tập A có m phần tử nhận giá trị tập B có n phần tử?

Nếu m > n với ánh xạ, có hai phần tử A có ảnh, điều có nghĩa khơng có đơn ánh từ A đến B Bây giả sử m ≤ n gọi phần tử A a1,a2, ,am Rõ ràng có n cách chọn ảnh cho phần tử a1 Vì ánh xạ đơn ánh nên ảnh phần tử a2 phải khác ảnh a1 nên có n - cách chọn ảnh cho phần tử a2 Nói chung, để chọn ảnh ak ta có n - k + cách Theo quy tắc nhân, ta có

n(n − 1)(n − 2) (n − m + 1) = n n m

!

( − )!

đơn ánh từ tập A đến tập B

5) Giá trị biến k sau chương trình sau thực hiện? m :=

for i1 := to n1

for i2 := to n2

(25)

for ik := to nk

k := k+1

Giá trị khởi tạo k Ta có k vịng lặp lồng Gọi Ti việc thi hành vịng lặp thứ i Khi số lần qua vòng lặp số cách làm việc T1, T2, , Tk Số cách thực việc Tj nj (j=1, 2, , k), vịng lặp thứ j duyệt với giá trị nguyên ij nằm nj Theo quy tắc nhân vòng lặp lồng duyệt qua n1.n2 nk lần Vì giá trị cuối k n1.n2 nk

Nguyên lý nhân thường phát biểu ngôn ngữ tập hợp sau Nếu A1, A2, , Ak tập hữu hạn, số phần tử tích Descartes tập tích số phần tử tập thành phần Ta biết việc chọn phần tử tích Descartes A1 x A2 x x Ak tiến hành cách chọn phần tử A1, phần tử A2, , phần tử Ak Theo quy tắc nhân ta có:

|A1 x A2 x x Ak| = |A1|.|A2| |Ak| 2.1.2 Nguyên lý bù trừ:

Khi hai cơng việc làm đồng thời, ta khơng thể dùng quy tắc cộng để tính số cách thực nhiệm vụ gồm hai việc Để tính số cách thực nhiệm vụ ta cộng số cách làm hai việc trừ số cách làm đồng thời hai việc Ta phát biểu nguyên lý đếm ngôn ngữ tập hợp Cho A1, A2 hai tập hữu hạn,

|A1 ∪ A2| = |A1| + |A2| − |A1 ∩ A2| Từ với ba tập hợp hữu hạn A1, A2, A3, ta có:

|A1 ∪ A2 ∪ A3| = |A1| + |A2| + |A3| − |A1 ∩ A2| − |A2 ∩ A3| − |A3 ∩ A1| + |A1 ∩ A2 ∩ A3|, quy nạp, với k tập hữu hạn A1, A2, , Ak ta có:

| A1 ∪ A2 ∪ ∪ Ak| = N1 − N2 + N3 − + (−1)k-1Nk,

trong Nm (1 ≤ m ≤ k) tổng phần tử tất giao m tập lấy từ k tập cho, nghĩa

Nm = | |

1 i1 i2 imi1k i2 im A A

A ∩ ∩ ∩

≤ < < < ≤

Bây ta đồng tập Am (1 ≤ m ≤ k) với tính chất Am cho tập vũ trụ hữu hạn U đếm xem có phần tử U cho khơng thỏa mãn tính chất Am nào.Gọi N số cần đếm, N số phần tử U Ta có:

N = N− | A1 ∪ A2 ∪ ∪ Ak| = N− N1 + N2 − + (−1)kNk,

trong Nm tổng phần tử U thỏa mãn m tính chất lấy từ k tính chất cho Cơng thức gọi nguyên lý bù trừ Nó cho phép tính N qua Nm trường hợp số dễ tính tốn

(26)

Thí dụ 3: Có n thư n phong bì ghi sẵn địa Bỏ ngẫu nhiên thư vào phong bì Hỏi xác suất để xảy không thư địa

Mỗi phong bì có n cách bỏ thư vào, nên có tất n! cách bỏ thư Vấn đề lại đếm số cách bỏ thư cho không thư địa Gọi U tập hợp cách bỏ thư Am tính chất thư thứ m bỏ địa Khi theo cơng thức ngun lý bù trừ ta có:

N = n! − N1 + N2 − + (−1)nNn,

trong Nm (1 ≤ m ≤ n) số tất cách bỏ thư cho có m thư địa Nhận xét rằng, Nm tổng theo cách lấy m thư từ n lá, với cách lấy m thư, có (n-m)! cách bỏ để m thư địa chỉ, ta nhận được:

Nm = Cnm(n - m)! = n k !

! N = n!(1 − 1! +

1

2! − + (−1) n

n!), Cnm =

)! (

! !

m n m

n

− tổ hợp chập m tập n phần tử (số cách chọn m đối tượng n đối tượng cho) Từ xác suất cần tìm là: −

1! +

2! − + (−1) n

n! Một điều lý thú xác suất dần đến e

-1 (nghĩa > 1

3) n lớn

SốN toán gọi số thứ tự ký hiệu Dn Dưới vài giá trị Dn, cho ta thấy Dn tăng nhanh so với n:

n 10 11

Dn 44 265 1854 14833 133496 1334961 14684570

2.2 NGUYÊN LÝ DIRICHLET 2.2.1 Mở đầu:

Giả sử có đàn chim bồ câu bay vào chuồng Nếu số chim nhiều số ngăn chuồng ngăn có nhiều chim Nguyên lý dĩ nhiên áp dụng cho đối tượng khơng phải chim bồ câu chuồng chim

Mệnh đề (Nguyên lý): Nếu có k+1 (hoặc nhiều hơn) đồ vật đặt vào k hộp tồn hộp có hai đồ vật

Chứng minh: Giả sử khơng có hộp k hộp chứa nhiều đồ vật Khi tổng số vật chứa hộp nhiều k Điều trái giả thiết có k + vật

Nguyên lý thường gọi nguyên lý Dirichlet, mang tên nhà toán học người Đức kỷ 19 Ông thường xuyên sử dụng ngun lý cơng việc

Thí dụ 4: 1) Trong nhóm 367 người có hai người có ngày sinh nhật giống có tất 366 ngày sinh nhật khác

(27)

2) Trong kỳ thi học sinh giỏi, điểm thi đánh giá số nguyên khoảng từ đến 100 Hỏi có học sinh dự thi chắn tìm hai học sinh có kết thi nhau?

Theo nguyên lý Dirichlet, số học sinh cần tìm 102, ta có 101 kết điểm thi khác

3) Trong số người có mặt trái đất, phải tìm hai người có hàm giống Nếu xem hàm gồm 32 xâu nhị phân có chiều dài 32, cịn ứng với bit ứng với bit 0, có tất 232 = 4.294.967.296 hàm khác Trong số người hành tinh vượt tỉ, nên theo nguyên lý Dirichlet ta có điều cần tìm

2.2.2 Nguyên lý Dirichlet tổng quát:

Mệnh đề: Nếu có N đồ vật đặt vào k hộp tồn hộp chứa ]N/k[ đồ vật

(Ở đây, ]x[ giá trị hàm trần số thực x, số nguyên nhỏ có giá trị lớn x Khái niệm đối ngẫu với [x] – giá trị hàm sàn hay hàm phần nguyên x – số nguyên lớn có giá trị nhỏ x.)

Chứng minh: Giả sử hộp chứa ]N/k[ vật Khi tổng số đồ vật ≤ k (]N

k [− 1) < k N

k = N Điều mâu thuẩn với giả thiết có N đồ vật cần xếp

Thí dụ 5:1) Trong 100 người, có người sinh tháng

Xếp người sinh tháng vào nhóm Có 12 tháng tất Vậy theo nguyên lý Dirichlet, tồn nhóm có ]100/12[= người

2) Có năm loại học bổng khác Hỏi phải có sinh viên để chắn có người nhận học bổng

Gọi N số sinh viên, ]N/5[ = < N/5 ≤ hay 25 < N ≤ 30 Vậy số N cần tìm 26

3) Số mã vùng cần thiết nhỏ phải để đảm bảo 25 triệu máy điện thoại nước có số điện thoại khác nhau, số có chữ số (giả sử số điện thoại có dạng 0XX - 8XXXXX với X nhận giá trị từ đến 9)

Có 107 = 10.000.000 số điện thoại khác có dạng 0XX - 8XXXXX Vì theo nguyên lý Dirichlet tổng quát, số 25 triệu máy điện thoại có ]25.000.000/10.000.000[ = có số Để đảm bảo máy có số cần có mã vùng

2.2.3 Một số ứng dụng nguyên lý Dirichlet

(28)

Thí dụ 6: 1) Trong phịng họp có n người, tìm người có số người quen số người dự họp

Số người quen người phòng họp nhận giá trị từ đến n − Rõ ràng phịng khơng thể đồng thời có người có số người quen (tức khơng quen ai) có người có số người quen n − (tức quen tất cả) Vì theo số lượng người quen, ta phân n người thành n −1 nhóm Vậy theo nguyên lý Dirichlet tồn tai nhóm có người, tức ln tìm người có số người quen

2) Trong tháng gồm 30 ngày, đội bóng chuyền thi đấu ngày trận chơi không 45 trận Chứng minh tìm giai đoạn gồm số ngày liên tục tháng cho giai đoạn đội chơi 14 trận

Gọi aj số trận mà đội chơi từ ngày đầu tháng đến hết ngày j Khi ≤ 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 59 Do theo ngun lý Dirichlet có 60 số Vì tồn i j cho = aj + 14 (j < i) Điều có nghĩa từ ngày j + đến hết ngày i đội chơi 14 trận

3) Chứng tỏ n + số nguyên dương không vượt 2n, tồn số chia hết cho số khác

Ta viết số nguyên a1, a2, , an+1 dạng aj = 2kjqj k

j số ngun

khơng âm cịn qj số dương lẻ nhỏ 2n Vì có n số nguyên dương lẻ nhỏ 2n nên theo nguyên lý Dirichlet tồn i j cho qi = qj = q Khi ai= q aj =

q Vì vậy, k

i k

j k

2 i ≤ kj aj chia hết cho cịn trường hợp ngược lại ta có chia hết cho aj

Thí dụ cuối trình bày cách áp dụng nguyên lý Dirichlet vào lý thuyết tổ hợp mà quen gọi lý thuyết Ramsey, tên nhà toán học người Anh Nói chung, lý thuyết Ramsey giải toán phân chia tập tập phần tử

Thí dụ 7. Giả sử nhóm người cặp hai bạn thù Chứng tỏ nhóm có ba người bạn lẫn có ba người kẻ thù lẫn

Gọi A người Trong số người nhóm có ba người bạn A có ba người kẻ thù A, điều suy từ nguyên lý Dirichlet tổng quát, ]5/2[ = Trong trường hợp đầu ta gọi B, C, D bạn A ba người có hai người bạn họ với A lập thành ba người bạn lẫn nhau, ngược lại, tức ba người B, C, D khơng có bạn chứng tỏ họ ba người thù lẫn Tương tự chứng minh trường hợp có ba người kẻ thù A

(29)

2.3 CHỈNH HỢP VÀ TỔ HỢP SUY RỘNG 2.3.1 Chỉnh hợp có lặp

Một cách xếp có thứ tự k phần tử lặp lại tập n phần tử gọi chỉnh hợp lặp chập k từ tập n phần tử Nếu A tập gồm n phần tử chỉnh hợp phần tử tập Ak Ngoài ra, chỉnh hợp lặp chập k từ tập n phần tử hàm từ tập k phần tử vào tập n phần tử Vì số chỉnh hợp lặp chập k từ tập n phần tử nk

2.3.2 Tổ hợp lặp

Một tổ hợp lặp chập k tập hợp cách chọn thứ tự k phần tử lặp lại tập cho Như tổ hợp lặp kiểu dãy không kể thứ tự gồm k thành phần lấy từ tập n phần tử Do k > n

Mệnh đề 1:Số tổ hợp lặp chập k từ tập n phần tử Cnk+k−1

Chứng minh. Mỗi tổ hợp lặp chập k từ tập n phần tử biểu diễn dãy n−1 đứng k Ta dùng n − đứng để phân cách ngăn Ngăn thứ i chứa thêm lần phần tử thứ i tập xuất tổ hợp Chẳng hạn, tổ hợp lặp chập phần tử biểu thị bởi:

* * | * | | * * *

mô tả tổ hợp chứa phần tử thứ nhất, phần tử thứ hai, khơng có phần tử thứ phần tử thứ tư tập hợp

Mỗi dãy n − k ứng với xâu nhị phân độ dài n + k − với k số Do số dãy n − đứng k ngơi số tổ hợp chập k từ tập n + k − phần tử Đó điều cần chứng minh

Thi dụ 8: 1) Có cách chọn tờ giấy bạc từ két đựng tiền gồm tờ 1000đ, 2000đ, 5000đ, 10.000đ, 20.000đ, 50.000đ, 100.000đ Giả sử thứ tự mà tờ tiền chọn không quan trọng, tờ tiền loại không phân biệt loại có tờ

Vì ta khơng kể tới thứ tự chọn tờ tiền ta chọn lần, lần lấy từ loại tiền nên cách chọn tờ giấy bạc tổ hợp lặp chập từ phần tử Do số cần tìm C75+5−1= 462

2) Phương trình x1 + x2 + x3 = 15 có nghiệm nguyên không âm?

Chúng ta nhận thấy nghiệm phương trình ứng với cách chọn 15 phần tử từ tập có loại, cho có x1 phần tử loại 1, x2 phần tử loại x3 phần tử loại chọn Vì số nghiệm số tổ hợp lặp chập 15 từ tập có phần tử C315+15−1= 136

2.3.3 Hốn vị tập hợp có phần tử giống

Trong toán đếm, số phần tử giống Khi cần phải cẩn thận, tránh đếm chúng lần Ta xét thí dụ sau

(30)

Thí dụ 9: Có thể nhận xâu khác cách xếp lại chữ từ SUCCESS?

Vì số chữ từ SUCCESS nên câu trả lời số hoán vị chữ Từ chứa chữ S, chữ C, chữ U chữ E Để xác định số xâu khác tạo ta nhận thấy có C(7,3) cách chọn chỗ cho chữ S, cịn lại chỗ trống Có C(4,2) cách chọn chỗ cho chữ C, lại chỗ trống Có thể đặt chữ U C(2,1) cách C(1,1) cách đặt chữ E vào xâu Theo nguyên lý nhân, số xâu khác tạo là:

3

C C42.C12.C11= 4 2 1

! ! ! !

! ! ! ! ! ! ! ! = 1

!

! ! ! ! = 420

Mệnh đề 2: Số hốn vị n phần tử có n1 phần tử thuộc loại 1, n2 phần tử thuộc loại 2, , nk phần tử thuộc loại k,

! ! !

!

2 n nk n

n

Chứng minh. Để xác định số hoán vị trước tiên nhận thấy có n1cách giữ n

n

C

chỗ cho n1 phần tử loại 1, lại n - n1 chỗ trống Sau có cách đặt n

n n n

C − phần tử

loại vào hốn vị, cịn lại n - n1 - n2 chỗ trống Tiếp tục đặt phần tử loại 3, loại 4, , loại k - 1vào chỗ trống hốn vị Cuối có k cách đặt n

k n n n n C 1− − −

− k phần tử loại

k vào hoán vị Theo quy tắc nhân tất hốn vị là:

n n

C =

1

n n n

Ck

k n n n n C 1− − −

− !. ! ! !

2 n nk n

n

2.3.4 Sự phân bố đồ vật vào hộp

Thí dụ 10: Có cách chia xấp quân cho người chơi từ cỗ chuẩn 52 quân?

Người nhận quân cách Người thứ hai chia qn cách, cịn 47 qn Người thứ ba nhận quân cách Cuối cùng, người thứ tư nhận quân

cách Vì vậy, theo ngun lý nhân tổng cộng có

5 52 C 47 C 42 C 37 C 52

C C475 C425 C375 = 52! 5 5 32!! ! ! ! cách chia cho người người xấp quân

Thí dụ tốn điển hình việc phân bố đồ vật khác vào hộp khác Các đồ vật 52 quân bài, hộp người chơi số lại để bàn Số cách xếp đồ vật vào hộp cho mệnh đề sau

Mệnh đề 3:Số cách phân chia n đồ vật khác vào k hộp khác cho có ni vật đặt vào hộp thứ i, với i = 1, 2, , k

(31)

)!

!.( ! !

!

1 n nk n n nk n

n

− −

2.4 SINH CÁC HOÁN VỊ VÀ TỔ HỢP 2.4.1 Sinh hoán vị:

Có nhiều thuật tốn phát triển để sinh n! hoán vị tập {1,2, ,n} Ta mơ tả phương pháp đó, phương pháp liệt kê hoán vị tập {1,2, ,n} theo thứ tự từ điển Khi đó, hốn vị a1a2 an gọi trước hoán vị b1b2 bn tồn k (1 ≤ k ≤ n), a1 = b1, a2 = b2, , ak-1 = bk-1 ak < bk

Thuật toán sinh hoán vị tập {1,2, ,n} dựa thủ tục xây dựng hoán vị kế tiếp, theo thứ tự từ điển, từ hoán vị cho trước a1 a2 an Đầu tiên an-1 < an rõ ràng đổi chỗ an-1 an cho nhận hốn vị liền sau hoán vị cho Nếu tồn số nguyên aj aj+1 cho aj < aj+1 aj+1 > aj+2 > > an, tức tìm cặp số ngun liền kề tính từ bên phải sang bên trái hoán vị mà số đầu nhỏ số sau Sau đó, để nhận hốn vị liền sau ta đặt vào vị trí thứ j số nguyên nhỏ số lớn aj tập aj+1, aj+2, , an, liệt kê theo thứ tự tăng dần số lại aj, aj+1, aj+2, , an vào vị trí j+1, , n Dễ thấy khơng có hốn vị sau hoán vị xuất phát trước hốn vị vừa tạo

Thí dụ 11: Tìm hốn vị liền sau theo thứ tự từ điển hoán vị 4736521

Cặp số nguyên tính từphải qua trái có số trước nhỏ số sau a3 = a4 = Số nhỏ số bên phải số mà lại lớn số Đặt số vào vị trí thứ Sau đặt số 3, 6, 1, theo thứ tự tăng dần vào bốn vị trí cịn lại Hốn vị liền sau hoán vị cho 4751236

procedure Hoán vị liền sau (a1, a2, , an) (hoán vị {1,2, ,n} khác (n, n−1, , 2, 1)) j := n −

while aj > aj+1

j := j − {j số lớn mà aj < aj+1} k := n

while aj > ak

k := k - {ak số nguyên nhỏ số lớn aj bên phải aj} đổi chỗ (aj, ak)

r := n s := j +

while r > s

đổi chỗ (ar, as) r := r - ; s := s +

{Điều xếp phần hốn vị sau vị trí thứ j theo thứ tự tăng dần.}

(32)

2.4.2 Sinh tổ hợp:

Làm để tạo tất tổ hợp phần tử tập hữu hạn? Vì tổ hợp tập con, nên ta dùng phép tương ứng 1-1 tập {a1,a2, ,an} xâu nhị phân độ dài n

Ta thấy xâu nhị phân độ dài n khai triển nhị phân số nguyên nằm 2n − Khi 2n xâu nhị phân liệt kê theo thứ tự tăng dần số nguyên biểu diễn nhị phân chúng Chúng ta xâu nhị phân nhỏ 00 00 (n số 0) Mỗi bước để tìm xâu liền sau ta tìm vị trí tính từ phải qua trái mà số 0, sau thay tất số bên phải số đặt số vào vị trí

procedure Xâu nhị phân liền sau (bn-1bn-2 b1b0): xâu nhị phân khác (11 11) i :=

while bi =

begin

bi := i := i +

end

bi :=

Tiếp theo trình bày thuật tốn tạo tổ hợp chập k từ n phần tử {1,2, ,n} Mỗi tổ hợp chập k biểu diễn xâu tăng Khi liệt kê tổ hợp theo thứ tự từ điển Có thể xây dựng tổ hợp liền sau tổ hợp a1a2 ak cách sau Trước hết, tìm phần tử dãy cho kể từ phải qua trái cho ≠ n − k + i Sau thay + aj + j − i + với j = i + 1, i + 2, , k

Thí dụ 12: Tìm tổ hợp chập từ tập {1, 2, 3, 4, 5, 6} liền sau tổ hợp {1, 2, 5, 6} Ta thấy từ phải qua trái a2 = số hạng tổ hợp cho thỏa mãn điều kiện ≠ − + i Để nhận tổ hợp tiếp sau ta tăng lên đơn vị, tức a2 = 3, sau đặt a3 = + = a4 = + = Vậy tổ hợp liền sau tổ hợp cho {1,3,4,5} Thủ tục cho dạng thuật toán sau

procedure Tổ hợp liền sau ({a1, a2, , ak}: tập thực tập {1, 2, , n} không {n − k + 1, , n} với a1 < a2 < < ak)

i := k

while = n − k + i i := i −

ai := +

for j := i + to k aj := + j − i

(33)

2.5 HỆ THỨC TRUY HỒI

2.5.1 Khái niệm mở đầu mơ hình hóa hệ thức truy hồi:

Đơi ta khó định nghĩa đối tượng cách tường minh Nhưng dễ dàng định nghĩa đối tượng qua Kỹ thuật gọi đệ quy Định nghĩa đệ quy dãy số định rõ giá trị hay nhiều số hạng quy tắc xác định số hạng từ số hạng trước Định nghĩa đệ quy dùng để giải tốn đếm Khi quy tắc tìm số hạng từ số hạng trước gọi hệ thức truy hồi

Định nghĩa 1: Hệ thức truy hồi (hay công thức truy hồi) dãy số {an} công thức biểu diễn an qua hay nhiều số hạng trước dãy Dãy số gọi lời giải hay nghiệm hệ thức truy hồi số hạng thỏa mãn hệ thức truy hồi

Thí dụ 13 (Lãi kép):1) Giả sử người gửi 10.000 đô la vào tài khoản ngân hàng với lãi suất kép 11% năm Sau 30 năm có tiền tài khoản mình?

Gọi Pn tổng số tiền có tài khoản sau n năm Vì số tiền có tài khoản sau n năm số có sau n − năm cộng lãi suất năm thứ n, nên ta thấy dãy {Pn} thoả mãn hệ thức truy hồi sau:

Pn = Pn-1 + 0,11Pn-1 = (1,11)Pn-1

với điều kiện đầu P0 = 10.000 la Từ suy Pn = (1,11)n.10.000 Thay n = 30 cho ta P30 = 228922,97 la

2) Tìm hệ thức truy hồi cho điều kiện đầu để tính số xâu nhị phân độ dài n hai số liên tiếp Có xâu nhị phân có độ dài 5?

Gọi an số xâu nhị phân độ dài n khơng có hai số liên tiếp Để nhận hệ thức truy hồi cho {an}, ta thấy theo quy tắc cộng, số xâu nhị phân độ dài n khơng có hai số liên tiếp số xâu nhị phân kết thúc số cộng với số xâu kết thúc số Giả sử n ≥

Các xâu nhị phân độ dài n, hai số liên tiếp kết thúc số xâu nhị phân thế, độ dài n − thêm số vào cuối chúng Vậy chúng có tất an-1 Các xâu nhị phân độ dài n, khơng có hai số liên tiếp kết thúc số 0, cần phải có bit thứ n − 1, khơng chúng có hai số hai bit cuối Trong trường hợp chúng có tất an-2 Cuối ta có được:

an = an-1 + an-2 với n ≥

Điều kiện đầu a1 = a2 = Khi a5 = a4 + a3 = a3 + a2 + a3 = 2(a2 + a1) + a2 = 13 2.5.2 Giải hệ thức truy hồi

Định nghĩa 2: Một hệ thức truy hồi tuyến tính bậc k với hệ số sốlà hệ thức truy hồi có dạng:

(34)

an = c1an-1 + c2an-2 + + ckan-k , c1, c2, , ck số thực ck ≠

Theo nguyên lý quy nạp toán học dãy số thỏa mãn hệ thức truy hồi nêu định nghĩa xác định hệ thức truy hồi k điều kiện đầu: a0 = C0, a1 = C1, , ak-1 = Ck-1

Phương pháp để giải hệ thức truy hồi tuyến tính tìm nghiệm dạng an = rn, r số Chú ý an = rn nghiệm hệ thức truy hồi an = c1an-1 + c2an-2 + + ckan-k

rn = c1rn-1 + c2rn-2 + + ckrn-k hay rk− c1rk-1− c2rk-2− − ck-1r – ck =

Phương trình gọi phương trình đặc trưng hệ thức truy hồi, nghiệm gọi nghiệm đặc trưng hệ thức truy hồi

Mệnh đề:Cho c1, c2, , ck số thực Giả sử phương trình đặc trưng rk − c1rk-1− c2rk-2 − − ck-1r – ck =

có k nghiệm phân biệt r1, r2, , rk Khi dãy {an} nghiệm hệ thức truy hồi an = c1an-1 + c2an-2 + + ckan-k an = α1r1n + α2r2n + + αkrkn, với n = 1, 2, α1, α2, , αk số

Thí dụ 14:1) Tìm cơng thức hiển số Fibonacci

Dãy số Fibonacci thỏa mãn hệ thức fn = fn-1 + fn-2 điều kiện đầu f0 = f1 = Các nghiệm đặc trưng r1 =

2

+

r2 =

Do số Fibonacci cho công thức fn = α1(1

2

+

)n + α2(1

)n Các điều kiện ban đầu f0 = = α1 + α2 f1 = = α1(1

2

+

) + α2(1

) Từ hai phương trình cho ta α1 = 5, α2 = -

5 Do số Fibonacci cho công thức hiển sau: fn =

5(

2

+

)n - 5(

1

2

)n

2) Hãy tìm nghiệm hệ thức truy hồi an = 6an-1 - 11an-2 + 6an-3 với điều kiện ban đầu a0 = 2, a1 = a2 = 15

Đa thức đặc trưng hệ thức truy hồi r3 - 6r2 + 11r - Các nghiệm đặc trưng r = 1, r = 2, r = Do nghiệm hệ thức truy hồi có dạng

an = α11n + α22n + α33n Các điều kiện ban đầu a0 = = α1 + α2 + α3

a1 = = α1 + α22 + α33 a2 = 15 = α1 + α24 + α39

Giải hệ phương trình ta nhận α1= 1, α2 = −1, α3 = Vì thế, nghiệm hệ thức truy hồi điều kiện ban đầu cho dãy {an} với

(35)

an = − 2n + 2.3n

2.6 QUAN HỆ CHIA ĐỂ TRỊ

2.6.1 Mở đầu:

Nhiều thuật toán đệ quy chia tốn với thơng tin vào cho thành hay nhiều toán nhỏ Sự phân chia áp dụng liên tiếp tìm lời giải toán nhỏ cách dễ dàng Chẳng hạn, ta tiến hành việc tìm kiếm nhị phân cách rút gọn việc tìm kiếm phần tử danh sách tới việc tìm phần tử danh sách có độ dài giảm nửa Ta rút gọn liên tiếp lại phần tử Một ví dụ khác thủ tục nhân số nguyên Thủ tục rút gọn toán nhân hai số nguyên tới ba phép nhân hai số nguyên với số bit giảm nửa Phép rút gọn dùng liên tiếp nhận số nguyên có bit Các thủ tục gọi thuật toán chia để trị

2.6.2 Hệ thức chia để trị:

Giả sử thuật toán phân chia toán cỡ n thành a tốn nhỏ, tốn nhỏ có cỡ n

b (để đơn giản giả sử n chia hết cho b; thực tế tốn nhỏ thường có cỡ [n

b] ] n

b[) Giả sử tổng phép toán thêm vào thực phân chia tốn cỡ n thành tốn có cỡ nhỏ g(n) Khi đó, f(n) số phép toán cần thiết để giải toán cho f thỏa mãn hệ thức truy hồi sau:

f(n) = af(n

b) + g(n) Hệ thức có tên hệ thức truy hồi chia để trị

Thí dụ 15: 1) Thuật tốn tìm kiếm nhị phân đưa tốn tìm kiếm cỡ n tốn tìm kiếm phần tử dãy tìm kiếm cỡ n/2, n chẵn Khi thực việc rút gọn cần hai phép so sánh Vì thế, f(n) số phép so sánh cần phải làm tìm kiếm phần tử danh sách tìm kiếm cỡ n ta có f(n) = f(n/2) + 2, n số chẵn

2) Có thuật tốn hiệu thuật tốn thơng thường để nhân hai số nguyên Ở ta có thuật tốn Đó thuật tốn phân nhanh, có dùng kỹ thuật chia để trị Trước tiên ta phân chia hai số nguyên 2n bit thành hai khối khối n bit Sau phép nhân hai số nguyên 2n bit ban đầu thu ba phép nhân số nguyên n bit cộng với phép dịch chuyển phép cộng

Giả sử a b số nguyên có biểu diễn nhị phân độ dài 2n a = (a2n-1 a2n-2 a1 a0)2 b = (b2n-1 b2n-2 b1 b0)2

Giả sử a = 2nA1 + A0 , b = 2nB1 + B0 ,

A1 = (a2n-1 a2n-2 an+1 an)2 , A0 = (an-1 a1 a0)2 B1 = (b2n-1 b2n-2 bn+1 bn)2 , B0 = (bn-1 b1 b0)2 Thuật toán nhân nhanh số nguyên dựa đẳng thức:

(36)

ab = (22n + 2n)A1B1 + 2n(A1 - A0)(B0 - B1) + (2n + 1)A0B0

Đẳng thức phép nhân hai số nguyên 2n bit thực cách dùng ba phép nhân số nguyên n bit phép cộng, trừ phép dịch chuyển Điều có nghĩa f(n) tổng phép toán nhị phân cần thiết để nhân hai số nguyên n bit

f(2n) = 3f(n) + Cn

Ba phép nhân số nguyên n bit cần 3f(n) phép toán nhị phân Mỗi phép cộng, trừ hay dịch chuyển dùng số nhân với n lần phép toán nhị phân Cn tổng phép toán nhị phân dùng làm phép toán

Mệnh đề 1: Giả sử f hàm tăng thoả mãn hệ thức truy hồi f(n) = af(n

b) + c với n chia hết cho b, a ≥ 1, b số nguyên lớn 1, c số thực dương Khi

f(n) =

⎪⎩ ⎪ ⎨ ⎧ = > , ) (log , ) ( log a n O a n

O ba

Mệnh đề 2: Giả sử f hàm tăng thoả mãn hệ thức truy hồi f(n) = af(n

b) + cn

d với n = bk, k số nguyên dương, a ≥ 1, b số nguyên lớn 1, c d số thực dương Khi

f(n) =

⎪ ⎪ ⎩ ⎪⎪ ⎨ ⎧ < = > d d d d d a b a n O b a n n O b a n O b , ) ( , ) log ( , ) ( log

Thí dụ 16: Hãy ước lượng số phép toán nhị phân cần dùng nhân hai số nguyên n bit thuật toán nhân nhanh

Thí dụ 15.2 f(n) = 3f(n/2) + Cn, n chẵn Vì thế, từ Mệnh đề ta suy f(n) = O(nlog23) Chú ý log23 ≈ 1,6 Vì thuật tốn nhân thơng thường dùng O(n2) phép tốn nhị phân, thuật toán nhân nhanh thực tốt thuật tốn nhân thơng thường số ngun đủ lớn

BÀI T

P CH

ƯƠ

NG II:

1 Trong tổng số 2504 sinh viên khoa công nghệ thông tin, có 1876 theo học mơn ngơn ngữ lập trình Pascal, 999 học mơn ngơn ngữ Fortran 345 học ngơn ngữ C Ngồi cịn biết 876 sinh viên học Pascal Fortran, 232 học Fortran C, 290 học Pascal C Nếu 189 sinh viên học môn Pascal, Fortran C trường hợp có sinh viên không học môn môn ngôn ngữ lập trình kể

(37)

2. Một họp gồm 12 người tham dự để bàn vấn đề Có người phát biểu vấn đề I, người phát biểu vấn đề II người phát biểu vấn đề III Ngoài ra, có người khơng phát biểu vấn đề Hỏi nhiều có người phát biểu vấn đề

3 Chỉ có người số 25 triệu người có tên họ viết tắt chữ sinh ngày năm (không thiết năm)

4 Một tay đô vật tham gia thi đấu giành chức vô địch 75 Mỗi có trận đấu, tồn có khơng q 125 trận Chứng tỏ có liên tiếp đấu 24 trận

5. Cho n số nguyên dương Chứng minh lấy từ n số cho số số hạng thích hợp cho tổng chúng chia hết cho n

6. Trong lấy ý kiến vấn đề, người hỏi ghi vào phiếu trả lời sẵn cách để nguyên phủ định câu trả lời tương ứng với vấn đề nêu

Chứng minh với 1153 người hỏi ln tìm 10 người trả lời giống hệt

7. Có 17 nhà bác học viết thư cho trao đổi vấn đề Chứng minh ln tìm người trao đổi vấn đề

8.Trong kỳ thi kết thúc học phần tốn học rời rạc có 10 câu hỏi Có cách gán điểm cho câu hỏi tổng số điểm 100 câu điểm

9 Phương trình x1 + x2 + x3 + x4 + x5 = 21 có nghiệm ngun khơng âm? 10 Có xâu khác lập được từ chữ từ MISSISSIPI, yêu cầu phải dùng tất chữ?

11 Một giáo sư cất sưu tập gồm 40 số báo toán học vào ngăn tủ, ngăn đựng 10 số Có cách cất tờ báo vào ngăn nếu:

1) Mỗi ngăn đánh số cho phân biệt được;

2) Các ngăn giống hệt nhau?

12 Tìm hệ thức truy hồi cho số thứ tự Dn

13. Tìm hệ thức truy hồi cho số xâu nhị phân chứa xâu 01

14. Tìm hệ thức truy hồi cho số cách lên n bậc thang người bước một, hai ba bậc lần

15. 1) Tìm hệ thức truy hồi mà Rn thoả mãn, Rn số miền mặt phẳng bị phân chia n đường thẳng khơng có hai đường song song khơng có đường qua điểm

b) Tính Rn phương pháp lặp

16 Tìm nghiệm hệ thức truy hồi an = 2an-1 + 5an-2 - 6an-3 với a0 = 7, a1 = -4, a2 =

(38)

CHƯƠNG III

ĐỒ

TH

Lý thuyết đồ thị ngành khoa học phát triển từ lâu lại có nhiều

ứng dụng đại Những ý tưởng đưa từ kỷ 18 nhà toán học Thụy Sĩ tên Leonhard Euler Ông dùng đồ thị để giải toán cầu Konigsberg tiếng

Đồ thị dùng để giải toán nhiều lĩnh vực khác Thí dụ, dùng đồ thị để xác định xem có thực mạch điện bảng điện phẳng

được khơng Chúng ta phân biệt hai hợp chất hóa học có cơng thức phân tử có cấu trúc khác nhờđồ thị Chúng ta xác định xem hai máy tính có nối với đường truyền thơng hay khơng dùng mơ hình đồ thị mạng máy tính Đồ thị với trọng sốđược gán cho cạnh

dùng để giải tốn tốn tìm đường ngắn hai thành phố mạng giao thơng Chúng ta dùng đồ thị để lập lịch thi phân chia kênh cho đài truyền hình

3.1 ĐỊNH NGHĨA VÀ THÍ DỤ

Đồ thị cấu trúc rời rạc gồm đỉnh cạnh (vơ hướng có hướng) nối đỉnh Người ta phân loại đồ thị tùy theo đặc tính số cạnh nối cặp đỉnh đồ thị Nhiều toán thuộc lĩnh vực khác giải

được mơ hình đồ thị Chẳng hạn người ta dùng đồ thị để biểu diễn cạnh tranh lồi mơi trường sinh thái, dùng đồ thịđể biểu diễn có ảnh hưởng lên tổ chức đó, dùng đồ thịđể biểu diễn kết cục thi đấu thể thao Chúng ta dùng đồ thị để giải toán toán tính số tổ hợp khác chuyến bay hai thành phố mạng hàng không, hay để giải toán tham quan tất đường phố thành phố

sao cho đường phố qua lần, tốn tìm số màu cần thiết để

tơ vùng khác đồ

Trong đời sống, thường gặp sơ đồ, sơ đồ tổ chức máy, sơ đồ giao thông, sơ đồ hướng dẫn thứ tự đọc chương sách, , gồm điểm biểu thị đối tượng xem xét (người, tổ chức, địa danh, chương mục sách, ) nối số điểm với đoạn thẳng (hoặc cong) hay mũi tên, tượng trưng cho quan hệ đối tượng Đó thí dụ đồ thị

3.1.1 Định nghĩa: Một đơn đồ thị G = (V, E) gồm tập khác rỗng V mà phần tử gọi đỉnh tập E mà phần tử gọi cạnh, cặp khơng có thứ tự đỉnh phân biệt

37

(39)

3.1.2 Định nghĩa: Một đa đồ thị G = (V, E) gồm tập khác rỗng V mà phần tử

của gọi đỉnh họ E mà phần tử gọi cạnh, cặp khơng có thứ tự đỉnh phân biệt Hai cạnh gọi cạnh bội hay song song chúng tương ứng với cặp đỉnh

Rõ ràng đơn đồ thị đa đồ thị, đa đồ thị đơn

đồ thị

3.1.3 Định nghĩa: Một giảđồ thị G = (V, E) gồm tập khác rỗng V mà phần tử

của gọi đỉnh họ E mà phần tử gọi cạnh, cặp khơng có thứ tự đỉnh (không thiết phân biệt)

Với v∈V, (v,v)∈E ta nói có khuyên đỉnh v

Tóm lại, giả đồ thị loại đồ thị vô hướng tổng quát chứa khun cạnh bội Đa đồ thị loại đồ thị vô hướng chứa cạnh bội khơng thể có khun, cịn đơn đồ thị loại đồ thị vơ hướng khơng chứa cạnh bội khun

Thí dụ 1:

Đơn đồ thị

v1 v2 v3

v4 v5 v6

v1 v2 v3

v5 v6 v7

v4

Giảđồ thị

3.1.4 Định nghĩa: Một đồ thị có hướng G = (V, E) gồm tập khác rỗng V mà phần tử gọi đỉnh tập E mà phần tử gọi cung, cặp có thứ tự phần tử thuộc V

3.1.5 Định nghĩa: Một đa đồ thị có hướng G = (V, E) gồm tập khác rỗng V mà phần tử gọi đỉnh họ E mà phần tử gọi cung,

đó cặp có thứ tự phần tử thuộc V

Đồ thị vô hướng nhận từđồ thị có hướng G cách xoá bỏ chiều mũi tên cung gọi đồ thị vô hướng G

Thí dụ 2:

Đồ thị có hướng Đa đồ thị có hướng

v6 v7

v5

v3

v2

V5

v1 v3

v4 v5

v2

v1

v6

38

(40)

Thí dụ 3: 1) Đồ thị “lấn tổ” sinh thái học Đồ thị dùng nhiều mơ hình có tính đến tương tác loài vật Chẳng hạn cạnh tranh lồi hệ sinh thái mơ hình hóa đồ thị “lấn tổ” Mỗi lồi biểu diễn đỉnh Một cạnh vô hướng nối hai đỉnh hai loài biểu diễn

đỉnh cạnh tranh với

2) Đồ thị ảnh hưởng Khi nghiên cứu tính cách nhóm nguời, ta thấy số

người có ảnh hưởng lên suy nghĩ người khác Đồ thị có hướng gọi đồ thịảnh hưởngcó thể dùng để mơ hình tốn Mỗi người nhóm biểu diễn đỉnh Khi người biểu diễn đỉnh a có ảnh hưởng lên người biểu diễn đỉnh b có cung nối từđỉnh a đến đỉnh b

3) Thi đấu vòng tròn. Một thi đấu thể thao đội đấu với đội khác

đúng lần gọi đấu vòng tròn Cuộc thi đấu có thểđược mơ hình

đồ thị có hướng đội đỉnh Một cung từđỉnh a đến đỉnh b đội a thắng đội b

4) Các chương trình máy tính thi hành nhanh cách thi hành đồng thời số câu lệnh Điều quan trọng khơng thực câu lệnh đòi hỏi kết câu lệnh khác chưa thực Sự phụ thuộc câu lệnh vào câu lệnh trước biểu diễn đồ thị có hướng Mỗi câu lệnh biểu diễn đỉnh có cung từ đỉnh tới đỉnh khác câu lệnh biểu diễn đỉnh thứ hai thực trước câu lệnh biểu diễn

đỉnh thứ thực Đồ thị gọi làđồ thị có ưu tiên trước sau

3.2 BẬC CỦA ĐỈNH

3.2.1 Định nghĩa: Hai đỉnh u v đồ thị (vô hướng) G=(V,E) gọi liền kề (u,v)∈E Nếu e = (u,v) e gọi cạnh liên thuộc với đỉnh u v Cạnh e gọi cạnh nối đỉnh u v Các đỉnh u v gọi điểm đầu mút cạnh e

3.2.2 Định nghĩa: Bậc đỉnh v đồ thị G=(V,E), ký hiệu deg(v), số cạnh liên thuộc với nó, riêng khuyên đỉnh tính hai lần cho bậc

Đỉnh v gọi đỉnh treo deg(v)=1 gọi đỉnh lập deg(v)=0 Thí dụ 4:

Ta có deg(v1)=7, deg(v2)=5, deg(v3)=3, deg(v4)=0, deg(v5)=4, deg(v6)=1, deg(v7)=2

Đỉnh v4 đỉnh cô lập đỉnh v6 đỉnh treo

v1 v2 v3

v5 v6 v7

v4

39

(41)

3.2.3 Mệnh đề:Cho đồ thị G = (V, E) Khi 2|E| =

V v

v

)

deg(

Chứng minh: Rõ ràng cạnh e = (u,v) tính lần deg(u) lần deg(v) Từđó suy tổng tất bậc đỉnh hai lần số cạnh

3.2.4 Hệ quả: Sốđỉnh bậc lẻ đồ thị số chẵn

Chứng minh: Gọi V1 V2 tương ứng tập đỉnh bậc chẵn tập đỉnh bậc lẻ

của đồ thị G = (V, E) Khi

2|E| =

∈1

) deg( V v

v +

∈ 2

) deg( V v

v

Vế trái số chẵn tổng thứ số chẵn nên tổng thứ hai số

chẵn Vì deg(v) lẻ với v ∈ V2 nên |V2| số chẵn

3.2.5 Mệnh đề: Trong đơn đồ thị, ln tồn hai đỉnh có bậc

Chứng minh: Xét đơn đồ thị G=(V,E) có |V|=n Khi phát biểu đưa tốn: phịng họp có n người, tìm người có số người quen số người dự họp (xem Thí dụ 2.2.3)

3.2.6 Định nghĩa:Đỉnh u gọi nối tới v hay v gọi nối từ u

đồ thị có hướng G (u,v) cung G Đỉnh u gọi đỉnh đầu đỉnh v gọi

đỉnh cuối cung

3.2.7 Định nghĩa: Bậc vào (t.ư bậc ra) đỉnh v đồ thị có hướng G, ký hiệu degt(v) (t.ư dego(v)), số cung có đỉnh cuối v

Thí dụ 5:

v1

v2

v4 v5 v6

v3

degt(v1) = 2, dego(v1) = 3,

degt(v2) = 5, dego(v2) = 1,

degt(v3) = 2, dego(v3) = 4,

degt(v4) = 1, deg0(v4) = 3,

degt(v5) = 1, dego(v5) = 0,

degt(v6) = 0, dego(v6) =

Đỉnh có bậc vào bậc gọi đỉnh cô lập Đỉnh có bậc vào bậc gọi đỉnh treo, cung có đỉnh cuối đỉnh treo gọi cung treo

3.2.8 Mệnh đề: Cho G =(V, E) đồ thị có hướng Khi

40

(42)

∈ ∈

= V

v t v V o

v v) deg ( ) (

deg = |E|

Chứng minh: Kết có cung tính lần cho đỉnh đầu lần cho đỉnh cuối

3.3 NHỮNG ĐƠN ĐỒ THỊĐẶC BIỆT

3.3.1 Đồ thị đầy đủ: Đồ thị đầy đủ n đỉnh, ký hiệu Kn, đơn đồ thị mà hai đỉnh

phân biệt ln liền kề Như vậy, Kn có

2 ) (n

n

cạnh đỉnh Kn

có bậc n−1 Thí dụ 6:

K1 K2

K3 K4

v1

v2

v3

v1 v2

v3

v4 v5 v2

v1 v3 V4 v2 v1 v1 K5

3.3.2 Đồ thị vòng: Đơn đồ thị n đỉnh v1, v2, , (n≥3) n cạnh (v1,v2), (v2,v3), ,

(vn-1,vn), (vn,v1) gọi đồ thị vòng, ký hiệu Cn Như vậy, đỉnh Cn có bậc

Thí dụ 7:

C3 C4 C5 C6

v1

v5 v2

v4 v3

v1 v6 v5 v2 v3 v4 v1 v2 v3

v1 v2

v4 v3

3.3.3 Đồ thị bánh xe:Từ đồ thị vòng Cn, thêm vào đỉnh vn+1 cạnh (vn+1,v1),

(vn+1,v2), , (vn+1,vn), ta nhận đơn đồ thị gọi đồ thị bánh xe, ký hiệu Wn Như

vậy, đồ thị Wn có n+1 đỉnh, 2n cạnh, đỉnh bậc n n đỉnh bậc

Thí dụ 8:

W3 W4 W5 W6

v2

v3

v1 v2

v4 v3

v1

v5 v2

v4 v3

v6 v5 v2 v3 v4 v1

v4 v5

v6 v7

v1

3.3.4 Đồ thị lập phương: Đơn đồ thị 2nđỉnh, tương ứng với 2n xâu nhị phân độ dài n hai đỉnh kề xâu nhị phân tương ứng với hai đỉnh khác bit gọi đồ thị lập phương, ký hiệu Qn Như vậy, đỉnh

Qn có bậc n số cạnh Qn n.2n-1 (từ công thức 2|E| =

V v

v) deg( )

41

(43)

Thí dụ 9:

Q1

Q2

10 11

01 00

000

110 111

101

011 001

010 100

1

Q3

3.3.5 Đồ thị phân đôi (đồ thị hai phe): Đơn đồ thị G=(V,E) cho V=V1∪V2,

V1∩V2=∅, V1≠∅, V2≠∅ cạnh G nối đỉnh V1 đỉnh

trong V2được gọi đồ thị phân đôi

Nếu đồ thị phân đơi G=(V1∪V2,E) cho với v1∈V1, v2∈V2, (v1,v2)∈E

G gọi đồ thị phân đôi đầy đủ Nếu |V1|=m, |V2|=n đồ thị phân đơi đầy đủ G

ký hiệu Km,n Như Km,n có m.n cạnh, đỉnh V1 có bậc n đỉnh V2

có bậc m Thí dụ 10:

v1 v2

v3 v4 v5 v6

v1 v2 v3

v4 v5 v6

K2,4 K3,3 3.3.6 Một vài ứng dụng đồ thịđặc biệt:

1) Các mạng cục (LAN): Một số mạng cục dùng cấu trúc hình sao, tất thiết bị nối với thiết bị điều khiển trung tâm Mạng cục kiểu

biểu diễn đồ thị phân đôi đầy đủ K1,n Các thông báo gửi từ thiết bị tới

thiết bị khác phải qua thiết bịđiều khiển trung tâm

Mạng cục có cấu trúc vịng trịn, thiết bị nối với

đúng hai thiết bị khác Mạng cục kiểu biểu diễn đồ thị vịng Cn

Thông báo gửi từ thiết bị tới thiết bị khác truyền theo vòng tròn

đến nơi nhận v2 v3 v4

v5 v1 v6

v7 v8 v9

Cấu trúc hình Cấu trúc vịng trịn Cấu trúc hỗn hợp

v1 v2

v8

v7

v6 v5

v4

v3 v9

v2

v8

v7

v3

v4

v6

v5

v1

42

(44)

Cuối cùng, số mạng cục dùng cấu trúc hỗn hợp hai cấu trúc Các thông báo truyền vịng quanh theo vịng trịn qua thiết bị trung tâm Sự

dư thừa làm cho mạng đáng tin cậy Mạng cục kiểu biểu diễn đồ thị bánh xe Wn

2) Xử lý song song: Các thuật toán để giải toán thiết kếđể thực phép toán thời điểm thuật toán nối tiếp Tuy nhiên, nhiều tốn với số

lượng tính tốn lớn tốn mơ thời tiết, tạo hình y học hay phân tích mật mã khơng thể giải khoảng thời gian hợp lý dùng thuật toán nối tiếp dùng siêu máy tính Ngồi ra, giới hạn mặt vật lý

đối với tốc độ thực phép toán sở, nên thường gặp toán giải khoảng thời gian hợp lý thao tác nối tiếp Vì vậy, người ta phải nghĩ đến kiểu xử lý song song

Khi xử lý song song, người ta dùng máy tính có nhiều xử lý riêng biệt, xử lý có nhớ riêng, nhờđó khắc phục hạn chế máy nối tiếp Các thuật tốn song song phân chia tốn thành số tốn cho giải đồng thời Do vậy, thuật toán song song nhờ việc sử dụng máy tính có đa xử lý, người ta hy vọng giải nhanh toán phức tạp Trong thuật toán song song có dãy thị theo dõi việc thực thuật toán, gửi toán tới xử lý khác nhau, chuyển thông tin vào, thông tin tới xử lý thích hợp

Khi dùng cách xử lý song song, xử lý cần thơng tin xử lý khác Do chúng cần phải kết nối với Người ta dùng loại

đồ thị thích hợp để biểu diễn mạng kết nối xử lý máy tính có nhiều

xử lý Kiểu mạng kết nối dùng để thực thuật toán song song cụ thể phụ thuộc vào yêu cầu với việc trao đổi liệu xử lý, phụ thuộc vào tốc độ

mong muốn tất nhiên vào phần cứng có

Mạng kết nối xử lý đơn giản đắt có liên kết hai chiều cặp xử lý Các mạng mơ hình đồ thị đầy đủ Kn,

đó n số xử lý Tuy nhiên, mạng liên kết kiểu có số kết nối nhiều mà thực tế số kết nối cần phải có giới hạn

Các xử lý kết nối đơn giản xếp chúng theo mảng chiều

Ưu điểm mảng chiều xử lý có nhiều đường nối trực tiếp với xử lý khác Nhược điểm nhiều cần có nhiều kết nối trung gian để

các xử lý trao đổi thông tin với

Mạng kiểu lưới (hoặc mảng hai chiều) hay dùng cho mạng liên kết Trong mạng thế, số xử lý số phương, n=m2 Các xử lý

P2 P3 P4 P5 P6

P1

43

(45)

được gán nhãn P(i,j), ≤ i, j ≤ m−1 Các kết nối hai chiều nối xử lý P(i,j) với bốn xử lý bên cạnh, tức với P(i,j±1) P(i±1,j) chừng xử lý lưới

P(0,0) P(0,1) P(0,2) P(0,3)

P(1,0) P(1,1) P(1,2) P(1,3)

P(2,0) P(2,1) P(2,2) P(2,3)

P(3,0) P(3,1) P(3,2) P(3,3)

Mạng kết nối quan trọng mạng kiểu siêu khối Với mạng loại số

các xử lý luỹ thừa 2, n=2m Các xử lý gán nhãn P0, P1, , Pn-1 Mỗi

bộ xử lý có liên kết hai chiều với m xử lý khác Bộ xử lý Pi nối với xử lý có số

biểu diễn dãy nhị phân khác với dãy nhị phân biểu diễn i bit Mạng kiểu siêu khối cân số kết nối trực tiếp xử lý số kết nối gián tiếp cho xử lý truyền thơng Nhiều máy tính chế tạo theo mạng kiểu siêu khối nhiều thuật toán thiết kế để sử dụng mạng kiểu siêu khối Đồ thị lập phương Qm biểu diễn mạng kiểu siêu khối có 2m xử lý

3.4 BIỂU DIỄN ĐỒ THỊ BẰNG MA TRẬN VÀ SỰĐẲNG CẤU ĐỒ THỊ:

P1 P2 P3 P4 P5 P6

P0 P7

3.4.1 Định nghĩa: Cho đồ thị G=(V,E) (vô hướng có hướng), với V={v1,v2, , vn}

Ma trận liền kề G ứng với thứ tự đỉnh v1,v2, , ma trận

A=(aij)1≤i,jnM(n,Z), aij số cạnh cung nối từ vi tới vj

Như vậy, ma trận liền kề đồ thị vô hướng ma trận đối xứng, nghĩa , ma trận liền kề đồ thị có hướng khơng có tính đối xứng

ji ij a a =

Thí dụ 11: Ma trận liền kề với thứ tự đỉnh v1, v2, v3, v4 là:

v1 v2

v3

v4

⎟⎟ ⎟ ⎟ ⎟

⎠ ⎞ ⎜⎜

⎜ ⎜ ⎜

⎝ ⎛

0 2

2 1

1

2

44

(46)

Ma trận liền kề với thứ tự đỉnh v1, v2, v3, v4, v5 là: ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 1 1 0 0 1 1 1

1 v1

v2

v5

v4 v3

3.4.2 Định nghĩa: Cho đồ thị vô hướng G=(V,E), v1, v2, , đỉnh e1, e2, ,

em cạnh G Ma trận liên thuộc G theo thứ tự V E ma trận

M=( ) ( , )

1

1 M n m Z

m

m j n i

ij ∈ ×

≤ ≤≤

≤ ,

ij

m cạnh ej nối với đỉnh vi cạnh ej khơng nối với đỉnh vi

Thí dụ 12: Ma trận liên thuộc theo thứ tự đỉnh v1, v2, v3, v4, v5 cạnh e1, e2, e3,

e4, e5, e6 là:

v1 v2 v3

v4 v5

e6 e5 e4 e3 e2 e1 ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 1 0 0 1 1 0 0 1 0 0 0 1

3.4.3 Định nghĩa: Các đơn đồ thị G1=(V1,E1) G2=(V2,E2) gọi đẳng cấu

tồn song ánh f từ V1 lên V2 cho đỉnh u v liền kề G1

khi f(u) f(v) liền kề G2 với u v V1 Ánh xạ f gọi

phép đẳng cấu

Thông thường, để chứng tỏ hai đơn đồ thị không đẳng cấu, người ta chúng khơng có chung tính chất mà đơn đồ thị đẳng cấu cần phải có Tính chất gọi bất biến phép đẳng cấu đơn đồ thị

Thí dụ 13: 1) Hai đơn đồ thị G1 G2 sau đẳng cấu qua phép đẳng cấu f: aax,

bau, caz, dav, eay:

b d e c a u x y z v

G1 G2 45

(47)

2) Hai đồ thị G1 G2 sau có đỉnh cạnh khơng đẳng cấu G1

có đỉnh bậc mà G2 khơng có đỉnh bậc

3) Hai đồ thị G1 G2 sau có đỉnh, 10 cạnh, có đỉnh bậc 4, bốn đỉnh

bậc hai đỉnh bậc Tuy nhiên G1 G2 khơng đẳng cấu hai đỉnh bậc G1

(a d) không kề nhau, hai đỉnh bậc G2 (y z) kề

G1 G2

4) Hãy xác định xem hai đồ thị sau có đẳng cấu hay khơng?

G1 G2

d c b g e h u v x y w t z

u1 u2 v1 v3

u4 u6 u5 u3 v6 v2 v4 v5 a

Hai đồ thị G1 G2 đẳng cấu hai ma trận liền kề G1 theo thứ tự đỉnh

u1, u2, u3, u4, u5, u6 G2 theo thứ tự đỉnh v6, v3, v4, v5, v1, v2

bằng:

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 0 1 0 0 1 0 1 0 1 0 1

3.5 CÁC ĐỒ THỊ MỚI TỪĐỒ THỊ CŨ

3.5.1 Định nghĩa: Cho hai đồ thị G1=(V1,E1) G2=(V2,E2) Ta nói G2 đồ thị

của G1 V2 ⊂ V1 E2 ⊂ E1 Trong trường hợp V1=V2 G2 gọi bao trùm

G1

46

(48)

Thí dụ 14:

G G1 G2 G3

a

e d

c b

a

c

a d

c

e b

a

c b

d

b

G4 G5

G1, G2, G3 G4 đồ thị G, G2 G4 đồ thị bao

trùm G, cịn G5 khơng phải đồ thị G

3.5.2 Định nghĩa: Hợp hai đơn đồ thị G1=(V1,E1) G2=(V2,E2) đơn đồ thị

có tập đỉnh V1 ∪ V2 tập cạnh E1 ∪ E2, ký hiệu G1 ∪ G2

Thí dụ 15:

G1 G2 G1∪G2

a d

b c

e

a d

c b

x y z

u v u

x y z

w

x y z

u v w

3.5.3 Định nghĩa:Đơn đồ thị G’=(V,E’) gọi đồ thị bù đơn đồ thị G=(V,E) G G’ khơng có cạnh chung (E ∩ E’=∅) G ∪ G’là đồ thịđầy đủ

Dễ thấy G’ bù G G bù G’ Khi ta nói hai đồ thị

là bù Thí dụ 16:

G’ G G1’ G1

x

v y

u z u z

y v

x

x y

u v

x

u

y

v

Hai đồ thị G’ G bù hai đồ thị G1 G1’ bù 3.6 TÍNH LIÊN THƠNG

3.6.1 Định nghĩa: Đường độ dài n từ đỉnh u đến đỉnh v, với n số nguyên dương, đồ thị (giả đồ thị vô hướng đa đồ thị có hướng) G=(V,E) dãy cạnh (hoặc cung) e1, e2, , en đồ thị cho e1=(x0,x1),e2=(x1,x2), ,en=(xn-1,xn),

với x0=u xn=v Khi đồ thị khơng có cạnh (hoặc cung) bội, ta ký hiệu đường 47

(49)

bằng dãy đỉnh x0, x1, , xn Đường gọi chu trình bắt đầu kết

thúc đỉnh Đường chu trình gọi đơn khơng chứa cạnh (hoặc cung) lần Một đường chu trình khơng qua đỉnh q lần (trừ đỉnh đầu đỉnh cuối chu trình trùng nhau) gọi đường chu trình sơ cấp Rõ ràng đường (t.ư chu trình) sơ cấp đường (t.ư chu trình) đơn

Thí dụ 17:

x y z

v

w u

Trong đơn đồ thị trên, x, y, z, w, v, y đường đơn (không sơ cấp) độ dài 5; x, w, v, z, y khơng đường (v, z) khơng cạnh; y, z, w, x, v, u, y chu trình sơ cấp

độ dài

3.6.2 Định nghĩa: Một đồ thị (vô hướng) gọi liên thơng có đường cặp đỉnh phân biệt đồ thị

Một đồ thị không liên thông hợp hai hay nhiều đồ thị liên thông, cặp đồ thị đỉnh chung Các đồ thị liên thơng rời

được gọi thành phần liên thông đồ thị xét Như vậy, đồ thị liên thơng có thành phần liên thơng

Thí dụ 18: x

t

u

y

w z

v

a

d c h

b

i

k

l g

G G’

Đồ thị G liên thơng, đồ thị G’ khơng liên thơng có thành phần liên thông 3.6.3 Định nghĩa: Một đỉnh đồ thị G mà xố tất cạnh liên thuộc với ta nhận đồ thị có nhiều thành phần liên thông đồ thị G

được gọi đỉnh cắt hay điểm khớp Việc xoá đỉnh cắt khỏi đồ thị liên thông tạo đồ thị khơng liên thơng Hồn tồn tương tự, cạnh mà ta bỏ

tạo đồ thị có nhiều thành phần liên thơng so với đồ thị xuất phát gọi cạnh cắt cầu

x

v

y

w

z

s

u

t Thí dụ 19:

48

(50)

Trong đồ thị trên, đỉnh cắt v, w, s cầu (x,v), (w,s)

3.6.4 Mệnh đề: Giữa cặp đỉnh phân biệt đồ thị liên thơng ln có đường

đi sơ cấp

Chứng minh: Giả sử u v hai đỉnh phân biệt đồ thị liên thông G Vì G liên thơng nên có đường u v Gọi x0, x1, , xn, với x0=u xn=v, dãy

các đỉnh đường có độ dài ngắn Đây đường sơ cấp cần tìm Thật vậy, giả sử khơng đường đơn, xi=xj với ≤ i < j Điều có nghĩa

giữa đỉnh u v có đường ngắn qua đỉnh x0, x1, , xi-1, xj, , xn nhận

được cách xoá cạnh tương ứng với dãy đỉnh xi, , xj-1

3.6.5 Mệnh đề: Mọi đơn đồ thị n đỉnh (n ≥ 2) có tổng bậc hai đỉnh tuỳ ý không nhỏ n đồ thị liên thơng

Chứng minh: Cho đơn đồ thị G=(V,E) có n đỉnh (n ≥ 2) thoả mãn yêu cầu tốn Giả sử G khơng liên thơng, tức tồn hai đỉnh u v cho khơng có đường

đi nối u v Khi đồ thị G tồn hai thành phần liên thơng G1 có n1

đỉnh chứa u, G2 chứa đỉnh v có n2 đỉnh Vì G1, G2 hai số thành phần

liên thông G nên n1+n2 ≤ n ta có:

deg(u)+deg(v) ≤ (n1 −1)+(n2 − 1) = n1+n2−2 ≤ n−2 <n

Điều mâu thuẫn dẫn đến kết luận đồ thị G phải liên thông

3.6.6 Hệ quả: Đơn đồ thị mà bậc đỉnh khơng nhỏ nửa sốđỉnh đồ thị liên thông

3.6.7 Mệnh đề: Nếu đồ thị có hai đỉnh bậc lẻ hai đỉnh phải liên thơng, tức có đường nối chúng

Chứng minh: Cho G=(V,E) đồ thị thị có hai đỉnh bậc lẻ u v Giả sử u v không liên thơng với Khi chúng phải thuộc hai thành phần liên thơng đồ thị G, G1 chứa u G2 chứa v

Bậc đỉnh u G1 bậc u G, nên G1đỉnh u

có bậc lẻ G1 có đỉnh bậc lẻ Điều mâu thuẫn Vậy hai đỉnh u v

phải liên thông

3.6.8 Mệnh đề: Cho G=(V,E) đồ thị liên thơng Khi đỉnh G điểm khớp G tồn hai đỉnh u v cho đường nối u v phải qua đỉnh

Chứng minh: Điều kiện cần: Giả sửđỉnh x điểm khớp đồ thị G Khi đồ thị

con G1 G nhận cách xố x cạnh liên thuộc với không liên

thông Giả sử G2, G3 hai thành phần liên thông G1 Lấy u đỉnh

G2 v đỉnh G3 Do u, v thuộc hai thành phần liên thông khác nhau, nên

G1 đỉnh u, v không liên thông Nhưng G đỉnh u, v lại liên thông, nên

đường nối u, v phải qua đỉnh x 49

(51)

Điều kiện đủ: Giả sử đường nối u, v qua đỉnh x, nên bỏđỉnh x cạnh liên thuộc với x đồ thị G1 nhận từ G chứa hai đỉnh u, v khơng liên

thơng Do G1 đồ thị không liên thông hay đỉnh x điểm khớp G

3.6.9 Định lý: Cho G đơn đồ thị có n đỉnh, m cạnh k thành phần liên thơng Khi

2 ) )( ( − − + ≤ ≤

k m n k n k

n

Chứng minh: Bất đẳng thức nkm chứng minh quy nạp theo m Nếu m=0 k=n nên bất đẳng thức Giả sử bất đẳng thức đến m−1, với m ≥ Gọi G’ đồ thị bao trùm G có số cạnh m0 nhỏ cho có k thành

phần liên thơng Do việc loại bỏ cạnh G’ tăng số thành phần liên thơng lên đồ thị thu có n đỉnh, k+1 thành phần liên thơng m0−1 cạnh Theo giả thiết quy nạp, ta có m0−1 ≥ n−(k+1) hay m0 ≥ n−k Vậy m ≥ n-k

Bổ sung cạnh vào G để nhận đồ thị G’’ có m1 cạnh cho k thành phần

liên thông đồ thịđầy đủ Ta có m ≤ m1 nên cần chứng minh

m1 ≤

2

) )(

(nk nk+

Giả sử Gi Gj hai thành phần liên thông G’’ với ni njđỉnh ni ≥ nj >1 (*)

Nếu ta thay Gi Gj đồ thị đầy đủ với ni+1 nj−1 đỉnh tổng số đỉnh khơng

thay đổi số cạnh tăng thêm lượng là:

1 ) )( ( ) ( ) ( ) ( = − + ⎥ ⎦ ⎤ ⎢ ⎣ ⎡ − − − − − ⎥⎦ ⎤ ⎢⎣ ⎡ − − + j i j j j j i i i

i n n n n n n n n n

n

Thủ tục lặp lại hai thành phần có sốđỉnh thoả (*) Vì m1 lớn

nhất (n, k cố định) đồ thị gồm k-1 đỉnh cô lập đồ thị đầy đủ với n-k+1

đỉnh Từđó suy bất đẳng thức cần tìm

3.6.10 Định nghĩa:Đồ thị có hướng G gọi liên thông mạnh với hai đỉnh phân biệt u v G có đường từ u tới v đường từ v tới u

Đồ thị có hướng G gọi liên thông yếu đồ thị vô hướng liên thơng

Đồ thị có hướng G gọi liên thông chiều với hai đỉnh phân biệt u v G có đường từ u tới v đường từ v tới u

Thí dụ 20:

u v w

t

x

u v w

s x t y s y

G G’ 50

(52)

Đồ thị G liên thông mạnh đồ thị G’ liên thơng yếu (khơng có đường

đi từ u tới x từ x tới u)

3.6.11 Mệnh đề: Cho G đồ thị (vô hướng có hướng) với ma trận liền kề A theo thứ tự đỉnh v1, v2, , Khi số đường khác độ dài r từ vi tới vj

trong r số nguyên dương, giá trị phần tử dòng i cột j ma trận Ar Chứng minh: Ta chứng minh mệnh đề quy nạp theo r Số đường khác

độ dài từ vi tới vj số cạnh (hoặc cung) từ vi tới vj, phần tử dịng i cột

j ma trận A; nghĩa là, mệnh đề r=1

Giả sử mệnh đềđúng đến r; nghĩa là, phần tử dòng i cột j Ar số đường

đi khác độ dài r từ vi tới vj Vì Ar+1=Ar.A nên phần tử dòng i cột j Ar+1

bi1a1j+bi2a2j+ +binanj,

trong bik phần tử dòng i cột k Ar Theo giả thiết quy nạp bik số đường

khác độ dài r từ vi tới vk

Đường độ dài r+1 từ vi tới vj sẽđược tạo nên từđường độ dài r từ vi tới đỉnh

trung gian vk cạnh (hoặc cung) từ vk tới vj Theo quy tắc nhân số

đường tích số đường độ dài r từ vi tới vk, tức bik, số cạnh

(hoặc cung) từ vk tới vj, tức akj Cộng tích lại theo tất đỉnh trung gian vk

ta có mệnh đềđúng đến r+1

BÀI TẬP CHƯƠNG III:

1 Cho G đồ thị có v đỉnh e cạnh, M, mtương ứng bậc lớn nhỏ đỉnh G Chứng tỏ

m ≤ 2e

v ≤ M

2 Chứng minh G đơn đồ thị phân đơi có v đỉnh ecạnh,

e ≤ v2/4

3 Trongmột phương án mạng kiểu lưới kết nối n=m2 xử lý song song, xử lý P(i,j)

được kết nối với xử lý (P(i±1) mod m, j), P(i, (j±1) mod m), cho kết nối bao xung quanh cạnh lưới Hãy vẽ mạng kiểu lưới có 16 xử lý theo phương án

4 Hãy vẽ đồ thị vô hướng biểu diễn ma trận liền kề sau:

a) , b) , c) .

1 4 ⎛

⎝ ⎜ ⎜ ⎜

⎞ ⎠ ⎟ ⎟ ⎟

1 2 0 1 1 ⎛

⎝ ⎜ ⎜ ⎜ ⎜

⎠ ⎟ ⎟ ⎟ ⎟

0 3 1 0 ⎛

⎝ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜

⎠ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟

51

(53)

5. Nêu ý nghĩa tổng phần tử hàng (t.ư cột) ma trận liền kềđối với đồ thị vô hướng ? Đối với đồ thị có hướng ?

6 Tìm ma trận liền kề cho đồ thị sau:

a) Kn , b) Cn, c) Wn , d) Km,n , e) Qn 7 Có đơn đồ thị không đẳng cấu với n đỉnh khi: a) n=2, b) n=3, c) n=4

8. Hai đơn đồ thị với ma trận liền kề sau có đẳng cấu không?

⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 1 1 0 0 1 , ⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 1 1 0 1 0 1 1

9. Hai đơn đồ thị với ma trận liền kề sau có đẳng cấu khơng?

⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 1 1 0 1 0 1 , ⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 1 1 0 1 1 0

10. Các đồ thị G G’ sau có đẳng cấu với không? a) b) u1 u2 u3 u4

u5 u6

v1 v2

v4 v3

v5 v6

11. Cho V={2,3,4,5,6,7,8} E tập hợp cặp phần tử (u,v) V cho u<v u,v nguyên tố Hãy vẽ đồ thị có hướng G=(V,E) Tìm số đường phân biệt độ dài từđỉnh tới đỉnh

u1 u2 u3

u4 u5 u6

v1 v2

v6

v5 v4

v3

12 Hãy tìm số đường độ dài n hai đỉnh liền kề (t.ư không liền kề) tùy ý K3,3 với giá trị n sau:

a) n=2, b) n=3, c) n=4, d) n=5 52

(54)

14. Một họp có ba đại biểu đến dự Mỗi người quen hai đại biểu khác Chứng minh xếp sốđại biểu ngồi xung quanh bàn tròn,

để người ngồi hai người mà đại biểu quen

15. Một lớp học có sinh viên Mỗi sinh viên thân với sinh viên khác Chứng minh xếp số chẵn sinh viên ngồi quanh bàn tròn để sinh viên ngồi hai sinh viên mà họ thân

16. Trong họp có hai đại biểu khơng quen đại biểu có số lẻ người quen đến dự Chứng minh ln ln xếp số đại biểu ngồi chen hai đại biểu nói trên, để người ngồi hai người mà quen 17. Một thành phố có n (n ≥ 2) nút giao thơng hai nút giao thơng có số đầu mối đường ngầm tới nút giao thông không nhỏ n Chứng minh từ nút giao thơng tuỳ ý ta có thểđi đến nút giao thông khác đường ngầm

53

(55)

CHƯƠNG IV

ĐỒ

TH

EULER VÀ

ĐỒ

TH

HAMILTON

4.1 ĐƯỜNG ĐI EULER VÀ ĐỒ THỊ EULER

Có thể coi năm 1736 năm khai sinh lý thuyết đồ thị, với việc cơng bố lời giải “bài tốn cầu Konigsberg” nhà toán học lỗi lạc Euler (1707-1783) Thành phố Konigsberg thuộc Phổ (nay gọi Kaliningrad thuộc Nga) chia thành bốn vùng nhánh sông Pregel, vùng gồm hai vùng bên bờ sông, đảo Kneiphof miền nằm hai nhánh sông Pregel Vào kỷ 18, người ta xây bảy cầu nối vùng với

G

D A

C B

C B

D A

Dân thành phố thắc mắc: “Có thể dạo qua tất bảy cầu, cầu lần không?” Nếu ta coi khu vực A, B, C, D đỉnh cầu qua lại hai khu vực cạnh nối hai đỉnh ta có sơ đồ Konigsberg đa đồ thị G hình

Bài tốn tìm đường qua tất cầu, cầu qua lần phát biểu lại mơ hình sau: Có tồn chu trình đơn đa đồ thị G chứa tất cạnh?

4.1.1 Định nghĩa: Chu trình (t.ư đường đi) đơn chứa tất cạnh (hoặc cung) đồ thị (vô hướng có hướng) G gọi chu trình (t.ư đường đi) Euler Một đồ thị liên thông (liên thơng yếu đồ thị có hướng) có chứa chu trình (t.ư đường đi) Euler gọi đồ thị Euler (t.ư nửa Euler)

Thí dụ 1:

Đồ thị không nửa Euler

Đồ thị nửa Euler

Đồ thị Euler

(56)

Đồ thị Euler Đồ thị nửa Euler

Điều kiện cần đủ để đồ thị đồ thị Euler Euler tìm vào năm 1736 ơng giải tốn hóc búa tiếng thời bảy cầu Konigsberg định lý lý thuyết đồ thị

4.1.2 Định lý: Đồ thị (vô hướng) liên thông G đồ thị Euler đỉnh G có bậc chẵn

Chứng minh:

Điu kin cn: Giả sử G đồ thị Euler, tức tồn chu trình Euler P G Khi lần chu trình P qua đỉnh G bậc đỉnh tăng lên Mặt khác, cạnh đồ thị xuất P lần Do đỉnh đồ thị có bậc chẵn

4.1.3 Bổ đề: Nếu bậc đỉnh đồ thị G khơng nhỏ G chứa chu trình đơn

Chứng minh: Nếu G có cạnh bội có khun khẳng định bổ đề hiển nhiên Vì giả sử G đơn đồ thị Gọi v đỉnh G Ta xây dựng theo quy nạp đường

trong v1 đỉnh kề với v, với i ≥ 1, chọn vi+1 đỉnh kề với vi vi+1 ≠ vi-1 (có thể

chọn deg(vi) ≥ 2), v0 = v Do tập đỉnh G hữu hạn, nên sau số hữu

hạn bước ta phải quay lại đỉnh xuất trước Gọi k số nguyên dương để vk=vi (0≤i<k) Khi đó, đường vi, vi+1, , vk-1, vk (= vi) chu trình đơn cần

tìm

v2

v1

v

Điu kin đủ: Quy nạp theo số cạnh G Do G liên thông bậc đỉnh chẵn nên đỉnh có bậc khơng nhỏ Từ theo Bổ đề 4.1.3, G phải chứa chu trình đơn C Nếu C qua tất cạnh G chu trình Euler Giả sử C không qua tất cạnh G Khi loại bỏ khỏi G cạnh thuộc C, ta thu đồ thị H (không thiết liên thông) Số cạnh H nhỏ G rõ ràng đỉnh H có bậc chẵn Theo giả thiết quy nạp, thành phần liên thơng H tìm chu trình Euler Do G liên thơng nên thành

(57)

phần H có đỉnh chung với chu trình C Vì vậy, ta xây dựng chu trình Euler G sau:

C

Bắt đầu từ đỉnh chu trình C, theo cạnh C chừng chưa gặp phải đỉnh không cô lập H Nếu gặp phải đỉnh ta theo chu trình Euler thành phần liên thơng H chứa đỉnh Sau lại tiếp tục theo cạnh C gặp phải đỉnh khơng lập H lại theo chu trình Euler thành phần liên thông tương ứng H, Quá trình kết thúc ta trở đỉnh xuất phát, tức thu chu trình qua cạnh đồ thị lần

4.1.4 Hệ quả: Đồ thị liên thông G nửa Euler (mà khơng Euler) có hai đỉnh bậc lẻ G

Chứng minh: Nếu G nửa Euler tồn đường Euler G từ đỉnh u đến đỉnh v Gọi G’ đồ thị thu từ G cách thêm vào cạnh (u,v) Khi G’ đồ thị Euler nên đỉnh G’ có bậc chẵn (kể u v) Vì u v hai đỉnh G có bậc lẻ

Đảo lại, có hai đỉnh bậc lẻ u v gọi G’ đồ thị thu từ G cách thêm vào cạnh (u,v) Khi đỉnh G’ có bậc chẵn hay G’ đồ thị Euler Bỏ cạnh (u,v) thêm vào khỏi chu trình Euler G’ ta có đường Euler từ u đến v G hay G nửa Euler

4.1.5 Chú ý: Ta vạch chu trình Euler đồ thị liên thơng G có bậc đỉnh chẵn theo thuật toán Fleury sau

Xuất phát từ đỉnh G tuân theo hai quy tắc sau:

1 Mỗi qua cạnh xố đi; sau xố đỉnh lập (nếu có); Khơng qua cầu, khơng cịn cách khác

u v w s

x y z

t

(58)

Xuất phát từ u, ta theo cạnh (u,v) (u,x), giả sử (u,v) (xoá (u,v)) Từ v qua cạnh (v,w), (v,x), (v,t), giả sử (v,w) (xố (v,w)) Tiếp tục, theo cạnh (w,s), (w,y), (w,z), giả sử (w,s) (xoá (w,s)) Đi theo cạnh (s,y) (xoá (s,y) s) Vì (y,x) cầu nên theo hai cạnh (y,w), (y,z), giả sử (y,w) (xoá (y,w)) Đi theo (w,z) (xoá (w,z) w) theo (z,y) (xoá (z,y) z) Tiếp tục theo cạnh (y,x) (xố (y,x) y) Vì (x,u) cầu nên theo cạnh (x,v) (x,t), giả sử (x,v) (xoá (x,v)) Tiếp tục theo cạnh (v,t) (xoá (v,t) v), theo cạnh (t,x) (xoá cạnh (t,x) t), cuối cung theo cạnh (x,u) (xoá (x,u), x u)

4.1.6 Bài toán người phát thư Trung Hoa:

Một nhân viên từ Sở Bưu Điện, qua số đường phố để phát thư, quay Sở Người phải qua đường theo trình tự để đường ngắn nhất?

Bài toán nhà toán học Trung Hoa Guan nêu lên (1960), thường gọi “bài toán người phát thư Trung Hoa” Ta xét toán dạng đơn giản sau

Cho đồ thị liên thơng G Một chu trình qua cạnh G gọi hành trình G Trong hành trình đó, tìm hành trình ngắn nhất, tức qua cạnh

Rõ ràng G đồ thị Euler (mọi đỉnh có bậc chẵn) chu trình Euler G (qua cạnh G lần) hành trình ngắn cần tìm

Chỉ cịn phải xét trường hợp G có số đỉnh bậc lẻ (số đỉnh bậc lẻ số chẵn) Khi đó, hành trình G phải qua hai lần số cạnh

Dễ thấy hành trình qua cạnh (u,v) q hai lần khơng phải hành trình ngắn G Vì vậy, ta cần xét hành trình T qua hai lần số cạnh G

Ta quy ước xem hành trình T G hành trình đồ thị Euler GT, có từ G cách vẽ thêm cạnh song song cạnh mà T

qua hai lần Bài toán đặt đưa toán sau:

Trong đồ thị Euler GT, tìm đồ thị có số cạnh (khi chu trình Euler

trong đồ thị hành trình ngắn nhất)

Định lý (Gooodman Hedetniemi, 1973) Nếu G đồ thị liên thơng có q cạnh hành trình ngắn G có chiều dài

q + m(G),

trong m(G) số cạnh mà hành trình qua hai lần xác định sau:

Gọi V0(G) tập hợp đỉnh bậc lẻ (2k đỉnh) G Ta phân 2k phần tử G

thành k cặp, tập hợp k cặp gọi phân hoạch cặp V0(G)

Ta gọi độ dài đường ngắn từ u đến v khoảng cách d(u,v) Đối với phân hoạch cặp Pi, ta tính khoảng cách hai đỉnh cặp, tính tổng d(Pi)

Số m(G) cực tiểu d(Pi):

(59)

m(G)=min d(Pi)

Thí dụ 2: Giải toán người phát thư Trung Hoa cho đồ thị sau:

D

C E

F

B J K

A I H G

G GT

Tập hợp đỉnh bậc lẻ VO(G)={B, G, H, K} tập hợp phân hoạch cặp

P={P1, P2, P3},

P1 = {(B, G), (H, K)} → d(P1) = d(B, G)+d(H, K) = 4+1 = 5,

P2 = {(B, H), (G, K)} → d(P2) = d(B, H)+d(G, K) = 2+1 = 3,

P3 = {(B, K), (G, H)} → d(P3) = d(B, K)+d(G, H) = 3+2 =

m(G) = min(d(P1), d(P2), d(P3)) =

Do GT có từ G cách thêm vào cạnh: (B, I), (I, H), (G, K) GT

đồ thị Euler Vậy hành trình ngắn cần tìm theo chu trình Euler GT:

A, B, C, D, E, F, K, G, K, E, C, J, K, H, J, I, H, I, B, I, A

4.1.7 Định lý: Đồ thị có hướng liên thông yếu G đồ thị Euler đỉnh G có bậc vào bậc

Chứng minh: Chứng minh tương tự chứng minh Định lý 4.1.2 điều kiện đủ cần có bổ đề tương tự Bổ đề 4.1.3

4.1.8 Bổ đề: Nếu bậc vào bậc đỉnh đồ thị có hướng G khơng nhỏ G chứa chu trình đơn

4.1.9 Hệ quả: Đồ thị có hướng liên thơng yếu G nửa Euler (mà không Euler) tồn hai đỉnh x y cho:

dego(x) = degt(x)+1, degt(y) = dego(y)+1, degt(v) = dego(v), ∀v∈V, v ≠ x, v ≠ y

Chứng minh: Chứng minh tương tự Hệ 4.1.4

4.2 ĐƯỜNG ĐI HAMILTON VÀ ĐỒ THỊ HAMILTON

Năm 1857, nhà toán học người Ailen Hamilton(1805-1865) đưa trò chơi “đi vòng quanh giới” sau

Cho hình thập nhị diện (đa diện có 12 mặt, 20 đỉnh 30 cạnh), đỉnh hình mang tên thành phố tiếng, cạnh hình (nối hai đỉnh) đường lại hai thành phố tương ứng Xuất phát từ thành phố, tìm đường thăm tất thành phố khác, thành phố lần, trở chỗ cũ

(60)

Trước Hamilton, từ thời Euler, người ta biết đến câu đố hóc búa “đường mã bàn cờ” Trên bàn cờ, mã theo đường chéo hình chữ nhật x x ô vuông Giả sử bàn cờ có x vng Hãy tìm đường mã qua tất ô bàn cờ, ô lần trở lại xuất phát

Bài tốn nhiều nhà toán học ý, đặc biệt Euler, De Moivre, Vandermonde,

Hiện có nhiều lời giải phương pháp giải có nhiều, có quy tắc: lần bố trí mã ta chọn vị trí mà vị trí số chưa dùng tới khống chế

Một phương pháp khác dựa tính đối xứng hai nửa bàn cờ Ta tìm hành trình mã nửa bàn cờ, lấy đối xứng cho nửa bàn cờ lại, sau nối hành trình hai nửa tìm lại với

Trị chơi câu đố dẫn tới việc khảo sát lớp đồ thị đặc biệt, đồ thị Hamilton

4.2.1 Định nghĩa: Chu trình (t.ư đường đi) sơ cấp chứa tất đỉnh đồ thị (vô hướng có hướng) G gọi chu trình (t.ư đường đi) Hamilton Một đồ thị có chứa chu trình (t.ư đường đi) Hamilton gọi đồ thị Hamilton (t.ư nửa Hamilton)

Thí dụ 3:1) C

B D

A E

J

L H

T

K I

O P

F

M G

S R

N Q

Đồ thị Hamilton (hình thập nhị diện biểu diẽn mặt phẳng) với chu trình Hamilton A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, A (đường tô đậm)

2) Trong đợt thi đấu bóng bàn có n (n ≥ 2) đấu thủ tham gia Mỗi đấu thủ gặp đấu thủ khác lần Trong thi đấu bóng bàn có khả thắng thua

(61)

Chứng minh sau đợt thi đấu xếp tất đấu thủ đứng thành hàng dọc, để người đứng sau thắng người đứng trước anh (chị) ta

Xét đồ thị có hướng G gồm n đỉnh cho đỉnh ứng với đấu thủ có cung nối từ đỉnh u đến đỉnh v đấu thủ ứng với u thắng đấu thủ ứng với v Như vậy, đồ thị G có tính chất với hai đỉnh phân biệt u v, có hai cung (u,v) (v,u), đồ thị gọi đồ thị có hướng đầy đủ Từ Mệnh đề 4.2.2 đây, G đồ thị nửa Hamilton Khi đường Hamilton G cho ta xếp cần tìm

3) Một lời giải hành trình mã bàn cờ x 8:

D

T

Đường Hamilton tương tự đường Euler cách phát biểu: Đường Euler qua cạnh (cung) đồ thị lần, đường Hamilton qua đỉnh đồ thị lần Tuy nhiên, tốn tìm đường Euler đồ thị giải trọn vẹn, dấu hiệu nhận biết đồ thị Euler đơn giản dễ sử dụng, tốn tìm đường Hamilton xác định đồ thị Hamilton lại khó nhiều Đường Hamilton đồ thị Hamilton có nhiều ý nghĩa thực tiễn nghiên cứu nhiều, cịn khó khăn lớn chưa vượt qua

Người ta tìm vài điều kiện đủ để nhận biết lớp nhỏ đồ thị Hamilton đồ thị nửa Hamilton Sau vài kết

4.2.2 Định lý (Rédei): Nếu G đồ thị có hướng đầy đủ G đồ thị nửa Hamilton

(62)

Chứng minh: Giả sử G=(V,E) đồ thị có hướng đầy đủ α=(v1,v2, , vk-1, vk)

đường sơ cấp đồ thị G

Nếu α qua tất đỉnh G đường Hamilton G

Nếu G cịn có đỉnh nằm ngồi α, ta bổ sung dần đỉnh vào α cuối nhận đường Hamilton

Thật vậy, giả sử v đỉnh tuỳ ý không nằm α

a) Nếu có cung nối v với v1 bổ sung v vào đầu đường α để α1=(v, v1, v2,

, vk-1, vk)

b) Nếu tồn số i (1 ≤ i ≤ k-1) mà từ vi có cung nối tới v từ v có cung nối tới vi+1

thì ta chen v vào vi vi+1 để đường sơ cấp α2=(v1, v2, , vi, v, vi+1, , vk)

c) Nếu hai khả không xảy nghĩa với i (1 ≤ i ≤ k) vi có

cung tới v Khi bổ sung v vào cuối đường α đường α3=(v1, v2,

, vk-1, vk, v)

Nếu đồ thị G có n đỉnh sau n-k bổ sung ta nhận đường Hamilton

4.2.3 Định lý (Dirac, 1952): Nếu G đơn đồ thị có n đỉnh đỉnh G có bậc khơng nhỏ

2

n

G đồ thị Hamilton

Chứng minh: Định lý chứng minh phản chứng Giả sử G khơng có chu trình Hamilton Ta thêm vào G số đỉnh nối đỉnh với đỉnh G, ta đồ thị G’ Giả sử k (>0) số tối thiểu đỉnh cần thiết để G’ chứa chu trình Hamilton Như vậy, G’ có n+k đỉnh

b’

a' b y

a

Gọi P chu trình Hamilton ayb a G’, a b đỉnh G, cịn y đỉnh Khi b khơng kề với a, trái lại ta bỏ đỉnh y chu trình ab a, mâu thuẩn với giả thiết tính chất nhỏ k

Ngoài ra, a’ đỉnh kề a (khác với y) b’ đỉnh nối tiếp a’ chu trình P b’ khơng thể đỉnh kề với b, trái lại ta thay P chu trình aa’ bb’ a, khơng có y, mâu thuẩn với giả thiết tính chất nhỏ k

Như vậy, với đỉnh kề với a, ta có đỉnh khơng kề với b, tức số đỉnh không kề với b khơng thể số đỉnh kề với a (số đỉnh kề với a không nhỏ

2

n

+k)

(63)

Mặt khác, theo giả thiết số đỉnh kề với b không nhỏ

n

+k Vì khơng có đỉnh vừa kề với b lại vừa không kề với b, nên số đỉnh G’ khơng 2(

2

n

+k)=n+2k, mâu thuẩn với giả thiết số đỉnh G’ n+k (k>0) Định lý chứng minh

4.2.4 Hệ quả: Nếu G đơn đồ thị có n đỉnh đỉnh G có bậc khơng nhỏ

2 −

n

G đồ thị nửa Hamilton

Chứng minh: Thêm vào G đỉnh x nối x với đỉnh G ta nhận đơn đồ thị G’ có n+1 đỉnh đỉnh có bậc khơng nhỏ

2 +

n

Do theo Định lý 4.2.3, G’ có chu trình Hamilton Bỏ x khỏi chu trình này, ta nhận đường Hamilton G

4.2.5 Định lý (Ore, 1960): Nếu G đơn đồ thị có n đỉnh hai đỉnh không kề có tổng số bậc khơng nhỏ n G đồ thị Hamilton

4.2.6 Định lý: Nếu G đồ thị phân đôi với hai tập đỉnh V1, V2 có số đỉnh

bằng n (n ≥ 2) bậc đỉnh lớn

n

G đồ thị Hamilton

Thí dụ 4: e

f

g

h b

a c d

a

e

f

g

b d

a c

Đồ thị G có đỉnh, đỉnh Đồ thị G’ có đỉnh bậc đỉnh có bậc 4, nên theo Định lý 4.2.3, G bậc kề nên tổng số bậc hai đỉnh đồ thị Hamilton không kề 8, nên theo Định lý 4.2.5, G’ đồ thị Hamilton

a b b

d e f

Đồ thị phân đơi có bậc đỉnh (> 3/2), nên theo Định lý 4.2.6, đồ thị Hamilton

(64)

4.2.7 Bài toán xếp chỗ ngồi:

Có n đại biểu từ n nước đến dự hội nghị quốc tế Mỗi ngày họp lần ngồi quanh bàn trịn Hỏi phải bố trí ngày bố trí cho ngày, người có hai người kế bên bạn Lưu ý n người muốn làm quen với

Xét đồ thị gồm n đỉnh, đỉnh ứng với người dự hội nghị, hai đỉnh kề hai đại biểu tương ứng muốn làm quen với Như vậy, ta có đồ thị đầy đủ Kn

Đồ thị Hamilton rõ ràng chu trình Hamilton cách xếp yêu cầu toán Bái tốn trở thành tìm chu trình Hamilton phân biệt đồ thị đầy đủ Kn (hai chu trình Hamilton gọi phân biệt chúng khơng có cạnh chung)

Định lý: Đồ thị đầy đủ Kn với n lẻ n ≥ có

2 −

n

chu trình Hamilton phân biệt

Chứng minh: Kn có

2 ) (n

n

cạnh chu trình Hamilton có n cạnh, nên số chu trình Hamilton phân biệt nhiều

2 −

n

Giả sử đỉnh Kn 1, 2, , n Đặt đỉnh tâm đường tròn đỉnh

2, , n đặt cách đường tròn (mỗi cung 3600/(n-1) cho đỉnh lẻ nằm nửa đường tròn đỉnh chẵn nằm nửa đường tròn Ta có chu trình Hamilton 1,2, , n,1 Các đỉnh giữ cố định, xoay khung theo chiều kim đồng hồ với góc quay:

n

1

2

5

4

1 3600 −

n , 3600 −

n , 3600 −

n , , −

n

3600 −

n ,

ta nhận

3 −

n

khung phân biệt với khung Do ta có

1 −

n

chu trình Hamilton phân biệt

Thí dụ 5: Giải tốn xếp chỗ ngồi với n=11

Có (11−1)/2=5 cách xếp chỗ ngồi phân biệt sau: 10 11 1 11 10 1 11 10 1 11 10

(65)

1 11 10

1

2

7

1

8

4

1

2

5 7

9

6

1

1

3

5

9

6

1

2

3

1

4

6

1

1

2

5

9

4

6

1

BÀI TẬP CHƯƠNG IV:

1 Với giá trị n đồ thị sau có chu trình Euler ?

a) Kn, b) Cn, c) Wn, d) Qn

2 Với giá trị m n đồ thị phân đơi đầy đủ Km,ncó: a) chu trình Euler ? b) đường Euler ?

3 Với giá trị m n đồ thị phân đơi đầy đủ Km,ncó chu trình Hamilton ? 4

Chứng minh đồ thị lập phương Qn đồ thị Hamilton Vẽ liệt kê tất

các chu trình Hamilton đồ thị lập phương Q3

5

Trong họp có 15 người ngày ngồi với quanh bàn tròn lần Hỏi có cách xếp cho lần ngồi họp, người có hai người bên cạnh bạn mới, xếp ?

6 Hiệu trưởng mời 2n (n ≥ 2) sinh viên giỏi đến dự tiệc Mỗi sinh viên giỏi quen n sinh viên giỏi khác đến dự tiệc Chứng minh ln ln xếp tất sinh viên giỏi ngồi xung quanh bàn tròn, để người ngồi hai người mà sinh viên quen

7. Một ơng vua xây dựng lâu đài để cất báu vật Người ta tìm thấy sơ đồ lâu đài (hình sau) với lời dặn: muốn tìm báu vật, cần từ phịng bên ngồi (số 1, 2, 6, 10, ), qua tất cửa phòng, cửa lần; báu vật giấu sau cửa cuối

Hãy tìm nơi giấu báu vật

(66)

21

20 19

18 17

16

15 14

13 12

11

10

8

6

4

1

8. Đồ thị cho hình sau gọi đồ thị Peterson P

a e

k i

b g

f h

d c

a) Tìm đường Hamilton P

b) Chứng minh P \ {v}, với v đỉnh P, đồ thị Hamilton

9. Giải toán người phát thư Trung Hoa với đồ thị cho hình sau:

10. Chứng minh đồ thị G cho hình sau có đường Hamilton (từ s đến r)

a

c b s

r

f e

d

g

h

nhưng khơng có chu trình Hamilton

(67)

11. Cho thí dụ về:

1) Đồ thị có chu trình vừa chu trình Euler vừa chu trình Hamilton;

2) Đồ thị có chu trình Euler chu trình Hamilton, hai chu trình khơng trùng nhau;

3) Đồ thị có đỉnh, đồ thị Hamilton, khơng phải đồ thị Euler;

4) Đồ thị có đỉnh, đồ thị Euler, đồ thị Hamilton

12. Chứng minh mã qua tất ô bàn cờ có x x ô vuông, ô lần, trở chỗ cũ

(68)

CHƯƠNG V

M

T S

BÀI TOÁN T

I

Ư

U TRÊN

ĐỒ

TH

5.1 ĐỒ THỊ CĨ TRỌNG SỐ VÀ BÀI TỐN ĐƯỜNG ĐI NGẮN NHẤT 5.1.1 Mởđầu:

Trong đời sống, thường gặp tình sau: để từ địa

điểm A đến địa điểm B thành phố, có nhiều đường đi, nhiều cách đi; có lúc ta chọn đường ngắn (theo nghĩa cự ly), có lúc lại cần chọn đường nhanh (theo nghĩa thời gian) có lúc phải cân nhắc để chọn đường rẻ tiền (theo nghĩa chi phí), v.v

Có thể coi sơ đồ đường từ A đến B thành phố đồ thị, với đỉnh giao lộ (A B coi giao lộ), cạnh đoạn đường nối hai giao lộ Trên cạnh đồ thị này, ta gán số dương, ứng với chiều dài đoạn đường, thời gian

đi đoạn đường cước phí vận chuyển đoạn đường đó,

Đồ thị có trọng số đồ thị G=(V,E) mà cạnh (hoặc cung) e∈E gán số thực m(e), gọi trọng số cạnh (hoặc cung) e

Trong phần này, trọng số cạnh xét số dương cịn gọi chiều dài cạnh Mỗi đường từđỉnh u đến đỉnh v, có chiều dài m(u,v), tổng chiều dài cạnh mà qua Khoảng cách d(u,v) hai đỉnh u v chiều dài đường ngắn (theo nghĩa m(u,v) nhỏ nhất) đường từ u đến v Có thể xem đồ thị G đồ thị có trọng số mà cạnh có chiều dài Khi đó, khoảng cách d(u,v) hai đỉnh u v chiều dài đường từ

u đến v ngắn nhất, tức đường qua cạnh

5.1.2 Bài tốn tìm đường ngắn nhất:

Cho đơn đồ thị liên thơng, có trọng số G=(V,E) Tìm khoảng cách d(u0,v) từ đỉnh u0 cho trước đến đỉnh v G tìm đường ngắn từ u0 đến v

Có số thuật tốn tìm đường ngắn nhất; đây, ta có thuật tốn E Dijkstra, nhà tốn học người Hà Lan, đề xuất năm 1959 Trong phiên mà ta trình bày, người ta giả sửđồ thị vô hướng, trọng số dương Chỉ cần thay đổi đơi chút giải tốn tìm đường ngắn đồ thị có hướng

Phương pháp thuật tốn Dijkstra là: xác định đỉnh có khoảng cách

đến u0 từ nhỏđến lớn

Trước tiên, đỉnh có khoảng cách đến a nhỏ a, với d(u0,u0)=0 Trong

các đỉnh v ≠ u0, tìm đỉnh có khoảng cách k1 đến u0 nhỏ Đỉnh phải

trong đỉnh kề với u0 Giả sửđó u1 Ta có:

d(u0,u1) = k1

(69)

Trong đỉnh v ≠ u0 v ≠ u1, tìm đỉnh có khoảng cách k2 đến u0 nhỏ Đỉnh

này phải đỉnh kề với u0 với u1 Giả sửđó u2 Ta có:

d(u0,u2) = k2

Tiếp tục trên, tìm khoảng cách từ u0 đến đỉnh v G

Nếu V={u0, u1, , un} thì:

0 = d(u0,u0) < d(u0,u1) < d(u0,u2) < < d(u0,un) 5.1.3 Thuật toán Dijkstra:

procedure Dijkstra (G=(V,E) đơn đồ thị liên thơng, có trọng số với trọng số dương) {G có đỉnh a=u0, u1, , un=z trọng số m(ui,uj), với m(ui,uj) =

∞ (ui,uj) không cạnh G}

for i := to n L(ui) := ∞

L(a) := S := V \ {a} u := a while S ≠∅ begin

for tất đỉnh v thuộc S

if L(u) +m(u,v) < L(v) then L(v) := L(u)+m(u,v) u := đỉnh thuộc S có nhãn L(u) nhỏ

{L(u): độ dài đường ngắn từ a đến u} S := S \ {u}

end

Thí dụ 1: Tìm khoảng cách d(a,v) từ a đến đỉnh v tìm đường ngắn từ a

đến v cho đồ thị G sau

n b

e

d

g

m c

h

k

3

1

6

5

3

2 4

2

3 a

(70)

L(a) L(b) L(c) L(d) L(e) L(g) L(h) L(k) L(m) L(n)

∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞

3

1 ∞ ∞ ∞ ∞ ∞

− ∞ ∞ ∞ ∞

− ∞ ∞ ∞ ∞

− − ∞ ∞

7

6

− 10

8

6

0

− −

− −

− −

− − −

− −

− −

− − −

− −

− − −

− −

− − − − − − − −

5.1.4 Định lý: Thuật toán Dijkstra tìm đường ngắn từ đỉnh cho trước

đến đỉnh tuỳ ý đơn đồ thị vơ hướng liên thơng có trọng số

Chứng minh: Định lý chứng minh quy nạp Tại bước k ta có giả thiết quy nạp là:

(i) Nhãn đỉnh v không thuộc S độ dài đường ngắn từ đỉnh a tới đỉnh này;

(ii) Nhãn đỉnh v S độ dài đường ngắn từđỉnh a tới đỉnh

đường chứa đỉnh (ngồi đỉnh này) khơng thuộc S

Khi k=0, tức chưa có bước lặp thực hiện, S=V \ {a}, thếđộ dài đường ngắn từ a tới đỉnh khác a ∞ độ dài đường ngắn từ

a tới (ở đây, cho phép đường khơng có cạnh) Do bước sở

(71)

trước vào vòng lặp thứ k+1, đỉnh không thuộc S gán nhãn độ dài đường ngắn từ a Đỉnh v phải gán nhãn độ dài

đường ngắn từ a Nếu điều không xảy cuối bước lặp thứ k có

đường với độ dài nhỏ Lk(v) chứa cảđỉnh thuộc S (vì Lk(v) độ dài đường

ngắn từ a tới v chứa đỉnh không thuộc S sau bước lặp thứ k) Gọi u đỉnh

đầu tiên đường thuộc S Đó đường với độ dài nhỏ Lk(v) từ a tới u

chứa đỉnh không thuộc S Điều trái với cách chọn v Do (i) cịn

ở cuối bước lặp k+1

Gọi u đỉnh thuộc S sau bước k+1 Đường ngắn từ a tới u chứa

đỉnh không thuộc S chứa v không Nếu khơng chứa v theo giả

thiết quy nạp độ dài Lk(v) Nếu chứa v tạo thành đường từ a tới

v với độ dài ngắn chứa đỉnh không thuộc S khác v, kết thúc cạnh từ v tới u Khi độ dài Lk(v)+m(v,u) Điều chứng tỏ (ii)

Lk+1(u)=min(Lk(u), Lk(v)+m(v,u))

5.1.5 Mệnh đề: Thuật tốn Dijkstra tìm đường ngắn từ đỉnh cho trước đến đỉnh tuỳ ý đơn đồ thị vơ hướng liên thơng có trọng số có độ phức tạp O(n2) Chứng minh: Thuật tốn dùng khơng q n−1 bước lặp Trong bước lặp, dùng không 2(n−1) phép cộng phép so sánh để sửa đổi nhãn đỉnh Ngoài ra, đỉnh thuộc Sk có nhãn nhỏ nhờ khơng q n−1 phép so sánh Do thuật tốn

có độ phức tạp O(n2)

5.1.6 Thuật tốn Floyd:

Cho G=(V,E) đồ thị có hướng, có trọng số Để tìm đường ngắn cặp đỉnh G, ta áp dụng thuật toán Dijkstra nhiều lần áp dụng thuật toán Floyd trình bày

Giả sử V={v1, v2, , vn} có ma trận trọng số W ≡ W0 Thuật toán Floyd xây

dựng dãy ma trận vuông cấp n Wk (0 ≤ k ≤ n) sau:

procedure Xác định Wn

for i := to n

for j := to n

W[i,j] := m(vi,vj) {W[i,j] phần tử dòng i cột j ma trận W0}

for k := to n

if W[i,k] +W[k,j] < W[i,j] then W[i,j] := W[i,k] +W[k,j] {W[i,j] phần tử dòng i cột j ma trận Wk}

5.1.7 Định lý: Thuật toán Floyd cho ta ma trận W*=Wn ma trận khoảng cách nhỏ

nhất đồ thị G

(72)

Chứng minh: Ta chứng minh quy nạp theo k mệnh đề sau:

Wk[i,j] chiều dài đường ngắn đường nối đỉnh vi với đỉnh

vjđi qua đỉnh trung gian {v1, v2, , vk}

Trước hết mệnh đề hiển nhiên với k=0 Giả sử mệnh đềđúng với k-1

Xét Wk[i,j] Có hai trường hợp:

1) Trong đường chiều dài ngắn nối vi với vj qua đỉnh trung gian

trong {v1, v2, , vk}, có đường γ cho vk ∉γ Khi γ đường ngắn

nhất nối vi với vjđi qua đỉnh trung gian {v1, v2, , vk-1}, nên theo giả thiết quy

nạp,

Wk-1[i,j] = chiều dài γ≤ Wk-1[i,k]+Wk-1[k,j]

Do theo định nghĩa Wk Wk[i,j]=Wk-1[i,j]

2) Mọi đường chiều dài ngắn nối vi với vj qua đỉnh trung gian

{v1, v2, , vk}, chứa vk Gọi γ = vi vk vj đường ngắn

v1 vk vk vj đường ngắn qua đỉnh trung gian

{v1, v2, , vk-1}

Wk-1[i,k]+Wk-1[k,j] = chiều dài(v1 vk) + chiều dài(vk vj)

= chiều dài γ < Wk-1[i,j]

Do theo định nghĩa Wk ta có:

Wk[i,j] = Wk-1[i,k]+Wk-1[k,j]

Thí dụ 2: Xét đồ thị G sau:

v1 v2 v3

v4 v5

3 v6

1

4 2

Áp dụng thuật tốn Floyd, ta tìm (các trống ∞)

W = W0 =

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟

⎠ ⎞

⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜

⎝ ⎛

1 2

4

3

2

(73)

W1 = , W ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 4

2 =

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 10 4 11

W3 = , W

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 5 10 11 14 11

4 =

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 5 11 13 10

W5 = , W* = W

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 4 10 7 12 9

6 =

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 4 10 7 7 12 9

Thuật tốn Floyd áp dụng cho đồ thị vơ hướng nhưđồ thị có hướng Ta cần thay cạnh vô hướng (u,v) cặp cạnh có hướng (u,v) (v,u) với m(u,v)=m(v,u) Tuy nhiên, trường hợp này, phần tử đường chéo ma trận W cần đặt

Đồ thị có hướng G liên thơng mạnh phần tử nằm đường chéo ma trận trọng số ngắn W* hữu hạn

5.2 BÀI TOÁN LUỒNG CỰC ĐẠI 5.2.1 Luồng vận tải:

5.2.1.1 Định nghĩa: Mạng vận tải đồ thị có hướng, khơng có khuyên có trọng số G=(V,E) với V={v0, v1, , vn} thoả mãn:

1) Mỗi cung e ∈ E có trọng số m(e) số ngun khơng âm gọi khả thông qua cung e

2) Có đỉnh v0 khơng có cung vào, tức degt(v0)=0 Đỉnh v0 gọi

là lối vào hay đỉnh phát mạng

3) Có đỉnh khơng có cung ra, tức dego(vn)=0 Đỉnh vnđược gọi

lối hay đỉnh thu mạng

(74)

5.2.1.2 Định nghĩa: Để định lượng khai thác, tức xác định lượng vật chất chuyển qua mạng vận tải G=(V,E), người ta đưa khái niệm luồng vận tải định nghĩa sau

Hàm ϕ xác định tập cung E nhận giá trị nguyên gọi luồng vận tải mạng vận tải G ϕ thoả mãn:

1) ϕ(e) ≥ 0, ∀e ∈ E

2)

= , ∀v ∈V, v≠v − Γ ∈ ( ) ) ( v e e ϕ

+ Γ ∈ ( ) ) ( v e e

ϕ 0, v≠vn Ởđây, Γ−(v)={e∈E | e có đỉnh cuối v},

(v)={e∈E | e có đỉnh đầu v} +

Γ

3) ϕ(e) ≤ m(e), ∀e ∈ E

Ta xem ϕ(e) lượng hàng chuyển cung e=(u,v) từđỉnh u đến đỉnh v không vượt khả thông qua cung Ngoài ra, từđiều kiện 2) ta thấy v lối vào v0 hay lối vn, lượng hàng chuyển tới v lượng

hàng chuyển khỏi v

Từ quan hệ 2) suy ra:

4)

= =:

+ Γ ∈ ( 0)

) ( v e e ϕ

− Γ ∈ ( ) ) ( n v e e ϕ n v ϕ

Đại lượng

n v

ϕ (ta ký hiệu ϕn) gọi luồng qua mạng, hay cường độ

luồng điểm hay giá trị luồng ϕ Bài tốn đặt ởđây tìm ϕđể ϕvnđạt giá trị

lớn nhất, tức tìm giá trị lớn luồng

5.2.1.3 Định nghĩa: Cho mạng vận tải G=(V,E) A ⊂ V Ký hiệu −

Γ (A)={(u,v)∈E | v∈A, u∉A}, Γ+(A)={(u,v)∈E | u∈A, v∉A}

Đối với tập cung M tuỳ ý, đại lượng ϕ(M)=

M e

e) (

ϕ gọi luồng tập cung M

Từđiều kiện 2) dễ dàng suy hệ sau

5.2.1.4 Hệ quả: Cho ϕ luồng mạng vận tải G=(V,E) A ⊂ V \{v0,vn} Khi đó:

ϕ(Γ−(A))=ϕ(Γ+(A))

5.2.2 Bài toán luồng cực đại:

Cho mạng vận tải G=(V,E) Hãy tìm luồng ϕđểđạt ϕvnmax mạng G Nguyên lý thuật toán giải toán tìm luồng cực đại sau

5.2.2.1 Định nghĩa: Cho A ⊂ V tập tuỳ ý không chứa lối vào v0 chứa lối

vn Tập Γ−(A) gọi thiết diện mạng vận tải G Đại lượng m(Γ−(A))=

− Γ ∈ ( ) ) ( A e e

m gọi khả thông qua thiết diện (A)

Γ

(75)

Từ định nghĩa thiết diện khả thông qua ta nhận thấy rằng:

đơn vị hàng hố chuyển từ v0 đến phải lần qua cung thiết diện Γ−(A) Vì vậy, dù luồng ϕ thiết diện Γ−(A) thoả mãn quan hệ:

ϕn≤ m(Γ−(A))

Do đó, luồng ϕ thiết diện W mà có: ϕn = m(W)

thì chắn luồng ϕ đạt giá trị lớn thiết diện W có khả thơng qua nhỏ

5.2.2.2 Định nghĩa: Cung e mạng vận tải G với luồng vận tải ϕ goi cung bão hoà ϕ(e)=m(e)

Luồng ϕ mạng vận tải G gọi luồng đầy đường từ v0đến chứa cung bão hồ

Từđịnh nghĩa ta thấy rằng, luồng ϕ mạng vận tải G chưa đầy định tìm đường α từ lối vào v0 đến lối khơng chứa cung bão hồ Khi ta nâng luồng ϕ thành ϕ’ sau:

⎩ ⎨ ⎧

∉ ∈ +

=

)

(

,

) ( ) ( '

α ϕ

α ϕ

ϕ

e khi e

e khi e

e

Khi ϕ’ luồng, mà giá trị là: ϕ’n = ϕn +1 > ϕn

Như vậy, luồng không đầy ta nâng giá trị nâng nhận luồng đầy

Tuy vậy, thực tế cho thấy có luồng đầy, chưa đạt tới giá trị cực đại Bởi vậy, cần phải dùng thuật toán Ford-Fulkerson để tìm giá trị cực đại luồng

5.2.2.3 Thuật tốn Ford-Fulkerson:

Để tìm luồng cực đại mạng vận tải G, ta xuất phát từ luồng tuỳ ý ϕ G, nâng luồng lên đầy, sau áp dụng thuật tốn Ford-Fulkerson ta áp dụng thuật toán Ford-Fulkerson trực tiếp luồng ϕ

Thuật toán gồm bước:

Bước (đánh dấu ởđỉnh mạng): Lối vào v0được đánh dấu

1) Nếu đỉnh viđã đánh dấu ta dùng số +i để đánh dấu cho đỉnh y chưa đánh dấu mà (vi,y)∈E cung chưa bão hoà (ϕ(vi,y)<m(vi,y))

2) Nếu đỉnh viđã đánh dấu ta dùng số −i để đánh dấu cho đỉnh z chưa đánh dấu mà (z,vi)∈E luồng cung dương (ϕ(z,vi)>0)

(76)

Nếu với phương pháp ta đánh dấu tới lối G tồn

v0 xích α, đỉnh khác đánh dấu theo số đỉnh liền

trước (chỉ sai khác dấu) Khi chắn ta nâng giá trị luồng Bước (nâng giá trị luồng): Để nâng giá trị luồng ϕ, ta đặt:

ϕ’(e) = ϕ(e), e∉α,

ϕ’(e) = ϕ(e)+1, e∈αđược định hướng theo chiều xích α từ vo đến vn,

ϕ’(e) = ϕ(e)−1, e∈αđược định hướng ngược với chiều xích αđi từ vođến

y vj

z vi

-j +i

e

v0

0

ϕ’ thoả mãn điều kiện luồng, nên ϕ’ luồng ta có: ϕ’n = ϕn+1

Như vậy, ta nâng luồng lên đơn vị

Sau lặp lại vịng Vì khả thơng qua cung hữu hạn, nên trình phải dừng lại sau số hữu hạn bước

Bước 3: Nếu với luồng ϕ0 bằng phương pháp ta không thể nâng giá trị của luồng

lên nữa, nghĩa ta khơng thể đánh dấu đỉnh vn, ta nói q trình nâng

luồng kết thúc ϕ0 đã đạt giá trị cực đại, đồng thời gọi ϕ0 luồng kết thúc

Khi mạng vận tải G=(V,E) đạt tới luồng ϕ0, bước tiếp theo ta không thểđánh

dấu tới lối Trên sở trạng đánh dấu bước này, ta chứng

minh luồng ϕ0đã đạt được giá trị cực đại

5.2.2.4 Bổ đề: Cho luồng ϕ mạng vận tải G=(V,E) A ⊂ V, chứa lối

khơng chứa lối vào v0 Khi đó:

)) ( ( )) (

( A A

n

v =ϕ Γ− −ϕ Γ+

ϕ

Chứng minh: Đặt A1=A \{vn} Theo Hệ 5.2.1.4, ta có:

)) ( ( )) (

(Γ− A1 =ϕ Γ+ A1

ϕ (1)

Đặt C1={(a,vn)∈E | a∉A} Khi Γ−(A) =Γ−(A1)∪C1 Γ−(A1)∩C1 = ∅, nên

ϕ ϕ

ϕ(Γ−(A))= (Γ−(A1))+ (C1) (2)

Đặt C2={(b,vn)∈E | b∈A1} Khi C2={(b,vn)∈E | b∈A}, Γ+(A1) =Γ+(A)∪C2

C ∩

Γ+(A) = ∅, nên

ϕ ϕ

ϕ(Γ+(A))= (Γ+(A1))− (C2) (3)

(77)

Ngoài ra, Γ−(vn)= C1∪C2 C1∩C2 = ∅, nên

n

v

ϕ = ϕ(Γ−(vn))= ϕ(C1)+ϕ(C2) (4)

Từ (1), (2), (3) (4), ta có:

)) ( ( )) (

( A A

n

v =ϕ Γ− −ϕ Γ+

ϕ

5.2.2.5 Định lý (Ford-Fulkerson): Trong mạng vận tải G=(V,E), giá trị lớn luồng khả thông qua nhỏ thiết diện, nghĩa

)) ( ( max , , A m A v A v V A v n n − ∈ ∉ ⊂ Γ = ϕ ϕ

Chứng minh: Giả sử mạng vận tải G, ϕ0 luồng cuối cùng, mà sau đó bằng

phương pháp đánh dấu thuật tốn Ford-Fulkerson khơng đạt tới lối Trên sở

hiện trạng đánh dấu lần cuối này, ta dùng B để ký hiệu tập gồm đỉnh G không đánh dấu Khi v0∉B, vn∈B Do Γ−(B) thiết diện mạng

vận tải G theo Bổđề 5.2.2.4, ta có:

)) ( ( )) ( ( 0

0 B B

n

v =ϕ Γ− −ϕ Γ+

ϕ (1)

Đối với cung e=(u,v)∈Γ−(B) u∉B v∈B, tức u đánh dấu v không đánh dấu, nên theo nguyên tắc đánh dấu thứ nhất, e cung bão hoà:

ϕ0(e) = m(e)

Do đó, ( ( )) ( ) ( ) ( ( ))

) ( )

(

0 B e m e m B

B e B e − Γ ∈ Γ ∈ − = = = Γ Γ

− − ϕ

ϕ (2)

Đối với cung e=(s,t)∈Γ+(B) s∈B t∉B, tức s không đánh dấu t đánh dấu, nên theo nguyên tắc đánh dấu thứ hai:

ϕ0(e) =

Do đó, ( ( )) ( )

) (

0

0 Γ =

=

+ Γ ∈ + B e e B ϕ

ϕ (3)

Từ (1), (2) (3) ta suy ra:

)) ( (

0 m B

n

v = Γ−

ϕ

Vì vậy, giá trị lớn luồng đạt được, m( (B)) giá trị nhỏ

nhất khả thông qua thiết diện thuộc mạng vận tải G

0

n v

ϕ Γ−

Thí dụ 3: Cho mạng vận tải hình với khả thơng qua đặt khuyên tròn, luồng ghi cung Tìm luồng cực đại mạng

Luồng ϕ có đường (v0,v4), (v4,v6), (v6,v8) gồm cung chưa bão hồ nên

chưa đầy Do nâng luồng cung lên đơn vị, để ϕ1

Do đường xuất phát từ v0 đến v8 chứa cung bão hoà, nên

luồng ϕ1 luồng đầy Song chưa phải luồng cực đại

Áp dụng thuật toán Ford-Fulkerson để nâng luồng ϕ1

(78)

v1 v5 v2 v3 v0 5 8 5 8 5 v4 v6 4 4 4 2 4 4 4 4 v8 9 11 12 6 v7 4 ϕ v1 v5 v2 v3 v0 5 8 5 8 5 v4 v6 4 4 4 v8 +7 9 12 12 6 v7 +4 4 4 4 4 4 −6 ϕ1 +0 +3

Xét xích α=(v0, v4, v6, v3, v7, v8) Quá trình đánh dấu từ v0 đến v8 để nâng

luồng ϕ1 lên một đơn vị bằng cách biến đổi luồng tại cung thuộc xích α được đánh

dấu Sau ta có luồng ϕ2

v0

v4

+4

+0 3+1

7+1

3−1

v7 v8 +3 6+1 2+1 v3 v6 −6

xích α

0 +7

Xét xích β=(v0, v1, v5, v2, v6, v3, v7, v8) Quá trình đánh dấu từ v0đến v8 để

nâng luồng ϕ2 lên một đơn vị bằng cách biến đổi luồng tại cung thuộc xích β được đánh dấu Sau ta có luồng ϕ3

(79)

+0 v1 +1 v5 −5 v2 v3 v0 5 8 5 8 5 v4 v6 +2 4 4 4 4 4 4 4 4 v8 +7 9 12 12 6 v7 4 −6 ϕ2 +3 v0 v1 7+1 3+1 +0 −5

3−1 +1 v5 2+1 v3 v8 +3 v7 +2 −6 7+1 3+1

2−1

v6 v2

xích β

0 +7 v1 v5 v2 v3 v0 v0 5 8 5 8 5 v4 v6 4 4 4 4 4 4 4 4 v8 9 12 12 6 v7 4 ϕ3

Tiếp theo ta có thểđánh dấu đỉnh v0 nên trình nâng luồng kết thúc

và ta giá trị luồng cực đại là:

3

8 v

ϕ = 6+12+8 = 26

Mặt khác, thiết diện nhỏ Γ−(B) với B={v1, v2, , v8}

Γ (B)={(v0,v1), (v0,v2), (v0,v3), (v0,v4)}

(80)

5.3 BÀI TOÁN DU LỊCH 5.3.1 Giới thiệu toán:

Một người xuất phát từ thành phố muốn tới thăm n−1 thành phố

khác, thành phốđúng lần, quay thành phố ban đầu Hỏi nên theo trình tự để độ dài tổng cộng đoạn đường qua ngắn (khoảng cách hai thành phố hiểu cự ly thơng thường thời gian cần chi phí hành trình, xem cho trước)

Xét đồ thị đầy đủ G=(V,E), với V={1, 2, , n}, có trọng số với trọng số mij=

m(i,j) khác mji = m(j,i) Như vậy, ta xem G đồ thị có hướng đầy đủ “mạnh” theo nghĩa với i, j=1, 2, , n, i≠j, ln có (i,j), (j,i)∈E Bài tốn trở

thành tìm chu trình Hamilton có độ dài ngắn G

Bài toán tiếng có lời giải cách sử dụng phương pháp “nhánh cận”

5.3.2 Phương pháp nhánh cận: Giả sử tập hữu hạn phương án toán, ta phải chọn phương án tối ưu theo tiêu chuẩn (thí dụ

làm cho hàm mục tiêu đạt giá trị nhỏ nhất) Ta tìm cách phân chia tập phương án

đang xét thành hai tập không giao Với tập này, ta tính “cận dưới” (chặn đủ tốt) giá trị hàm mục tiêu ứng với phương án Mang so sánh hai cận vừa tính được, ta phán đốn xem tập có nhiều triển vọng chứa phương án tối ưu tiếp tục phân chia tập thành hai tập khác khơng giao nhau, lại tính cận tương ứng Lặp lại trình sau số

hữu hạn bước, cuối sẽđược phương án tốt, nói chung tối ưu Nếu khơng lặp lại q trình phân chia để kiểm tra sau vài bước, ta sẽđược phương án tối ưu Người ta thường mô tả q trình phân chia “cây có gốc” mà gốc

tượng trưng cho tập toàn phương án, cịn đỉnh phía tượng trưng cho tập trình “phân nhánh nhị phân” Vì vậy, phương pháp mang tên nhánh cận

5.3.3 Cơ sở lý luận phép tốn: Nếu khơng xác định thành phố xuất phát có n! hành trình, hành trình ứng với hốn vị tập {1, 2, , n} Còn cho trước thành phố xuất phát có tất (n−1)! hành trình

Giả sử h=(π(1), π(2), , π(n), π(1)) (π hốn vị) hành trình qua thành phốπ(1), , π(n) theo thứ tựđó quay vềπ(1) hàm mục tiêu

f(h) =

− + =

+ +

h j

i ij

n n

n m m

m m

) , ( ) ( ) ( )

( ) ( )

2 ( )

( π π π π π

π L ,

sẽ biểu thị tổng độ dài theo hành trình h, (i,j) ký hiệu chặng đường hành trình, tức cặp thành phố kề theo hành trình h

(81)

5.3.4 Ma trận rút gọn: Quá trình tính tốn sẽđược thực ma trận suy từ

ma trận trọng số M=(mij) ban đầu phép biến đổi rút gọn để số liệu

đơn giản

Phép trừ phần tử nhỏ dòng (t.ư cột) vào tất phần tử dịng (t.ư cột) gọi phép rút gọn dòng (t.ư cột) Phần tử nhỏ gọi số rút gọn dòng (t.ư cột) xét Ma trận với phần tử khơng âm có phần tử dòng cột gọi ma trận rút gọn ma trận ban đầu

Thí dụ 4:

M = M’ = ,

⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ 10 ⎯→ ⎯ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ 5 ⎯→ ⎯ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ 5 0

1 0 tất nhiên rút gọn cách khác

M = M’’ =

⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ 10 ⎯→ ⎯ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ 2 0 0

5.3.5 Mệnh đề: Phương án tối ưu xét ma trận trọng số ban đầu phương án tối ưu toán xét ma trận rút gọn đảo lại

Chứng minh: Có thể xem việc tìm chu trình Hamilton người du lịch toán vận tải đặc biệt dạng bảng Như bảng (ma trận trọng số ma trận rút gọn) ta phải có n chọn, chọn tượng trưng cho cặp thành phố hành trình cần tìm, dịng cột có ô chọn Mỗi hành trình h tương ứng một−một với tập n chọn xác định f(h) tổng trọng số ban đầu ghi n ô chọn xét

Với hành trình h bất kỳ, ký hiệu f′(h)=

h j i ij m ) , (

' giá trị hàm mục tiêu ứng với ma trận rút gọn M’ s tổng số rút gọn ta có:

f(h) = f′(h)+s

Gọi X tập toàn phương án xét giai đoạn đó, h0

phương án tối ưu toán xét ma trận trọng số ban đầu M, ta có: f(h0) ≤ f(h), ∀h∈X

hay f(h0)−s ≤ f(h)−s, ∀h∈X hay f′(h0) ≤ f′(h), ∀h∈X hay h0 phương án tối ưu

toán xét ma trận rút gọn M’

(82)

5.3.6 Phân nhánh: Sự phân hoạch tập hợp tất hành trình giai đoạn

đó thành hai tập rời biểu diễn phân nhánh Trên cây, đỉnh biểu diễn thành vòng tròn tượng trưng cho mơt tập hành trình Đỉnh X tập tồn hành trình Đỉnh (i,j) biểu diễn tập hành trình có chứa cặp (i,j) kề Đỉnh (i, j) biểu diễn tập hành trình khơng chứa cặp (i,j) kề Tại đỉnh (i,j) lại có phân nhánh: đỉnh (k,l) biểu diễn tập hành trình có chứa cặp (i,j) cặp (k,l), đỉnh (k,l) biểu diễn tập hành trình có chứa cặp (i,j) khơng chứa cặp (k,l)

Nếu trình diễn đủ lớn cuối có đỉnh biểu diễn hành trình

Vấn đề đặt nên chọn cặp thành phố để tiến hành phân nhánh xuất phát từ đỉnh cho trước cây? Một cách tự nhiên ta nên chọn cặp thành phố gần để phân nhánh trước, ma trận rút gọn cặp thành phố (i,j)

vậy có m'ij=0 hành trình chứa cặp (i,j) có triển vọng tốt

Trên ma trận rút gọn thường có nhiều cặp thành phố thoả mãn điều kiện ( =0) Để định ta phải tìm cách so sánh Vì thành phố i thiết phải nối liền với mij ột thành phố nên hành trình h khơng chứa (i,j) tức h∈

m'

) ,

(i j phải ứng với độ dài hành trình có chứa phần tử nhỏ dịng i khơng kể =0 phần tử nhỏ cột j khơng kể =0 thành phố j thiết phải nối liền với thành phố trước hành trình Ký hiệu tổng hai phần tử nhỏ

nhất θ

ij

m'

ij

m'

ij ta có f′(h) ≥θij, ∀h∈(i, j)

Vì lý trên, số θij dùng làm tiêu chuẩn so sánh cặp thành phố

(i,j) có =0 Một cách tổng quát, giai đoạn ta chọn cặp thành phố (i,j) có =0 ma trij ận rút gọn có θ

m'

ij

m' ijlớnnhất để tiến hành phân nhánh từ đỉnh

trên

5.3.7 Tính cận: Với đỉnh phân nhánh, ta phải tính cận giá trị

hàm mục tiêu ứng với tập phương án mà đỉnh biểu diễn Cận tính ghi bên đỉnh xét

Theo công thức f(h)=f′(h)+s f′(h) ≥ nên f(h) ≥ s, ∀h∈X Vì tổng số rút gọn ma trận ban đầu lấy làm cận đỉnh X Mặt khác, ta lại có f′(h) ≥θij, ∀h∈(i, j), f(h)=f′(h)+s ≥ θij+s, ∀h∈(i, j) Vì

vậy tổng θij+s lấy làm cận cho đỉnh (i, j) Sau chọn (i,j) để phân nhánh

xuất phát từđỉnh X bảng xố dịng i cột j chọn (i,j) Sau bỏ dòng i cột j ma trận M’ lại rút gọn thành ma trận M’’ với s’ tổng số rút gọn, f″(h) giá trị hàm mục tiêu xét M’’ Khi ta có f′(h)=f″(h)+s’, ∀h∈(i,j), f(h)=f′(h)+s=f″(h)+s+s’, ∀h∈(i,j) Do f″(h) ≥ nên

(83)

f(h) ≥ s+s’, ∀h∈(i,j), nghĩa tổng s+s’ lấy làm cận cho đỉnh (i,j) phân nhánh

Nếu tiếp tục phân nhánh cận đỉnh tiếp sau tính tốn tương tự, q trình lặp Ta cần xem đỉnh xuất phát nhánh giống đỉnh X ban đầu Để tiết kiệm khối lượng tính tốn, người ta thường chọn đỉnh có cận nhỏ để phân nhánh tiếp tục

5.3.8 Thủ tục ngăn chặn hành trình con: Một đường chu trình Hamilton khơng thể chứa chu trình với số cạnh tạo thành nhỏ n Vì ta đặt mii=∞

(i=1, , n) để tránh khuyên

Với i≠j (i,j) chọn phải đặt m’ji=∞ ma trận rút gọn

Nếu chọn (i,j) (j,k) n>3 phải đặt m’ji=m’kj=m’ki=∞

Chú ý việc đặt m’ij=∞ tương đương với việc xố (i,j) bảng xem

(i,j) ô cấm, nghĩa hai thành phố i j không kề hành trình định kiến thiết Ở giai đoạn trình phải tiến hành thủ tục ngăn chặn trước tiếp tục rút gọn ma trận

5.3.9 Tính chất tối ưu: Q trình phân nhánh, tính cận, ngăn chặn hành trình con, rút gọn ma trận phải thực có đủ n chọn để kiến thiết hành trình Hamilton, nói cách khác phân nhánh xuất đỉnh

biểu diễn hành trình xố hết dòng cột bảng Cận đỉnh cuối độ dài hành trình vừa kiến thiết

a) Nếu cận đỉnh không lớn cận đỉnh treo phân nhánh hành trình tối ưu

b) Nếu trái lại phải xuất phát từ đỉnh treo có cận nhỏ để phân nhánh tiếp tục kiểm tra xem điều kiện a) có thoả mãn khơng

Thí dụ 5: Xét toán với thành phố, số liệu cho theo bảng sau:

M = ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ ∞ ∞ 5 23 48 27 46 12 18 18 25 16 21 35 13 20 25 30 14 26 30 16 43 27 16 16 5 0 0

Tổng số rút gọn bước đầu s=48 Trong ma trận rút gọn ta có: m’14=m’24=m’36=m’41=m’42=m’56=m’62=m’63=m’65=0

(84)

và θ14=10, θ24=1, θ36=5, θ41=1, θ42=0, θ56=2, θ62=0, θ63=9, θ65=2 Sau so sánh ta

thấy θ14=10 lớn nên ta chọn ô (1,4) để phân nhánh Cận đỉnh (1,4)

s+θ14=58 Xố dịng cột đặt m’41=∞

M’ =

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ ∞ ∞ 0 13 43 22 41 2 0 35 13 15 24 29 13 10 14 27 11

1 6 ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ ∞ 0 13 22 41 2 0 13 15 24 29 13 ⎯→

⎯ M’’ =

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ ∞ 0 13 22 41 2 0 13 15 23 28 12 01

3

1 6

2

3

4

5

6

Tổng số rút gọn s’=1 Vậy cận đỉnh (1,4) s+s’=49 Vì 49<58 nên tiếp tục phân nhánh đỉnh (1,4) Trong ma trận lại, sau rút gọn ta có

m”21=m”36=m”42=m”56=m”62=m”63=m”65=0

Ở giai đoạn này, sau tính tốn ta thấy θ21=14 lớn nên chọn tiếp ô (2,1) Cận

dưới đỉnh (2,1) 49+θ21=63 Xố dịng cột Đặt m”42=∞ Rút gọn ma trận cịn

lại, ta có:

⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ 0 0 22 41 2 13 ⎯→

⎯ M’’’= ⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ 0 0 22 41 0 13

2 35 56

3

4

5

6

Tổng số rút gọn Cận đỉnh (2,1) 49+2=51 Tiếp tục cuối ta ô chọn là:

(1,4), (2,1), (5,6), (3,5), (4,3), (6,2)

và kiến thiết hành trình h0=(1 1) với f(h0)=63 cận đỉnh cuối

cận đỉnh cuối 63, đỉnh treo (1,4) có cận 58<63 nên phải tiếp tục phân nhánh từđó để kiểm tra Sau phân nhánh đỉnh treo có cận khơng nhỏ 63 nên khẳng định hành trình h0=(1 1)

là tối ưu

Sự phân nhánh từđỉnh (1,4) làm sau: ma trận rút gọn đợt 1, ta đặt m’14=∞ xem (1,4) cấm, θ63=9 lớn θij, chọn ô (6,3) để

(85)

phân nhánh Cận đỉnh (6,3) 58+9=67 Đặt m’36=∞ Rút gọn ma trận với tổng

hằng số rút gọn 15 Cận đỉnh (6,3) 58+15=73

BÀI T

P CH

ƯƠ

NG V:

X ) , ( ) ,

( (6,3)

) , ( ) ,

( (2,1) )

6 ,

( (5,6) )

5 ,

( (3,5)

) , ( ) , ( ) , ( 63 63 64 56 73 51 49

67 73 65

58

48

1 Dùng thuật tốn Dijkstra tìm đường ngắn từđỉnh a đến đỉnh khác đồ

thị sau:

2 Dùng thuật tốn Dijkstra tìm đường ngắn từđỉnh a đến đỉnh khác đồ

thị sau:

c b d k h a g 12 11 7 2 4 e b f c d e g h i 5 2 10 4 10 a k

(86)

3. Cho đồ thị có trọng số hình Hãy tìm đường ngắn từđỉnh A đến

đỉnh N

A B C D E

1 F

K G L H M I 3

2 2 4 2

2 N

J

3

4. Tìm đường ngắn từ B đến đỉnh khác đồ thị có ma trận trọng số (các trống ∞):

F A B C D E G

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ 4 2 2 4 4 6 A B C D E F G

5 Tìm W* cách áp dụng thuật toán Floyd vào đồ thị sau:

B C F D E 13 20 A

6. Giải toán mạng vận tải sau thuật toán Ford-Fulkerson với luồng vận tải khởi

đầu

v1 v5 v2 6 v6 v3 v4 v0 4 v7 8 8 2 6 4 4 2 2 4 3 4

(87)

7. Giải toán mạng vận tải sau thuật toán Ford-Fulkerson với luồng vận tải khởi

đầu cho kèm theo

v1 v0 v3 v2 v4 v5 v6 v7 v8 v9 v10 v11 10 8 6

8 15

16 10 20 20 2 16 10 0 2

6 25

30 3 10 6 10 15 8 1 4 7 6 2 12 15 5 28 4

8. Hãy giải tốn người du lịch với thành phố, có số liệu cho ma trận trọng số

sau: ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ ∞ ∞ 25 46 29 44 14 21 20 27 14 23 33 11 22 23 34 16 24 32 14 45 25

(88)

CHƯƠNG VI

CÂY

Một đồ thị liên thơng khơng có chu trình gọi Cây dùng từ năm 1857, nhà toán học Anh tên Arthur Cayley dùng để xác định dạng khác hợp chất hoá học Từ dùng để giải nhiều toán nhiều lĩnh vực khác Cây hay sử dụng tin học Chẳng hạn, người ta dùng để xây dựng thuật toán có hiệu để định vị phần tử

trong danh sách Cây dùng để xây dựng mạng máy tính với chi phí rẻ cho đường điện thoại nối máy phân tán Cây dùng để tạo mã có hiệu quảđể lưu trữ truyền liệu Dùng mơ hình thủ tục mà để thi hành cần dùng dãy định Vì đặc biệt có giá trị nghiên cứu thuật toán xếp

6.1 ĐỊNH NGHĨA VÀ CÁC TÍNH CHẤT CƠ BẢN

6.1.1 Định nghĩa: Cây đồ thị vô hướng liên thông, không chứa chu trình có hai đỉnh

Một đồ thị vơ hướng khơng chứa chu trình có hai đỉnh gọi rừng Trong rừng, thành phần liên thông

Thí dụ 1: Rừng sau có cây:

a

c f

d

e

g j

i

k

l

n m h

b

6.1.2 Mệnh đề: Nếu T có n đỉnh T có hai đỉnh treo

Chứng minh: Lấy cạnh (a,b) tuỳ ý T Trong tập hợp đường sơ cấp chứa cạnh (a,b), ta lấy đường từ u đến v dài Vì T nên u ≠ v Mặt khác, u v phải hai đỉnh treo, đỉnh, u chẳng hạn, khơng phải đỉnh treo u phải đầu mút cạnh (u,x), với x đỉnh khơng thuộc đường từ u đến v Do đó, đường sơ cấp từ x đến v, chứa cạnh (a,b), dài đường từ u đến v, trái với tính chất đường từ u đến v chọn

6.1.3 Định lý: Cho T đồ thị có n ≥ đỉnh Các điều sau tương đương:

1) T

2) T liên thơng có n−1 cạnh

3) T khơng chứa chu trình có n−1 cạnh

4) T liên thông cạnh cầu

5) Giữa hai đỉnh phân biệt T có đường sơ cấp

(89)

6) T khơng chứa chu trình thêm cạnh có chu trình

Chứng minh: 1)2) Chỉ cần chứng minh có n đỉnh có n−1 cạnh Ta chứng minh quy nạp Điều hiển nhiên n=2 Giả sử có k đỉnh có k−1 cạnh, ta chứng minh T có k+1 đỉnh có k cạnh Thật vậy, T ta xoá đỉnh treo cạnh treo tương ứng đồ thị nhận k đỉnh, có k−1 cạnh, theo giả thiết quy nạp Vậy T có k cạnh

2)3) Nếu T có chu trình bỏ cạnh chu trình T liên thơng Làm lại T khơng cịn chu trình mà liên thơng, lúc ta có n đỉnh có n−1 cạnh, trái với 2)

3)4) Nếu T có k thành phần liên thơng T1, , Tk có số đỉnh n1, , nk (với

n1+n2+ … +nk=n) Ti nên có số cạnh ni−1 Vậy ta có

n−1=(n1−1)+(n2−1)+ +(nk−1)=(n1+n2+ … +nk)−k=n−k

Do k=1 hay T liên thơng Hơn nữa, bỏ cạnh T hết liên thơng, cịn liên thơng T n đỉnh với n−2 cạnh, trái với điều chứng minh

4)5) Vì T liên thông nên hai đỉnh phân biệt T ln có đường sơ

cấp, khơng thểđược nối hai đường sơ cấp thế, hai đường tạo chu trình bỏ cạnh thuộc chu trình này, T liên thông, trái với giả

thiết

5)6) Nếu T chứa chu trình hai đỉnh chu trình nối hai đường sơ cấp Ngoài ra, thêm cạnh (u,v), cạnh tạo nên với

đường sơ cấp nối u v chu trình

6)1) Nếu T khơng liên thơng thêm cạnh nối hai đỉnh hai thành phần liên thông khác ta không nhận chu trình Vậy T liên thơng,

6.2 CÂY KHUNG VÀ BÀI TỐN TÌM CÂY KHUNG NHỎ NHẤT.

6.2.1 Định nghĩa: Trong đồ thị liên thông G, ta loại bỏ cạnh nằm chu trình ta đồ thị liên thông Nếu loại bỏ cạnh chu trình khác đồ thị khơng cịn chu trình (vẫn liên thơng) ta thu nối đỉnh G Cây gọi khung hay bao trùm đồ thị G

Tổng quát, G đồ thị có n đỉnh, m cạnh k thành phần liên thơng áp dụng thủ tục vừa mô tảđối với thành phần liên thông G, ta thu đồ thị gọi rừng khung G Số cạnh bị loại bỏ thủ tục m−n+k, số ký hiệu ν(G) gọi chu số đồ thị G

6.2.2 Bài tốn tìm khung nhỏ nhất: Bài tốn tìm khung nhỏ đồ

thị số toán tối ưu đồ thị tìm ứng dụng nhiều lĩnh

(90)

vực khác đời sống Trong phần ta có hai thuật tốn để giải toán Trước hết, nội dung toán phát biểu sau

Cho G=(V,E) đồ thị vơ hướng liên thơng có trọng số, cạnh e∈E có trọng số m(e)≥0 Giả sử T=(VT,ET) khung đồ thị G (VT=V) Ta gọi độ dài m(T)

cây khung T tổng trọng số cạnh nó: m(T)=

∈ET

) (

e

e m

Bài toán đặt số tất khung đồ thị G, tìm khung có độ

dài nhỏ Cây khung gọi khung nhỏ đồ thị toán

đặt gọi tốn tìm khung nhỏ

Để minh hoạ cho ứng dụng toán khung nhỏ nhất, hai mơ hình thực tế tiêu biểu cho

Bài tốn xây dựng hệ thống đường sắt: Giả sử ta muốn xây dựng hệ thống đường sắt nối n thành phố cho hành khách có thểđi từ thành phố đến

một số thành phố lại Mặt khác, quan điểm kinh tếđòi hỏi chi phí xây dựng hệ thống đường phải nhỏ Rõ ràng đồ thị mà đỉnh thành phố cạnh tuyến đường sắt nối thành phố tương ứng, với phương án xây dựng tối ưu phải Vì vậy, tốn đặt dẫn tốn tìm khung nhỏ

nhất đồ thị đầy đủ n đỉnh, đỉnh tương ứng với thành phố với độ dài cạnh chi phí xây dựng hệ thống đường sắt nối hai thành phố

Bài tốn nối mạng máy tính: Cần nối mạng hệ thống gồm n máy tính đánh số từ

đến n Biết chi phí nối máy i với máy j m(i,j) (thơng thường chi phí 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 cho tổng chi phí nhỏ Bài toán dẫn tốn tìm khung nhỏ

Bài tốn tìm khung nhỏ có thuật tốn hiệu để giải chúng Ta xét hai số thuật toán vậy: thuật toán Kruskal thuật toán Prim

6.2.3 Thuật toán Kruskal:Thuật toán xây dựng tập cạnh ET khung nhỏ

nhất T=(VT, ET) theo bước Trước hết xếp cạnh đồ thị G theo thứ tự

không giảm trọng số Bắt đầu từ ET=∅, bước ta duyệt danh

sách cạnh xếp, từ cạnh có độ dài nhỏđến cạnh có độ dài lớn hơn, để tìm cạnh mà việc bổ sung vào tập ET khơng tạo thành chu trình tập Thuật tốn

kết thúc ta thu tập ET gồm n−1 cạnh Cụ thể mơ tả sau:

1. Bắt đầu từđồ thị rỗng T có n đỉnh

2. Sắp xếp cạnh G theo thứ tự không giảm trọng số

3. Bắt đầu từ cạnh dãy này, ta thêm dần cạnh dãy xếp vào T theo nguyên tắc cạnh thêm vào không tạo thành chu trình T

(91)

4. Lặp lại Bước số cạnh T n−1, ta thu khung nhỏ

nhất cần tìm

Thí dụ 2: Tìm khung nhỏ đồ thị cho hình đây:

v2

v3

v1

v4

v5

v6 v1

v2

v3

v4

v5

20

14

4 16 18

17 33

v6

Bắt đầu từđồ thị rỗng T có đỉnh

Sắp xếp cạnh đồ thị theo thứ tự không giảm trọng số:

{(v3, v5), (v4, v6), (v4, v5), (v5, v6), (v3, v4), (v1, v3), (v2, v3), (v2, v4), (v1, v2)}

Thêm vào đồ thị T cạnh (v3, v5)

Do số cạnh T 1<6−1 nên tiếp tục thêm cạnh (v4, v6) vào T Bây số cạnh

của T nhỏ 6, ta tiếp tục thêm cạnh dãy xếp vào T Sau thêm cạnh (v4, v5) vào T, thêm cạnh (v5, v6) tạo thành với

cạnh (v4, v5), (v4, v6) có T chu trình Tình tương tự xãy đối

với cạnh (v3, v4) cạnh dãy Tiếp theo ta bổ sung cạnh (v1, v3), (v2, v3)

vào T thu dược tập ET gồm cạnh:

{(v3, v5), (v4, v6), (v4, v5), (v1, v3), (v2, v3)}

Tính đắn thuật tốn: Rõ ràng đồ thị thu theo thuật tốn có n−1 cạnh khơng có chu trình Vì theo Định lý 6.1.3, khung đồ thị G Như phải T có độ dài nhỏ Giả sử tồn khung S đồ thị mà m(S)<m(T) Ký hiệu ek cạnh dãy cạnh T xây dựng theo thuật

tốn vừa mơ tả khơng thuộc S Khi đồ thị G sinh S bổ sung cạnh ek chứa chu trình C qua ek Do chu trình C phải chứa cạnh e

thuộc S không thuộc T nên đồ thị thu từ S cách thay cạnh e ek, ký hiệu đồ thị S’, khung Theo cách xây dựng, m(ek)≤m(e),

m(S’)≤m(S), đồng thời số cạnh chung S’ T tăng thêm so với số cạnh chung S T Lặp lại trình bước một, ta biến đổi S thành T bước tổng độ dài không tăng, tức m(T)≤m(S) Mâu thuẩn chứng tỏ T khung nhỏ G

Độ phức tạp thuật toán Kruskal đánh sau Trước tiên, ta xếp cạnh G theo thứ tự có chiều dài tăng dần; việc xếp có độ phức tạp O(p2), với p số cạnh G Người ta chứng minh việc chọn ei+1 không tạo nên

chu trình với i cạnh chọn trước có độ phức tạp O(n2) Do p≤n(n−1)/2, thuật tốn Kruskal có độ phức tạp O(p2)

(92)

6.2.4 Thuật toán Prim: Thuật toán Kruskal làm việc hiệu quảđối với đồ

thị dày (đồ thị có số cạnh m ≈ n(n−1)/2) Trong trường hợp đó, thuật tốn Prim tỏ hiệu Thuật tốn Prim cịn gọi phương pháp lân cận gần

1. VT:={v*}, v* đỉnh tuỳ ý đồ thị G

ET:=∅

2. Với đỉnh vj∉VT, tìm đỉnh wj∈VT cho

m(wj,vj) = m(xi, vj)=:βj

xi∈VT

và gán cho đỉnh vj nhãn [wj, βj] Nếu khơng tìm đuợc wj (tức vj không kề

với bất cứđỉnh VT) gán cho vj nhãn [0, ∞]

3. Chọn đỉnh vj* cho

βj* = βj

vj∉VT

VT := VT∪ {vj*},

ET := ET∪ {(wj*, vj*)}

Nếu |VT| = n thuật toán dừng (VT, ET) khung nhỏ

Nếu |VT| < n chuyển sang Bước

4.Đối với tất đỉnh vj∉VT mà kề với vj*, ta thay đổi nhãn chúng sau:

Nếu βj > m(vj*, vj) đặt βj:=m(vj*, vj) nhãn vj [vj*, βj] Ngược lại, ta

giữ nguyên nhãn vj Sau quay lại Bước

Thí dụ 3: Tìm khung nhỏ thuật toán Prim đồ thị gồm đỉnh A, B, C, D, E, F, H, I cho ma trận trọng số sau

B ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 14 18 21 11 19 12 18 14 17 23 21 20 20 32 18 17 34 30 21 19 20 21 23 34 22 29 34 23 11 21 30 22 13 13 19 19 20 21 29 13 33 16 12 20 19 34 13 33 15 18 32 20 23 19 16 15 D

C E F H

A I I H F E D C B A

Yêu cầu viết kết trung gian bước lặp, kết cuối cần đưa tập cạnh độ dài khung nhỏ

(93)

V.lặp A B C D E F H I VT ET K.tạo − [A,15] [A,16] [A,19] [A,23] [A,20] [A,32] [A,18] A ∅

1 − − [A,16] [B,13] [A,23] [B,19] [B,20] [B,12] A, B (A,B) − − [A,16] [I,11] [I,21] [I,18] [I,14] − A, B, I (A,B), (B,I) − − [D,13] − [I,21] [I,18] [I,14] − A, B, I, D (A,B), (B,I), (I,D) − − − − [I,21] [I,18] [I,14] − A, B, I, D, C (A,B), (B,I), (I,D),

(D,C)

5 − − − − [I,21] [H,17] − − A, B, I, D, C,

H

(A,B), (B,I), (I,D), (D,C), (I,H)

6 − − − − [I,21] − − − A, B, I, D, C,

H, F

(A,B), (B,I), (I,D), (D,C), (I,H), (H,F)

7 − − − − − − − − A, B, I, D, C,

H, F, E

(A,B), (B,I), (I,D), (D,C), (I,H), (H,F),

(I,E)

Vậy độ dài khung nhỏ là: 15 + 12 + 11 + 13 + 14 + 17 + 21 = 103

Tính đắn thuật tốn:Để chứng minh thuật toán Prim đúng, ta chứng minh quy nạp T(k) (k=1, 2, ,n), đồ thị nhận vòng lặp thứ k, đồ

thị khung nhỏ G, T(n) khung nhỏ G

T(1) gồm đỉnh v* G, T(1) đồ thị khung G

Giả sử T(i) (1≤i<n) đồ thị khung nhỏ G Ta chứng minh T(i+1) đồ thị khung nhỏ

Thật vậy, theo thuật toán Prim ET(i+1)=ET(i) ∪ {ei+1}, với ei+1 cạnh ngắn

trong tất cạnh có đầu mút thuộc VT(i), đầu mút không thuộc VT(i)

Nếu ei+1 cạnh T Ti+1 đồ thị T

Nếu ei+1 khơng phải cạnh T Ti+1 đồ thị T’=(VT, ET∪{ei+1})

Đồ thị T’ chứa chu trình sơ cấp C (theo tính chất định lý cây) Ta chọn C cạnh ej có đỉnh thuộc T(i) đỉnh không thuộc T(i) ej≠ei+1

Ta bỏ ej C Khi

T’’=(VT, ET’ \ {ej})

là khung G T(i+1) đồ thị T’ nên đồ thị T’’ Theo cách chọn ei+1 thuật tốn Prim, ta có

m(ei+1) ≤ m(ej) m(T’’) ≤ m(T)

Nhưng T’’ khung G, T khung nhỏ nhất, phải có m(T’’)=m(T), tức T’’ khung nhỏ G

Độ phức tạp thuật toán Prim O(n3) Thật vậy, T(k) có k đỉnh có n−k

đỉnh khơng thuộc T(k), ta phải chọn chiều dài nhỏ nhiều k(n−k) cạnh Do k(n−k) < (n−1)2, nên độ phức tạp bước chọn ek+1 O(n2) Vì phải chọn

n−1 cạnh, nên độ phức tạp thuật toán Prim O(n3)

(94)

6.3 CÂY CÓ GỐC

6.3.1 Định nghĩa: Cây có hướng đồ thị có hướng mà đồ thị vơ hướng

Cây có gốc có hướng, có đỉnh đặc biệt, gọi gốc, từ gốc có đường đến đỉnh khác

Thí dụ 4:

i h

l m j

k

o p

q n

d a

c g

f

b e

r

Trong có gốc gốc r có bậc vào 0, tất đỉnh khác có bậc vào

Một có gốc thường vẽ với gốc r phát triển từ xuống, gốc r gọi đỉnh mức Các đỉnh kề với r xếp phía gọi đỉnh mức Đỉnh đỉnh mức đỉnh mức 2,

Tổng qt, có gốc v đỉnh mức k đường từ r

đến v có độ dài k

Mức lớn đỉnh gọi chiều cao

Cây có gốc hình thường vẽ hình để làm rõ mức đỉnh

r

a b c d

e f g h i

l m n

p

o q

k

j

(95)

Trong có gốc, cung có hướng từ xuống, vẽ mũi tên để

hướng khơng cần thiết; đó, người ta thường vẽ có gốc

6.3.2 Định nghĩa: Cho T có gốc r=v0 Giả sử v0, v1, , vn-1, đường

trong T Ta gọi:

− vi+1 vi vi cha vi+1

− v0, v1, , vn-1 tổ tiên vn dòng dõi v0, v1, , vn-1

−Đỉnh treo đỉnh khơng có con; đỉnh treo gọi hay đỉnh ngoài; đỉnh

không phải đỉnh

6.3.3 Định nghĩa: Một có gốc T gọi m-phân đỉnh T có nhiều m Với m=2, ta có nhị phân

Trong nhị phân, rõ bên trái hay bên phải; bên trái (t.ư phải) vẽ phía bên trái (t.ư phải) cha

Cây có gốc T gọi m-phân đầy đủ đỉnh T có m

6.3.4 Mệnh đề: Một m-phân đầy đủ có i đỉnh có mi+1 đỉnh có (m−1)i+1

Chứng minh: Mọi đỉnh m-phân đầy đủđều có bậc m, cịn có bậc 0, số cung mi sốđỉnh mi+1 Gọi l số ta có l+i=mi+1, nên l=(m−1)i+1

6.3.5 Mệnh đề:1) Một m-phân có chiều cao h có nhiều mh

2) Một m-phân có l có chiều cao h ≥ [logml]

Chứng minh: 1) Mệnh đề chứng minh quy nạp theo h Mệnh đề hiển nhiên

đúng h=1 Giả sử có chiều cao k ≤ h−1 có nhiều mk-1 (với h≥2) Xét T có chiều cao h Bỏ gốc khỏi ta rừng gồm không m con, có chiều cao ≤ h−1 Do giả thiết quy nạp, có nhiều mh-1 Do T, nên T có nhiều m.mh-1=mh

2)l≤ mh⇔ h ≥ [logml]

6.4 DUYỆT CÂY NHỊ PHÂN

6.4.1 Định nghĩa: Trong nhiều trường hợp, ta cần phải “điểm danh” hay “thăm” cách có hệ thống đỉnh nhị phân, đỉnh lần Ta gọi việc duyệt nhị phân hay đọc nhị phân

Có nhiều thuật tốn duyệt nhị phân, thuật tốn khác chủ yếu

thứ tự thăm đỉnh

Cây nhị phân T có gốc r ký hiệu T(r) Giả sử r có bên trái u, bên phải v Cây có gốc u đỉnh khác dòng dõi u T gọi

(96)

con bên trái T, ký hiệu T(u) Tương tự, ta có bên phải T(v) T Một T(r) khơng có bên trái hay bên phải

Sau ba thuật toán duyệt nhị phân T(r) Các thuật toán

được trình bày đệ quy Chú ý T(x) mơt đỉnh x “duyệt T(x)” có nghĩa “thăm đỉnh x”

Thí dụ 5: a

b c

d e f

h i j k

q

l m n o p s

g

6.4.2 Các thuật toán duyệt nhị phân:

1) Thuật toán tiền thứ tự:

1. Thăm gốc r

2. Duyệt bên trái T(r) theo tiền thứ tự

3. Duyệt bên phải T(r) theo tiền thứ tự

Duyệt nhị phân T(a) hình theo tiền thứ tự: Thăm a

2 Duyệt T(b) 2.1 Thăm b 2.2 Duyệt T(d) 2.2.1 Thăm d

2.2.2 Duyệt T(g) 2.2.2.1 Thăm g

2.2.2.3 Duyệt T(l): Thăm l

2.2.3 Duyệt T(h): Thăm h 2.3 Duyệt T(e)

2.3.1 Thăm e 2.3.2 Duyệt T(i) 2.3.2.1 Thăm i

2.3.2.2 Duyệt T(m): Thăm m 2.3.2.3 Duyệt T(n): Thăm n Duyệt T(c)

(97)

3.1 Thăm c 3.3 Duyệt T(f) 3.3.1.Thăm f 3.3.2 Duyệt T(j) 3.3.2.1 Thăm j

3.3.2.2 Duyệt T(o): Thăm o 3.3.2.3 Duyệt T(p): Thăm p 3.3.3 Duyệt T(k)

3.3.3.1 Thăm k

3.3.3.2 Duyệt T(q): Thăm q 3.3.3.3 Duyệt T(s): Thăm s

Kết duyệt T(a) theo tiền thứ tự là:

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

2) Thuật toán trung thứ tự:

1. Duyệt bên trái T(r) theo trung thứ tự

2. Thăm gốc r

3. Duyệt bên phải T(r) theo trung thứ tự

Duyệt nhị phân T(a) hình theo trung thứ tự: Duyệt T(b)

1.1 Duyệt T(d)

1.1.1 Duyệt T(g) 1.1.1.2 Thăm g

1.1.1.3 Duyệt T(l): thăm l

1.1.2 Thăm d

1.1.3 Duyệt T(h): Thăm h 1.2 Thăm b

1.3 Duyệt T(e)

1.3.1 Duyệt T(i)

1.3.1.1 Duyệt T(m): Thăm m 1.3.1.2 Thăm i

1.3.1.3 Duyệt T(n): Thăm n 1.3.2 Thăm e

2 Thăm a Duyệt T(c) 3.2 Thăm c 3.3 Duyệt T(f)

3.3.1 Duyệt T(j)

(98)

3.3.1.1 Duyệt T(o): Thăm o 3.3.1.2 Thăm j

3.3.1.3 Duyệt T(p): Thăm p 3.3.2 Thăm f

3.3.3 Duyệt T(k)

3.3.3.1 Duyệt T(q): Thăm q 3.3.3.2 Thăm k

3.3.3.3 Duyệt T(s): Thăm s Kết duyệt T(a) theo trung thứ tự là:

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

3) Thuật toán hậu thứ tự:

1. Duyệt bên trái T(r) theo hậu thứ tự

2. Duyệt bên phải T(r) theo hậu thứ tự

3. Thăm gốc r

Duyệt nhị phân T(a) hình theo hậu thứ tự: Duyệt T(b)

1.1 Duyệt T(d)

1.1.1 Duyệt T(g)

1.1.1.2 Duyệt T(l): thăm l

1.1.1.3 Thăm g 1.1.2 Duyệt T(h): thăm h 1.1.3 Thăm d

1.2 Duyệt T(e)

1.2.1 Duyệt T(i)

1.2.1.1 Duyệt T(m): Thăm m 1.2.1.2 Duyệt T(n): Thăm n 1.2.1.3 Thăm i

1.2.3 Thăm e 1.3 Thăm b

2 Duyệt T(c)

2.2 Duyệt T(f)

2.2.1 Duyệt T(j)

2.2.1.1 Duyệt T(o): Thăm o 2.2.1.2 Duyệt T(p): Thăm p 2.2.1.3 Thăm j

2.2.2 Duyệt T(k)

2.2.2.1 Duyệt T(q): Thăm q

(99)

2.2.2.2 Duyệt T(s): Thăm s 2.2.2.3 Thăm k

2.2.3 Thăm f 2.3 Thăm c

3 Thăm a

Kết duyệt T(a) theo trung thứ tự là:

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

6.4.3 Ký pháp Ba Lan:

Xét biểu thức đại số sau đây: (a+b)(c−

2

d

) (1)

Ta vẽ nhị phân hình đây, đỉnh mang dấu phép tính (1), gốc mang phép tính sau (1), dấu nhân, ký hiệu ∗, mang số chữđại diện cho số

+ −

b c /

d

a

Duyệt nhị phân hình theo trung thứ tự là: a + b ∗ c − d / (2) biểu thức (1) bỏđi dấu ngoặc

Ta nói biểu thức (1) biểu diễn nhị phân T(∗) hình trên, hay nhị phân T(∗) tương ứng với biểu thức (1) Ta nói: cách viết (ký pháp) quen thuộc đại số học cách viết biểu thức (1) ký pháp trung thứ tự kèm theo dấu ngoặc

Ta biết dấu ngoặc (1) cần thiết, (2) hiểu theo nhiều cách khác (1), chẳng hạn

(a + b ∗ c) − d / (3) a + (b ∗ c − d) / (4)

Các biểu thức (3) (4) biểu diễn nhị phân hình sau Hai nhị phân tương ứng khác nhau, duyệt theo trung thứ tự (2)

(100)

+ /

d

c b

2 a

a /

d

c +

b

2

Đối với hình thứ nhất, duyệt theo tiền thứ tự, ta có

∗ + a b − c / d (5) duyệt theo hậu thứ tự, ta có:

a b + c d / − ∗ (6)

Có thể chứng minh (5) (6) xác định nhị phân hình thứ nhất, xác định biểu thức (1) mà không cần dấu ngoặc Chẳng hạn nhị phân hình thứ hai duyệt theo tiền thứ tự

− + a ∗ b c / d khác với (5) duyệt theo hậu thứ tự

a b c ∗ + d / − khác với (6)

Vì vậy, ta viết biểu thức đại số, lôgic cách duyệt tương ứng theo tiền thứ tự hậu thứ tự ta khơng cần dùng dấu ngoặc mà không sợ hiểu nhầm

Người ta gọi cách viết biểu thức theo tiền thứ tự ký pháp Ba Lan, cách viết theo hậu thứ tự ký pháp Ba Lan đảo, để ghi nhớ đóng góp nhà tốn học lơgic học Ba Lan Lukasiewicz (1878-1956) vấn đề

(101)

Việc chuyển biểu thức viết theo ký pháp quen thuộc (có dấu ngoặc) sang dạng ký pháp Ba Lan hay ký pháp Ba Lan đảo ngược lại, thực cách vẽ nhị phân tương ứng, nhưđã làm biểu thức (1) Nhưng thay vẽ nhị phân, ta xem xét để xác định dần cơng thức phận công thức cho Chẳng hạn cho biểu thức viết theo ký pháp Ba Lan

− ∗ ↑ / −− a b ∗ c ↑− c d ∗ −− a c d / ↑− b ∗ d

Trước hết, ý phép toán +, −, *, /, ↑đều phép toán hai ngơi, nhị phân tương ứng, đỉnh mang dấu phép toán đỉnh có hai Các chữ số đặt Theo ký pháp Ba Lan (t.ư Ba Lan đảo) T a b (t.ư a b T) có nghĩa a T b, với T phép toán +, −, *, /, ↑

{5 23 2* / *{3 35

* /

*

3 5c c d a c d b a d b d c a d c c b

a ↑− −− ↑−

− − ↑ − − −

−3 123 123

2 ) ( / ) ( * ) ( ) ( / * ) (

5 142432 14243 14243

43 42 d b d c a d c c b a d b d c a d c c b a − − − − − − − ↑ − − − ↑ − − ↑ − ) ( / ) ( * ) ( ) ( / * ) ( 2

5 14243 4 d b c b a d b d c a d c c b a − − − − ↑ − − − − − ↑ − 43 42 4 4 ) ( 2 3 ) ( / ) ( * ) ( * d b c b a d b d c a d c c b a − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ − − − − − − − − ↑ − 4 4 4 4 4 4 4 4 ) ( ) ( ) ( 3 ) ( ) ( * ) ( * d b d c a d c c b a d b d c a d c c b a − − − − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ − − − − − − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ − − − ) ( ) ( ) (

5 2 b d d c a d c c b a − − − − − ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ − −

(102)

BÀI T

P CH

ƯƠ

NG VI:

1. Vẽ tất (khơng đẳng cấu) có:

a) đỉnh b) đỉnh c) đỉnh

2. Một có n2 đỉnh bậc 2, n3đỉnh bậc 3, …, nk đỉnh bậc k Hỏi có đỉnh bậc

1?

3. Tìm số tối đa đỉnh m-phân có chiều cao h

4. Có thể tìm có đỉnh thoảđiều kiện hay khơng? Nếu có, vẽ

cây ra, khơng, giải thích sao:

a) Mọi đỉnh có bậc

b) Mọi đỉnh có bậc

c) Có đỉnh bậc đỉnh bậc

d) Có đỉnh bậc đỉnh bậc

5. Chứng minh bác bỏ mệnh đề sau

a) Trong cây, đỉnh đỉnh cắt

b) Một có sốđỉnh khơng nhỏ có nhiều đỉnh cắt cầu

6. Có bốn đội bóng đá A, B, C, D lọt vào vòng bán kết giải đội mạnh khu vực Có dựđốn xếp hạng sau:

a)Đội B vơ địch, đội D nhì

b)Đội B nhì, đội C ba

c)Đọi A nhì, đội C tư

Biết dựđoán đội Hãy cho biết kết xếp hạng đội

7. Cây Fibonacci có gốc Tn đuợc dịnh nghĩa hồi quy sau T1 T2

có gốc gồm đỉnh với n=3,4, … có gốc Tnđược xây dựng từ gốc với Tn-1

như bên trái Tn-2 bên phải

a) Hãy vẽ Fibonacci có gốc

b) Cây Fibonacci Tn có đỉnh, đỉnh Chiều cao

của bao nhiêu?

8. Hãy tìm khung đồ thị sau cách xoá cạnh chu trình đơn

a) a b c

e f g

h i j

d

(103)

b)

9. Hãy tìm khung cho đồ thị sau

a b

c d e

h f i k g l j

a) K5 b) K4,4 c) K1,6

d) Q3 e) C5 f) W5

10.Đồ thị Kn với n=3, 4, có khung khơng đẳng cấu?

11. Tìm khung nhỏ đồ thị sau theo thuật toán Kruskal Prim

a b c d e g 15 h 20 f 11 10 14 42

12. Tìm khung nhỏ thuật tốn Prim đồ thị gồm đỉnh A, B, C, D, E, F, H, I cho ma trận trọng số sau

D

C E F

B G A H ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 18 14 21 12 19 11 20 18 17 23 21 20 19 32 14 17 34 30 21 20 18 21 23 34 22 29 24 19 12 21 30 22 13 33 23 19 20 21 29 13 13 15 11 19 20 24 33 13 16 20 32 18 19 23 15 16 B A E D C H G F

Yêu cầu viết kết trung gian bước lặp, kết cuối cần đưa tập cạnh độ dài khung nhỏ

(104)

13. Duyệt sau thuật toán tiền thứ tự, trung thứ tự hậu thứ tự

a) b)

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

e f

h j i

g d

14. Viết biểu thức sau theo ký pháp Ba Lan ký pháp Ba Lan đảo

a) BD C BD A D C B A D C B A − + + + − + + 2 ) ( ) )( ( b) ) ( ) (

4 c d a d a b d

b

a ⎟ + −

⎠ ⎞ ⎜ ⎝ ⎛ − + ⎥⎦ ⎤ ⎢⎣ ⎡ − − −

15. Viết biểu thức sau theo ký pháp quen thuộc

a) x y + ↑ x y − ↑− x y * /

b) − ∗ ↑ / −− a b c ∗ ↑− c d ∗ −− a c d / ↑− b ∗ d

(105)

CHƯƠNG VII

ĐỒ

TH

PH

NG VÀ TÔ MÀU

ĐỒ

TH

Từ xa xưa lưu truyền toán cổ “Ba nhà, ba giếng”: Có ba nhà gần ba giếng, khơng có đường nối thẳng nhà với khơng có đường nối thẳng giếng với

Có lần bất hồ với nhau, họ tìm cách làm đường khác đến giếng cho đường

đôi khơng giao Họ có thực ý định khơng?

Bài tốn có thểđược mơ hình đồ thị phân đôi đầy đủ K3,3 Câu hỏi ban

đầu diễn đạt sau: Có thể vẽ K3,3 mặt phẳng cho hai

cạnh cắt nhau? Trong chương nghiên cứu tốn: vẽ đồ thị mặt phẳng khơng có cạnh cắt không Đặc biệt trả lời tốn ba nhà ba giếng Thường có nhiều cách biểu diễn đồ thị Khi tìm cách biểu diễn đồ thị khơng có cạnh cắt nhau?

N1 N2 N3

G2 G3

G1

7.1 ĐỒ THỊ PHẲNG

7.1.1 Định nghĩa: Một đồ thị gọi phẳng vẽ mặt phẳng mà khơng có cạnh cắt (ở điểm điểm mút cạnh) Hình vẽ gọi biểu diễn phẳng đồ thị

Một đồ thị phẳng thường vẽ với cạnh cắt nhau, vẽ cách khác khơng có cạnh cắt

Thí dụ 1: 1) Một cây, chu trình đơn đồ thị phẳng

2) K4 đồ thị phẳng vẽ lại hình bên khơng có đường cắt

Đồ thị K4 K4 vẽ khơng có đường cắt

a b

c d

a

d c

b

3) Xét đồ thị G hình a Có thể biểu diễn G cách khác hình b, hai cạnh không cắt

d b

c e

a

e b

c

a d

(106)

4) Đồ thịđầy đủ K5 thí dụ vềđồ thị không phẳng (xem Định lý 7.2.2)

7.1.2 Định nghĩa: Cho G đồ thị phẳng Mỗi phần mặt phẳng giới hạn chu trình đơn khơng chứa bên chu trình đơn khác, gọi miền (hữu hạn) đồ thị G Chu trình giới hạn miền biên miền Mỗi đồ thị phẳng liên thơng có miền vơ hạn (là phần mặt phẳng bên tất miền hữu hạn) Số cạnh tạo thành biên gọi đai G; trường hợp G khơng có chu trình đai số cạnh G

Thí dụ 2: 1) Một có miền, miền vơ hạn 2) Đồ thị phẳng hình bên có miền, M5

là miền vơ hạn, miền M1 có biên abgfa,

miền M2 có biên bcdhgb, … Chu

trình đơn abcdhgfa khơng giới hạn miền chứa bên chu trình đơn khác abgfa

7.1.3 Định lý (Euler, 1752): Nếu đồ thị phẳng liên thơng có n đỉnh, p cạnh d miền ta có hệ thức:

c

d b

g h

M2

a

f

e

M4

M3

M1

M5

n − p + d =

Chứng minh: Cho G đồ thị phẳng liên thơng có n đỉnh, p cạnh d miền

Ta bỏ số cạnh G để khung G Mỗi lần ta bỏ cạnh (p giảm 1) số miền G giảm (d giảm 1), sốđỉnh G không thay đổi (n không đổi) Như vậy, giá trị biểu thức n − p + d khơng thay đổi suốt q trình ta bỏ bớt cạnh G để Cây có n đỉnh, có n − cạnh có miền, vậy:

n − p + d = n − (n −1) + =

Hệ thức n − p + d = thường gọi “hệ thức Euler cho hình đa diện”, Euler chứng minh cho hình đa diện có n đỉnh, p cạnh d mặt Mỗi hình đa diện coi đồ thị phẳng Chẳng hạn hình tứ diện ABCD hình hộp ABCDA’B’C’D’ biểu diễn đồ thị

A

D

B C

B

B’ C’

C A

A’

D

D’

7.1.4 Hệ quả: Trong đồ thị phẳng liên thông tuỳ ý, tồn đỉnh có bậc khơng vượt q

(107)

Chứng minh: Trong đồ thị phẳng miền bao cạnh Mặt khác, cạnh nằm biên tối đa hai miền, nên ta có 3d ≤ 2p

Nếu đồ thị phẳng mà tất đỉnh có bậc khơng nhỏ đỉnh đồ thị phải đầu mút cạnh mà cạnh lại có hai đầu mút nên ta có 6n ≤ 2p hay 3n ≤ p Từ suy 3d+3n ≤ 2p+p hay d+n ≤ p, trái với hệ thức Euler d+n=p+2

7.2 ĐỒ THỊ KHÔNG PHẲNG

7.2.1 Định lý:Đồ thị phân đôi đầy đủ K3,3 đồ thị không phẳng

Chứng minh: Giả sử K3,3 đồ thị phẳng Khi ta có đồ thị phẳng với đỉnh

(n=6) cạnh (p=9), nên theo Định lý Euler đồ thị có số miền d=p−n+2=5

Ở đây, mõi cạnh chung cho hai miền, mà miền có cạnh Do 4d≤2p, tức 4x5≤2x9, vô lý

Như định lý cho ta lời giải toán “Ba nhà ba giếng”, nghĩa thực việc làm đường khác đến giếng cho đường đôi không giao

7.2.2 Định lý:Đồ thịđầy đủ K5 đồ thị không phẳng

Chứng minh: Giả sử K5 đồ thị phẳng Khi ta có đồ thị phẳng với đỉnh (n=5)

và 10 cạnh (p=10), nên theo Định lý Euler đồ thị có số miền d=p−n+2=7

Trong K5, miền có 3cạnh, cạnh chung cho hai miền,

3d≤2n, tức 3x7≤2x10, vô lý

7.2.3 Chú ý: Ta thấy K3,3 K5 không phẳng Rõ ràng, đồ thị khơng

phẳng chứa hai đồ thị đồ thị Hơn nữa, tất đồ thị không phẳng cần phải chứa đồ thị nhận từ K3,3 K5 số phép toán

cho phép

Cho đồ thị G, có cạnh (u,v) Nếu ta xoá cạnh (u,v), thêm đỉnh w với hai cạnh (u,w) (w,v) ta nói ta thêm đỉnh w (bậc 2) đặt cạnh (u,v) G

Đồ thị G’ gọi đồng phôi với đồ thị G G’ có từ G cách thêm đỉnh (bậc 2) đặt cạnh G

Thí dụ 3:

a

u v

b c

a

u w v

d

c b

G G’

(108)

Đồ thị G đồng phôi với đồ thị G’

Nhà toán học Ba Lan, Kuratowski, thiết lập định lý sau vào năm 1930 Định lý biểu thịđặc điểm đồ thị phẳng nhờ khái niệm đồ thịđồng phôi

7.2.4 Định lý (Kuratowski): Đồ thị không phẳng chứa đồ thị đồng phơi với K3,3 K5

Thí dụ 4:

a c

b

f

e

d

Hình Hình Hình

Đồ thị hình đồ thị phẳng Các đồ thị có đỉnh, khơng chứa đồ thị K3,3được có đỉnh bậc 2, tất đỉnh K3,3đều có bậc 3; khơng thể chứa đồ thị K5 có đỉnh bậc nhỏ 4,

tất đỉnh K5đều có bậc

Đồ thị hình đồ thị khơng phẳng xố đỉnh b cạnh (b,a), (b,c), (b,f) ta đồ thị K5

7.3 TƠ MÀU ĐỒ THỊ 7.3.1 Tơ màu đồ:

Mỗi đồ coi đồ thị phẳng Trong đồ, ta coi hai miền có chung đường biên hai miền kề (hai miền có chung điểm biên không coi kề nhau) Một đồ thường tô màu, cho hai miền kề tô hai màu khác Ta gọi cách tô màu đồ cách tô màu

Để đảm bảo chắn hai miền kề khơng có màu trùng nhau, tô miền màu khác Tuy nhiên việc làm nói chung khơng hợp lý Nếu đồ có nhiều miền khó phân biệt màu gần giống Do người ta dùng số màu cần thiết để tô đồ Một toán đặt là: xác định số màu tối thiểu cần có để tơ màu đồ

b

f c

e d

a

M6 M5

M4

M3

M2

M1

a b

c d

f e

Thí dụ 5: Bản đồ hình bên có miền, cần có màu (vàng, đỏ, xanh) để tô đồ Chẳng hạn, màu vàng tô cho M1 M4, màu đỏđược tô cho M2

và M6, màu xanh tô cho M3 M5

(109)

7.3.2 Tô màu đồ thị:

Mỗi đồ mặt phẳng biểu diễn đồ thị, miền đồ biểu diễn đỉnh; cạnh nối hai đỉnh, miền biểu diễn hai đỉnh kề Đồ thị nhận cách gọi đồ thịđối ngẫu đồ xét Rõ ràng đồ mặt phẳng có đồ thị đối ngẫu phẳng Bài tốn tơ màu miền đồ tương đương với tốn tơ màu đỉnh đồ thị đối ngẫu cho hai đỉnh liền kề có màu, mà ta gọi tô màu đỉnh đồ thị

Số màu cần dùng để tô màu đồ thị G gọi sắc số đồ thị G ký hiệu χ(G)

Thí dụ 6:

Ta thấy đỉnh b, d, g, e đôi kề nên phải tơ màu khác Do χ(G) ≥ Ngồi ra, dùng màu đánh số 1, 2, 3, để tô màu G sau:

a b c

d e

f g h

Như χ(G) =

3

2

4

7.3.3 Mệnh đề: Nếu đồ thị G chứa đồ thị đồng phôi với đồ thị đầy đủ Kn

χ(G) ≥ n

Chứng minh: Gọi H đồ thị G đồng phôi với Kn χ(H) ≥ n Do χ(G) ≥ n

7.3.4 Mệnh đề: Nếu đơn đồ thị G khơng chứa chu trình độ dài lẻ χ(G) =2

Chứng minh: Khơng tính chất tổng qt giả sử G liên thông Cốđịnh đỉnh u G tơ màu hai màu Với đỉnh v G, tồn đường từ u đến v, đường có độ dài chẵn tơ màu cho v, đường có độ dài lẻ tơ màu cho v Nếu có hai đường mang tính chẵn lẻ khác nối

(110)

u với v dễ thấy G phải chứa chu trình độ dài lẻ Điều mâu thuẫn cho biết hai màu tô đồ thị G

7.3.5 Mệnh đề: Với số nguyên dương n, tồn đồ thị khơng chứa K3 có

sắc số n

Chứng minh: Ta chứng minh mệnh đề quy nạp theo n

Trường hợp n=1 hiển nhiên

Giả sử ta có đồ thị Gn với kn đỉnh, khơng chứa K3 có sắc số n Ta xây dựng

đồ thị Gn+1 gồm n Gn thêm knn đỉnh theo cách sau: thứ tự

(v1, v2, …, vn), với vi thuộc Gn thứ i, tương ứng với đỉnh mới, đỉnh

này nối n cạnh đến đỉnh v1, v2, …, Dễ thấy Gn+1 không chứa

K3 có sắc số n+1

7.3.6 Định lý (Định lý màu Kempe-Heawood): Mọi đồ thị phẳng tơ màu

Chứng minh: Cho G đồ thị phẳng Khơng tính chất tổng qt xem G liên thơng có số đỉnh n ≥ Ta chứng minh G tô màu quy nạp theo n

Trường hợp n=5 hiển nhiên Giả sửđịnh lý cho tất đồ thị phẳng có sốđỉnh nhỏ n Xét G đồ thị phẳng liên thơng có n đỉnh

Theo Hệ 7.1.4, G tồn đỉnh a với deg(a) ≤ Xoá đỉnh a cạnh liên thuộc với nó, ta nhận đồ thị phẳng G’ có n−1 đỉnh Theo giả thiết quy nạp, tơ đỉnh G’ màu Sau tơ G’ rồi, ta tìm cách tô đỉnh a màu khác với màu đỉnh kề nó, màu dùng Điều thực deg(a) < deg(a)=5 đỉnh kề a tô màu trở xuống

Chỉ phải xét trường hợp deg(a)=5 mà đỉnh kề a b, c, d, e ,f tơ màu Khi đỉnh b, c, d, e ,f phải có đỉnh khơng kề nhau, đỉnh đơi kề b c d e f đồ thị đầy đủ K5 đồ thị khơng

phẳng, G khơng phẳng, trái với giả thiết Giả sử b d không kề (Hình 1)

Hình Hình Hình

a

f

(2)

e

d c

b

m n

(2)

f a

e

d c

b

m n

f

(5)

a

c

e

(3) m n

(2)

(4) (2)

(1)

(5)

(1)

(1)

(111)

Xoá đỉnh b d cho kề a đỉnh trước kề b kề d mà khơng kề a (Hình 2), ta đồ thị G’’ có n−2 đỉnh Theo giả thiết quy nạp, ta tơ G’’ màu Sau đỉnh G’’ tơ (Hình 2), ta dựng lại đỉnh b d, tô b d màu tơ cho a (màu 1, Hình 3), cịn a tơ lại màu khác với màu b, c, d, e, f Vì b d không kề tô màu 1, nên với đỉnh dùng hết nhiều màu Do G tơ màu

7.3.7 Định lý (Định lý màu Appel-Haken): Mọi đồ thị phẳng tô màu

Định lý Bốn màu đưa đoán vào năm 1850 sinh viên người Anh tên F Guthrie cuối hai nhà toán học Mỹ

Kenneth Appel Wolfgang Haken chứng minh vào năm 1976 Trước năm 1976

đã có nhiều chứng minh sai, mà thơng thường khó tìm thấy chỗ sai, cơng bố Hơn có nhiều cố gắng cách vơ ích để tìm phản thí dụ cách cố vẽ đồ cần bốn màu để tơ

Có lẽ chứng minh sai tiếng toán học chứng minh sai “bài toán bốn màu” công bố năm 1879 luật sư, nhà tốn học nghiệp dư Ln Đơn tên Alfred Kempe Nhờ cơng bố lời giải “bài tốn bốn màu”,

Kempe công nhận hội viên Hội Khoa học Hồng gia Anh Các nhà tốn học

chấp nhận cách chứng minh ông ta 1890, Percy Heawood phát

sai lầm chứng minh Kempe Mặt khác, dùng phương pháp Kempe,

Heawood chứng minh “bài toán năm màu” (tức đồ tơ màu)

Như vậy, Heawood giải “bài tốn năm màu”, cịn “bài tốn bốn màu”

vẫn cịn thách đốđối với nhà toán học suốt gần kỷ Việc tìm lời giải “bài tốn bốn màu” ảnh hưởng đến phát triển theo chiều hướng khác lý thuyết đồ thị

Mãi đến năm 1976, khai thác phương pháp Kempe nhờ cơng cụ máy tính

điện tử, Appel Haken tìm lời giải “bài tốn bốn màu” Chứng minh họ dựa phân tích trường hợp cách cẩn thận nhờ máy tính Họ “bài toán bốn màu” sai có phản thí dụ thuộc gần 2000 loại khác khơng có loại dẫn tới phản thí dụ Trong chứng minh họ dùng 1000 máy Cách chứng minh gây nhiều tranh cãi máy tính đóng vai trị quan trọng Chẳng hạn, liệu có sai lầm chương trình điều dẫn tới kết sai khơng? Lý luận họ có thực chứng minh hay khơng, phụ thuộc vào thơng tin từ máy tính không đáng tin cậy?

(112)

7.3.8 Những ứng dụng tốn tơ màu đồ thị:

1) Lập lịch thi: Hãy lập lịch thi trường đại học cho khơng có sinh viên có hai mơn thi lúc

Có thể giải tốn lập lịch thi mơ hình đồ thị, với đỉnh mơn thi, có cạnh nối hai đỉnh có sinh viên phải thi hai môn biểu diễn hai đỉnh Thời gian thi môn biểu thị màu khác Như việc lập lịch thi tương ứng với việc tô màu đồ thị

Chẳng hạn, có mơn thi cần xếp lịch Giả sử môn học đuợc đánh số từ tới cặp môn thi sau có chung sinh viên: 2, 3, 4, 7, 3, 4, 5, 7, 4, 6, 7, 5, 6, 6, 7, Hình biểu diễn đồ thị tương ứng Việc lập lịch thi việc tơ màu đồ thị Vì số màu đồ thị nên cần có đợt thi

1

7

3

5

Nâu

Nâu Vàng

Đỏ

Xanh

Vàng

Đỏ

2) Phân chia tần số: Các kênh truyền hình từ số tới số 12 phân chia cho

đài truyền hình cho khơng có đài phát cách khơng q 240 km lại dùng

cùng kênh Có thể chia kênh truyền mơ hình tơ màu đồ thị Ta xây dựng đồ thị cách coi đài phát đỉnh Hai đỉnh nối với cạnh chúng cách không 240 km Việc phân chia kênh tương ứng với việc tơ màu đồ thị, màu biểu thị kênh

3) Các ghi số: Trong dịch hiệu cao việc thực vòng lặp tăng tốc biến dùng thường xuyên lưu tạm thời ghi số xử lý trung tâm (CPU) mà nhớ thông thường Với vòng lặp cho trước cần ghi số? Bài tốn giải mơ hình tơ màu đồ thị Để xây dựng mơ hình ta coi đỉnh đồ thị biến vịng lặp Giũa hai đỉnh có cạnh biến biểu thị đỉnh phải lưu ghi số thời điểm thực vòng lặp Như số màu đồ thị số ghi cần có ghi khác phân cho biến đỉnh biểu thị biến liền kề đồ thị

(113)

BÀI T

P CH

ƯƠ

NG VII:

1. Cho G đơn đồ thị phẳng liên thơng có 10 mặt, tất đỉnh có bậc Tìm sốđỉnh đồ thị G

2. Cho G đơn đồ thị phẳng liên thơng có đỉnh, bậc đỉnh 2, 2, 2, 3, 3, 3, 4, 4, Tìm số cạnh số mặt G

3. Tìm sốđỉnh, số cạnh đai của:

a) Kn; b) Km,n 4. Chứng minh rằng:

a) Kn phẳng n ≤

b) Km,n phẳng m ≤ hay n ≤

5.Đồ thị đồ thị khơng phẳng sau có tính chất: Bỏ đỉnh cạnh liên thuộc tạo đồ thị phẳng

a) K5; b) K6; c) K3,3

6. Cho G đơn đồ thị phẳng liên thơng có n đỉnh m cạnh, n ≥ Chứng minh rằng:

m ≤ 3n −

7. Trong đồ thị hình đây, đồ thị phẳng, đồ thị không phẳng? Nếu đồ thị phẳng kẻ thêm cạnh đểđược đồ thị không phẳng?

G1 G2 G3

a

b

c

d e

f g

h

f

d e g

b f

c

b

c a

d e

g f

8. Chứng minh đồ thị Peterson (đồ thị Bài tập 8, Chương IV) đồ thị không phẳng

9. Cho G đồ thị phẳng liên thơng có n đỉnh, m cạnh đai g, với g ≥ Chứng minh rằng:

m ≤

2 −

g g

(n − 2)

10. Đa diện lồi có d mặt (d ≥ 5), mà từ đỉnh có cạnh Hai người chơi trò chơi sau: người tô đỏ mặt mặt lại Người thắng

(114)

người tơ mặt có chung đỉnh Chứng minh tồn cách chơi mà người tô trước luôn thắng

11. Chứng minh rằng:

a) Một đồ thị phẳng tơ đỉnh hai màu đồ thị phân đơi

b) Một đồ thị phẳng tô miền hai màu đồ thị Euler

12. Tìm sắc số đồ thị cho Bài tập

13. Tìm sắc số đồ thị Kn, Km,n, Cn, Wn

14. Khoa Tốn có hội đồng họp tháng lần Cần có thời điểm họp khác để đảm bảo không bị xếp lịch họp hai hội đồng lúc, hội đồng là:

H1 = {H, L, P}, H2 = {L, M, T}, H3 = {H, T, P}

15. Một vườn bách thú muốn xây dựng chuồng tự nhiên để trưng bày thú Không may, số loại thú ăn thịt thú khác có hội Có thể dùng mơ hình đồ thị tơ màu đồ thị để xác định số chuồng khác cần có cách nhốt thú vào chuồng thú tự nhiên này?

16. Chứng minh đơn đồ thị phẳng có đỉnh 13 cạnh tô hai màu

17. Chứng minh G đơn đồ thị phẳng có 12 đỉnh tồn G đỉnh có bậc ≤ Từđó suy đồ thị G tơ màu

(115)

CHƯƠNG VIII

ĐẠ

I S

BOOLE

Các mạch điện máy tính dụng cụ điện tử khác có đầu vào, đầu vào số số 1, tạo đầu số Các mạch điện có thểđược xây dựng cách dùng phần tử có hai trạng thái khác Chúng bao gồm chuyển mạch hai vị trí mở đóng dụng cụ quang học sáng tối Năm 1938 Claude Shannon chứng tỏ dùng quy tắc lôgic George Boole đưa vào năm 1854 “Các quy luật tư duy” ông để thiết kế mạch điện Các quy tắc tạo nên sở đại số Boole Sự hoạt động mạch điện xác định hàm Boole rõ giá trị đầu tập đầu vào Bước việc xây dựng mạch điện biểu diễn hàm Boole biểu thức lập cách dùng phép toán đại số Boole Biểu thức mà ta nhận chứa nhiều phép tốn mức cần thiết để biểu diễn hàm Ở cuối chương này, ta có phương pháp tìm biểu thức với số tối thiểu phép tổng tích dùng để biểu diễn hàm Boole Các thủ tục mô tả đồ Karnaugh phương pháp Quine-McCluskey, chúng đóng vai trị quan trọng việc thiết kế mạch điện có hiệu cao

8.1 KHÁI NIỆM ĐẠI SỐ BOOLE

8.1.1 Định nghĩa: Tập hợp khác rỗng S với phép toán ký hiệu nhân (.), cộng (+), lấy bù () gọi đại số Boole tiên đề sau thoả mãn với a, b, c ∈S

1 Tính giao hốn: a) a.b = b.a, b) a+b = b+a

2 Tính kết hợp: a) (a.b).c = a.(b.c),

b) (a+b)+c = a+(b+c)

3 Tính phân phối: a) a.(b+c) = (a.b)+(a.c),

b) a+(b.c) = (a+b).(a+c)

4 Tồn phần tử trung hoà: Tồn hai phần tử khác S, ký hiệu cho: a) a.1 = 1.a = a,

b) a+0 = 0+a = a

1 gọi phần tử trung hoà phép . gọi phần tử trung hoà phép +

5 Tồn phần tử bù: Với a ∈S, tồn phần tử a’∈S cho:

a) a.a’ = a’.a = 0,

b) a+a’ = a’+a =

(116)

a’ gọi phần tử bù a

Thí dụ 1:

1) Đại số lơgic đại số Boole, S tập hợp mệnh đề, phép toán ∧ (hội), (tuyển), − (phủ định) tương ứng với , +, , đ (đúng), s (sai) tương ứng với phần tử trung hoà 1,

2) Đại số tập hợp đại số Boole, S tập hợp

P

(X) gồm tập tập khác rỗng X, phép toán ∩ (giao), (hợp), − (bù) tương ứng với , +, , tập X, Ø tương ứng với phần tử trung hoà 1,

3) Cho B= {0,1}, phép toán , +, B định nghĩa sau: 1.1 = 1, 1+1 = 1, 1’ = 0,

1.0 = 0, 1+0 = 1, 0’ = (1) 0.1 = 0, 0+1 = 1,

0.0 = 0, 0+0 = 0,

Khi B đại số Boole Đây đại số lơgic, 1, tương ứng với đ (đúng), s (sai) Mỗi phần tử 0,1 B gọi bit Ta thường viết x thay cho x’.

Tổng quát, gọi Bn tập hợp xâu n bit (xâu nhị phân độ dài n) Ta định nghĩa tích, tổng hai chuỗi bù chuỗi theo bit Bảng 1, mà thường gọi phép toán AND-bit, OR-bit, NOT-bit Bn với phép toán tạo thành đại số Boole

4) Cho M tập hợp số thực có cận p, cận q tâm đối xứng O Các phép toán , +, M định nghĩa sau:

a.b = min(a, b), a+b = max(a, b), a’ điểm đối xứng a qua O

Khi M đại số Boole, q, p tương ứng với phần tử trung hoà 1,

8.1.2 Chú ý: Trước hết cần lưu ý điều quan trọng sau đây: tiên đề đại số Boole xếp theo cặp a) b) Từ tiên đề a), ta thay . +, thay + ., thay thay ta tiên đề b) tương ứng

Ta gọi cặp tiên đề a), b) đối ngẫu Do ta chứng minh định lý đại số Boole ta có định lý khác, đối ngẫu nó, cách thay . tương ứng + (và ngược lại) Ta có:

Quy tắc đối ngẫu:Đối ngẫu định lý định lý

8.1.3 Định lý: 6 (Tính nuốt) a) a.0 = 0,

b) a+1 =

7 (Tính luỹđẳng) a) a.a = a,

b) a+a = a

(117)

8 (Hệ thức De Morgan) a) (a.b)’ = a’+b’,

b) (a+b)’ = a’.b’

9 (Hệ thức bù kép) (a’)’ = a

10 a) 1’ = 0,

b) 0’ =

11 (Tính hút) a) a.(a+b) = a,

b) a+(a.b) = a

Chứng minh:

6. = a.a (tiên đề 5a))

= a.(a’+0) (tiên đề 4b)) = (a.a’)+(a.0) (tiên đề 3a)) = 0+(a.0) (tiên đề 5a))

= a.0 (tiên đề 4b))

7 a = a.1 (tiên đề 4a))

= a.(a+a’) (tiên đề 5b)) = (a.a)+(a.a’) (tiên đề 3a)) = (a.a)+0 (tiên đề 5a))

= a.a (tiên đề 4b))

8. Ta chứng minh a’+b’ bù a.b cách chứng minh rằng: (a.b).(a’+b’) = (theo 5a)) (a.b)+(a’+b’) = (theo 5b))

Thật vậy, (a.b).(a’+b’) = (a.b.a’)+(a.b.b’) = (a.a’.b)+(a.b.b’) = (0.b)+(a.0) = 0+0 = 0, (a.b)+(a’+b’) = (a’+b’)+(a.b) = (a’+b’+a).(a’+b’+b) = (1+b’).(a’+1) = 1.1 = Vì a.b có phần tử bù nên (a.b)’ = a’+b’

9. Có từ tiên đề

10. Có từ hệ thức 1.0 = 1+0 =

11. a.(a+b) = (a+0).(a+b) = a+(0.b) = a+0 = a

8.1.4 Chú ý: Hệ tiên đề đại số Boole nêu hệ tối thiểu Chẳng hạn, tiên đề tính kết hợp suy từ tiên đề khác Thật vậy, với A=(a.b).c B=a.(b.c), ta có: a+A = a+((a.b).c) = (a+(a.b)).(a+c) = a.(a+c) = a, a+B = a+(a.(b.c)) = (a+a).(a+(b.c)) = a.(a+(b.c)) = a, a’+A = a’+((a.b).c) = (a’+(a.b)).(a’+c) = ((a’+a).(a’+b)).(a’+c) = (1.(a’+b)).(a’+c) = (a’+b).(a’+c) = a’+(b.c), a’+B = a’+(a.(b.c)) = (a’+a).(a’+(b.c)) = 1.(a’+(b.c)) = a’+(b.c)

Do a+A = a+B a’+A = a’+B Từđó suy rằng:

(118)

A = A+0 = A+(a.a’) = (A+a).(A+a’) = (a+A).(a’+A) = (a+B).(a’+B)=(a.a’)+B=0+B= B hay ta có 2a) đối ngẫu ta có 2b) Ngồi ra, tính phần tử bù suy từ tiên đề khác

Tương tự đại số lôgic, đại số Boole ta xét công thức, thành lập từ biến a, b, c, … nhờ phép toán , +, Trong công thức, ta quy ước thực phép toán theo thứ tự: , ., +; a.b viết ab, gọi tích a b a+b gọi tổng a b Ta biến đổi cơng thức, rút gọn cơng thức tương tự đại số lôgic Ta xét tích sơ cấp tổng sơ cấp tương tự “hội sơ cấp” “tuyển sơ cấp” Mọi công thức có thểđưa dạng tích chuẩn tắc hồn tồn dạng tổng chuẩn tắc hoàn toàn tương tự dạng “hội tuyển chuẩn tắc hồn tồn” Mỗi cơng thức đại số Boole gọi biểu diễn hàm Boole

8.2 HÀM BOOLE

8.2.1 Định nghĩa: Ký hiệu B = {0, 1} Bn= {(x1, x2, …, xn) | xi∈B, 1≤ i ≤ n}, ởđây

B Bn đại số Boole (xem 2) 3) Thí dụ 1) Biến x gọi biến Boole nhận giá trị từ B Một hàm từ Bn vào B gọi hàm Boole (hay hàm đại số lơgic) bậc n

Các hàm Boole có thểđược biểu diễn cách dùng biểu thức tạo biến phép toán Boole (xem Bảng Thí dụ 1) Các biểu thức Boole với biến x1, x2, …, xnđược định nghĩa đệ quy sau:

- 0, 1, x1, x2, …, xn biểu thức Boole

- Nếu P Q biểu thức Boole P, PQ P+Q biểu thức Boole Mỗi biểu thức Boole biểu diễn hàm Boole Các giá trị hàm nhận cách thay cho biến biểu thức

Hai hàm n biến F G gọi F(a1, a2, …, an)=G(a1, a2, …,an)

với a1, a2, …, an∈B Hai biểu thức Boole khác biểu diễn hàm Boole

được gọi tương đương Phần bù hàm Boole F hàm F với F(x1, x2, …, xn) =

) , , ,

(x1 x2 xn

F Giả sử F G hàm Boole bậc n Tổng Boole F+G tích Boole FG định nghĩa bởi:

(F+G)(x1, x2, …, xn) = F(x1, x2, …, xn)+G(x1, x2, …, xn),

(FG)(x1, x2, …, xn) = F(x1, x2, …, xn)G(x1, x2, …, xn) Thí dụ 2:

Bậc Số hàm Boole 16 256 65.536 4.294.967.296 18.446.744.073.709.551.616 Theo quy tắc nhân phép đếm ta suy

ra có 2n n phần tử khác gồm số Vì hàm Boole việc gán cho số 2n n phần tử đó, nên lại theo quy tắc nhân có

các hàm Boole khác

n

2

2

(119)

Bảng sau cho giá trị 16 hàm Boole bậc phân biệt:

x y F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16

0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 1 0 0 có số hàm thơng dụng sau:

- Hàm F1 hàm 0,

- Hàm F2 hàm 1,

- Hàm F3 hàm hội, F3(x,y) viết xy (hay x∧y),

- Hàm F4 hàm tuyển, F4(x,y) viết x+y (hay x y), ∨

- Hàm F5 hàm tuyển loại, F5(x,y) viết x⊕y,

- Hàm F6 hàm kéo theo, F6(x,y) viết x

y,

- Hàm F7 hàm tương đương, F7(x,y) viết x

y,

- Hàm F8 hàm Vebb, F8(x,y) viết x y,

- Hàm F9 hàm Sheffer, F9(x,y) viết x

y

Thí dụ 3: Các giá trị hàm Boole bậc F(x, y, z) = xy+z cho bảng sau:

x y z xy z F(x, y, z) = xy+z

0 0 1

0 0

0 0 1

0 1 0

1 0 1

1 0

1 1 1

1 1 1

8.2.2 Định nghĩa: Cho x biến Boole σ ∈B Ký hiệu:

⎩ ⎨ ⎧

= = =

,

σ σ σ

khi x

khi x x

Dễ thấy xσ =1⇔ x=σ Với hàm Boole F bậc n, ký hiệu:

TF = {(x1, x2, …, xn)∈Bn | F(x1, x2, …, xn)=1}

Và gọi tập đặc trưng hàm F Khi ta có: F

F T

T = , TF+G = TFTG, TFG = TFTG

Cho n biến Boole x1, x2, …, xn Một biểu thức dạng:

k k

i i

i x x

xσ σ2K σ

2 1

(120)

trong σ1,σ2,K,σk ∈B, 1≤i1<i2 <L<ikn gọi hội sơ cấp n biến x1, x2, …, xn Số biến xuất hội sơ cấp đựoc gọi hạng của

hội sơ cấp

Cho F hàm Boole bậc n Nếu F biểu diễn dạng tổng (tuyển) số hội sơ cấp khác n biến biểu diễn gọi dạng tổng (tuyển) chuẩn tắc F Dạng tổng (tuyển) chuẩn tắc hoàn toàn dạng chuẩn tắc F mà hội sơ cấp có hạng n

Thí dụ 4: xy+xy dạng tổng chuẩn tắc hàm x

y

y

x+ xy+xy+xy dạng tổng chuẩn tắc hàm Sheffer x y

8.2.3 Mệnh đề: Mọi hàm Boole F bậc n biểu diễn dạng:

∈ + = i n i B n i i i

n x x F x x

x x x F ) , , ( 1 1

1 ( , , , , , )

) , , , ( σ σ σ σ σ σ K K K K

K (1),

trong i số tự nhiên bất kỳ, ≤ i ≤ n

Chứng minh: Gọi G là hàm Boole vế phải (1) Cho (x1, x2, …, xn)∈TF Khi số

hạng ứng với giá trị σ 1= x1, …, σ i= xi tổng vế phải (1) 1,

(x1, x2, …, xn)∈TG Đảo lại, (x1, x2, …, xn)∈TG tức vế phải phải xảy

bằng số hạng đó, chẳng hạn số hạng ứng với giá trị (σ 1, …, σ i),

khi x1=σ 1, …, xi=σ i f(σ 1,…,σ i, xi+1,…, xn)=1 hay (x1, x2, …, xn)∈TF Vậy TF=TG hay F=G

Cho i=1 mệnh đề nhận xét vai trò biến xi nhau,

ta hệ sau

8.2.4 Hệ quả: Mọi hàm Boole F bậc n có thểđược khai triển theo biến xi:

) , , , , , , ( ) , , , , , , ( ) , ,

(x1 xn xiF x1 xi 1 xi 1 xn xiF x1 xi 1 xi 1 xn

F K = K − + K + K − + K

Cho i=n mệnh đề bỏ nhân tử tích, số hạng tổng, ta hệ sau

8.2.5 Hệ quả: Mọi hàm Boole F bậc n có thểđược khai triển dạng:

∈ = F n n T n

n x x

x x F ) , , ( 1 1 ) , , ( σ σ σ σ K K K

8.2.6 Chú ý: Từ Hệ 8.2.5, ta suy hàm Boole biểu diễn dạng tổng (tuyển) chuẩn tắc hồn tồn Như hàm Boole biểu diễn biểu thức Boole chứa ba phép tích (hội), tổng (tuyển), bù (phủ định) Ta nói hệ {tích, tổng, bù} đầy đủ

Bằng đối ngẫu, ta chứng minh kết tương tự việc thay tích tổng ngược lại, từ dẫn tới việc biểu diễn F qua tích tổng Biểu diễn gọi dạng tích (hội) chuẩn tắc hồn tồn F:

(121)

∈ + + = F n n T n

n x x

x x F ) , , ( 1 1 ) ( ) , , ( σ σ σ σ K K K

Thí dụ 5: Dạng tổng chuẩn tắc hồn tồn hàm F cho Thí dụ là:

xyz z xy z y x z y x z y x z y x

F( , , )= + + + + ,

và dạng tích chuẩn tắc hồn tồn là:

) )( )( ( ) , ,

(x y z x y z x y z x y z

F = + + + + + +

8.3 MẠCH LƠGIC 8.3.1 Cổng lơgic:

x1

x2

F(x1, x2, …, xn)

M xn-1

xn

Xét thiết bị hình trên, có số đường vào (dẫn tín hiệu vào) có đường (phát tín hiệu ra) Giả sử tín hiệu vào x1, x2, …, xn (ta gọi đầu vào

hay input) tín hiệu F (đầu hay output) có hai trạng thái khác nhau, tức mang bit thông tin, mà ta ký hiệu

Ta gọi thiết bị với đầu vào đầu mang giá trị 0, mạch lôgic

Đầu mạch lôgic hàm Boole F đầu vào x1, x2, …, xn Ta

nói mạch lơgic hình thực hàm F

Các mạch lôgic tạo thành từ số mạch sở, gọi cổng lôgic Các cổng lôgic sau thực hàm phủđịnh, hội tuyển

1 Cổng NOT: Cổng NOT thực hàm phủ định Cổng có đầu vào Đầu

F(x) phủđịnh đầu vào x

⎩ ⎨ ⎧ = = = = , ) ( x khi khi x x

F x F(x)=x

Chẳng hạn, xâu bit 100101011 qua cổng NOT cho xâu bit 011010100

2 Cổng AND: Cổng AND thực hàm hội Đầu F(x,y) hội (tích) đầu vào ⎩ ⎨ ⎧ = = = = , 1 ) ,

(x y xy khi x y F

trong trường hợp khác.

x y F(x,y)=xy x y z F(x,y,z)=xyz

Chẳng hạn, hai xâu bit 101001101 111010110 qua cổng AND cho 101000100

(122)

3 Cổng OR: Cổng OR thực hàm tuyển (tổng) Đầu F(x,y) tuyển (tổng) đầu vào

⎩ ⎨ ⎧

= =

= =

= + =

0

, 1

1 )

, (

y x khi

y hay x

khi y

x y x F

x y

F(x,y)=x+y x y z t

F=x+y+z+t

Chẳng hạn, hai xâu bit 101001101 111010100 qua cổng OR cho 111011101

8.3.2 Mạch lôgic:

1 Tổ hợp cổng: Các cổng lôgic lắp ghép để mạch lơgic thực hàm Boole phức tạp Như ta biết hàm Boole biểu diễn biểu thức chứa phép −, ., + Từ suy lắp ghép thích hợp cổng NOT, AND, OR để mạch lôgic thực hàm Boole

Thí dụ 6: Xây dựng mạch lơgic thực hàm Boole cho bảng sau

Theo bảng này, hàm F có dạng tổng (tuyển) chuẩn tắc hồn toàn là:

x y z F(x,y,z) 0 0 0 1 0 1 0 1 1 1 1

z y x z xy xyz z

y x

F( , , )= + +

Hình vẽ mạch lơgic thực hàm F cho

z y x z xy xyz

F = + +

x y z

(123)

Biểu thức F(x, y, z) rút gọn: z y x xy z y x z z xy z y x z xy

xyz+ + = ( + )+ = +

Hình cho ta mạch lơgic thực hàm xy+xyz

Hai mạch lơgic hai hình thực hàm Boole, ta nói hai mạch lôgic tương đương, mạch lôgic thứ hai đơn giản

z y x xy

F = +

z x y

Vấn đề tìm mạch lơgic đơn giản thực hàm Boole F cho trước gắn liền với vấn đề tìm biểu thức đơn giản biểu diễn hàm Đây vấn đề khó lý thú, ý nghĩa thực tiễn khơng cịn chục năm trước

Ta vừa xét việc thực hàm Boole mạch lôgic gồm cổng NOT, AND, OR

Dựa vào đẳng thức x+y=x.y xy=x+y, cho ta biết hệ {., −} hệ {+, −} hệđầy đủ Do thực hàm Boole mạch lơgic gồm có cổng NOT, AND NOT, OR

Xét hàm Sheffer Mạch lôgic thực hàm gọi cổng NAND, vẽ hình

⎩ ⎨ ⎧ = = = = = ↑ = 0 , ) , ( y hay x khi y x khi y x y x F

O xy

x y

Dựa vào đẳng thức x=xx,xy =(xy)↑(xy), x+y=(xx)↑(yy), cho ta biết hệ {↑} đầy đủ, nên hàm Boole thực mạch lơgic gồm có cổng NAND

Xét hàm Vebb Mạch lôgic thực hàm gọi cổng NOR, vẽ hình

⎩ ⎨ ⎧ = = = = = ↓ = , 1 ) , ( y x khi y hay x khi y x y x F

Tương tự hệ {↓} đầy đủ nên hàm Boole thực mạch lơgic gồm có cổng NOR

Một phép tốn lơgic quan trọng khác phép tuyển loại:

O xy

x y

(124)

⎩ ⎨ ⎧

≠ = =

⊕ =

,

) , (

y x khi

y x khi y

x y x F

Mạch lôgic cổng lôgic, gọi cổng XOR, vẽ hình

x xy

y

2 Mạch cộng: Nhiều tốn địi hỏi phải xây dựng mạch lơgic có nhiều đường ra, cho đầu F1, F2, …, Fk hàm Boole đầu vào x1, x2, …, xn

F1(x1, x2, …, xn)

F2(x1, x2, …, xn)

Fk(x1, x2, …, xn)

x2

x1

M M

xn-1

xn

Chẳng hạn, ta xét phép cộng hai số tự nhiên từ khai triển nhị phân chúng Trước hết, ta xây dựng mạch duợc dùng để tìm x+y với x, y hai số 1-bit Đầu vào mạch x y Đầu số 2-bit cs, s bit tổng c bit nhớ

x y c s

0 0 0 1 0 1 1

0+0 = 00 0+1 = 01 1+0 = 01 1+1 = 10

Từ bảng trên, ta thấy s= xy,c=xy Ta vẽđược mạch thực hai hàm

y x

s= ⊕ c=xy hình Mạch gọi mạch cộng hai số 1-bit hay mạch cộng bán phần, ký hiệu DA

Xét phép cộng hai số 2-bit a2a1 b2b1,

y x

s= ⊕

x

y

DA

s x

c y

xy c=

1

1

b b

a a

Thực phép cộng theo cột, cột thứ (từ phải sang trái) ta tính a1+b1 bit tổng s1 bit nhớc1; cột thứ hai, ta tính a2 +b2 +c1, tức phải cộng ba số 1-bit

(125)

Cho x, y, z ba số 1-bit Tổng x+y+z số 2-bit cs, s bit tổng x+y+z c bit nhớ x+y+z Các hàm Boole s c theo biến x, y, z xác định bảng sau:

Từ bảng này, dễ dàng thấy rằng:

x y z c s 0 0 0 1 0 1 1 0 1 1 1 1 1 1

z y x

s= ⊕ ⊕

Hàm c viết dạng tổng chuẩn tắc hoàn toàn là:

xyz z xy z y x yz x

c= + + +

Cơng thức c rút gọn:

xy y x z z z xy y x y x z

c= ( + )+ ( + )= ( ⊕ )+

Ta vẽ mạch thực hai hàm Boole s=xyz c=z(xy)+xy

như hình đây, mạch ghép nối hai mạch cộng bán phần (DA) cổng OR Đây mạch cộng ba số 1-bit hay mạch cộng toàn phần, ký hiệu AD

x

y z

DA DA

x y z

s

c

x y z

AD

s s

c c

(126)

Trở lại phép cộng hai số 2-bit a2a1 b2b1 Tổng a2a1+b2b1 số 3-bit

1 2s s

c , s1 bit tổng a1+b1: s1=a1⊕b1, s2 bit tổng a2+b2+c1, với c1

là bit nhớ a1+b1: s2 =a2⊕b2⊕c1 c2 bit nhớ a2+b2+c1

Ta có mạch thực ba hàm Boole s1, s2, c2 hình

b2 a2 b1 a1

Dễ dàng suy mạch cộng hai số n-bit, với n số nguyên dương Hình sau cho mạch cộng hai số 4-bit

c2

c1

DA AD

s2 s1

b4 a4 b3 a3 b2 a2 b1 a1

DA AD

c4

AD

c2

AD

c3 c1

s4 s3 s2 s1

8.4 CỰC TIỂU HỐ CÁC MẠCH LƠGIC.

Hiệu mạch tổ hợp phụ thuộc vào số cổng bố trí cổng Q trình thiết kế mạch tổ hợp bắt đầu bảng rõ giá trị đầu tổ hợp giá trị đầu vào Ta ln ln sử dụng khai triển tổng tích mạch để tìm tập cổng lơgic thực mạch Tuy nhiên,khai triển tổng tích chứa số hạng nhiều mức cần thiết Các số hạng khai triển tổng tích khác biến, cho số hạng xuất biến số hạng xuất phần bù nó, tổ hợp lại Chẳng hạn, xét mạch có đầu x = y = z = x = z = y =

0 Khai triển tổng tích mạch xyz+xyz Hai tích khai triển khác biến, biến y Ta tổ hợp lại sau:

xz xz xz y y z y x

xyz+ =( + ) =1 =

(127)

Do xz biểu thức với phép tốn biểu diễn mạch cho Mạch thứ hai dùng cổng, mạch thứ phải dùng ba cổng bộđảo (cổng NOT)

8.4.1 Bản đồ Karnaugh:

Để làm giảm số số hạng biểu thức Boole biểu diễn mạch, ta cần phải tìm số hạng để tổ hợp lại Có phương pháp đồ thị, gọi đồ Karnaugh, dùng để tìm số hạng tổ hợp hàm Boole có số biến tương đối nhỏ Phương pháp mà ta mô tả Maurice Karnaugh đưa vào năm 1953 Phương pháp dựa cơng trình trước E.W Veitch Các đồ Karnaugh cho ta phương pháp trực quan để rút gọn khai triển tổng tích, chúng khơng thích hợp với việc khí hố q trình Trước hết, ta minh hoạ cách dùng đồ Karnaugh để rút gọn biểu thức hàm Boole hai biến

Có bốn hội sơ cấp khác khai triển tổng tích hàm Boole có hai biến x y Một đồ Karnaugh hàm y

xy xy

y

x xy

y

Boole hai biến gồm bốn ô vng, hình vng

x

biểu diễn hội sơ cấp có mặt khai triển ghi số

x

Các hình gọi kề hội sơ cấp mà chúng biểu diễn khác biến

Thí dụ 7: Tìm đồ Karnaugh cho biểu thức:

a) xy+xy b) xy+xy c) xy+xy+xy

và rút gọn chúng

Ta ghi số vào ô vuông hội sơ cấp biểu diễn ô có mặt khai triển tổng tích Ba đồ Karnaugh cho hình sau

x

x

y

1

y x

x

1

1 1

y

Việc nhóm hội sơ cấp hình cách sử dụng đồ Karnaugh cho khai triển Khai triển cực tiểu tổng tích tương ứng là: a) y, b) xy+xy, c) x+y

Bản đồ Karnaugh ba biến hình chữ nhật chia thành tám Các biểu diễn tám hội sơ cấp có Hai ô yz yz yz yz gọi kề hội sơ cấp mà chúng

x

x xyz xyz xyz xyz yz

x xyz xyz xyz

biểu diễn khác biến Một cách để lập đồ Karnaugh ba biến cho hình bên

(128)

Để rút gọn khai triển tổng tích ba biến, ta dùng đồ Karnaugh để nhận dạng hội sơ cấp tổ hợp lại Các khối gồm hai ô kề biểu diễn cặp hội sơ cấp tổ hợp lại thành tích hai biến; khối x x biểu diễn hội sơ cấp tổ hợp lại thành biến nhất; cịn khối gồm tất tám biểu diễn tích khơng có biến nào, cụ thểđây biểu thức

Thí dụ 8: Dùng đồ Karnaugh ba biến để rút gọn khai triển tổng tích sau: a) xyz+xyz+xyz+xyz,

b) xyz+xyz+xyz+xyz+xyz,

c) xyz+xyz+xyz+xyz+xyz+xyz+xyz

Bản đồ Karnaugh cho khai triển tổng tích cho hình sau:

Việc nhóm thành khối cho thấy khai triển cực tiểu thành tổng Boole tích Boole là:

z y z

y z

y yz

x

x 1

1

z

y yz yz

yz

1

1 1

1 1 1 1

x

x

x

x

yz yz yz yz

a) xz+ yz+xyz, b) y+xz, c) x+y+z

Bản đồ Karnaugh bốn biến hình vng chia làm 16 ô Các ô biểu diễn 16 hội sơ cấp có Một cách lập đồ Karnaugh bốn biến cho hình

Hai ô gọi kề hội sơ cấp mà chúng biểu diễn khác biến Do đó, kề với bốn ô khác Sự rút gọn khai triển tổng tích bốn biến thực cách nhận dạng khối gồm 2, 4, 16 ô biểu diễn hội sơ cấp tổ hợp lại Mỗi ô biểu diễn hội sơ cấp dùng để lập tích có biến đưa vào khai triển Cũng trường

wx x w

x w

x w

z y z

y z

y yz

wxyz wxyz wxyz wxyz

yz x

w wxyz wxyz wxyz

yz x

w wxyz wxyz wxyz

xyz

w wxyz wxyz wxyz

(129)

hợp đồ Karnaugh hai ba biến, mục tiêu cần phải nhận dạng khối lớn có chứa số cách dùng số khối, mà trước hết khối lớn

8.4.2 Phương pháp Quine-McCluskey:

8.4.2.1 Mở đầu: Ta thấy đồ Karnaugh dùng để tạo biểu thức cực tiểu hàm Boole tổng tích Boole Tuy nhiên, đồ Karnaugh khó dùng số biến lớn bốn Hơn nữa, việc dùng đồ Karnaugh lại dựa việc rà soát trực quan để nhận dạng số hạng cần nhóm lại Vì ngun nhân đó, cần phải có thủ tục rút gọn khai triển tổng tích khí hố Phương pháp Quine-McCluskey thủ tục Nó dùng cho hàm Boole có số biến Phương pháp W.V Quine E.J McCluskey phát triển vào năm 1950 Về bản, phương pháp Quine-McCluskey có hai phần Phần đầu tìm số hạng ứng viên đểđưa vào khai triển cực tiểu tổng tích Boole mà ta gọi nguyên nhân nguyên tố Phần thứ hai xác định xem số ứng viên đó, số hạng thực dùng

8.4.2.2 Định nghĩa: Cho hai hàm Boole F G bậc n Ta nói G nguyên nhân F TG⊂TF, nghĩa G⇒F

Dễ thấy hội sơ cấp dạng tổng chuẩn tắc F nguyên nhân F Hội sơ cấp A F gọi nguyên nhân nguyên tố F A xố biến hội nhận đuợc khơng nguyên nhân F

Nếu F1, …, Fk nguyên nhân F , Khi

Do

nguyên nhân F F F T

T i ⊂ 1≤ik

U

k i F F F T T

Tk i

i i =1

⊂ =

= = k i i F

Cho S hệ nguyên nhân F Ta nói hệ S đầy đủđối với F , nghĩa

∈ = S G G F

U

S G G F T T ∈ =

8.4.2.3 Mệnh đề: Hệ nguyên nhân nguyên tố hàm F hệđầy đủ

Chứng minh: Gọi S hệ nguyên nhân nguyên tố F Ta có TGTF,∀gS, Nên F Giả sử dạng tổng chuẩn tắc hoàn toàn F

S G

G G T T

T S G ⊂ = ∈

U

= ' ' ' S G G F

nên

U

' ' ' S G G F T T ∈ =

Xét 'G'∈S , G’ nguyên nhân nguyên tố F cách xố bớt số biến G’ ta thu nguyên nhân nguyên tố G F Khi

hay Vì hay

G G T

T ' ⊂

U

U

(130)

Dạng tổng chuẩn tắc

∈ = S G G

F gọi dạng tổng chuẩn tắc thu gọn F

8.4.2.4 Phương pháp Quine-McCluskey tìm dạng tổng chuẩn tắc thu gọn:

Giả sử F hàm Boole n biến x1, x2, …, xn Mỗi hội sơ cấp n biến

được biểu diễn dãy n ký hiệu bảng {0, 1, −} theo quy ước: ký tự thứ i hay xi có mặt hội sơ cấp bình thường hay với dấu phủ định, cịn xi

khơng có mặt ký tự − Chẳng hạn, hội sơ cấp biến x1, …, x6 x1x3x4x6

được biểu diễn 0−11−0 Hai hội sơ cấp gọi kề biểu diễn nói chúng khác vị trí 0, Rõ ràng hội sơ cấp dán với phép dán Ax+Ax=A chúng kề

Thuật toán tiến hành sau: Lập bảng gồm nhiều cột để ghi kết dán Sau thực bước sau:

Bước 1: Viết vào cột thứ biểu diễn nguyên nhân hạng n hàm Boole

F Các biểu diễn chia thành nhóm, biểu diễn nhóm có số ký hiệu nhóm xếp theo thứ tự số ký hiệu tăng dần

Bước 2: Lần lượt thực tất phép dán biểu diễn nhóm i với biểu diễn nhóm i+1 (i=1, 2, …) Biểu diễn tham gia phép dán sẽđược ghi nhận dấu * bên cạnh Kết dán ghi vào cột

Bước 3: Lặp lại Bước cho cột khơng thu thêm cột Khi tất biểu diễn khơng có dấu * cho ta tất nguyên nhân nguyên tố F

Thí dụ 9: Tìm dạng tổng chuẩn tắc thu gọn hàm Boole:

wxyz xyz w yz x w z y x w yz x w z y x w z y x w

F1 = + + + + + + ,

wxyz z wxy z y wx z y wx yz x w yz x w z y x w

F2 = + + + + + +

Từ bảng ta có dạng tổng chuẩn tắc thu gọn F1 F2 là:

0 * 1 * 0 1 * 0 * 1 * 1 * 1 1 *

− * 0 − *

− 0 * − 1 * − *

− * − 1 *

− 1 * − 1 *

−−

− − −− 1

0 * 0 1 * 1 0 * 1 * 1 * 1 * 1 1 *

0 −

−0 1

1 − * 1 − * − 1

1 − * 1 − *

1 −−

yz z x z w

F1 = + + ,

2 wxy xyz wyz wx

F = + + +

(131)

8.4.2.5 Phương pháp Quine-McCluskey tìm dạng tổng chuẩn tắc tối thiểu:

Sau tìm dạng tổng chuẩn tắc thu gọn hàm Boole F, nghĩa tìm tất nguyên nhân nguyên tố nó, ta tiếp tục phương pháp Quine-McCluskey tìm dạng tổng chuẩn tắc tối thiểu (cực tiểu) F sau

Lập bảng chữ nhật, cột ứng với cấu tạo đơn vị F (mỗi cấu tạo đơn vị hội sơ cấp hạng n dạng tổng chuẩn tắc hồn tồn F) dịng ứng với nguyên nhân nguyên tố F Tại ô (i, j), ta đánh dấu cộng (+) nguyên nhân nguyên tố dòng i phần cấu tạo đơn vị cột j Ta nói nguyên nhân nguyên tố i phủ cấu tạo đơn vị j Một hệ S nguyên nhân nguyên tố F gọi phủ hàm F cấu tạo đơn vị F phủ thành viên hệ Dễ thấy hệ S phủ hàm F đầy đủ, nghĩa tổng thành viên S F

Một nguyên nhân nguyên tố gọi cốt yếu thiếu hệ ngun nhân ngun tố khơng thể phủ hàm F Các nguyên nhân nguyên tố cốt yếu tìm sau: cột có dấu +, xem dấu + thuộc dịng dịng ứng với ngun nhân ngun tố cốt yếu

Việc lựa chọn nguyên nhân nguyên tố bảng đánh dấu, để dạng tổng chuẩn tắc tối thiểu, tiến hành theo bước sau

Bước 1: Phát tất nguyên nhân nguyên tố cốt yếu

Bước 2: Xoá tất cột phủ nguyên nhân nguyên tố cốt yếu

Bước 3: Trong bảng cịn lại, xố nốt dịng khơng cịn dấu + sau có hai cột giống xố bớt cột

Bước 4: Sau bước trên, tìm hệ S nguyên nhân nguyên tố với số biến phủ cột lại

Tổng nguyên nhân nguyên tố cốt yếu nguyên nhân nguyên tố hệ S dạng tổng chuẩn tắc tối thiểu hàm F

Các bước 1, 2, có tác dụng rút gọn bảng trước lựa chọn Độ phức tạp chủ yếu nằm Bước Tình tốt nguyên nhân nguyên tố cốt yếu Trường hợp khơng phải lựa chọn hàm F có dạng tổng chuẩn tắc tối thiểu dạng tổng chuẩn tắc thu gọn Tình xấu khơng có ngun nhân nguyên tố cốt yếu Trường hợp ta phải lựa chọn tồn bảng

Thí dụ 10: Tìm dạng tổng chuẩn tắc tối thiểu hàm Boole cho Thí dụ

z y x

w wxyz wxyz wxyz wxyz wxyz wxyz

z

w + + +

z

x + + + +

yz + + + +

(132)

Các nguyên nhân nguyên tốđều cốt yếu nên dạng tổng chuẩn tắc tối thiểu F1 là: yz

z x z w

F1= + +

z y x

w wxyz wxyz wxyz wxyz wxyz wxyz

wx + + + +

y x

w + +

yz

x + +

wyz + +

Các nguyên nhân nguyên tố cốt yếu nằm dòng Sau rút gọn, bảng dòng 3, cột Việc chọn S đơn giản: chọn hai nguyên nhân nguyên tố cịn lại Vì ta hai dạng tổng chuẩn tắc tối thiểu là:

yz x y x w wx

F2 = + + ,

wyz y x w wx

F2 = + +

(133)

BÀI T

P CH

ƯƠ

NG VIII:

1 Cho S tập hợp ước nguyên dương 70, với phép tốn •, + được định nghĩa S sau:

a • b = UCLN(a, b), a + b = BCNN(a, b), a = 70/a

Chứng tỏ S với phép tốn •, + lập thành đại số Boole

2. Chứng minh trực tiếp định lý 6b, 7b, 8b (không dùng đối ngẫu để suy từ 6a, 7a, 8a)

3. Chứng minh rằng:

a) (a+b).(a+b’) = a;

b) (a.b)+(a’.c) = (a+c).(a’+b)

4. Cho hàm Boole F1, F2, F3 xác định bảng sau:

x y z F1 F2 F3

0 0 1

0 1

0 0 1

0 1 1

1 0 1

1 0

1 0 1

1 1 1

Vẽ mạch thực hàm Boole

5. Hãy dùng cổng NAND để xây dựng mạch với đầu sau:

a) x b)xy c)x+y d) x y ⊕

6. Hãy dùng cổng NOR để xây dựng mạch với đầu cho Bài tập 5

7. Hãy dùng cổng NAND để dựng mạch cộng bán phần

8. Hãy dùng cổng NOR để dựng mạch cộng bán phần

9. Dùng đồ Karnaugh, tìm dạng tổng chuẩn tắc tối thiểu (khai triển cực tiểu) hàm Boole ba biến sau:

a) F = xyz+xyz

b) F =xyz+xyz++xyz+xyz

c) F = xyz++xyz+xyz+xyz+xyz

d) F =xyz+xyz+xyz+xyz+xyz+xyz

(134)

10. Dùng đồ Karnaugh, tìm dạng tổng chuẩn tắc tối thiểu hàm Boole bốn biến sau:

a) F =wxyz+wxyz+wxyz+wxyz+wxyz

b) F =wxyz+wxyz+wxyz+wxyz+wxyz+wxyz

c) F =wxyz+wxyz+wxyz+wxyz+wxyz+wxyz+wxyz+wxyz

d) F =wxyz+wxyz+wxyz+wxyz+wxyz+wxyz+wxyz+wxyz+wxyz

11. Dùng phương pháp Quine-McCluskey, tìm dạng tổng chuẩn tắc tối thiểu hàm Boole ba biến cho Bài tập vẽ mạch thực dạng tối thiểu tìm

12. Dùng phương pháp Quine-McCluskey, tìm dạng tổng chuẩn tắc tối thiểu hàm Boole bốn biến cho Bài tập vẽ mạch thực dạng tối thiểu tìm

13. Hãy giải thích làm dùng đồ Karnaugh để rút gọn dạng tích chuẩn tắc (tích tổng) hoàn toàn hàm Boole ba biến (Gợi ý: Đánh dấu số tất tuyển sơ cấp biểu diễn tổ hợp khối tuyển sơ cấp.)

14. Dùng phương pháp Bài tập 13, rút gọn dạng tích chuẩn tắc hoàn toàn: )

)( )(

)(

(x y z x y z x y z x y z

F = + + + + + + + +

(135)

TÀI LI

U THAM KH

O

[1] Nguyễn Cam-Chu Đức Khánh, Lý thuyết đồ thị, NXB Thành phố Hồ Chí Minh, 1999

[2] Hồng Chúng,Đại cương tốn học hữu hạn, NXB Giáo dục, 1997

[3] Phan Đình Diệu, Lý thuyết Ơ-tơ-mat thuật toán, NXB Đại học THCN, 1977

[4] ĐỗĐức Giáo, Toán rời rạc, NXB Đại học Quốc Gia Hà Nội, 2000

[5] Nguyễn Xuân Quỳnh, Cơ sở toán rời rạc ứng dụng, NXB Giáo dục, 1995 [6] Đặng Huy Ruận, Lý thuyết đồ thị ứng dụng, NXB Khoa học Kỹ thuật, 2000

[7] Nguyễn Tơ Thành-Nguyễn Đức Nghĩa, Tốn rời rạc, NXB Giáo dục, 1997 [8] Claude Berge, Théorie des graphes et ses applications, Dunod, Paris 1963

[9] Richard Johnsonbaugh, Discrete Mathematics, Macmillan Publishing Company, New york 1992

(136)

PH

N PH

L

C

Ph

l

c 1

Unit ch

a khai báo c

u trúc d

li

u cho

đồ

th

và cài

đặ

t th

t

c tìm

đườ

ng

đ

i ng

n nh

t theo thu

t toán

unit Func_DoThi;

interface

type

TypeToaDo=record x,y:integer; end;

TypeChiPhi=record

VoCung:boolean;//Neu VoCung=True thi co nghia la chi phi bang Vo Cung, nguoc lai thi chi phi bang Gia

Gia:real; end;

TypeDinh=record Ten:String;

ToaDo:TypeToaDo; MucKichHoat:Byte; end;

TypeDanhSachDinh=array of TypeDinh; TypeCanh=record

DinhDau,DinhCuoi:Integer;//Tham chieu danh sach Dinh TrongSo:TypeChiphi;

end;

TypeDanhSachCanh=Array of TypeCanh; TypeDoThi=Record

SoDinh:Integer;

DSDinh:TypeDanhSachDinh; SoCanh:Integer;

DSCanh:TypeDanhSachCanh; end;

TypeCost=Array of Array of TypeChiPhi; TypeDist=Array of TypeChiPhi;

TypeDuongDi=Array of Integer;

Function DuongDiNganNhat(G:TypeDoThi;X,Y:Integer;Var DuongDiTuXdenY:TypeDuongDi;Var ChiPhi:real):Boolean; Procedure DeleteGraph(VAR G:TypeDoThi);

var G:TypeDoThi;

(137)

implementation

Function DuongDiNganNhat(G:TypeDoThi;X,Y:Integer;Var DuongDiTuXdenY:TypeDuongDi;var ChiPhi:real):Boolean; Var s:Array of byte;{S[i]=0 hoac S[i]=1}

Cost:TypeCost;Dist:TypeDist;MocXich:Array of Integer; M,i,j,K,u,w:Integer;

Min:TypeChiPhi; begin

M:=G.SoDinh; {Thuc M=N, ma tran vuong kich thuoc MxM} Setlength(Cost,M,M);

Setlength(Dist,M); Setlength(MocXich,M); Setlength(S,M);

for i:=0 to M-1 for j:=0 to M-1

Cost[i,j].VoCung:=True; for k:=0 to G.SoCanh-1 begin

i:=G.DSCanh[K].DinhDau;j:=G.DSCanh[K].DinhCuoi; Cost[i,j]:=G.DSCanh[K].TrongSo;

end;

for i:=0 to M-1

begin S[i]:=0;Dist[i]:=Cost[X,i];MocXich[i]:=X;end;

S[X]:=1;Dist[X].VoCung:=False;Dist[X].Gia:=0;K:=2; {Dua X vao S} while k<M {Xac dinh M-1 duong di}

begin u:=0;

While S[u]<>0 u:=u+1; Min:=Dist[u];i:=u+1; While i<M

begin

If S[i]=0 then

If ((Min.VoCung)and(not Dist[i].VoCung))or

((Not min.VoCung)and((not Dist[i].VoCung)and(min.Gia>Dist[i].Gia))) then

begin Min:=Dist[i];u:=i;end; i:=i+1;

end;

S[u]:=1;k:=k+1;{Dua u vao tap S} For w:=0 to M-1

if S[w]=0 then begin

If (not Dist[u].VoCung)and(not Cost[u,w].VoCung)and

(138)

then begin

Dist[w].VoCung:=false;

Dist[w].Gia:=Dist[u].Gia+Cost[u,w].Gia;

MocXich[w]:=u;{Duong di ngan nhat den W thi phai di qua U} end;

end; end;

{Tim duong di tu X den Y} Setlength(DuongDiTuXdenY,M); If not Dist[Y].VoCung then begin

DuongDiNganNhat:=true; ChiPhi:=Dist[Y].gia;

{Xac dinh cac dinh phai di qua (theo day chuyen nguoc)} {k:=0;DuongDiTuXdenY[k]:=Y;k:=k+1;

i:=MocXich[Y];DuongDiTuXdenY[k]:=i;} K:=0;i:=Y;DuongDiTuXdenY[k]:=i; while i<>X

begin

i:=MocXich[i];k:=k+1;DuongDiTuXdenY[k]:=i; end;

{Vi chuoi chua DuongDiTuXdenY la mot chuoi nguoc nen ta se dao lai} for i:=0 to (k div 2)

begin

j:=DuongDiTuXdenY[i];

DuongDiTuXdenY[i]:=DuongDiTuXdenY[K-i]; DuongDiTuXdenY[K-i]:=j;

end;

{Dat lai kich thuoc cua mang DuongDiTuXdenY bang so dinh phai di qua} Setlength(DuongDiTuXdenY,K+1);

end

else DuongDiNganNhat:=false; Setlength(Cost,0,0);

Setlength(Dist,0); Setlength(MocXich,0); Setlength(S,0);

end;

Procedure DeleteGraph(VAR G:TypeDoThi); begin

G.SoDinh:=0; G.SoCanh:=0;

Setlength(G.DSDinh,0); Setlength(G.DSCanh,0); end;

BEGIN

G.SoDinh :=0;G.SoCanh:=0;

(139)

END

Thiết kế giao diện cho chương trình (Form 2)

Với đối tượng gồm:

Các khai báo cài đặt cho chương form2:

(140)

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, Buttons, ExtCtrls,Func_Dothi,Func_Graph,

Menus,IdGlobal, ImgList,Jpeg; const BanKinh=20;

RMuiTen=10; type

TForm2 = class(TForm) Panel1: TPanel;

MaskEdit1: TMaskEdit; MaskEdit2: TMaskEdit; StaticText1: TStaticText; StaticText2: TStaticText; MainMenu1: TMainMenu;

imduongdingannhat1: TMenuItem; imduongdingannhat2: TMenuItem; Caykhungbenhat1: TMenuItem; Image1: TImage;

PopupMenu1: TPopupMenu; Rename1: TMenuItem; Delete1: TMenuItem; N1: TMenuItem; N2: TMenuItem;

ImageList1: TImageList; File1: TMenuItem; New1: TMenuItem; Open1: TMenuItem; Save1: TMenuItem; N3: TMenuItem; Exit1: TMenuItem; ScrollBox1: TScrollBox; PaintBox1: TPaintBox; Save2: TMenuItem; N6: TMenuItem;

ExportPicturefile1: TMenuItem; DeleteAll1: TMenuItem;

SaveDialog1: TSaveDialog; OpenDialog1: TOpenDialog; ImageList2: TImageList; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; ExportPicturefile2: TMenuItem;

(141)

N4: TMenuItem;

procedure PaintBox1DragDrop(Sender, Source: TObject; X, Y: Integer); procedure PaintBox1DragOver(Sender, Source: TObject; X, Y: Integer; Statct; DragStatc; var Accept: Boolean);

(142)

Procedure VeDoThi(G:TypeDothi;Pic:Tbitmap;Imagelist:Timagelist); Function Delen(x,y,Width,Height:integer;DinhDown:integer):boolean; Procedure

Veline(T1,T2:TypeToaDo;Gia:real;Pic:Tbitmap;LineColor:Tcolor;TimeDelay:TdateTi me);

implementation

{$R *.dfm}

Function MidPoint(T1,T2:TypeToaDo;PhanTram:Integer):TypeToaDo; Var Dx,Dy:integer;

begin

Dx:=T2.x -T1.x ;Dy:=T2.y -T1.y ;

MidPoint.x:=T1.x +Round(Dx*PhanTram/100); MidPoint.y:=T1.y +Round(Dy*PhanTram/100); end;

Procedure

Veline(T1,T2:TypeToaDo;Gia:real;Pic:Tbitmap;LineColor:Tcolor;TimeDelay:TdateTi me);

var i:integer;T3:TypeToaDo;TimeNow:TDateTime; TempPic:Tbitmap;

begin

TempPic:=Tbitmap.Create; For i:=1 to 100

begin

TempPic.Assign(Pic); TimeNow:=Time; T3:=MidPoint(T1,T2,i);

Vecung(TempPic,T1,T3,Gia,True,RGB(255,0,0),RGB(0,0,255)); Form2.DrawPaint(Form2.PaintBox1,TempPic);

repeat

Application.ProcessMessages; until (TimeNow+TimeDelay)>Time; end;

TempPic.Free; end;

Procedure TForm2.DrawPaint(PaintBox:TPaintBox;Bitmap:TBitmap); begin

Paintbox.Canvas.Draw(0,0,Bitmap); end;

procedure CatZeroThua(var St:string); var i,P,L:integer;

begin

L:=length(st);

If St[L]=' ' then begin delete(st,1,L);L:=length(st);end; P:=pos('.',st);i:=L;

(143)

If P=0 then exit;

while (i>P)and(st[i]='0') i:=i-1; If st[i]='.' then i:=i-1;

delete(St,i+1,L-i); end;

Function Quay(P,Tam:TypeToaDo;Goc:Real):TypeToaDo; Var Q:TypeToaDo;

begin

Goc:=Goc*Pi/180; P.x:=P.x-Tam.x; P.y:=P.y-Tam.y;

Q.x:=Round(P.x*Cos(goc)-P.y*Sin(goc)); Q.y:=Round(P.x*Sin(goc)+P.y*Cos(goc)); Q.x:=Q.x+Tam.x;

Q.y:=Q.y+Tam.y; Quay:=Q;

end; procedure

Vecung(Pic:Tbitmap;T1,T2:TypeToaDo;Gia:Real;Line:Boolean;LineColor,TextColor: Tcolor);

var DX,DY,X,Y:Integer;P,Q1,Q2:TypeToaDo;L,TL:real;St:String; begin

DX:=T2.x-T1.x;DY:=T2.y-T1.y; L:=sqrt(DX*DX+DY*DY); if L<=2*Bankinh then exit; TL:=BanKinh/L;

Q1.X:=round(T1.x+DX*TL); Q1.Y:=round(T1.y+DY*TL); Q2.X:=round(T2.x-DX*TL); Q2.Y:=round(T2.y-DY*TL); T1:=Q1;T2:=Q2;

DX:=T2.x-T1.x;DY:=T2.y-T1.y; L:=sqrt(DX*DX+DY*DY); If L=0 then exit;

TL:=RMuiTen/L;

P.X:=round(T2.x-DX*TL); P.Y:=round(T2.y-DY*TL); Q1:=Quay(P,T2,-35); Q2:=Quay(P,T2,35);

pic.Canvas.Brush.Style:=bsSolid; pic.Canvas.Brush.Color:=LineColor; pic.Canvas.Pen.Color:=LineColor; If Line then

begin pic.Canvas.MoveTo(T1.x,T1.y); pic.Canvas.LineTo(T2.x,T2.y) end;

(144)

Pic.Canvas.Polygon([point(T2.x,T2.y),point(Q1.x,Q1.y),point((T2.x+P.x) div 2,(T2.y+P.y) div 2),point(Q2.x,Q2.y)]);

str(Gia:0:10,st);CatZeroThua(st); Pic.Canvas.Font.Color:=TextColor; Pic.Canvas.Font.Size:=TextSizeTrongSo; Pic.Canvas.Brush.Style:=bsclear;

Pic.Canvas.TextOut(T2.x-((T2.x-T1.x) div 3),T2.y -((T2.y-T1.y)div 3),St); end;

Function Delen(x,y,Width,Height:integer;DinhDown:integer):boolean; Var i,W,H:integer;

begin

for i:=0 to G.SoDinh-1 begin

If (i<>DinhDown)and((G.DSDinh[i].ToaDo.x-Width<x)and(x<G.DSDinh[i].ToaDo.x+Width))

and((G.DSDinh[i].ToaDo.y-Height<y)and(y<G.DSDinh[i].ToaDo.y+Height)) then begin

Delen:=true;exit; end;

end;

Delen:=false; end;

Procedure VeDoThi(G:TypeDothi;Pic:Tbitmap;Imagelist:Timagelist);

Var i,j:integer;R:Trect;W,H:Integer; T1,T2:TypeToaDo;LineColor,TextColor:Tcolor; Bitmap:Tbitmap;

begin

Pic.Canvas.Brush.Style:=bsSolid; Pic.Canvas.Pen.Style:=psSolid;

Pic.Canvas.Brush.Color:=rgb(255,255,255); Pic.Canvas.Pen.Color:=rgb(255,255,255);

Pic.Canvas.FillRect(Rect(0,0,Pic.Width,Pic.Height)); Bitmap:=Tbitmap.Create;

Bitmap.PixelFormat:=Pf24bit; For i:=0 to G.SoDinh-1 with G.DSDinh[i] begin

W:=Imagelist.Width; H:=Imagelist.Height; Imagelist.GetBitmap(MucKichHoat,Bitmap);

R:=Rect(Toado.x-(W div 2),ToaDo.y-(H div 2),Toado.x+(W div 2),ToaDo.y+(H div 2));

//Pic.Canvas.Draw(Toado.x-(W div 2),ToaDo.y-(H div 2),Bitmap); Pic.Canvas.Brush.Style:=bsClear;

Pic.Canvas.BrushCopy(R,Bitmap,Rect(0,0,Bitmap.Width-1,Bitmap.Height-1),RGB(255,255,255));

Bitmap.FreeImage;

(145)

Pic.Canvas.Font.Color:=rgb(0,255,0); Pic.Canvas.Brush.Style:=bsClear; W:=Pic.Canvas.TextWidth(ten); H:=Pic.Canvas.TextHeight(ten); If W<Imagelist.Width then

Pic.Canvas.TextRect(R,Toado.x-(W div 2),ToaDo.y-(H div 2),ten ) else

Pic.Canvas.TextRect(R,R.Left,ToaDo.y-(H div 2),ten ); end;

Bitmap.Free;

LineColor:=RGB(0,0,255); TextColor:=RGB(255,0,0); for i:=0 to G.SoCanh -1 with G.DSCanh[i] begin

T1:=G.DsDinh[DinhDau].ToaDo; T2:=G.DsDinh[DinhCuoi].ToaDo;

Vecung(Pic,T1,T2,Trongso.Gia,true,LineColor,TextColor); end;

end;

(146)

count:=count+1;

If G.DSDinh[i].MucKichHoat=1 then D1:=i else D2:=i; If count=2 then i:=G.SoDinh

end; i:=i+1; end;

TimCacDinhKichHoat:=count; end;

function TimCung(G:TypeDoThi;D1,D2:integer; var Chiso:integer):Boolean; var i:integer;

begin

Timcung:=false;

for i:=0 to G.SoCanh -1

If (G.DSCanh[i].DinhDau=D1)and(G.DSCanh[i].DinhCuoi=D2) then begin

ChiSo:=i;

TimCung:=true; exit;

end; end;

procedure Tform2.HienThamSoCung(G:TypeDoThi); var i,D1,D2,count,loi:integer;St:string;

begin

maskedit1.Enabled:=False;maskedit1.Text:=''; maskedit2.Enabled:=False;maskedit2.Text:=''; statictext1.Caption:='';

statictext2.Caption:='';

If TimCacDinhKichHoat(G,D1,D2)=2 then begin count:=0;

maskedit1.Enabled:=False;maskedit1.Text:=''; maskedit2.Enabled:=False;maskedit2.Text:=''; statictext1.Caption:='';

statictext2.Caption:='';

SpeedButton1.Down:=False; SpeedButton2.Down:=False; i:=0;

while i<=(G.SoCanh-1) begin

if (G.DSCanh[i].DinhDau=D2)and(G.DSCanh[i].DinhCuoi=D1) then begin

statictext1.Caption:=G.DSDinh[D2].Ten + ' ->' + G.DSDinh[D1].Ten; str(G.DSCanh[i].TrongSo.Gia:0:10,st);

catzerothua(st); maskedit1.Text:=(st); maskedit1.Enabled:=true; SpeedButton1.Down:=True; Count:=count+1;

(147)

end else

if (G.DSCanh[i].DinhDau=D1)and(G.DSCanh[i].DinhCuoi=D2) then begin

statictext2.Caption:=G.DSDinh[D2].Ten + '< -' + G.DSDinh[D1].Ten; str(G.DSCanh[i].TrongSo.Gia:0:0,st);

catzerothua(st); maskedit2.Text:=st; maskedit2.Enabled:=true; SpeedButton2.Down:=True; Count:=count+1;

If count=2 then i:=G.SoCanh; end;

i:=i+1; end;

//bitbtn2.Enabled:=True; //bitbtn3.Enabled:=True; SpeedButton1.Enabled:=True; SpeedButton2.Enabled:=True; end

else begin

//bitbtn2.Enabled:=False; //bitbtn3.Enabled:=False; SpeedButton1.Enabled:=False; SpeedButton2.Enabled:=False; end;

end;

procedure TForm2.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var i:integer;T:Tpoint; begin

i:=DownDinh(x,y,G);

If (button=mbRight)and(i<>-1) then begin

DinhDown:=i;

T:=PaintBox1.ClientToScreen(Point(x,y)); PopupMenu1.Popup(T.X,T.Y);

exit; end; If i<>-1 then begin

Mouse_Down:=true; DinhDown:=i;

if G.DSDinh[i].MucKichHoat=0 then begin

(148)

KhuKichHoatThua(G);

G.DSDinh[i].MucKichHoat:=1; Dx:=x-G.DSDinh[i].ToaDo.x; Dy:=y-G.DSDinh[i].ToaDo.y; end

else

G.DSDinh[i].MucKichHoat:=0; HienThamSoCung(G);

end; end;

procedure TForm2.PaintBox1DragDrop(Sender, Source: TObject; X, Y: Integer); Var H:Integer;

begin

if {(Sender is TListBox) and} (Source is Timage) then If Timage(Source).Name ='Image1' then

begin

G.SoDinh:=G.SoDinh+1;

Setlength(G.DSDinh,G.SoDinh); G.DSDinh[G.SoDinh-1].ToaDo.X:=x; G.DSDinh[G.SoDinh-1].ToaDo.Y:=y;

G.DSDinh[G.SoDinh-1].Ten:='T' + InttoStr(G.SoDinh); VeDoThi(G,Pic,imagelist1);

DrawPaint(PaintBox1,Pic); FileChanged:=true;

end; end;

procedure TForm2.PaintBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);

Var i:integer; begin

Accept:=true; i:=0;

While i<=(G.SoDinh-1)

if not Delen(x,y,imagelist1.Width,imagelist1.Height,i) then i:=i+1

else begin

Accept:=False; i:=G.SoDinh; end;

If Accept then begin

VeDoThi(G,Pic,imagelist1);

Pic.Canvas.Draw(x+20,y,Image1.Picture.Bitmap); DrawPaint(PaintBox1,Pic);

end

(149)

else begin

VeDoThi(G,Pic,imagelist1); DrawPaint(PaintBox1,Pic); end;

end;

procedure TForm2.FormResize(Sender: TObject); begin

If (self.WindowState<>wsMinimized)and((pic is Tbitmap)) then begin

Pic.Width:=Paintbox1.Width; Pic.Height:=Paintbox1.Height; end;

end;

procedure TForm2.FormCreate(Sender: TObject); begin

Pic:=Tbitmap.Create; Pic.PixelFormat:=Pf24bit; Pic.Width:=Paintbox1.Width; Pic.Height:=Paintbox1.Height; FileChanged:=false;

Filename:='';

Self.Caption:='Graph Algorithm - New documents' end;

function TForm2.DownDinh(x,y:integer;G:TypeDothi):integer; var i:integer;

begin

For i:=0 to G.Sodinh-1 with G.DSDinh[i]

If Sqrt(sqr(Toado.x-x)+sqr(Toado.y-y))<20 then begin

DownDinh:=i; exit; end;

DownDinh:=-1; end;

procedure TForm2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

If mouse_Down then begin

if (not Delen(x,y,imagelist1.Width,imagelist1.Height,DinhDown)) and((0<x)and(x<Pic.Width)and(0<y)and(y<Pic.Height)) then begin

(150)

G.DSDinh[DinhDown].ToaDo.y:=y-Dy; VeDoThi(G,Pic,imagelist1);

DrawPaint(PaintBox1,Pic); end

end else begin end; end;

procedure TForm2.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

If mouse_Down then

if (not Delen(x,y,imagelist1.Width,imagelist1.Height,DinhDown)) and((0<x)and(x<Pic.Width)and(0<y)and(y<Pic.Height)) then begin

G.DSDinh[DinhDown].ToaDo.x:=x-Dx; G.DSDinh[DinhDown].ToaDo.y:=y-Dy; mouse_Down:=false;

VeDoThi(G,Pic,imagelist1); DrawPaint(PaintBox1,Pic); FileChanged:=True;

end else begin

mouse_Down:=false; end

end;

procedure TForm2.MaskEdit1Change(Sender: TObject); var D1,D2,ChiSo,Loi:integer; X:real;

begin

if not maskedit1.Focused then exit; val(maskedit1.Text,X,Loi);

If TimCacDinhKichHoat(G,D1,D2)=2 then if Timcung(G,D2,D1,ChiSo) then

begin G.DSCanh[ChiSo].TrongSo.Gia:=X; VeDoThi(G,Pic,imagelist1);

DrawPaint(PaintBox1,Pic); end;

end;

procedure TForm2.MaskEdit2Change(Sender: TObject); var D1,D2,ChiSo,Loi:integer; X:real;

begin

if not maskedit2.Focused then exit; val(maskedit2.Text,X,Loi);

(151)

If TimCacDinhKichHoat(G,D1,D2)=2 then if Timcung(G,D1,D2,ChiSo) then

begin

G.DSCanh[ChiSo].TrongSo.Gia:=X; VeDoThi(G,Pic,imagelist1);

DrawPaint(PaintBox1,Pic); end;

end;

procedure TForm2.PaintBox1Paint(Sender: TObject); begin

//VeDoThi(G,Pic,imagelist1); DrawPaint(PaintBox1,Pic); end;

Function TrongSo(DinhDau,DinhCuoi:Integer):TypeChiPhi; Var i:integer;

begin

Trongso.VoCung:=true; i:=0;

While (i<=(G.SoCanh-1))

If (G.DSCanh[i].DinhDau=DinhDau)and(G.DSCanh[i].DinhCuoi=DinhCuoi) then begin

TrongSo:=G.DSCanh[i].TrongSo; i:=G.SoCanh;

end else i:=i+1; end;

procedure TForm2.imduongdingannhat2Click(Sender: TObject);

Var D1,D2,i,x,y:integer;ChiPhi:real;DuongDi:TypeDuongDi;St,So:string; TimeNow:TDateTime;

SubPic:Tbitmap; begin

If TimCacDinhKichHoat(G,D1,D2)=2 then begin

If DuongDiNganNhat(G,D2,D1,DuongDi,ChiPhi) then begin

SubPic:=Tbitmap.Create;

Imagelist2.GetBitmap(0,SubPic); x:=G.DSDinh[DuongDi[0]].ToaDo.x; y:=G.DSDinh[DuongDi[0]].ToaDo.y; Pic.Canvas.Brush.Style:=BSclear;

Pic.Canvas.BrushCopy(rect(x,y- SubPic.Height,x+Subpic.Width,y),SubPic,Rect(0,0,SubPic.Width-1,SubPic.Height-1),RGB(255,255,255));

for i:=0 to high(DuongDi)-1 begin

(152)

Veline(G.DSDinh[DuongDi[i]].ToaDo,G.DSDinh[DuongDi[i+1]].ToaDo,

TrongSo(DuongDi[i],DuongDi[i+1]).Gia,Pic,RGB(255,0,0),100000); TimeNow:=Time;

repeat

Application.ProcessMessages; until (TimeNow+100000)>Time; end;

St:='Duong di Tu ' + G.DSDinh[D1].Ten + ' Den ' + G.DSDinh[D2].Ten +' la:' + Cr + Lf;

for i:=0 to high(DuongDi)-1 begin

st:=st+G.DsDinh[DuongDi[i]].Ten +' > ';

Vecung(Pic,G.DSDinh[DuongDi[i]].ToaDo,G.DSDinh[DuongDi[i+1]].ToaDo,

TrongSo(DuongDi[i],DuongDi[i+1]).Gia,True,RGB(255,0,0),RGB(0,0,255))

//Veline(G.DSDinh[DuongDi[i]].ToaDo,G.DSDinh[DuongDi[i+1]].ToaDo, //

TrongSo(DuongDi[i],DuongDi[i+1]).Gia,Pic,RGB(255,0,0),10000) end;

st:=st+G.DsDinh[DuongDi[high(DuongDi)]].Ten+ cr+lf; Str(ChiPhi:0:10,So);Catzerothua(So);

St:=St+ 'Voi chi phi la: ' + So;

Pic.Canvas.BrushCopy(rect(x,y- SubPic.Height,x+Subpic.Width,y),SubPic,Rect(0,0,SubPic.Width-1,SubPic.Height-1),RGB(255,255,255));

x:=G.DSDinh[DuongDi[high(DuongDi)]].ToaDo.x; y:=G.DSDinh[DuongDi[high(DuongDi)]].ToaDo.y; Pic.Canvas.Brush.Style:=BSclear;

Imagelist2.GetBitmap(1,SubPic);

Pic.Canvas.BrushCopy(rect(x,y- SubPic.Height,x+Subpic.Width,y),SubPic,Rect(0,0,SubPic.Width-1,SubPic.Height-1),RGB(255,255,255));

SubPic.Free;

DrawPaint(PaintBox1,Pic); showmessage(st);

end else begin

Showmessage('Khong co duong di Tu ' + G.DSDinh[D1].Ten + ' Den ' + G.DSDinh[D2].Ten);

(153)

end; end; end;

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var TraLoi:Word;

begin

If FileChanged then begin

TraLoi:=MessageDlg('File changed Do you want to save?',mtConfirmation ,[mbYes,mbNo,mbCancel],0);

If TraLoi=mrYes then

Form2.Save1Click(Sender) 8lse

If TraLoi=mrCancel then

(154)

G.SoDinh:=G.SoDinh-1;

Setlength(G.DSDinh,G.SoDinh); Setlength(Index,G.SoCanh); N:=0;Start:=-1;

For i:=0 to G.SoCanh-1

If (G.DSCanh[i].DinhDau=DinhDown)or(G.DSCanh[i].DinhCuoi=DinhDown) then begin

If Start=-1 then Start:=N; end

else begin

Index[N]:=i; N:=N+1; end;

If Start<>-1 then begin

G.SoCanh:=N;

For i:=Start to G.SoCanh-1

G.DSCanh[i]:=G.DSCanh[Index[i]]; For i:=0 to G.SoCanh-1

With G.DSCanh[i] begin

If DinhDau>DinhDown then DinhDau:=DinhDau-1; If DinhCuoi>DinhDown then DinhCuoi:=DinhCuoi-1; end;

Setlength(G.DSCanh,G.SoCanh); end;

Setlength(Index,0); HienThamSoCung(G); VeDoThi(G,Pic,imagelist1); DrawPaint(PaintBox1,Pic); FileChanged:=True;

end;

procedure TForm2.DeleteAll1Click(Sender: TObject); begin

G.SoDinh:=0;G.SoCanh:=0;

Setlength(G.DSDinh,0);Setlength(G.DSCanh,0); Pic.Canvas.Brush.Style:=bsSolid;

Pic.Canvas.Pen.Style:=psSolid;

Pic.Canvas.Brush.Color:=rgb(255,255,255); Pic.Canvas.Pen.Color:=rgb(255,255,255);

Pic.Canvas.FillRect(Rect(0,0,Pic.Width,Pic.Height)); DrawPaint(PaintBox1,Pic);

FileChanged:=true; end;

(155)

procedure TForm2.Save1Click(Sender: TObject); var F:textfile;

i:integer; begin

SaveDialog1.DefaultExt:='*.GRD';

SaveDialog1.Filter:='Graph data file (*.GRD)|*.GRD'; If not SaveDialog1.Execute then exit;

AssignFile(F,SaveDialog1.FileName); Rewrite(F);

Try

Writeln(f,G.Sodinh,' ',G.Socanh); For i:=0 to G.SoDinh-1

Writeln(F,G.DSDinh[i].ToaDo.x,' ',G.DSDinh[i].ToaDo.y,' ',G.DSDinh[i].Ten); For i:=0 to G.SoCanh-1

Writeln(F,G.DSCanh[i].DinhDau,' ',G.DSCanh[i].DinhCuoi,' ',G.DSCanh[i].TrongSo.Gia);

except

Showmessage('Writting error'); end;

CloseFile(F);

FileChanged:=false; end;

procedure TForm2.Open1Click(Sender: TObject); Var F:TextFile;

i:integer; begin

OpenDialog1.DefaultExt:='*.GRD';

OpenDialog1.Filter:='Graph data file (*.GRD)|*.GRD'; If not OpenDialog1.Execute then exit;

AssignFile(F,OpenDialog1.FileName); ReSet(F);

Try

Readln(f,G.Sodinh,G.Socanh); Setlength(G.DSDinh,G.SoDinh); Setlength(G.DSCanh,G.SoCanh); For i:=0 to G.SoDinh-1

begin

Readln(F,G.DSDinh[i].ToaDo.x,G.DSDinh[i].ToaDo.y,G.DSDinh[i].Ten); G.DSDinh[i].Ten:=trimleft(G.DSDinh[i].Ten);

G.DSDinh[i].MucKichHoat:=0; end;

(156)

For i:=0 to G.SoCanh-1

Readln(F,G.DSCanh[i].DinhDau,G.DSCanh[i].DinhCuoi,G.DSCanh[i].TrongSo.Gia); except

DeleteGraph(G);

showmessage('Error struct file'); CloseFile(F);

Self.Caption:='Graph Algorithm - New document'; VeDoThi(G,Pic,imagelist1);

DrawPaint(PaintBox1,Pic); exit;

end;

CloseFile(F);

VeDoThi(G,Pic,imagelist1); DrawPaint(PaintBox1,Pic);

Filename:=OpenDialog1.FileName;

Self.Caption:='Graph Algorithm - ' + Filename; FileChanged:=False;

end;

procedure TForm2.SpeedButton1Click(Sender: TObject); var D1,D2,ChiSo,i:integer;

begin

TimCacDinhKichHoat(G,D1,D2); If Not SpeedButton1.Down then begin

Timcung(G,D2,D1,ChiSo); for i:=Chiso to G.SoCanh-2 G.DSCanh[i]:=G.DSCanh[i+1]; G.SoCanh:=G.SoCanh-1;

Setlength(G.DSCanh,G.SoCanh); end

else begin

G.SoCanh:=G.SoCanh+1;

Setlength(G.DSCanh,G.SoCanh); With G.DSCanh[G.SoCanh-1] begin

DinhDh);

(157)(158)

begin

SaveDialog1.DefaultExt:='*.JPG';

SaveDialog1.Filter:='Bitmap image (*.BMP)|*.BMP|Jpeg image (*.JPG)|*.JPG';

SaveDialog1.FilterIndex:=2;

If not SaveDialog1.Execute then exit; case SaveDialog1.FilterIndex of 1:{BMP}

Pic.SaveToFile(SaveDialog1.FileName); 2:{Jpeg}

begin

T:=TJpegimage.Create; T.Assign(Pic);

try

T.SaveToFile(SaveDialog1.FileName); finally

T.Free end; end; end end; end

Chương trình cài đặt sau:

program Project1;

uses Forms,

Func_DoThi in 'Func_DoThi.pas', Unit2 in 'Unit2.pas' {Form2}, {$R *.res}

begin

Application.Initialize;

Application.CreateForm(TForm2, Form2); Application.Run;

end

(159)

PH N PH L C

Ph l c 2

Bài toán lu ng c c i

Cho mạng G=(V,E) Hãy tìm luồng f* mạng với giá trị luồng val(f*)

lớn Luồng ta gọi luồng cực đại mạng

Bài tốn xuất nhiều ứng dụng thực tế Chẳng hạn cần xác định cường độ lớn dòng vận tải hai nút đồ giao

thông Trong thí dụ lời giải tốn luồng cực đại cho ta đoạn

đường xe đông chúng tạo thành chỗ hẹp tương ứng dịng giao thơng xét

theo hai nút chọn Một thí dụ khác xét đồ thị tương ứng với hệ thống

đường ống dẫn dầu, ống tương ứng với cung, điểm phát coi

tàu chở dầu, điểm thu bể chứa, điểm nối ống nút đồ thị,

khả thông qua cung tương ứng với tiết diện ống Cần phải tìm luồng

dầu lớn bơm dầu từ tàu chở dầu vào bể chứa

nh lý: Các mệnh đề tương đương: (i) f luồng cực đại mạng

(ii) Khơng tìm đường tăng luồng f

(iii) Val(f)=c(X,X*) với lát cắt (X,X*)

(Ta gọi lát cắt (X,X*) cách phân hoạch tập đỉnh V mạng thành hai tập X

và X*=V\X, s∈X t ∈ X*.)

Định lý sở để xây dựng thuật tốn lặp sau để tìm luồng cực đại

trong mạng: Bắt đầu từ luồng tất cung bằng0 (ta gọi luồng

luồng không), lặp lại bước lặp sau thu luồng mà

khơng cịn đường tăng:

Bước lặp tăng luồng (Ford – Fulkerson): Tìm đường tăng P luồng có, tăng

luồng dọc theo đường P

Khi có luồng cực đại, lát cắt hẹp tìm theo thủ tục mơ tả

việc chứng minh định lý Thuật tốn Ford-Fulkerson mơ tả thủ tục sau

đây:

Procedure Luongcucdai; Begin

Stop := false; While not Stop

If < Tìm đường tăng luồng P> then

< Tăng luồng dọc theo P>

Else Stop := true; End;

(160)

Để tìm đường tăng luồng G(f) sử dụng thuật tốn tìm kiếm theo

chiều rộng (hay tìm kiếm theo chiều sâu), đỉnh s 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 toán luồng cực đại mạng Thuật toán luồng chấp nhận

được mạng (có thể luồng khơng) , sau ta tăng luồng

cách tìm đường tăng luồng Để tìm đường tăng luồng ta áp dụng phương pháp

gán nhãn cho đỉnh Mỗi đỉnh trình thực thuật toán sẽở ba

trạng thái: chưa có nhãn, có nhãn chưa xét, có nhãn xét Nhãn đỉnh v gồm

hai phần có hai dạng sau : [+p v( ),ε( )v ] [−p v( ), ( )ε v ] Phần thứ

+p(v) (-p(v)) cần tăng giảm luồng theo cung (p(v),v)( cung (v,p(v)) phần

thứ hai ε( )v lượng lớn tăng giảm luồng theo cung Đầu tiên

chỉ có đỉnh s khởi tạo nhãn nhãn chưa xét, cịn tất đỉnh cịn lại

đều chưa có nhãn Từ s ta gán nhãn cho tất đỉnh kề với nhãn đỉnh s

trở thành xét Tiếp theo, từ đỉnh v có nhãn chưa xét ta lại gán nhãn cho tất

các đỉnh chưa có nhãn kề với nhãn đỉnh v trở thành xét Quá trình

được lặp lại đỉnh t trở thành có nhãn nhãn tất

đỉnh có nhãn đầu xét đỉnh t khơng có nhãn Trong trường hợp thứ

ta tìm đường tăng luồng, trường hợp thứ hai luồng xét

không tồn đường tăng luồng (tức luồng cực đại) Mỗi tìm đường

tăng luồng, ta lại tăng luồng theo đường tìm được, sau xố tất nhãn đổi

với luồng thu lại sử dụng phép gán nhãn đỉnh để tìm đường tăng luồng

Thuật toán kết thúc luồng có mạng khơng tìm

đường tăng luồng

Hai thủ tục tìm đường tăng luồng mô tả sau :

Procedure Find-path; {

Th tc gán nhãn đường tăng lung p[v], ∈ε[v] nhãn ca đỉnh v;

VT danh sách đỉnh có nhãn chưa xét ;

c[u,v] kh năng thông qua ca cung (u,v),u,v V; f[u,v] lung cung (u,v), (u,v V);

}

BEGIN p[s] := s ; ε[s] :=+∞; VT := {s};

Pathfound := true; While VT<> {}

(161)

BEGIN

u ⇐ VT ;( * lấy u từ VT *)

For v∈V

If (v chưa có nhãn) then

Begin

If (c[u,v] >0) and (f[u,v] < c[u,v] ) then Begin

P[v] := u ;

ε[v] := {ε [u],c[u,v]-f[u,v] };

VT:=VT∪{v};(* nạp v vào danh sách đỉnh có nhãn *)

If v = t then exit;

End

Else

If (c[v,u] > 0) and (f[v,u] < 0) then Begin

P[v] := u ;

ε[v] := {ε [u] , f[u,v] };

VT:=VT∪{v};(* nạp v vào danh sách đỉnh có nhãn *)

If v = t then exit;

End;

End;

End;

PathFound :=false; End;

Procedure Inc_flow ;

{ thut toán tăng lung theo đường tăng }

Begin v := t ; u := t ; tang := [t]; while u <> s begin v := p[u];

if v > then f[v,u] := f[v,u] + tang

else

begin v := -v;

f[u,v] :=f[u,v] –tang; end;

u := v ;

(162)

end;

Procedure FF;

{ th tc th hin thut toán Ford_fulkerson }

Begin

(* khi to bt đầu t lung vi giá tr *)

For u ∈ V

For v ∈ V f[u,v] :=0;

Stop := false; While not Stop begin

find_path;

If pathfound then Inc_flow Else

Stop:=true; End;

< Lung cc đại mng f[u,v], u,v V > < Lát ct hp nht (VT , V\ VT) >

End;

Chương trình sau chương trình phục vụ cho việc học tập giảng dạy

tốn tìm luồng cực đại mạng Chương trình sau xây dựng cơng cụ lập

trình Delphi

Các ch c n ng c a ch ng trình: Ta xây dựng chương trình bao gồm chức

năng sau:

* Tóm tắt thuật tốn Ford – Fulkeson

* Hiển thị bước thực ứng với ví dụ cụ thể

Tóm t t thu t tốn Ford – Fulkerson :

Chức có mục đích giúp cho người sử dụng nắm vững thuật toán

trước vào thí dụ cụ thể

Hi n th b c th c hi n c a tốn:

Do chương trình nhằm mục đích phục vụ cho việc dạy học mơn Toán rời rạc

nên chức việc hiển thị chi tiết bước giải toán ứng với tưng thí dụ cụ thể

giúp cho người sử dụng hiểu rõ thuật toán

C u trúc d li u cài t thu t toán: C u trúc d li u:

Đồ thị lưu giữ dạng tập đỉnh tập cạnh Mỗi đỉnh lưu theo

cấu trúc Record sau:

(163)

L_TypeDinh = record

Ten:String;

ToaDo:L_TypeToaDo; MucKichHoat:Byte; end;

Trong đó:

- Biến Ten có kiểu String , lưu giữ tên đỉnh (mặt định V0,V1,…)

- Biến ToaDo có kiểu L_TypeToaDo, lưu giữ toạđộ x, y đỉnh có cấu

trúc Record sau :

L_TypeToaDo = record

x,y:integer; end;

Biến Muckichhoat có kiểu Byte lưu giữ mức độ kích hoạt đỉnh (mỗi đỉnh có

4 mức kích hoạt khác nhau), biến dùng để xác định đỉnh đầu, đỉnh cuối, đỉnh

hẹp…

Tập cạnh đồ thị lưu theo cấu trúc Record, cấu trúc cạnh lưu trữ sau:

L_TypeCanh = record

DinhDau,DinhCuoi:Integer; TrongSo:L_TypeChiphi;

end;

trong :

- Biến DinhDau cókiểu Integer, lưu giữ sốđỉnh đầu cạnh

- Biến DinhCuoi có kiểu Integer, lưu giữ sốđỉnh cuối cạnh

- Biến TrongSo có kiểu L_TypeChiPhi, lưu giữ giá khả thông qua

cạnh xét Kiểu L_TypeChiPhi Record có dạng sau :

L_TypeChiPhi = record Gia:real; kntq:real;

end;

Cài t thu t toán:

Như trình bày phần , thuật toán Ford –Fulkerson cài đặt

cách kết hợp thủ tục Find-Path (thủ tục gán nhãn tìm đường tăng luồng) Inc-Flow

(thủ tục tăng luồng theo đường tăng)

Đây phần cài đặt chi tiết thuật tốn Ford – Fulkerson (viết theo ngơn ngữ

lập trình Delphi):

(164)

procedure L_find_path(var L_G1:L_typedothi); {

thu tuc gan nhan tim duong tang luong: L_p[v],L_nhan,L_e[v] la nhan cua dinh v;

L_v la danh sach cac dinh co nhan nhung chua xet; }

VAR x,y:integer; ok:boolean; a1,b1,k1,l1:real; t,t1,i:integer; BEGIN

for i:=0 to L_G1.sodinh-1 L_p1[i]:=-1;

L_p1[0]:=0; L_nhan[0]:=true; L_e[0]:=vocung; L_v:=[0] ; L_v1:=[0]; L_pathfound:=true; While L_v<>[] Begin

ok:=true; x:=0;

While (x<=L_G1.sodinh-1) and (ok=true) Begin

If x in L_v then ok:=false Else

x:=x+1; End;

L_v:=L_v-[x];

For y:=0 to L_G1.sodinh-1 If L_p1[y]=-1 then

Begin

L_giatri(L_G1,x,y,t,a1,b1); {a:=c[x,y],b:=f[x,y]} L_giatri(L_G1,y,x,t1,k1,l1); {k:=c[y,x],l:=f[y,x]} If (a1>0) and (b1<a1) then

Begin

L_p1[y]:=x; L_nhan[y]:=true;

L_e[y]:=L_min(L_e[x],a1-b1); L_v:=L_v+[y];

(165)

L_v1:=L_v1+[y]; If y=L_G1.sodinh-1 then Begin

exit; End; End Else

If (k1>0) and (l1>0) then Begin

L_p1[y]:=x; L_nhan[y]:=false;

L_e[y]:=L_min(L_e[x],l1); L_v:=L_v+[y];

L_v1:=L_v1+[y]; If y=L_G1.sodinh-1 then Begin

exit; End; End; End;

End;

L_pathfound:=false; end;

procedure L_Inc_flow(var L_G1:L_typedothi); {

tang luong theo duong tang }

var x,y,t,t1:integer; tang,a,k:real; s,s1,s2,s3,s4:string; ok:boolean;

begin

x:=L_G1.sodinh-1; y:=L_G1.sodinh-1;

tang:=L_e[L_G1.sodinh-1]; ok:=false;

while x<>0 begin

y:=L_p1[x];

(166)

L_giatri(L_G1,x,y,t,a,L_b); {a:=c[x,y],b:=f[x,y]} L_giatri(L_G1,y,x,t1,k,L_l); {k:=c[y,x],l:=f[y,x]} if L_nhan[x] then

L_G1.dscanh[t1].trongso.gia:=L_G1.dscanh[t1].trongso.gia+tang else

begin

L_G1.dscanh[t].trongso.gia:=L_G1.dscanh[t].trongso.gia-tang; ok:=true;

end; x:=y; end; end;

procedure L_luongcucdai(L_G:L_typedothi; var L_G1:L_typedothi;var gt:real); {

thu tuc the hien thuat toan Ford_fulkerson }

var x,y,z,t,i,j,t1,t2:integer; a1,b1,f:real;

ok1,stop:boolean; s,s1,ch,ch1,a:string; begin

L_G1.SoDinh:=L_G.SoDinh ; L_G1.socanh:=L_G.socanh; setlength(L_p1,L_G1.SoDinh); setlength(L_nhan,L_G1.SoDinh ); setlength(L_e,L_G1.SoDinh );

setlength(L_G1.DSdinh,L_G1.SoDinh ); Setlength(L_G1.dscanh,L_G1.SoCanh ); for j:=0 to L_G.SoDinh -1

L_G1.DSDinh[j]:=L_G.DSDinh[j]; for j:=0 to L_G.SoCanh -1

L_G1.DSCanh[j]:=L_G.DSCanh[j]; stop:=false;

while not stop begin

L_find_path(L_G1); if L_pathfound then begin

tam:=tam+1; if tam>1 then

(167)

L_inc_flow(L_G1) else

stop:=true; end;

f:=0;

for y:= to L_G1.sodinh-1 begin

L_giatri(L_G1,0,y,t1,a1,b1); f:=f+b1;

end;

for y:=0 to L_G1.Socanh -1

if L_G1.DSCanh[y].DinhCuoi =L_G1.SoDinh -1 then begin

break; end; tam:=0; t2:=1;

while (t2<=L_G1.sodinh-2) begin

if t2 in L_v1 then

L_G1.dsdinh[t2].MucKichHoat :=3 else

L_G1.dsdinh[t2].MucKichHoat :=0; end;

t2:=t2+1; end;

L_G1.dsdinh[0].MucKichHoat :=3;

L_G1.dsdinh[L_G1.SoDinh -1].MucKichHoat :=0; end;

Giao di n ch ng trình :

Hình form chương trình, người sử dụng tự vẽđồ

thị để kiểm tra thuật toán (đồ thị vẽ nằm phần đồ thị nguồn) Sau có

đồ thị nguồn, muốn biết kết tốn ta nhấn nút Run công cụ

của form, ta sẽđược đồ thị kết (nằm phần đồ thịđích)

Các bước giải ứng với tốn cụ thể trình bày ta nhấn Notes

Đây phần giúp cho người sử dụng hiểu rõ thuật tốn, trình bày cách làm

bài toán theo bước tương ứng với thuật tốn nêu

Ngồi ra, người sử dụng xem lại thuật tốn cách click đơi vào phần

dưới form Phần giúp người sử dụng ln nắm vững thuật tốn

(168)

Để

thuận tiện cho người sử

dụng, chương trình lưu sẵn số thí dụ cụ thể để mơ tả thuật tốn, người sử

dụng cần vào file →open, sau chọn ví dụ cần xem

Chương trình cịn có chức giúp cho người sử dụng tạo thí dụ

và lưu lại ví dụ vừa tạo

Tên đỉnh đồ thị mặt định V0,V1,… Tuy

nhiên chương trình có chức đổi tên cho đỉnh, người

sử dụng đổi tên đỉnh cách vào Edit

rename sau đánh tên vào (xem hình bên)

cách trên, click phải vào đỉnh cần xét chọn

Việc đổi tên đỉnh xố đỉnh thực theo hai

cách, người sử dụng chọn đỉnh chọn Edit

Ngày đăng: 21/04/2021, 05:01

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w