TOÁN RỜI RẠC
NGUYỄN ĐÌNH CƯỜNG
BỘ MÔN KỸ THUẬT PHẦN MỀM
KHOA CNTT-ĐHNT
LÝ THUYẾT TỔ HỢP
Các phép toán tập hợp
Phần bù
Hợp của A và B
AB
Giao của A và B
AB
Kết hợp
Giao hoán
Phân bố
A
A
Đối ngẫu
AB
Tích Đềcát của các tập hợp
Quan hệ tương đương và phân hoạch
Đối xứng
Phản xạ Truyền ứng
Tính chất vật lý và sự hữu hình các phần tử trong tập hợp
Nguyên lý cộng
A
B
Một đoàn vận động viên gồm 2 môn bắn súng và bơi được cử đi thi đấu ở nước ngoài. Nam có 10 người. Số vận động
viên thi bắn súng kể cả nam và nữ là 14. Số nữ vận động viên thi bơi bằng số nam vận động viên thi bắn súng. Số nữ
vận động viên thi bơi bằng số nam vận động viên thi bắn súng. Hỏi toàn đoàn có bao nhiêu người.
Trả lời :
Toàn đoàn có 10 + 14 = 24 người
=0
for =1 to do
for =1 to do
for =1 to do
Giá trị sẽ bao nhiêu sau khi đoạn chương trình này thực hiện
Nguyên lý cộng
Nguyên lý nhân
=0
for =1 to do
for =1 to do
for =1 to do
Có bao nhiêu chuỗi kí tự có độ dài 10 chỉ chứa 2 chữ cái A, B, bắt đầu
bởi AAA hoặc ABA
Các cấu hình tổ hợp đơn giản
Chỉnh hợp lặp
Định nghĩa 1. Một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ tự gồm k thành phần lấy từ n phần
tử đã cho. Các phần tử có thể lặp lại.
•Tính số dãy nhị phân độ dài n, 1001000000100000000100000000001
Trả lời
•Tính số tập con của một n-tập
X Biểu diễn mỗi tập con bằng dãy nhị phân độ dài n
b
Chỉnh hợp không lặp
Định nghĩa 2. Một chỉnh hợp lặp chập k của n phần tử là một bộ có thứ tự gồm k thành phần lấy từ n phần
tử đã cho. Các phần tử không được lặp lại.
Các cấu hình tổ hợp đơn giản
Định nghĩa 3. Ta gọi một hoán vị n phần tử là một cách xếp thứ tự các phần tử đó.
Hoán vị
•6 người đứng xếp thành hàng ngang để chụp ảnh. Hỏi có thể bố trí bao nhiêu kiểu
Giải
Mỗi kiểu ảnh là một hoán vị của 6 người. Từ đó nhận được số kiểu ảnh có thể bố trí là 6! = 720
Tổ hợp
Định nghĩa 4. Tổ hợp chập của phần tử là một bộ không kể thứ tự gồm thành phần khác nhau lấy từ phần tử đã cho.
Có n đội bóng thi đấu vòng tròn. Hỏi phải tổ chức báo nhiêu trận
Giải. Cứ 2 đội thì có một trận, từ đó suy ra số trận đấu bằng số cách chọn 2 đội từ n đội
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
Các hệ số trong tam giác PASCAL
Viết chương trình máy tính in ra tam giác PASCAL
BÀI TOÁN ĐẾM
•Thường sử dụng nguyên lý cộng và nguyên lý nhân
Thí dụ
Có bao nhiêu cách xếp 5 người thành hàng ngang sao cho A không đứng cạnh B.
Giải
Xem A và B là một chổ , ta có 4! =24 cách xếp. Toàn bộ có 5!=120 Cách xếp, từ đó nhận được số cách xếp là 120 – 48 = 72
Hỏi có bao nhiêu đường đi khác nhau từ nút [0, 0] đến nút [n, m]
for
for
if a[j-1] > a[j] then Swap[a[j-1], a[j]];
BÀI TOÁN ĐẾM
Nguyên lý bù trừ
B
Định lý
Thí dụ
Hỏi trong tập X={1, 2, ...., 10000} có bao nhiêu số không chia hết cho bất cứ số nào trong các số 3, 4, 7.
Số lượng các số cần đếm =
+ + =
+
=3333+2500+1428=7261
+ + =
+
33 + 476 + 357=1666
=
Số lượng các số cần đếm =10000 -7261+ 1666 -119=4286
Có bao nhiêu xâu nhị phân bắt đầu bởi 00 và kết thúc 11
Tổ hợp lặp
Một sinh viên mua r=4 cây bút chì chọn trong n=3 màu khác nhau là xanh, đỏ và vàng. Hỏi có bao nhiêu cách chọn mua hang khác
nhau.
Xếp 4 dấu * và 2 dấu | vào 6 vị trí :
Phương trình
Định nghĩa 5. Một tổ hợp lặp chập r của n phần tử cho trước là việc chọn r phần tử trong n phần tử, trong đó mỗi phần tử có thể được
chọn lại nhiều lần.
Định nghĩa 6. Số tổ hợp lặp chập r của n phần tử bằng số tổ hợp chập r của r+n-1 phần tử.
Bài toán 1. Có bao nhiêu cách lấy k phần tử trong n phần tử xếp trên đường thẳng sao cho không có 2 phần tử kề nhau
cùng được lấy ra
•Số phần tử còn lại n-k
•Số đoạn trống có thể có k1 + k2 +k3 +1= N-k +1
k1 k2 k3
N
Mỗi cách lấy k khoảng từ các khoảng này, sẽ tương ứng với một cách chọn k phần tử t hỏa mãn yêu cầu đã nêu.
Vậy số cần tìm.
Bài toán 2. Có bao nhiêu cách lấy k phần tử trong n phần tử xếp trên vòng tròn sao cho không có 2 phần tử kề nhau
cùng được lấy ra
Vì trên vòng tròn nên ta có thể cố định phần tử a trong n phần tử. Chia ra 2 lớp bài toán a được chọn và
a không được chọn
•Nếu chọn a, khi đó 2 phần tử kề a sẽ không được chọn. Nhưvậy sẽ lấy k-1 phần tử từ n-3 phần tử
còn lại. Các phần tử này được xem như trên đường thẳng. Theo bài toán số 1, số cách là
•a không được chọn, bỏ a đi, ta đưa về bài toán lấy k phần tử từ n-1 phần tử xếp trên đường thẳng. Theo bài toán 1 số
cách là
Số cách cần tìm =
Hoán vị lặp
Có thể nhận được bao nhiêu từ khác nhau bằng cách sắp xếp lại các chữ cái của từ SUCCESS
•Có 3 chữ S, 2 chữ C và 1 chữ U
•Chọn vị trí cho chữ S:
•Có 2 vị trí cho 2 chữ C:
•Đặt chữ U bằng
•Đặt chữ E, t
Trong không gian Oxyz, một robot di chuyển bằng cách nhảy từng bước dài một đơn vị theo hướng dương của trục x, y hoặc z. Tính số
cách khắc nhau mà robot có thể di chuyển từ tọa độ [0, 0, 0] đến điểm [4, 3, 5]
Ví dụ: Biểu diễn một đường đi XXXXYYYYXZZZ
Định nghĩa 7. Hoán vị của n phần tử trong đó có phần tử giống nhau thuộc loại 2,…và phần
tử giống nhau thuộc loại [+ ] . Được gọi là hoán vị lặp chập của
Định nghĩa 8. Số hoán vị lặp chập k của n phần tử trong đó có phần tử giống nhau thuộc loại
2,…và phần tử giống nhau thuộc loại .
Công thức truy hồi
Ví dụ: Trên mặt phẳng, kẻ n đường thẳng sao cho không có 2 đường thẳng nào song song và 3 đường nào đồng quy. Hỏi
mặt phẳng được chia làm mấy phần.
Giải. Gọi số phần mặt phẳng được chia bởi n đường thẳng là . Giả sử đã kẻ n-1 đường thẳng, kẻ thêm đường thẳng thứ
n. Thì số phần tử được thêm bằng số giao điểm được thêm cộng với 1.
•Số giao điểm được thêm là số giao điểm đường thẳng vừa kẻ cắt n-1 đường thẳng cũ, nghĩa là bằng n-1. Từ đó nhận
được công thức truy hồi
Phương pháp tìm nghiệm của hệ thức truy hồi
Trong đó ,
•không thuần nhất
•
không tuyến tính
•Hệ thức
Phng
Cần tìm nghiệm cho dãy số
•Xét trường hợp k =2
Định lý. Cho
là nghiệm của hệ thức truy hồi.
Khi và chỉ khi
Với các n=0, 1, 2,…và , là hằng số.
Cho lần lượt n=0, 1 trong hệ thức truy hồi
•Giải hệ phương trình trên ta được
Xác định nghiệm của dãy số fibonaxi
Giải.
Kết quả
Phương trình đặc trưng
2,
.+
-1
.
Có nghiệm kép
là nghiệm của hệ thức truy hồi = +
Khi và chỉ khi = +
Định lý. Cho ,….,
Có k nghiệm phân biệt ,….,
Khi và chỉ khi
, …….với n=0, 1, 2, 3. , ,
Nhận xét bước quan trọng trong việc xác định nghiệm của hệ thức truy hồi . Việc làm này không phải lúc nào cũng thực
hiện được khi
LIỆT KÊ
Bài toán hình chữ nhật la tinh.
Một hình chữ nhật la tinh trên S là một bảng p dòng, q cột, sao cho mỗi dòng của nó là một chỉnh hợp không lặp chập q
của S và mỗi cột của nó là một chỉnh hợp không lặp chập p của S.
Thí dụ
1 2 3 4 5 6 7
2 3 4 5 6 7 1
3 4 5 6 7 1 2
S= {1, 2, 3, 4, 5, 6, 7}
Bài toán đếm số hình chữ nhật la tinh với số dòng nhiều hơn cho đến nay chưa được giải quyết. Người ta mới đưa ra một
vài dạng tiệm cận[ Erdos P.[1946], Yamamoto K. [1951]].
Gọi L[p, n] là số hình chữ nhật la tinh pxn, còn K[p,n] là số hình chữ nhật latinh chuẩn pxn. Ta có
Riordan J.[1946] đã chứng minh công thức
TOÁN RỜI RẠC
NGUYỄN ĐÌNH CƯỜNG
BỘ MÔN KỸ THUẬT PHẦN MỀM
KHOA CNTT-ĐHNT
BÀI TOÁN TỒN TẠI
Bài toán về 36 sĩ quan
Bài toán này được Euler đề nghị, nội dung nó nhưsau: Có một lần người ta triệu tập từ 6 trung đoàn mỗi trung đoàn 6 sĩ
quan thuộc 6 cấp bậc khác nhau: thiếu úy, trung úy, thượng úy, đại úy, thiếu tá, trung tá về tham gia duyệt binh ở sử đoàn.
Dùng các chữ cái A, B, C, D, E, F để chỉ các phiên hiệu trung đoàn các chữ cái thường a, b, c, d, e, f.
1960 Boce, Parker, Srikanda lời giải n=10.
Chỉ ra phương pháp xây dựng hình vuông la tinh trực giao cho mọi , với k>1
Bài toán 4 màu
AB
C
D
Bài toán có thể phát biểu trực quan nhưsau:
Chứng minh rằng mọi bản đồ trên mặt phẳng đều có thể tô bằng 4 màu sao cho không có hai nước láng giềng nào bị
tô bởi cùng một màu
Hình lục giác thần bí
9
14 15
11
6
813
18 1
4410
17
7212
319 16
Bài toán chọn 2n điểm trên lưới nxn điểm
Phương pháp phản chứng
Giả thiết điều định chứng minh là sai, từ đó dẫn đến mâu thuẫn
Thí dụ.
Cho 7 đoạn thẳng có độ dài lớn hơn 10 và nhỏ hơn 100. Chứng minh rằng luôn tìm được 3 đoạn để có thể ghép thành 1
tam giác.
Bất đẳng thức cuối cùng mâu thuẫn với giả thiết các đoạn thẳng nhỏ hơn 100.
Thí dụ.
Chứng minh rằng không thể nối 31 máy vi tính thành một mạng sao cho mỗi máy nối với 5 máy khác.
Giải. Giả sử ngược lại là tìm được cách nối 31 máy cho cho mỗi máy được nối đúng với 5 máy khác. Khi đó số lượng kênh
nối là 5x31/2 = 75.5.
Nguyên lý Dirichlet
Nguyên lý Dirichlet Nếu đem xếp nhiều đối tượng vào cái hộp, thì luôn tìm được một cái hộp chứa không ít hơn 2
đối tượng.
Nguyên lý Dirichlet tổng quát Nếu đem xếp đối tượng vào cái hộp, thì luôn tìm được một cái hộp chứa không ít hơn
đối tượng.
Thí dụ 1. Trong số 367 người bao giờ cũng tìm được hai người có ngày sinh nhật giống nhau.
Thí dụ 2. Trong một phòng họp bao giờ cũng tìm được hai người có số người quen trong số những người dự họp là
bằng nhau.
Thí dụ 3. Trong một tháng gồm 30 ngày một đội bóng chuyền thi đấu mỗi ngày ít nhất một trận, nhưng không chơi quá
45 trận. Hãy chứng minh rằng phải tìm được một giai đoạn gồm một số ngày liên tục nào đó trong tháng sao cho trong
giai đoạn đó đội chơi đúng 14 trận.
Hệ đại diện phân biệt
Giả sử , , …, là một họ tập con của một tập hợp S[ các
Ta gọi một bộ có thứ tự , , …, . Là một hệ đại diện phân biệt của họ này nếu
Hệ đại diện phân biệt được biết tắt là TRAN [Tranversal] và thành phần của hệ được gọi là đại diện của tập con [=1, …, ]
Thí dụ. S= {1, 2, 3, 4, 5}, , , ,
có TRAN là [2, 5, 3, 1]. Một TRAN khác của họ này là [5, 2, 4, 1]
Bài toán liệt kê
Thuật toán và độ phức tạp tính toán
Thuật toán giải bài toán đặt ra là một thủ tục xác định bao gồm một dãy hữu hạn các bước cần thực hiện để thu được lời
giải bài toán.
Thí dụ
Cho 3 số nguyên a, b, c. Mô tả tìm số lớn nhất trong 3 số đã cho.
Giải. Thuật toán gồm các bước sau:
Bước 1. Đặt x = a;
Bước 2. Nếu b > x thì x = b;
Bước 3. Nếu c > x, thì đặt x=c;
Thuật toán Euclide
Đầu vào a và b là hai số nguyên dương
Đầu ra: Ước số chung lớn nhất của a và b
function gcd[a, b];
begin
if as do
begin
swap[];
r=r-1;
s=s+1;
end
end
Thuật toán quay lui
procedure Try[i: integer];
var j:integer;
begin
for j=1 to
if then
begin
;
if i= n then
else
Try [i+1];
end
end
begin
Try[1];
end
procedure Try[i:integer];
var j:integer;
begin
for j=0 to 1 do
begin
b[i]=j;
if i=n then Result else Try[i+1];
end
end
begin
Try[1];
end
Liệt kê các hoán vị từ 1 đến N
Biểu diễn hoán vị dưới dạng , , , , trong đó với i. Các giá trị từ 1 đến n
lần lượt đề cử cho , trong đó giá trị được chấp nhận nếu nó chưa được dung. Vì thế cần phải ghi nhớ đối với mỗi giá trị
xem nó được dùng hay chưa. Điều này thực hiện nhờ vào một dãy biến logic bằng true nếu chưa được
dùng. Các biến này cần phải được khởi gán giá trị true . Sau khi gán cho cần ghi nhận false cho và phải gán lại true
khi thực hiện xong Result hay Try[i+1].
procedure Try[i : integer];
var j: integer;
vegin
for j=1 to n do
if b[j] then { chấp nhận j }
begin
p[i] = j;
b[j] = false; {ghi nhận trạng thái mới }
if i= n then Result else Try[i + 1];
b[j]=true;
end
end
Liệt kê các tổ hợp chập m của {1, 2, …, n}
Biểu diễn tổ hợp dưới dạng … , trong đó < … fopt
then branch_and_bound[i+1];
weight=weight –a[i]*x[i];
cost = cost –c[i] * x[i];
end
end
Bài toán người du lịch
Tìm cựu tiểu của hàm
, …., ] = c[1, + c[, + ….+ c[, + c[, 1
Với điều kiện , …., ] là hoán vị của các số 2, 3, …,.
Ký hiệu
Giả sử ta có phương án bộ phận []. Phương án này tương ứng với hành trình bộ phận qua thành phố
…
Vì vậy, chi phí phải trả theo hành trình bộ phận qua thành phố
c[1, + c[, + ….+ c[,
Cận dưới phương án bộ phận g[]= +
Giải bài toán người du lịch
procedure Try[i:integer];
var j: integer;
begin
for j=2 to n do
if chuaxet[j] then
begin
a[i]=j;
chuaxet [j] = false;
chuaxet[j] = false;
can = can + c[a[i-1], a[i]];
if i=n then Ghinhan
else
if Can + [n-i+1]*then Try [i+1];
chuaxet [j] = true;
end
end
Bài toán lập lịch trên hai máy
Thuật toán JOHNSON
1. Chia các chi tiết thành 2 nhóm:
2. Sắp xếp các chi tiết theo chiều tăng của các và sắp xếp chi tiết theo chiều giảm
3. Nối vào đuôi . Dãy thu được sẽ là lịch gia công tối ưu.
Các kết quả được tính sau:
•Chia nhóm = {,} = {, }
•Sắp xếp các chi tiết theo chiều tăng của các và sắp xếp chi tiết theo chiều giảm
= {, } = {, }
•,,
Định nghĩa 1. Đơn đồ thị vô hướng
G=
Định nghĩa 2. Đa đồ thị vô hướng
G=
được gọi là cạnh lặp nếu chúng cùng tương ứng với một cặp đỉnh.
Định nghĩa 3. Giả đồ thị vô hướng G=[V, E] bao gồm V là tập đỉnh, và E là họ các cặp không có thứ tự gồm hai phần tử [ không
nhất thiết phải khác nhau] của V gọi là các cạnh. Cạnh được gọi là khuyên nếu nó có dạng
Định nghĩa 4. Đơnđồ thị vô hướng G=[V, E] bao gồm V là tập đỉnh, và E tập các cặp có thứ tự gồm hai phần tử khác nhau của
V gọi là các cung.
Định nghĩa 5. Đa đồ thị có hướng
. Hai
cung
Các thuật ngữ cơ bản
Định nghĩa 6. Hai đỉnh và của đồ thị vô hướng G được gọi là kề nhau nếu [] là cạnh của đồ thị G. Nếu e=[u, v] là
cạnh của đồ thị thì ta nói cạnh này là liên thuộc với 2 đỉnh u và v, hoặc cũng nói là cạnh e là nối đỉnh u và đỉnh v, đồng thời
các đỉnh u và v sẽ được gọi là các đỉnh đầu của cạnh [u, v].
Định nghĩa 7. Ta gọi bậc của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc với nó và sẽ kí hiệu là deg[v]
Xét đồ thị trong hình 1, ta có
deg[a] = 1, deg[b] = 4, deg[c] = 4, deg[f] = 3, deg[d] = 1, deg[e] = 3, deg[g] = 0
Định lý 1. Giả sử
Chứng minh. Rõ ràng mỗi cạnh
e
Thí dụ 2
Đồ thị n đỉnh và mỗi đỉnh có bậc là 6 có bao nhiêu cạnh ?
Giải: Theo định lý 1, ta có 2m=6n. Từ đó suy ra số cạnh của đồ thị là 3n.
Hệ quả. Trong đồ thị vô hướng, số đỉnh bậc lẻ[ nghĩa là có bậc là số lẻ] là một số chẵn.
Chứng minh. Thực vậy, gọi
=+
Định nghĩa 8.
N
Định nghĩa 9
Ta gọi bán bậc ra [bán bậc vào] của đỉnh v trong đồ thị có hướng là số cung của đồ thị đi ra khỏi nó [đi vào nó] và kí hiệu
là
Định lý 2. Giả sử là đồ thị có hướng. Khi đó
Đường đi, chu trình. Đồ thị liên thông
Định nghĩa 10. Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dương, trên đồ thị vô hướng
, …,
Trong đó , [, ]
Đường đi nói trên có thể biểu diễn dưới dạng dãy các cạnh
[, ], [, ],…., [, ]
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh đầu trùng với đỉnh cuối [tức là u=v]
được gọi là chu trình. Đường đi hay chu trình được gọi là đơn nếu nhưkhông có cạnh nào được lặp lại.
Định nghĩa 11.
Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dương, trên đồ thị có hướng
,….,
Trong đó , ,
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung: , , , , …., ,
Đỉnh u được gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh đầu trùng với đỉnh cuối [tức là
u=v] được gọi là chu trình. Đường đi hay chu trình được gọi là đơn nếu nhưkhông có cung nào bị lặp lại.
Định nghĩa 12.
Đồ thị vô hướng
Định nghĩa 13. Ta gọi đồ thị con của đồ thị là đồ thị
Trong đó
Định nghĩa 14.
Đỉnh v được gọi là đỉnh rẻ nhánh nếu việc loại bỏ v cùng với các cạnh liên thuộc với nó khỏi đồ thị làm tang số thành phần
liên thông của đồ thị. Cạnh e được gọi là cầu nếu việc loại bỏ nó khỏi đồ thị làm tăng số thành phần liên thông của đồ thị.
Định nghĩa 15.
Đồ thị có hướng được gọi là liên thông mạnh nếu luôn tìm được đường đi giữa hai đỉnh bất kì của nó.
Định nghĩa 16.
Đồ thị có hướng được gọi là liên thông yếu nếu đồ thị vô hướng tương ứng với nó là đồ thị vô hướng liên thông.
Định lý 3.
Đồ thị vô hướng liên thông là định hướng được khi và chỉ khi mỗi cạnh của nó nằm trên ít nhất một chu trình.
Một số dạng đồ thị đặc biệt
Đồ thị hai phía.
Đơn đồ thị
của đồ thị chỉ nối một đỉnh nào đó trong X với một đỉnh nào đó trong Y. Khi đó ta sẽ sử dụng kí hiệu
hai phía với tập đỉnh X.
Định lý 4
Đơn đồ thị là đồ thị hai phía và chỉ khi nó không chứa chu trình độ dài lẻ.
Đồ thị hai phía.
Đơn đồ thị
. Cách vẽ như vậy sẽ được gọi là biểu diễn phẳng của đồ thị.
Định lý 5[Kuratovski]
Đồ thị là phẳng khi và chỉ khi nó không chứa đồ thị con đồng cấu với
Định lý 6 [công thức Euler]
Giả sử G là đồ thị phẳng liên thông với n đỉnh, m cạnh. Gọi m là số miền của mặt phẳng bị chia bởi biểu diễn phẳng của G. Khi đó
= –+2
Thí dụ
Cho G là đồ thị phẳng liên thông với 20 đỉnh, mỗi đỉnh đều có bậc là 3. Hỏi mặt phẳng bị chia làm bao nhiêu phần bởi biểu diễn
phẳng của đồ thị G.
Giải. Do mỗi đỉnh của đồ thị đều có bậc là 3, nên tổng bậc của đỉnh là 3x20=60. Từ đó suy ra số cạnh của đồ thị m=60/2=30. Vì
vậy theo công thức Euler, số miền cần tìm là = 30- 20 +2 =12
BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH
A= {
=0 nếu và =1, nếu
Tùy từng trường hợp cụ thể c[i , j] =
Tìm kiếm theo chiều sâu trên đồ thị
procedure DFS[v];
[* Tìm kiếm theo chiều sâu bắt đầu từ đỉnh v, các biến Chuaxet, Ke là biến toàn cục *]
begin
Thăm_đỉnh[v];
Chuaxet[v] = false;
for
if chuaxet[u] then DFS[u];
end
begin
for do chuaxet[v]=True;
for do
if Chuaxet[v] then DFS[v];
end
Tìm kiếm theo chiều rộng trên đồ thị
procedure BFS[v];
[* Tìm kiếm theo chiều sâu bắt đầu từ đỉnh v, các biến Chuaxet, Ke là biến toàn cục *]
begin
QUEUE=
QUEUE ;
Chuaxet[v]=false;
while QUEUE
begin
p
thămđỉnh[p];
` for kề[p] do
if Chuaxet[u] then
begin
QUEUE ;
Chuaxet [u] = false;
end
end
end
ĐỒ THỊ EULER VÀ ĐỒ THỊ HAMILTON
Đồ thị Euler và các kết quả liên quan đã được nhà toán học Thụy Sĩ Leonhard Euler [1707-1783] nghiên cứu từ thế kỉ 18
khi ông tiến hành giải quyết bài toán nổi tiếng có tên gọi “Bài toán 7 chiếc cầu ở thành phố Kónigsberg”. Có thể đi dạo
qua hết tất cả các cầu mỗi cầu chỉ qua một lần rồi trở về nơi xuất phát được không.
Bài toán xuất phát từ những bức thư của người dân vùng Kónigsberg [Nga] gửi cho Euler vào năm 1736 khi ông sang Nga
làm việc. Euler đã chứng minh được rằng, một cuộc đi dạo nhưvậy không thể nào xảy ra. Euler đã biểu diễn bài toán trên
bằng đồ thị và khẳng định, đồ thị nhưvậy không thể vẽ được một đường liền nét đi qua tất cả các cạnh sao cho mỗi cạnh
chỉ vẽ một lần.
Hình chiếc cầu ở thành phố Kónigsberg và biểu diễn thành đồ thị
ĐỒ THỊ EULER VÀ ĐỒ THỊ HAMILTON
Đồ thị Euler
Định nghĩa 1. Chu trình đơn trong G đi qua mỗi cạnh của nó một lần được gọi là chu trình Euler. Đường đi đơn trong G đi
qua mỗi cạnh của nó một lần được gọi là đường đi Euler. Đồ thị được gọi là đồ thị Euler nếu nó có chu trình Euler và gọi
là đồ thị nữa Euler nếu nó có đường đi Euler.
Định lý 1[Euler]. Đồ thị vô hướng liên thông G là đồ thị Euler khi và chỉ khi mọi đỉnh của .
Hệ quả . Đồ thị vô hướng liên thông và chỉ khi nó không quá 2 đỉnh bậc lẻ.
Định lý 2. Đồ thị có hướng liên thông mạnh là đồ thị Euler khi và chỉ khi
procedure Euler_cycle;
begin
STACK= ;
CE=;
chọn u là một đỉnh nào đó của đồ thị;
STACK u;
while STACK do
begin
x= top [STACK];
if Ke[x] then
begin
y=đỉnh đầu tiên trong danh sách Kề[x];
STACK u;
[* Loại bỏ cạnh [x,y] khỏi đồ thị *]
Ke[x] = Ke[x] \ {y};
Ke[y]= Ke[y]\{x};
end else
begin
x STACK;
CE u;
end
end
end
Đồ thị Hamilton
Định nghĩa 2
Đường đi qua tất cả các đỉnh của đồ thị mỗi đỉnh đúng một lần được gọi là đường đi Hamilton. Chu trình bắt đầu từ đỉnh v
nào đó qua tất cả các đỉnh còn lại mỗi đỉnh đúng một lần rồi quay trở về v được gọi là chu trình Halmilton. Đồ thị G được gọi
là đồ thị Halmilton nếu nó chứa chu trình Hamilton, và gọi là nửa Hamilton nếu nó chứa đường đi Hamilton.
Định lý 3[Dirak 1952]
Đơn đồ thị vô hướng với n>2 đỉnh, mỗi đỉnh có bậc không nhỏ hơn n/2 là đồ thị Hamilton.
Định lý 4
Giả sử G là đồ thị có hướng liên thông mạnh với n đỉnh. Nếu
,
Thì G là Hamilton
Đồ thị Hamilton
Định lý 5 [tổng quát hơn Dirac]
Giả sử đồ thị G gồm mọi cặp đỉnh của nó đều có tổng bậc không bé hơn n. Khi đó G là đồ thị Halmilton.
Định lý 6[Ore, 1960] Giả sử G gồm đỉnh và mọi cặp đỉnh không kề nhau của
là đồ thị Halmilton.
Định lý 7.
Giả sử G là đồ thị Halmilton. Khi đó
a. Mọi đỉnh của nó phải có bậc lớn hơn hoặc bằng 2.
b. Nếu một đỉnh có bậc bằng 2 thì hai cạnh của nó phải nằm trên một chu trình Halmilton
c. Nếu một đỉnh có bậc lớn hơn 2 và có hai cạnh của nó nằm trên một chu trình Hamilton thì các cạnh còn lại của nó
không nằm trên chu trình Hamilton
Thuật toán liệt kê các chu trình Hamilton của đồ thị
procedure Hamilton[k];
[* Liệt kê các chu trình Hamilton thu được bằng việc
Phát triển dãy đỉnh [ X[1],…, X[k-1]]
Của đồ thị
begin
for y
if [k=n+1] and [] then Ghinhan[X[1],…,X[n], ]
else
if chuaxet[y] then
begin
X[k]=y;
Chuaxet[y]=false;
Hamilton[k+1];
Chuaxet[y]=true;
end
end
begin
for do chuaxet[v]=true;
X[1]= ;
chuaxet[;
Hamilton[2];
end
CÂY VÀ CÂY KHUNG CỦA ĐỒ THỊ
Định nghĩa 3
Ta gọi cây là đồ thị vô hướng liên thông không có chu trình. Đồ thị không có chu trình được gọi là rừng.
Định lý 8. Giả sử là đồ thị vô hướng đỉnh. Khi đó các mệnh đề sau đây là tương đương:
1.
là cây
2.
không chứa chu trình và có
3.
liên thông và có
4.
liên thông và mỗi cạnh của nó là cầu
5. Hai đỉnh bất kì của được nối với nhau bởi đúng một đường đi đơn
6.
không chứa chu trình nhưng hễ cứ thêm vào nó một cạnh ta thu được đúng một chu trình
CÂY VÀ CÂY KHUNG CỦA ĐỒ THỊ
Định nghĩa 4. Giả sử là đồ thị vô hướng liên thông. Cây T=[V, F] với E được gọi là cây khung của đồ thị .
Định nghĩa 5 [Cayley]. Số cây khung của đồ thị
Thuật toán xây dựng cây khung của đồ thị
procedure cay_khung_DFS[];
// Đồ thị
begin
chuaxet[v]= false;
for do
if chuaxet[u] then
begin
Cay_khung_DFS[
end
end
begin
;
Cay_khung_DFS
;
end
Thuật toán xây dựng cây khung của đồ thị
procedure cay_khung_BFS[];
// Đồ thị
begin
Queue=;
Queue
chuaxet[v]=false;
while Queue do
begin
Queue
for kề [v] do
if chuaxet[u] then
begin
Queue
chuaxet[u]=false;
end
end
end
begin
;
Cay_khung_BFS
;
end
BÀI TOÁN CÂY KHUNG NHỎ NHẤT
procedure Kruskal [1956];
begin ;
while do
begin
Chọn ;
{e};
if không chứa chu trình then ;
end
if
end
BÀI TOÁN CÂY KHUNG NHỎ NHẤT
Thuật toán Prim [1957]
Thuật toán Kruskal làm việc kém hiệu quả đối với những đồ thị dày [ đồ thị với số cạnh
] .
Trong trường hợp đó thuật toán Prim tỏ ra hiệu quả hơn. Thuật toán Prim còn được gọi là phương pháp lân cận. Trong
phương pháp này, bắt đầu từ một đỉnh tùy ý của đồ thị
•, chẳng hạn là đỉnh
•Tìm cạnh có độ dài nhỏ nhất trong số các cạnh kề với hai đỉnh
•Quá trình này tiếp tục cho đến khi được cây C
procedure Prim;
;
;
for =1 to -2 do
begin
Chọn là cạnh có trọng số nhỏ nhất trong và liên thuộc với ;
if ;
end
BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ
Bài toán 1.
Cho một đồ thị đơn vô hướng liên thông. Tìm đường đi ngắn nhất theo số cạnh từ đỉnh
Đồ thị của bài toán này không có trọng số hay trọng số của các cạnh là bằng nhau, và đường đi ngắn nhất giữa hai đỉnh trên
đồ thị được hiểu là số cạnh của đường đi này là bé nhất.
Có thể giải bài toán này bằng thuật toán BFS.
Bài toán 2. [Thuật toán tìm đường đi ngắn nhất trong đồ thị có trọng số cạnh không âm – Thuật toán Dijkstra]
Cho đồ thị đơn vô hướng liên thông có trọng số dương. Tìm đường từ đỉnh đến của sao cho tổng trọng số của
đường đi này là nhỏ nhất.
•Đặc điểm của phương pháp này là cực tiểu hóa nhãn cho các đỉnh
Ký hiệu nhãn của đỉnh
Ký hiệu là trọng số của cạnh . Giả sử
BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ
sv
={d[],d[]+a[,]}
•
•
;
for v
begin
d[v] = a[s, v];
truoc[v]=s;
end
d[s] = 0; H= V\{s};
while H do
begind[u]=min{d[z]:z};
H=H\{u};
for v
if d[v] > d[u] + a[u,v] then
begin d[v]=d[u] + a[u,v];
truoc[v]=u;
end
end
BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ
BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ
Thuật toán FLOYD
procedure Floyd;
begin
for i=1 to n do
for j=1 to n do
begin
d[i,j]=a[i,j];
p[i, j]=i;
end
for k=1 to n do
for i=1 to n do
for j= 1 to n do
if d[i, j] > d[i ,k] + d[k, j] then
begin
d[i, j] = d[i, k] + d[k, j];
p[i, j] = p[k, j];
end
end
BÀI TOÁN LUỒNG CỰC ĐẠI
Đồ thị tăng luồng
Đồ thị trạng thái của luồng
Luồng cực đại, đỉnh phát và đỉnh thu
Algorithm
1: Xây dựng đồ thị tăng luồng
2: Chọn đường tăng luồng với giá trị
3: Tiến hành tăng luồng trên đường đã xét.
Until mạng đạt trạng thái cực đại của luồng;
ưng ý
Bài toán lập lịch cho hội nghị
Một hội nghị có tiểu ban và phòng họp, mỗi tiểu ban cần sinh hoạt trong một ngày tại phòng họp phù hợp với tiểu
ban đó. Cho biết = 1 [hoặc 0] cho biết tiểu ban
. Hãy bố trí các phòng họp sao cho hội
nghị kết thúc sớm nhất.
ĐẠI SỐ BOOLE VÀ ỨNG DỤNG
Định nghĩa đại số Boole
Định nghĩa 1. Cho tập cộng ‘.’ nhân và một phép
toán một ngôi ‘ ’ [bù] thỏa mãn các tính chất sau:
1. Tính kết hợp: , b, c
2. Tính giao hoán: , b
a.b=b.a
3. Tính phân phối:
4. Phần tử trung hòa
5. Phần tử bù: {0,1} sao cho
=0
Bộ sáu[B, +,., ‘ ’,0, 1] thỏa 5 tính chất trên gọi là một đại số Boole. Thay vì viết a.b, người ta viết ab.
ĐẠI SỐ BOOLE VÀ ỨNG DỤNG
a. Xét tập B gồm các mệnh đề toán học có giá trị false, true với các phép toán logic or, and, not. Khi đó bộ sáu [{true,
false}, or, and, not, false, true] là một đại số boole.
b. Giả sử ‘ là phép lấy bù của một tập hợp con của . Ta có
‘,
c. Bộ sáu {B={0,1}, +, ., ‘, 0, 1 }, trong đó phép + được hiểu theo phép + [mod 2] trong số học, phép ‘.’’ là phép nhân
thông thường trong số học, phép bù ‘ thỏa mãn Là một đại số boole.
Các tính chất cơbản
Từ định nghĩa trên có thể chứng minh các tính chất sau đây của một đại số Boole B={0,1},
1. Luật đồng sức:
2. Luật nuốt:
3. Luật bù kép:
4. Luật De Morgan: ==
Biểu thức Boole và hàm Boole
Với tập hợp
hợp thành bởi các biến boole với các phép toán cộng, nhân và bù, các dấu ngoặc [,].
Một cách đệ quy:
Nếu , thì
là biểu thức boole.
Định nghĩa 2
Ký hiệu là tập các phần tử , . Một hàm boole n biến là một ánh xạ
Hàm boole nhận một trong hai giá trị 0 hoặc 1 ứng với mỗi bộ biến . Vì .
Nên số hàm boole của n biến là Với n=3, số hàm Boole 3 biến khác nhau là 256.
Ví dụ hàm boole ba biến
Một môn thi trắc nghiệm gồm 4 câu hỏi với số điểm lần lượt 2, 3, 5, 4. Nếu trả lời đúng mỗi câu sinh viên sẽ được điểm tối đa, trả lời sai
chỉ được không điểm. Sinh viên thi đạt kết quả từ 10 điểm trở lên. Xác định hàm boole cho biết sinh viên thi đạt [=1] hay không đạt [=0].
Từ bảng chân trị này ta xác định biểu thức của
+zt + +
CÁC DẠNG KHÁC NHAU CỦA MỘT HÀM BOOLE
1. Tích cơbản
Để tiện cho việc trình bày, ta đưa vào quy tắc sau đây: giả sử biến
Giả sử cho n biến
với {0, 1}
,…, nếu
Định lý 1
Mọi tích có thể đưa về 0 hoặc về một tích căn bản
Xét trên gồm các biến x, y, z, t. Ta có tích cơ bản của 3 biến: , yzt và các tích cơ bản của 3 biến: y,
Cho nếu mọi biến và bù của biến đều có mặt trong .
Từ định nghĩa trên dễ dàng chứng minh được rằng, nếu chứa trong thì
[luật nuốt]
Chẳng hạn, với =x là tích cơ bản của hai biến x, z và =xchứa trong
và =x
Dạng tổng chuẩn tắc của hàm Boolean
Một hàm Boolean
tích nào khác.
+xyz+
Mọi hàm Boole [khác 0] đều có thể đưa về dạng tổng chuẩn tắc:
1. Dùng luật De Morgan và bù kép đưa biểu thức về dạng trong đó phép bù chỉ áp dụng trên các biến.
2. Luật phân phối đưa biểu thức về dạng tổng của các tích.
3. Dùng luật giao hoán, luật đồng sức và luật bù để đưa mỗi tích trong biểu thức về 0 hoặc là tích cơbản.
4. Dùng luật nuốt để đưa về dạng tổng chuẩn tắc.
Ví dụ. Biểu diễn tổng chuẩn tắc của hàm Boole
Giải
=[xy + ][+yz] [Luật De Morgan]
= +0 [luật phân phối + luật bù]
=
DẠNG TỔNG CHUẨN TẮC CỦA HÀM BOOLE
Định nghĩa 3. Một hàm boole
có đủ .
Ví dụ
Hàm + + là dạng tổng chuẩn tắc hoàn toàn.
Hàm
Định lý 2. Một hàm boole ,…, ] khác 0 đều có một dạng tổng chuẩn tắc hoàn toàn và duy nhất
Thuật toán
1. Biến đổi về dạng tổng chuẩn tắc.
2. Nhân tích cơbản nào vắng mặt biến với [+
3. Lặp lại bước 2 cho đến khi trong ,,…,
Ví dụ Biểu diễn hàm boole sau đây ở dạng tổng chuẩn tắc hoàn toàn
+
Ta có biểu thức đã cho ở dạng tổng chuẩn tắc, tiếp tục với bước 2 và 3
++ +
Dạng thu gọn và dạng tối thiểu của hàm Boole
Consensus của hai tích cơbản
Định nghĩa 4. Cho có chứa hoặc . Ta gọi consensus
của , là tích của , và và xóa các biến theo luật đồng sức
Ví dụ: với =, ta có . , , ta có .
Định lý 3. Nếu . Thì + +
Chứng minh. Do có consensus nên giả sử ==với
Xét hai trường hợp: Nếu
= + = A+ = +
Nếu = , thì
+B= =
Với =xyzt,
+Q=
Nguyên nhân nguyên tố của hàm boole.
Tích cơbản [implicant] của hàm :
+
Thật vây, viết ,
=x [
+xy +
Dễ thấy :+
Định nghĩa 5
Giả sử
nguyen nhân nguyên tố của f.
Dễ dàng kiểm tra là nguyên nhân nguyen tố
+
Dạng thu gọn và tối thiểu của hàm Boole
Định nghĩa 6. Ta gọi độ phức tạp của một dạng tổng chuẩn tắc là số lần các biến xuất hiện trong nó.
Chẳng hạn,
Định nghĩa 7. Dạng tổng chuẩn tắc của hàm
Hàm có dạng tương đương
Định nghĩa 8.
Hàm Boole
Hàm +
Định nghĩa 9.
Một dạng tổng chuẩn tắc của hàm hạng của nó là các nguyen nhân nguyên tố cốt yếu của
.
Lập bảng cho dạng thu gọn của này, mọi nguyên nhân nguyên tố của
Tối thiểu hóa hàm Boole
1. Phương pháp biến đổi đại số
Đưa
.
Xuất phát từ dạng thu gọn của , chọn các nguyên nhân nguyên tố cốt yếu, ta được dạng tối thiểu cần tìm.
Tối thiểu hóa hàm boole
Giải
Bước 1: ++ [ luật nuốt của số hạng thứ 2 và thứ 5]
= +z [nhóm số hạng thứ 1 và thứ 3]
= z + xy [Cộng them Q=
= + [luật nuốt của số hạng thứ 2 và thứ 4]
Đến đây ta thu được dạng tối thiểu của
Tuy nhiên nếu cộng thêm
Bước 2: Trong hai biểu thức ở trên của , có thể xóa số hạng
+
+
Phương pháp Karnaugh
Trường hợp hai biến
Mỗi tích cơbản ,
Xác định tối thiểu của hàm sau đây
+
Trường hợp 3 biến
Tìm dạng tối thiểu của hàm
+
x x x
+
Trường hợp bốn biến
Phương pháp Quine-Mc.Cluskey
+t+
•Bước 1: Đưa về dạng chuẩn tắc thu gọn ,
•Bước 2: Sắp xếp tổ hợp theo số lượng số 1 thành nhóm
•Bước 3: So sánh mỗi tổ hợp nhóm khác nhau một vị trí. Thay vị trí khác
nhau bằng dấu ‘-’.
•Bước 4: Gạch bỏ tổ hợp trùng lặp chỉ để lại một và tiếp tục thực hiện bước 3 cho đến khi không thể thực hiện
được nữa.
+a +abc
=a+bc
x
y
x+y
xy
x+y
x
y
x
yxy