Tải bản đầy đủ (.pdf) (110 trang)

Giáo án Bài giảng về: Toán rời rạc trong cách giải bài tập (Trường đại học sư phạm kỹ thuật )

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (847.75 KB, 110 trang )




TRƯỜNG ðẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN
KHOA CÔNG NGHỆ THÔNG TIN







BÀI TẬP
HỌC PHẦN TOÁN RỜI RẠC 2

Trình ñộ ñào tạo

Hệ ñào tạo


:

:

ðại học
Chính quy/Liên thông


Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 2


LỜI NÓI ĐẦU
Có thể nói toán học rời rạc là môn tiên quyết và hiệu quả nhất ñể người học
nâng cao tư duy toán học trong phân tích, thiết kế thuật toán và rèn luyện kỹ năng
lập trình với những thuật toán phức tạp. Không những thế nó còn là “cửa ngõ” ñể
người học có thể tiếp cận với rất nhiều modul trong khoa học máy tính (như
Chương trình dịch, lý thuyết tính toán, Trí tuệ nhân tạo, ). Bài tập ñể củng cố
và nâng cao kiến thức trong môn học này
Về nội dung, bám sát với chương trình của nhà trường và hệ thống bài tập
cũng ñược biên soạn theo các chương lý thuyết. Với mỗi chương sẽ ñược chia thành
4 phần:
Phần A. Nhắc lại lý thuyết: tóm tắt các kiến thức cơ bản, các ví dụ và các
lưu ý hữu ích, các kinh nghiệm trong khi lập trình
Phần B. ðề bài tập: ñưa ra các loại bài tập khác nhau, với các mức ñộ khác
nhau.
Phần C. Bài tập mẫu: Hướng dẫn giải một số bài tiêu biểu trong phần B, có
phân tích thuật toán và cài ñặt chương trình.
Phần D. Bài tập tự giải: Người học thực hiện việc giải các bài tập này
Mong rằng tài liệu này ñáp ứng ñược phần nào nhu cầu của học sinh, sinh viên. ðây
là bản ñầu tiên chắc chắn còn rất nhiều sai sót. Nhóm tác giả mong nhận ñược sự
ñóng góp của các thầy cô giáo, các bạn sinh viên và của tất cả những ai quan tâm tới
lĩnh vực này.


Hưng Yên, tháng 7 năm 2010
Bộ môn Công nghệ phần mềm
Khoa Công nghệ thông tin
Trường ñại học sư phạm kỹ thuật Hưng Yên
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 3

MỤC LỤC
Bài 1: Các khái niệm cơ bản của Lý thuyết ñồ thị 5
Mục tiêu 5
a. Nhắc lại lý thuyết 5
b. ðề bài tập 5
c. Hướng dẫn giải 6
d. Bài tập tự giải 7
Bài 2: Biểu diễn ñồ thị trên máy tính 10
Mục tiêu 10
a. Nhắc lại lý thuyết 10
b. ðề bài tập 10
c. Hướng dẫn giải 10
d. Bài tập tự giải 14
Bài 3: ðồ thị Euler 15
Mục tiêu 15
a. Nhắc lại lý thuyết 15
b. ðề bài tập 16
c. Hướng dẫn giải 16
d. Bài tập tự giải 19
Bài 4: ðồ thị hamilton 20
Mục tiêu 20
a. Nhắc lại lý thuyết 20
b. ðề bài tập 20
c. Hướng dẫn giải 20
d. Bài tập tự giải 22
Bài 5: Thảo luận cài ñặt ñồ thị, các thuật toán liệt kê chu trình Euler và Hamilton.
Thảo luận về bài tập lớn 23
Mục tiêu 23
a. Nhắc lại lý thuyết 23
b. ðề bài tập 23

c. Hướng dẫn giải 23
d. Bài tập tự giải 31
Bài 6 Thuật toán tìm kiếm trên ñồ thị và ứng dụng 34
Mục tiêu 34
a. Nhắc lại lý thuyết 34
b. ðề bài tập 34
c. Hướng dẫn giải 34
d. Bài tập tự giải 51
Bài 7: Cây và cây khung 52
Mục tiêu 52
a. Nhắc lại lý thuyết 52
b. ðề bài tập 53
c. Hướng dẫn giải 54
d. Bài tập tự giải 55
Bài 8: Thảo luận về cài ñặt thuật toán tìm cây khung nhỏ nhất trên ñồ thị 58
Mục tiêu 58
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 4
a. Nhắc lại lý thuyết 58
b. ðề bài tập 58
c. Hướng dẫn giải 58
d. Bài tập tự giải 70
Bài 9, 10: Bài toán tìm ñường ñi ngắn nhất 71
Mục tiêu 71
a. Nhắc lại lý thuyết 71
b. ðề bài tập 71
c. Hướng dẫn giải 73
d. Bài tập tự giải 92
Bài 12: Bài toán luồng cực ñại trong mạng 97

Mục tiêu 97
a. Nhắc lại lý thuyết 97
b. ðề bài tập 98
c. Hướng dẫn giải 99
d. Bài tập tự giải 101

Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 5
Bài 1: Các khái niệm cơ bản của Lý thuyết ñồ thị
Mục tiêu
- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau.
- Cài ñặt ñược chương trình chuyển ñổi giữa các phương pháp.
- Sinh viên có khả năng tự học.
a. Nhắc lại lý thuyết
- Hai ñỉnh x, y ñược gọi là cặp ñỉnh liên thông , nếu hoặc giữa x và y có ít nhất một
xích nối với nhau, hoặc tồn tại ít nhất một ñường ñi từ y sang x.
- ðồ thị vô hướng G(V,E) ñược gọi là ñồ thị liên thông, nếu mọi cặp ñỉnh của nó
ñều liên thông.
- ðồ thị có hướng G(V,E) ñược gọi là ñồ thị liên thông mạch, nếu mọi cặp ñỉnh của
nó ñều liên thông.
- Biểu diễn dạng hình học: Giả sử có ñồ thị G(V,E).
Biểu diễn ñỉnh: lấy các ñiểm trên mặt phẳng hay trên không gian tương ứng
với các phần tử của tập V và dùng ngay ký hiệu các phần tử này ñẻ ghi trên các
ñiểm tương ứng.
Biểu diễn cạnh: Nếu cạnh a với hai ñỉnh ñầu là x,y thì nó ñược biểu diễn
bằng ñoạn thẳng hay một ñoạn cong nối giữa hai ñiểm x, y và không ñi qua các
ñiểm tương ứng trong không gian.
Biểu diễn cung: nếu cung a có ñỉnh ñầu là x, ñỉnh cuối là y, thì nó ñược biểu
diễn bằng một ñoạn thẳng hoặc ñoạn cong ñược ñịnh hướng ñi từ x sang y và không

qua các ñiểm tương ứng trung gian khác.
Hình nhận ñược gọi là dạng biểu diễn hình học của ñồ thị G(V, E). ðôi khi
người ta cũng gọi dạng biểu diễn hình học là một ñồ thị.
b. ðề bài tập
Bài 1 Cho G ñồ thị gồm 4 phần G1, G2, G3 và G4 như sau:
a. Chỉ ra tập ñỉnh, cạnh(vô hướng,có hướng, khuyên, ) của mỗi ñồ thị ñã cho? Chỉ
loại ñồ thị ñó?
b. ðồ thị G, G1, G2, G3, G4 và G5 có liên thông ko? Nếu ñồ thị ko liên thông hãy
chỉ ra các thành phần liên thông?
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 6
c. ðồ thị G, G1, G2, G3, G4 và G5 có chu trình ko? Chỉ ra các chu trình của ñồ thị
(nếu có)?


c. Hướng dẫn giải
Bài 1
a.
Tên ñồ thị Tập ñỉnh V Tập cạnh E Loại ñồ thị
G1 1,2,3,4 (1,2);(1,4);(2,3);(2,4);(3,4) Vô hướng
G2 5,6,7 (5,6);(5,7);(6,7) Có hướng
G3 8,9 (8,9) Vô hướng
G4 0
G 1,2,3,4,5,6,7,8,9,0
(1,2);(1,4);(2,3);(2,4);(3,4);
(8,9)
(5,6);(5,7);(6,7)
Hỗn hợp


b.
Tên ñồ thị Tính liên thông Tên thành phần liên thông
G1 Có G1
G2 Có G2
G
1

1

4
3

2

5
7

6

8

9

00
G
2

G
3


G
4

Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 7
G3 Có G3
G4 Có G4
G Không G1,G2,G3,G4

c.
Tên ñồ thị Có chu trình? Tên chu trình
G1 Có (1,2,4,1);(1,2,3,4,1);(2,3,4,2)
G2 Không
G3 Không
G4 Không
G Có (1,2,4,1);(1,2,3,4,1);(2,3,4,2)

d. Bài tập tự giải
Bài 1. Một quần ñảo có n( n
) hòn ñảo và hai hòn ñảo bất kì thuộc quần ñảo ñều
có số ñầu mối ñường ngầm tới một trong nhưng hòn ñảo nầy ñều nhỏ hơn n. Chứng
minh rằng từ một hòn ñảo tùy ý thuộc quần ñảo ta có thể ñi ñến một hòn ñảo bất kì
khác của quần ñảo bằng ñường ngầm.
Bài 2 Khi về nghỉ hè mỗi bạn học sinh của lớp 11A trường Lê Hồng Phong ñều
trao ñổi ñịa chỉ với ít nhất một nửa số bạn trong lớp. Chứng minh rằng trong thời
gian nghỉ hè mỗi bạn của lớp 11A ñều có thể báo tin trực tiếp hay gián tiếp cho các
bạn trong lớp.
Bài 3 Trong một cuộc họp có ñúng hai ñại biểu không que nhau và mỗi ñại biểu này
có một số lẻ người que ñến dự. Chứng minh rằng luôn luôn có thể xếp một số ñại

bieetr ngồi chen giữa hai ñại biể nói trên , ñể người ngồi giữa hai người mà anh(
chị) ta quen.
Hướng ñẫn:
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 8
ðể giải ñược bài toán trên trước hết ta xây dựng các ñồ thị tương ứng, sau ñó vận
dụng kết quả của ñịnh lý 4.1, hệ quả 4.1 và ñịnh lý 4.2 mà suy ra kết luận.
Xuây dựng ñồ thị
• ðỉnh: Lấy các ñiểm trong mặt phẳng hay trong không gian tương ứng với các
hòn ñảo thuộc quần ñảo ( các bạn học sinh trong lớp 11A, các ñại biểu ñến
họp).
• Cạnh: Hai ñiểm x, y ñược nối bằng một cạnh khi và chỉ khi hai hòn ñảo x, y
có ñường ngầm trực tiếp với nhau( các bạn x, y trao ñổi ñịa chỉ cho nhau, các
ñại biểu x, y quen nhau)
- ðồ thị nhân ñược ký hiệu bằng G
1
, (G
2
, G
3
)
- ðồ thị G
1
mô tả toàn bộ lưới ñường ngầm trong quần ñảo
- ðồ thị G
2
mô tả toàn bộ quan hệ trao ñổi ñịa chỉ trong lớp 11A
- ðồ thị G
3

mô tả toàn bộ quen biết trong các ñại biểu trong các ñại biểu ñến
dự họp.
Vận dụng kết quả các ñịnh lý ñể suy ra kết luận
- Do hai hòn ñảo bất kì ñều có tổng số ñầu mối ñường ngầm không nhỏ hơn n, nên
hai ñỉnh bất kì của ñồ thị G
1
ñều có tổng bậc không nhỏ hơn n. Bởi vậy theo ñịnh lý
4.1. ñồ thị G
1
liên thông, nên hai hòn ñảo bất kì có ñường hầm nối với nhau.
- Vì mỗi bạn học sinh trong lớp 11A trao ñổi ñịa chỉ với ít nhất một nửa số bạn tron
lớp, nên bậc của mỗi ñỉnh của G
2
không nhỏ hơn một nửa số ñỉnh của ñồ thị. Khi ñó
, theo hệ quả 4.1. ñồ thị G
2
liên thông. Bởi vậy hai ñỉnh x, y ñều có xích nối với
nhau. Khi ñó thông qua các bạn tương ứng với các ñỉnh thuộc xích
, mà bạn tương
ứng với ñỉnh x báo tin ñược cho tương ứng với ñỉnh y và ngược lại.
- Hai ñại biểu không quen nhau, thì hai ñỉnh tương ứng không kề nhau. Mỗi ñại biểu
này lại có một số lẻ người quen ñến họp, nên trong ñồ thị liên thông G
3
có ñúng hai
ñỉnh bậc lẻ và hai ñỉnh này lại không kề nhau. Khi dó, theo ñịnh lý 4.2, hai ñỉnh này
liên thông nên có ít nhất một xich nối giữa hai ñỉnh này. Giả sử
là một trong
những mối xích nối giữa hai bậc lẻ này. Dựa vào
ta sắp xếp các ñại biểu tương
ứng ngồi giữa hai người mà anh chị quen.

Bài 4 Cho G ñồ thị như sau:
Chỉ ra tập ñỉnh, cạnh(vô hướng,có hướng, khuyên, ) của mỗi ñồ thị ñã cho? Chỉ
loại ñồ thị ñó? ðồ thị có liên thông ko? Nếu ñồ thị ko liên thông hãy chỉ ra các
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 9
thành phần liên thông? ðồ thị có chu trình ko? Chỉ ra các chu trình của ñồ thị (nếu
có)?







Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 10
Bài 2: Biểu diễn ñồ thị trên máy tính
Mục tiêu
- Nêu ñược các cách biểu diễn ñồ thị và biểu diễn ñồ thị trên máy tính trên máy tính.
- ðưa ra ñược ma trận kề, danh sách các cạnh, cung tương ứng với 1 ñồ thị cho
trước.
- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau.
- - Phân tích ñược bài toán thực tế tương ứng phần lý thuyết ñã học.
- Sinh viên có khả năng tự học.
a. Nhắc lại lý thuyết

b. ðề bài tập
Bài 1 Cho G ñồ thị gồm 4 phần G1, G2, G3 và G4 như sau:



a. Biểu diễn các ñồ thị G,G1,G2,G3,G4 dưới dạng ma trận kề
b. Biểu diễn các ñồ thị G,G1,G2,G3,G4 dưới dạng danh sách cạnh(cung)
c. Biểu diễn các ñồ thị G,G1,G2,G3,G4 dưới dạng danh sách kề
Bài 2 Cài ñặt chương trình nhập danh sách kề của ñồ thị từ bàn phím và ñưa danh
sách ñó ra màn hình.

c. Hướng dẫn giải
Bài 1
G
1

1

4
3

2

5
7

6

8

9

00

G
2

G
3

G
4

Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 11
Tên ñồ thị a. ma trận kề
b. danh sách
cạnh(cung)
c.danh sách kề
G1 1 2 3 4
1 0 1 0 1
2 1 0 0 1
3 0 0 0 1
4 1 1 1 0
Danh sách cạnh
1 2
1 4
2 3
2 4
3 4
1 2 4
2 1 4
3 4

4 1 2 3
G2 5 6 7
5 0 0 1
6 1 0 1
7 0 0 0
Danh sách cung
5 6
5 7
6 7
5 6 7
6 7
G3 8 9
8 0 1
9 1 0
Danh sách cạnh
8 9
8 9
9 8
G4 0
0 0

G 1 2 3 4 5 6 7 8 9 0
1 0 1 0 1 0 0 0 0 0 0
2 1 0 0 1 0 0 0 0 0 0
3 0 0 0 1 0 0 0 0 0 0
4 1 1 1 0 0 0 0 0 0 0
5 0 0 0 0 0 0 1 0 0 0
Danh sách cung
1 2
1 4

2 1
2 3
2 4
1 2 4
2 1 4
3 4
4 1 2 3
5 6 7
6 7
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 12
6 0 0 0 0 1 0 1 0 0 0
7 0 0 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0 1 0
9 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0

3 2
3 4
4 1
4 2
4 3
5 6
5 7
6 7
8 9
9 8
0


Bài 2 Chương trình nhập danh sách kề của ñồ thị từ bàn phím và ñưa danh sách ñó
ra màn hình
Phân tích bài toán :
Trong rất nhiều thuật toán làm việc với ñồ thị chúng ta thường xuyên phải thực hiện
các thao tác: Thêm hoặc bớt một số cạnh. Trong trường hợp này Cấu trúc dữ liệu
dùng ở trên là không thuận tiện. Khi ñó nên chuyển sang sử dụng danh sách kề liên
kết (Linked Adjancency List) như mô tả trong chương trình nhập danh sách kề của
ñồ thị từ bàn phím và ñưa danh sách ñó ra màn hình
Chương trình minh họa :

Program AdjList;
Const
maxV=100;
Type
link=^node;
node=record
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 13
v:integer;
next:link;
End;
Var
j,x,y,m,n,u,v:integer;
t:link;
Ke:array[1. .Vmax] of link;
Begin
Write(‘Cho so canh va dinh cua do thi:’); readln(m,n);
(*Khoi tao*)
for j:=1 to n do Ke[j]:=nil;

for j:=1 to m do
begin
write(‘Cho dinh dau va cuoi cua canh ‘,j,’:’);
readln(x,y);
new(t); t^.v:=x, t^.next:=Ke[y]; Ke[y]:=t;
new(t); t^.v:=y, t^.next:=Ke[x]; Ke[x]:=t;
end;
writeln(‘Danh sach ke cua cac dinh cua do thi:’);
for J:=1 to m do
begin
writeln(‘Danh sachcac dinh ke cua dinh ‘,j,’:’);
t:=Ke[j];
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 14
while t^.next<>nil do
begin
write(t^.v:4);
t:=t^.next;
end;
end;
readln;
End.

d. Bài tập tự giải


Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 15

Bài 3: ðồ thị Euler
Mục tiêu
- Kiểm tra ñược một ñồ thị bất kỳ có là ñồ thị euler hay không.
- Áp dụng ñược thuật toán tìm chu trình Euler, ñường Euler, với 1 ñồ thị cho trước.
- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau. Cài ñặt
ñược chương trình chuyển ñổi giữa các phương pháp.
- Cài ñặt ñược thuật toán Tìm chu trình Euler.
- Cài ñặt ñược thuật toán duyêt ñồ thị duyệt theo chiều sâu hoặc duyệt theo chiều
rộng.
- Sinh viên có khả năng tự học.
a. Nhắc lại lý thuyết
- Chu trình (t.ư. ñường ñi) ñơn chứa tất cả các cạnh (hoặc cung) của ñồ thị (vô
hướng hoặc có hướng) G ñược gọi là chu trình (t.ư. ñường ñi) Euler. Một ñồ thị
liên thông (liên thông yếu ñối với ñồ thị có hướng) có chứa một chu trình (t.ư.
ñường ñi) Euler ñược gọi là ñồ thị Euler (t.ư. nửa Euler).

Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 16

ðịnh lý
ðồ thị (vô hướng) liên thông G là ñồ thị Euler khi và chỉ khi mọi ñỉnh của G ñều có
bậc chẵn.
Hệ quả
ðồ thị liên thông G là nửa Euler (mà không là Euler) khi và chỉ khi có ñúng hai
ñỉnh bậc lẻ trong G.
Thuật toán vạch ñược một chu trình Euler trong ñồ thị liên thông G có bậc của mọi
ñỉnh là chẵn theo thuật toán Fleury sau ñây.
Xuất phát từ một ñỉnh bất kỳ của G và tuân theo hai quy tắc sau:
1. Mỗi khi ñi qua một cạnh nào thì xoá nó ñi; sau ñó xoá ñỉnh cô lập (nếu có);

2. Không bao giờ ñi qua một cầu, trừ phi không còn cách ñi nào khác.

b. ðề bài tập
Bài 1: ðồ thị sau có là ñồ thị nửa Euler hay ñồ thị Euler ko? Giải thích?
c. Hướng dẫn giải
Bài 1: ðồ thị sau có là ñồ thị nửa Euler hay ñồ thị Euler ko? Giải thích?

Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 17

ðồ thị G1 là ñồ thị nửa Euler
Thật vây, các ñỉnh a,b,e có bậc là 2,4,4 là bậc chẵn, các ñỉnh c và d có bậc là 3 là
bậc lẻ

ðồ thị G2 là ñồ thị nửa Euler
Thật vây, các ñỉnh c và d có bậc là 2 là bậc chẵn, các ñỉnh a và c có bậc là 1 là bậc
lẻ

a

b

e

c

d

G1

a

d

b

c

G2
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 18

ðồ thị G3 không là ñồ thị Euler
Thật vậy G3 có 3 ñỉnh a,d và g có bậc là 1 là bậc lẻ

G4
ðồ thị G4 là ñồ thị nửa Euler vì theo hệ quả
Thật vây, các ñỉnh 3,4,5 có bậc là 2 là bậc chẵn, các ñỉnh 1 và 2 có bậc là 3 là bậc lẻ

Bài 2
g

a

d

b

c


e

f

G3
1
2
3 4
5
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 19

Xuất phát từ u, ta có thể ñi theo cạnh (u,v) hoặc (u,x), giả sử là (u,v) (xoá
(u,v)). Từ v có thể ñi qua một trong các cạnh (v,w), (v,x), (v,t), giả sử (v,w) (xoá
(v,w)). Tiếp tục, có thể ñi theo một trong các cạnh (w,s), (w,y), (w,z), giả sử (w,s)
(xoá (w,s)). ði theo cạnh (s,y) (xoá (s,y) và s). Vì (y,x) là cầu nên có thể ñi theo một
trong hai cạnh (y,w), (y,z), giả sử (y,w) (xoá (y,w)). ði theo (w,z) (xoá (w,z) và w)
và theo (z,y) (xoá (z,y) và z). Tiếp tục ñi theo cạnh (y,x) (xoá (y,x) và y). Vì (x,u) là
cầu nên ñi theo cạnh (x,v) hoặc (x,t), giả sử (x,v) (xoá (x,v)). Tiếp tục ñi theo cạnh
(v,t) (xoá (v,t) và v), theo cạnh (t,x) (xoá cạnh (t,x) và t), cuối cung ñi theo cạnh
(x,u) (xoá (x,u), x và u).
d. Bài tập tự giải


Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 20
Bài 4: ðồ thị hamilton

Mục tiêu
- Kiểm tra ñược một ñồ thị bất kỳ có là ñồ thị Hamilton hay không.
- Áp dụng ñược thuật toán tìm chu trình Hamilton, ñường Hamilton, với 1 ñồ thị
cho trước.
- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau. Cài ñặt
ñược chương trình chuyển ñổi giữa các phương pháp.
- Cài ñặt ñược thuật toán Tìm chu trình Halmiton.
- Cài ñặt ñược thuật toán duyêt ñồ thị duyệt theo chiều sâu hoặc duyệt theo chiều
rộng.
- Sinh viên có khả năng tự học.
a. Nhắc lại lý thuyết
- ðồ thị Hamilton(nửa Hamilton) là ñồ thị có chứa một chu trình(ñường ñi)
Hamilton
Hay
ðường ñi (x[1],x[2],…,x[n]) ñược gọi là ñường ñi Hamilton nếu x[i]≠x[j]
(1≤i<j≤n)
Chu trình (x[1],x[2],…,x[n],x[1]) ñược gọi là chu trình Hamilton nếu
x[i]≠x[j] (1≤i<j≤n)
Note! Cho tới nay, vẫn chưa tìm ra phương pháp với ñộ phức tạp ña thức ñể tìm chu
trình cũng như ñường ñi Hamilton trong trướng hợp ñồ thị tổng quát.
Có thể sử dụng thuật toán quay lui ñể liệt kê chu trình Hamilton

b. ðề bài tập
Bài 1: ðồ thị sau có là ñồ thị nửa Hamilton hay ñồ thị Hamilton ko? Giải thích?
c. Hướng dẫn giải
Bài 1: ðồ thị sau có là ñồ thị nửa Hamilton hay ñồ thị Hamilton ko? Giải thích?
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 21



ðồ thị G1 là ñồ thị Hamilton


ðồ thị G2 là ñồ thị nửa Hamilton

ðồ thị G3 không có chu trình hay ñường ñi Hamilton
a

b

e

c

d

G1
a

d

b

c

G2
g

a


d

b

c

e

f

G3
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 22

G4
ðồ thị G4 là ñồ thị Hamilton, vì có chu trình Hamilton (1,3,5,2,4,1)
d. Bài tập tự giải

1
2
3 4
5
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 23
Bài 5: Thảo luận cài ñặt ñồ thị, các thuật toán liệt kê chu trình Euler và
Hamilton. Thảo luận về bài tập lớn
Mục tiêu

- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau.
- Chuyển ñổi giữa các kiểu biểu diễn ñồ thị trên máy tính.
- Nâng cao khả năng làm việc nhóm.
- Rèn luyện tư duy sáng tạo.
- Phân tích ñược bài toán thực tế tương ứng phần lý thuyết ñã học.
- Sinh viên có khả năng tự học.
a. Nhắc lại lý thuyết
Xem lại trong bài 3 và bài 4
b. ðề bài tập
Bài 1 Tìm chu trình Euler trong ñồ thị G.
Bài 2 Tìm chu trình Halmiton trong ñồ thị G.

c. Hướng dẫn giải
Bài 1 ðề bài : Cài ñặt chương trình tìm chu trình Euler trong ñồ thị G.
Cho ñồ thị G=(X,E) tồn tại chu trình Euler. Hãy tìm chu trình (chi trình Euler là
chu trình ñi qua tất cả các cạnh của ñồ thị, mỗi cạnh ñi qua ñúng một lần).
Phân tích bài toán :
ðầu vào: ðồ thị G
ðầu ra: Chu trình Euler (nếu có)
2. Thuật toán:
Xuất phát từ một ñỉnh u bất kỳ, khi ñi qua cạnh nào thì xoá cạnh ñó khỏi ñồ thị và
ghi lại từ trái sang phải. Khi thực hiện thuật toán cần lưu ý nếu gặp cạnh bắc cầu
giữa 2 thành phần liên thông thì ta phải xoá hết thành phần liên thông rồi mới xoá
ñến cạnh bắc cầu.
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 24
Khi xoá cạnh bắc cầu thì phải loại hết các ñỉnh trơ trọi (nghĩa là không kề với bất cứ
ñỉnh nào thuộc ñồ thị).
Cấu trúc dữ liệu:

Biểu diễn ñồ thị bằng ma trận kề a(i,j), do ñó lưu ý khi xoá ñi một cạnh ta chỉ việc
gán a(i,j)=a(j,i)=0, ñồng thời phải lưu cạnh vừa xoá vào một mảng khác: Mảng Ctr.
Mảng lt: array [1…Nmax] of integer dùng trong thủ tục tìm thành phần liên thông
(giống như một thuật toán tìm thành phần liên thông trình bày ở trên).
Mảng dd: array [1…Nmax] of Boolean, giá trị dd[i] cho biết ñỉnh i bị loại khỏi ñồ
thị hay chưa. Nếu bị lại thì dd[i]=True; ngược lại dd[i]=False;
Thủ tục
Procedure Euler_Cycle;
Begin
STACK:=∅ ; CE:=∅ ;
Chon u la mot dinh nao do cua do thi;
STACK← u;
While STACK<>∅ do
Begin
X:=top(STACK); (* x la phan tu dau STACK)
If Ke(x)<>∅ then
Begin
Y:=dinh dau tien trong danh sach Ke(x);
STACK← y;
(* loai bo canh (x,y) khoi do thi *)
Ke(x):=Ke(x)\ { y} ;
Ke(y):=Ke(y)\{ x} ;
Bài tập TOÁN RỜI RẠC 2 Bộ môn Công nghệ phần mềm - 2010

Trang 25
End
Else
Begin
x⇐ STACK; CE⇐ x;
End;

End;
End;
Chương trình minh họa :
Program Chu_trinh_Euler;
Const Nmax=100;
Emax=100;
Var a:array[1…Nmax,1 Nmax]of integer;
Ctr: array[1…Emax,1,2]of integer;
dd: array[1…Nmax]of Boolean;
lt: array[1…Nmax]of integer;
SolC,N:integer;
(*Biến Solc là số cạnh của chu trình, sẽ tăng lên một ñơn vị mỗi khi ta ñi qua
một cạnh*).
Program Timtplt(k:integer);
(* Thủ tục này tìm thành phần liên thông giống như thuật toán tình thành phần
liên thông trình bày ở trên chỉ khác một ñiểm là ta chỉ tìm tplt ñối với các ñỉnh chưa
bị loại khỏi ñồ thị *).
Var i:integer;
Begin lt[k]:=sotp;

×