Tải bản đầy đủ (.docx) (33 trang)

ỨNG DỤNG LẬP TRÌNH SYMBOLIC ĐỂ TÌM ĐƯỜNG ĐI, CHU TRÌNH EULER VÀ HAMILTON

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 (331.78 KB, 33 trang )

ĐẠI HỌC QUỐC GIA TP.HCM
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA HỌC MÁY TÍNH

BÁO CÁO THU HOẠCH
MÔN LẬP TRÌNH SYMBOLIC VÀ TRÍ TUỆ NHÂN TẠO
ĐỀ TÀI:
ỨNG DỤNG LẬP TRÌNH SYMBOLIC
ĐỂ TÌM ĐƯỜNG ĐI, CHU TRÌNH EULER VÀ HAMILTON
Giảng viên phụ trách: Học viên thực hiện:
PGS.TS ĐỖ VĂN NHƠN NGUYỄN NGỌC LÂM
MSHV: CH1101098
LỚP: CH-K6
TP.HCM 02-2013
Lời mở đầu
LỜI MỞ ĐẦU
Lý thuyết đồ thị là một ngành khoa học được phát triển từ lâu, nhưng có nhiều
ứng dụng hiện đại nhất là ứng dụng trong tin học ngày nay. Những ý tưởng cơ
bản của nó được đưa ra từ thế kỷ XVIII bởi nhà toán học Thụy Sĩ tên là
Leonhard Euler. Ông đã dùng đồ thị để giải quyết bài toán nổi tiếng về các cầu ở
Konigsberg hay còn gọi là bài toán 7 chiếc cầu.
Đặc biệt trong khoảng vài mươi năm trở lại đây, cùng với sự ra đời của máy tính
điện tử và sự phát triển nhanh chóng của Tin học, Lý thuyết đồ thị càng được
quan tâm nhiều hơn. Đặc biệt là các thuật toán trên đồ thị đã có nhiều ứng dụng
trong nhiều lĩnh vực khác như: Mạng máy tính, Lý thuyết mã, Tối ưu hoá, Kinh
tế học v.v
Phạm vi của bài thu hoạch sẽ khảo sát và cài đặt ứng dụng minh họa, giải quyết
bài toán tìm đường đi, chu trình Euler và Hamilton dựa trên sự hỗ trợ của phần
mền toán học Maple 16.
Maple 16 là phần mềm toàn diện để giải quyết các bài toán cao cấp. Bao gồm
những công cụ xử lý, tính toán trong các lĩnh vực toán học như :


 Đại số tuyến tính: ma trận, định thức, hệ phương trình tuyến tính, không
gian véctơ,
 Giải tích: hàm số, giới hạn, liên tục, đạo hàm, tích phân, phương trình vi
phân, chuỗi …
 Lý thuyết đồ thị: đỉnh, cung, liên thông, đường đi, chu trình,
 Đồ họa, Toán rời rạc, Thống Kê, … và nhiều lĩnh vực khác của toán học.
Với trên 3000 hàm số Maple là một trợ lý toán học tuyệt vời giúp giải quyết
phần tính toán trong học tập và nghiên cứu.
Lời mở đầu
Nội dung của bài thu hoạch bao gồm 4 chương, chủ yếu lựa chọn và sắp xếp
những nội dung then chốt nhất trong khoảng thời gian cho phép. Bài thu hoạch
trình bày và giới thiệu một cách tương đối hệ thống những kiến thức cơ bản về
đồ thị Euler và đồ thị Hamilton.
 Chương 1. TỔNG QUAN VỀ LÝ THUYẾT ĐỒ THỊ
Nội dung chương 1 trình bày tổng quan các khái niệm cơ bản về lý thuyết
đồ thị, đồng thời giới thiệu cách để biểu diễn đồ thị trên máy tính.
 Chương 2. ĐƯỜNG ĐI EULER VÀ ĐỒ THỊ EULER
Chương 2 trình bày tổng quan các khái niệm cơ bản về đồ thị Euler như:
đường đi Euler, chu trình Euler và các giải thuật.
 Chương 3. ĐƯỜNG ĐI HAMILTON VÀ ĐỒ THỊ HAMILTON
Chương 3 trình bày tổng quan các khái niệm cơ bản về đồ thị Hamilton
như: đường đi Hamilton, chu trình Hamilton.
 Chương 4. CÀI ĐẶT ỨNG DỤNG MINH HỌA
Chương 4 sẽ cài đặt ứng dụng minh họa cho bài toán tìm đường đi, chu trình
Euler và Hamilton dựa trên sự hỗ trợ của phần mền toán học Maple 16.
Lời cảm ơn
LỜI CẢM ƠN
Với lòng biết ơn sâu sắc nhất, em xin gửi đến quý Thầy Cô ở khoa, Khoa Học
Máy Tính - Trường Đại Học Công Nghệ Thông Tin đã đem hết tâm huyết
truyền đạt vốn kiến thức quý báu cho chúng em.

Em xin chân thành cảm ơn PGS.TS Đỗ Văn Nhơn đã truyền đạt kiến thức môn
Lập trình Symbolic & trí tuệ nhân tạo. Qua đó giúp em có đầy đủ kiến thức để
hoàn thành bài thu hoạch này.
Nhân đây em cũng xin gửi lời cảm ơn chân thành đến gia đình, bạn bè, đồng
nghiệp đã động viên tin thần cho em trong suốt quá trình học tập của mình.
Sau cùng, em xin kính chúc quý Thầy Cô, Khoa Học Máy Tính cùng PGS.TS
Đỗ Văn Nhơn dồi dào sức khỏe để thực hiện sứ mệnh cao đẹp của mình là
truyền đạt kiến thức cho thế hệ mai sau.
Một lần nữa em xin chân thành cảm ơn !
Nhận xét của giảng viên phụ trách
TP. HCM, ngày 02 tháng 02 năm 2013
Sinh viên thực hiện
(ký và ghi rõ họ tên)
Nguyễn Ngọc Lâm
NHẬN XÉT CỦA GIẢNG VIÊN PHỤ TRÁCH



















Nhận xét của giảng viên phụ trách

Mục lục
TP. HCM, ngày tháng năm 2013
Giảng viên phụ trách
(ký và ghi rõ họ tên)
PGS. TS Đỗ Văn Nhơn
MỤC LỤC
DANH MỤC CÁC HÌNH
Số hiệu hình Tên hình Trang
1.1
Phân loại đồ thị
2
2.1
Mô hình đồ thị của bài toán 7 cây cầu
6
2.2
Đồ thị Euler
8
2.3
Chu trình Hamilton
11
4.1
Đồ thị Euler trong Maple 16
16
4.2
Đồ thị Hamilton trong Maple 16

18
DANH MỤC CÁC BẢNG
Số hiệu bảng Tên bảng Trang
1.1
Danh sách kề
4
Chương 1. Tổng quan về lý thuyết đồ thị
Chương 1. TỔNG QUAN VỀ LÝ THUYẾT ĐỒ THỊ
1.1 Các khái niệm cơ bản về đồ thị
1.1.1 Định nghĩa đồ thị (Graph)
Là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó. Được mô tả
hình thức:
G = (V, E)
Trong đó:
 V gọi là tập các đỉnh (Vertices).
 E gọi là tập các cạnh (Edges). Có thể coi E là tập các cặp (u, v) với u và
v là hai đỉnh của V.
1.1.2 Đơn đồ thị
G được gọi là đơn đồ thị nếu giữa hai đỉnh u, v của V có nhiều nhất là 1 cạnh
trong E nối từ u tới v.
1.1.3 Đa đồ thị
G được gọi là đa đồ thị nếu giữa hai đỉnh u, v của V có thể có nhiều hơn 1
cạnh trong E nối từ u tới v.
CH1101098_Nguyễn Ngọc Lâm Trang 8
Chương 1. Tổng quan về lý thuyết đồ thị
1.1.4 Đồ thị vô hướng
G được gọi là đồ thị vô hướng nếu các cạnh trong E là không định hướng, tức
là cạnh nối hai đỉnh u, v bất kỳ cũng là cạnh nối hai đỉnh v, u. Hay nói cách
khác, tập E gồm các cặp (u, v) không tính thứ tự. (u, v) ≡ (v, u).
1.1.5 Đồ thị có hướng

G được gọi là đồ thị có hướng nếu các cạnh trong E là có định hướng, có thể
có cạnh nối từ đỉnh u tới đỉnh v nhưng chưa chắc đã có cạnh nối từ đỉnh v tới
đỉnh u. Hay nói cách khác, tập E gồm các cặp (u, v) có tính thứ tự: (u, v) ≠ (v,
u). Trong đồ thị có hướng, các cạnh được gọi là các cung. Đồ thị vô hướng
cũng có thể coi là đồ thị có hướng nếu như ta coi cạnh nối hai đỉnh u, v bất kỳ
tương đương với hai cung (u, v) và (v, u).
Hình 1.1 Phân loại đồ thị
1.1.6 Bậc của đỉnh
Bậc của đỉnh v trong đồ thị G = (V, E), ký hiệu deg(v), là số các cạnh liên
thuộc với nó, riêng khuyên tại một đỉnh được tính hai lần cho bậc của nó.
Đỉnh v gọi là đỉnh treo nếu deg(v) = 1 và gọi là đỉnh cô lập nếu deg(v) = 0.
CH1101098_Nguyễn Ngọc Lâm Trang 9
Chương 1. Tổng quan về lý thuyết đồ thị
1.1.7 Đường đi và chu trình
Đường đi độ dài n từ đỉnh u tới đỉnh v, với n là một số nguyên không âm
trong một đồ thị vô hướng là một dãy các cạnh {x
0
, x
1
},{x
1
, x
2
},…,{x
n-1
, x
n
},
với u = x
0

và x
n
= v. Đường đi được gọi là một chu trình nếu nó bắt đầu và kết
thúc tại cùng một đỉnh.
1.1.8 Tính liên thông
Một đồ thị vô hướng G = (V, E) được gọi là liên thông nếu có đường đi giữa
mọi cặp đỉnh phân biệt của đồ thị.
Một đồ thị có hướng gọi là liên thông mạnh nếu có đường đi từ a tới b và từ b
tới a với mọi đỉnh a và b của đồ thị.
Một đồ thị có hướng gọi là liên thông yếu nếu luôn tồn tại đường đi giữa hai
đỉnh khi ta không quan tâm tới hướng của các cạnh.
1.1.9 Thành phần liên thông
Thành phần liên thông: một đồ thị G = (V, E) không liên thông là hợp của hai
hay nhiều đồ thị con liên thông. Mỗi cặp các đồ thị con này không có đỉnh
chung. Các đồ thị con liên thông rời nhau như vậy được gọi là các thành phần
liên thông của đồ thị G = (V, E).
1.1.10 Điểm khớp
Một đỉnh v được gọi là điểm khớp của đồ thị G = (V, E) nếu loại bỏ v cùng
các cạnh liên thuộc với nó khỏi đồ thị sẽ làm tăng số thành phần liên thông
của đồ thị.
1.1.11 Cầu của đồ thị
Một cạnh của đồ thị G = (V, E) gọi là cầu, nếu loại bỏ cạnh đó khỏi đồ thị sẽ
làm tăng số thành phần liên thông của đồ thị.
CH1101098_Nguyễn Ngọc Lâm Trang
10
V1
V5
V4
V2
V3

Chương 1. Tổng quan về lý thuyết đồ thị
1.2 Biểu diễn đồ thị trên máy tính
1.2.1 Ma trận kề
Giả sử G = (V, E) là một đơn đồ thị với n đỉnh. Khi đó ta có thể biểu diễn đồ
thị bằng một ma trận vuông A = a[i, j] cấp n. Trong đó:
 a
ij
= 0 nếu không có cạnh nối đỉnh i với đỉnh j.
 a
ij
= 1 nếu có cạnh nối đỉnh i với đỉnh j.
Ví dụ: Cho đồ thị vô hướng G = (V, E) như hình dưới đây.
Hình 1.2 Ma trận kề
Ưu điểm:
 Đơn giản, trực quan, dễ cài đặt trên máy tính.
 Để kiểm tra xem hai đỉnh (u, v) của đồ thị có kề nhau hay không, ta chỉ
việc kiểm tra bằng một phép so sánh: a[u, v] ≠ 0.
Nhược điểm:
 Bất kể số cạnh của đồ thị là nhiều hay ít, ma trận liền kề luôn luôn đòi
hỏi n
2
ô nhớ để lưu các phần tử ma trận, điều đó gây lãng phí bộ nhớ
dẫn tới việc không thể biểu diễn được đồ thị với số đỉnh lớn.
1.2.2 Danh sách kề
Biểu diễn đồ thị bởi danh sách kề là cách liệt kê tất cả các cạnh của đồ thị
{(v
1
, v
2
); (v

1
, v
3
); (v
1
, v
5
); (v
2
, v
4
); (v
3
, v
4
}); (v
3
, v
5
}); (v
4
, v
5
)}. Hoặc là danh
sách này chỉ rõ các đỉnh nối với mỗi đỉnh của đồ thị.
CH1101098_Nguyễn Ngọc Lâm Trang
11
V1 V2 V3 V4 V5
V1
0 1 1 0 1

V2
1 0 0 1 0
V3
1 0 0 1 1
V4
0 1 1 0 1
V5
1 0 1 1 0
Chương 1. Tổng quan về lý thuyết đồ thị
Ví dụ:
Danh sách đỉnh kề
Đỉnh Đỉnh nối
v
1
v
2
, v
3
, v
5
v
2
v
1
, v
4
v
3
v
1

, v
4
, v
5
v
4
v
2
, v
3
, v
5
v
5
v
1
, v
3
, v
4
Bảng 1.1 Danh sách kề
Ưu điểm:
 Đối với danh sách kề, việc duyệt tất cả các đỉnh kề với một đỉnh v cho
trước là hết sức dễ dàng, cái tên "danh sách kề" đã cho thấy rõ điều
này. Việc duyệt tất cả các cạnh cũng đơn giản vì một cạnh thực ra là
nối một đỉnh với một đỉnh khác kề nó.
Nhược điểm:
 Về lý thuyết, so với hai phương pháp biểu diễn trên, danh sách kề tốt
hơn hẳn. Chỉ có điều, trong trường hợp cụ thể mà ma trận kề hay danh
sách cạnh không thể hiện nhược điểm thì ta nên dùng ma trận kề (hay

danh sách cạnh) bởi cài đặt danh sách kề có phần dài dòng hơn.
1.2.3 Danh sách cạnh
Trong trường hợp đồ thị có n đỉnh, m cạnh, ta có thể biểu diễn đồ thị dưới
dạng danh sách cạnh, trong cách biểu diễn này, người ta liệt kê tất cả các cạnh
của đồ thị trong một danh sách, mỗi phần tử của danh sách là một cặp (u, v)
tương ứng với một cạnh của đồ thị. (Trong trường hợp đồ thị có hướng thì
mỗi cặp (u, v) tương ứng với một cung, u là đỉnh đầu và v là đỉnh cuối của
cung). Danh sách được lưu trong bộ nhớ dưới dạng mảng hoặc danh sách móc
nối.
CH1101098_Nguyễn Ngọc Lâm Trang
12
Chương 1. Tổng quan về lý thuyết đồ thị
Ưu điểm:
 Trong trường hợp đồ thị thưa số cạnh tương đối nhỏ, cách biểu diễn
bằng danh sách cạnh sẽ tiết kiệm được không gian lưu trữ.
 Trong một số trường hợp, ta phải xét tất cả các cạnh của đồ thị thì cài
đặt trên danh sách cạnh làm cho việc duyệt các cạnh dễ dàng hơn.
Nhược điểm:
 khi ta cần duyệt tất cả các đỉnh kề với đỉnh v nào đó của đồ thị, thì
chẳng có cách nào khác là phải duyệt tất cả các cạnh, lọc ra những cạnh
có chứa đỉnh v và xét đỉnh còn lại. Điều đó khá tốn thời gian trong
trường hợp đồ thị có nhiều cạnh.
CH1101098_Nguyễn Ngọc Lâm Trang
13
Chương 2. Đường đi Euler và đồ thị Euler
Chương 2. ĐƯỜNG ĐI EULER VÀ ĐỒ THỊ EULER
2.1 Tình huống dẫn nhập: “Bài toán 7 cây cầu”
Thành phố Konigsberg thuộc Phổ (nay là Kaliningrad thuộc Cộng hoà Nga),
được chia làm 4 vùng bằng các nhánh sông Pregel. Các vùng này gồm 2 vùng
bên bờ sông (B, C), đảo Kneiphof (A) và một miền nằm giữa hai nhánh sông

Pregel (D). Vào thế kỷ XVIII, người ta đã xây 7 chiếc cầu nối những vùng này
với nhau. Người dân ở đây tự hỏi: Liệu có cách nào xuất phát tại một địa điểm
trong thành phố, đi qua 7 chiếc cầu, mỗi chiếc đúng 1 lần rồi quay trở về nơi
xuất phát không ?
Nhà toán học Thụy sĩ Leonhard Euler đã giải bài toán này và có thể coi đây là
ứng dụng đầu tiên của Lý thuyết đồ thị, ông đã mô hình hoá sơ đồ 7 cái cầu
bằng một đa đồ thị, bốn vùng được biểu diễn bằng 4 đỉnh, các cầu là các cạnh.
Bài toán tìm đường qua 7 cầu, mỗi cầu đúng một lần có thể tổng quát hoá bằng
bài toán: Có tồn tại chu trình đơn trong đa đồ thị chứa tất cả các cạnh ?
Hình 2.1 Mô hình đồ thị của bài toán 7 cây cầu
CH1101098_Nguyễn Ngọc Lâm Trang 14
Graph A
Graph B
Graph C
Chương 2. Đường đi Euler và đồ thị Euler
2.2 Đường đi Euler và đồ thị Euler
2.2.1 Định nghĩa
Chu trình đơn chứa tất cả các cạnh của đồ thị G được gọi là chu trình Euler.
Đường đi Euler trong G là đường đi đơn chứa mọi cạnh của G. Đồ 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.
Ví dụ: xét các đồ thị sau.

Chú thích:
 Graph A: đồ thị không nửa Euler.
 Graph B: đồ thị nửa Euler.
 Graph C: đồ thị Euler.
Điều kiện cần và đủ để một đồ thị là đồ thị Euler được Euler tìm ra vào năm
1736 khi ông giải quyết bài toán hóc búa nổi tiếng thời đó về bảy cái cầu ở
Konigsberg và đây là định lý đầu tiên của lý thuyết đồ thị.

2.2.2 Các định lý
[1] Một đa đồ thị liên thông có chu trình Euler khi và chỉ khi mọi đỉnh của
nó đều có bậc chẵn.
[2] Đa đồ thị liên thông có đường đi Euler nhưng không có chu trình Euler
nếu và chỉ nếu có đúng hai đỉnh bậc lẻ.
[3] Một đồ thi có hướng liên thông yếu G = (V, E) có chu trình Euler thì mọi
đỉnh của nó có bán bậc ra bằng bán bậc vào: deg + (v) = deg - (v)
(∀v∈V); Ngược lại, nếu G liên thông yếu và mọi đỉnh của nó có bán bậc
CH1101098_Nguyễn Ngọc Lâm Trang 15
Chương 2. Đường đi Euler và đồ thị Euler
ra bằng bán bậc vào thì G có chu trình Euler, hay G sẽ là liên thông
mạnh.
[4] Một đồ thị có hướng liên thông yếu G = (V, E) có đường đi Euler nhưng
không có chu trình Euler nếu tồn tại đúng hai đỉnh u, v ∈ V sao cho deg
+ (u) – deg - (u) = deg - (v) – deg + (v) = 1, còn tất cả những đỉnh khác u
và v đều có bán bậc ra bằng bán bậc vào.
2.2.3 Thuật toán Fleury tìm chu trình Euler
Đối với đồ thị vô hướng liên thông, mọi đỉnh đều có bậc chẵn: xuất phát từ
một đỉnh, ta chọn một cạnh liên thuộc với nó để đi tiếp theo hai nguyên tắc
sau:
 Mỗi khi đi qua một cạnh thì xoá nó đi, sau đó xoá đỉnh cô lập (nếu có).
 Không bao giờ đi qua một cầu, trừ phi không còn cách đi nào khác.
Và ta cứ chọn cạnh đi một cách thoải mái như vậy cho tới khi không đi tiếp
được nữa, đường đi tìm được chính là chu trình Euler.
Ví dụ: cho đồ thị vô hướng G = (V, E) như hình vẽ
Hình 2.2 Đồ thị Euler
Nếu xuất phát từ đỉnh 1, có hai cách đi tiếp: hoặc sang 2 hoặc sang 3, giả sử ta
sẽ sang 2 và xoá cạnh (1, 2) vừa đi qua. Từ 2 chỉ có cách duy nhất là sang 4,
nên cho dù (2, 4) là cầu ta cũng phải đi sau đó xoá luôn cạnh (2, 4). Đến đây,
các cạnh còn lại của đồ thị có thể vẽ như trên bằng nét liền, các cạnh đã bị xoá

được vẽ bằng nét đứt. Bây giờ đang đứng ở đỉnh 4 thì ta có 3 cách đi tiếp:
sang 3, sang 5 hoặc sang 6. Vì (4, 3) là cầu nên ta sẽ không đi theo cạnh (4, 3)
mà sẽ đi (4, 5) hoặc (4, 6). Nếu đi theo (4, 5) và cứ tiếp tục đi như vậy, ta sẽ
CH1101098_Nguyễn Ngọc Lâm Trang 16
Chương 2. Đường đi Euler và đồ thị Euler
được chu trình Euler là (1, 2, 4, 5, 7, 8, 6, 4, 3, 1). Còn đi theo (4, 6) sẽ tìm
được chu trình Euler là: (1, 2, 4, 6, 8, 7, 5, 4, 3, 1).
CH1101098_Nguyễn Ngọc Lâm Trang 17
Chương 3. Đường đi Hamilton và đồ thị Hamilton
Chương 3. ĐƯỜNG ĐI HAMILTON VÀ ĐỒ THỊ HAMILTON
3.1 Tình huống dẫn nhập: “Đi vòng quanh thế giới”
Năm 1857, nhà toán học người Ailen là Hamilton(1805-1865) đưa ra trò chơi
“đi vòng quanh thế giới” như sau.
Cho một hình thập nhị diện đều (đa diện đều có 12 mặt, 20 đỉnh và 30 cạnh),
mỗi đỉnh của hình mang tên một thành phố nổi tiếng, mỗi cạnh của hình (nối hai
đỉnh) là đường đi lại giữa hai thành phố tương ứng. Xuất phát từ một thành phố,
hãy tìm đường đi thăm tất cả các thành phố khác, mỗi thành phố chỉ một lần, rồi
trở về chỗ cũ.
Trước Hamilton, có thể là từ thời Euler, người ta đã biết đến một câu đố hóc búa
về “đường đi của con mã trên bàn cờ”. Trên bàn cờ, con mã chỉ có thể đi theo
đường chéo của hình chữ nhật 2 x 3 hoặc 3 x 2 ô vuông. Giả sử bàn cờ có 8 x 8
ô vuông. Hãy tìm đường đi của con mã qua được tất cả các ô của bàn cờ, mỗi ô
chỉ một lần rồi trở lại ô xuất phát.
Bài toán này được nhiều nhà toán học chú ý, đặc biệt là Euler, De Moivre,
Vandermonde,
Hiện nay đã có nhiều lời giải và phương pháp giải cũng có rất nhiều, trong đó có
quy tắc: mỗi lần bố trí con mã ta chọn vị trí mà tại vị trí này số ô chưa dùng tới
do nó khống chế là ít nhất.
Một phương pháp khác dựa trên tính đối xứng của hai nửa bàn cờ. Ta tìm hành
trình của con mã trên một nửa bàn cờ, rồi lấy đối xứng cho nửa bàn cờ còn lại,

sau đó nối hành trình của hai nửa đã tìm lại với nhau.
Trò chơi và câu đố trên dẫn tới việc khảo sát một lớp đồ thị đặc biệt, đó là đồ thị
Hamilton.
CH1101098_Nguyễn Ngọc Lâm Trang 18
Graph A
Graph B
Graph C
Chương 3. Đường đi Hamilton và đồ thị Hamilton
3.2 Đường đi Hamilton và đồ thị Hamilton
3.2.1 Định nghĩa
Đường đi qua tất cả các đỉnh của đồ thị mỗi đỉnh đúng một lần được gọi là
đường đi Hamilton. Chu trình bắt đầu từ một đỉnh v nào đó qua tất cả các
đỉnh còn lại mỗi đỉnh đúng một lần rồi quay trở về v được gọi là chu trình
Hamilton. Đồ thị G được gọi là đồ thị Hamilton nếu nó chứa chu trình
Hamilton và gọi là đồ thị nửa Hamilton nếu nó có đường đi Hamilton.
Ví dụ: xét các ví dụ sau
Chú thích:
 Graph A: không là nửa Hamilton.
 Graph B: nửa Hamilton.
 Graph C: đồ thị Hamilton
3.2.2 Các định lý
[1] Đồ thị vô hướng G, trong đó tồn tại k đỉnh sao cho nếu xoá đi k đỉnh
này cùng với những cạnh liên thuộc của chúng thì đồ thị nhận được sẽ
có nhiều hơn k thành phần liên thông. Thì khẳng định là G không có
chu trình Hamilton. Mệnh đề phản đảo của định lý này cho ta điều kiện
cần để một đồ thị có chu trình Hamilton
[2] Định lý Dirac: giả sử G là một đơn đồ thị liên thông có n đỉnh, trong đó
n > 2, khi đó G có chu trình Hamilton nếu bậc của mỗi đỉnh ít nhất
bằng n/2.
CH1101098_Nguyễn Ngọc Lâm Trang 19

A B
F C
D
Chương 3. Đường đi Hamilton và đồ thị Hamilton
[3] Định lý Ore: Nếu G là một đơn đồ thị có n đỉnh, với n ≥ 3 sao cho
deg(u) + deg(v) ≥ n với mọi cặp đỉnh không liền kề u và v trong G, khi
đó G sẽ có chu trình Hamilton.
3.2.3 Thuật toán tìm chu trình Hamilton
Để liệt kê chu trình Hamilton và đường đi Hamilton cho tới nay người ta vẫn
chưa tìm ra được thuật toán trong trường hợp tổng quát. Chính vì vậy chủ yếu
dựa trên thuật toán xác định bằng hoán vị vòng quanh với tư tưởng thuật toán
đệ quy quay lui hoặc dựa trên các quy tắc để xác định chu trình Hamilton (H)
của đồ thị.
Các quy tắc:
 Nếu có một đỉnh bậc 2 thì hai cạnh của đỉnh này phải nằm trong H
 Không được có chu trình con (độ dài nhỏ hơn n) trong H
 Ứng với một đỉnh nào đó, nếu đã chọn đủ 2 cạnh vào H thì phải loại bỏ
tất cả các cạnh còn lại (vì không thể chọn thêm) Không có đỉnh cô lập
hoặc đỉnh treo nào khi áp dụng quy tắc (3)
Ví dụ: Cho đồ thị vô hướng G(V, E) như hình vẽ sau
Hình 2.3 Chu trình Hamilton
Nếu xuất phát từ đỉnh A, có hai cách đi tiếp: hoặc sang B hoặc sang F, giả sử
ta sẽ sang B và xoá đỉnh A. Từ B có hai cách đi tiếp: sang D hoặc F, Giả sử ta
sang D và xóa đỉnh B. Từ D chỉ có một đường đi tiếp là sang C, sang F và trở
về A. Khi đó ta tìm được chu trình Hamilton là: [A, B, D, C, F, A].
CH1101098_Nguyễn Ngọc Lâm Trang 20
2
Chương 4. Cài đặt ứng dụng minh họa
Chương 4. CÀI ĐẶT ỨNG DỤNG MINH HỌA
4.1 Đường đi và chu trình Euler

4.1.1 Phát biểu bài toán về các cầu ở Konigsberg
Thành phố Konigsberg thuộc Phổ (nay gọi là Kaliningrad thuộc Nga) được
chia thành bốn vùng bằng các nhánh sông Pregel, các vùng này gồm hai vùng
bên bờ sông, đảo Kneiphof và một miền nằm giữa hai nhánh của sông Pregel.
Vào thế kỷ XVIII, người ta xây bảy chiếc cầu nối các vùng này với nhau.
Dân thành phố từng thắc mắc: “Có thể nào đi dạo qua tất cả bảy cầu, mỗi cầu
chỉ một lần thôi không?”. Nếu ta coi mỗi khu vực A, B, C, D như một đỉnh và
mỗi cầu qua lại hai khu vực là một cạnh nối hai đỉnh thì ta có sơ đồ của
Konigsberg là một đa đồ thị G như hình trên.
Bài toán tìm đường đi qua tất cả các cầu, mỗi cầu chỉ qua một lần có thể được
phát biểu lại bằng mô hình này như sau: Có tồn tại chu trình đơn trong đa đồ
thị G chứa tất cả các cạnh?
4.1.2 Cấu trúc dữ liệu cho giải thuật Fleury
Maple hỗ trợ gói thư viện GraphTheory có chứa cấu trúc khai báo một đơn đồ
thị vô hướng.
CH1101098_Nguyễn Ngọc Lâm Trang 21
Chương 4. Cài đặt ứng dụng minh họa
V = [v
1
, v
2
, , v
n
]; danh sách các đỉnh của đồ thị.
E = {{v
1
, v
2
}, {v
1

, v
3
}, }; tập hợp tất cả các tập cạnh của đồ thị.
G = Graph(V, E);
4.1.3 Giải thuật Fleury tìm chu trình Euler
Input: Đồ thị vô hướng G(V, E), đỉnh bắt đầu v V.
Output: Danh sách tập đỉnh v
i
V tạo thành chu trình Euler.
Bước 1:
G
1
:= G; results:= []; start:= v; results:= results v;
Bước 2: Kiểm tra đồ thị G có liên thông hay không.
If (Đồ thị G không liên thông) then
Dừng: Thông báo đồ thị không có chu trình Euler.
Bước 3: Kiểm tra đồ thị G có chu trình Euler hay không.
For i in V do
If( Deg(v
i
) mod 2 = 1) then
Dừng: Thông báo đồ thị không có chu trình Euler.
End if
End do
Bước 4:
While Deg(v
i
) <> 0 do
4.1 Chọn một đỉnh kề với đỉnh start trong danh sách các đỉnh kề và chỉ
chỉ đi qua cầu khi không còn cách nào khác

neighbors:= Danh sách những đỉnh kề với đỉnh start.
if (neighbors = 1) then
top:= start;
start:= neighbors[1];
CH1101098_Nguyễn Ngọc Lâm Trang 22
Chương 4. Cài đặt ứng dụng minh họa
end if
else
For i in (Danh sách các đỉnh kề với đỉnh start) do
If (i để cạnh (i, start) không phải là cầu) then
start:= neighbors[1];
Thoát khỏi vòng lập For
End if
End for
4.2 Đưa đỉnh vừa tìm được vào danh sách results
results:= results start;
4.3 Xóa cạnh (top, start) ra khỏi đồ thị G
End while
Bước 5: Tìm được chu trình Euler sử dụng danh sách results.
4.1.4 Tìm hiểu chức năng một số hàm thuộc thư viện GraphTheory
> ? GraphTheory;
 Vẽ đồ thị vô hướng: DrawGraph(G);
 Xóa cạnh đồ thị G: DeleteEdge(G, {2, 3});
 Danh sách tập đỉnh trong đồ thị G: V := Vertices(G);
 Danh sách tập cạnh trong đồ thị G: E := Edges(G);
 Kiểm tra đồ thị G có liên thông hay không: IsConnected(G);
 Kiểm tra bậc của đỉnh trong đồ thị: Degree(G, 2);
 Trả về bậc lớn nhất trong đồ thị: MaximumDegree(G);
 Kiểm tra cạnh {2,4} có phải là cầu hay không: IsCutSet(G, {2,4});
 Trả về danh sách các đỉnh kề với đỉnh b trong đồ thị: Neighbors(G, b);

 Thêm phần tử u vào danh sách L: [op(L),u];
 Trả về số phần tử trong danh sách L: nops(L);
 Coppy lại đồ thị G: H := CopyGraph(G);
4.1.5 Thủ tục cho giải thuật Fleury
> Euler:= proc(graph:: Graph, V)
local i,results,start,neighbors,top,G;
G:= CopyGraph(graph);
CH1101098_Nguyễn Ngọc Lâm Trang 23
Chương 4. Cài đặt ứng dụng minh họa
results:= [];
start:= V;
# Kiểm tra đồ thị G có chu trình Euler hay không?
if IsConnected(G) = false then
printf("Đồ thị G không liên thông nên không tồn tại chu trình Euler");
return;
end if;
# Kiểm tra tất cả các đỉnh trong đồ thị có phải là bậc chẳn hay không
for i from 1 by 1 to numelems(Vertices(G)) do
if Degree(G, Vertices(G)[i]) mod 2 = 1 then
printf("Đồ thị G không có chu trình Euler do tồn tại đỉnh bậc lẻ");
return;
end if;
end do;
if member(V,Vertices(G)) = false then # hai hàm có chức năng như trên.
printf("Đỉnh %a không nằm trong tập đỉnh %a của đồ thị\nLưu ý: Đỉnh
xuất phát phải nằm trong tập đỉnh của đồ thị",V,Vertices(G));
return;
end if;
results:= [op(results),start];
while MaximumDegree(G)<> 0 do

neighbors:= Neighbors(G, start);
top:= start;
if nops(neighbors) = 1 then
start:= neighbors[1];
else
for i from 1 by 1 to nops(neighbors) do
if IsCutSet(G,{start,neighbors[i]}) = false then
start:= neighbors[i];
break;
end if;
end do;
end if;
results:= [op(results),start];
DeleteEdge(G,{top, start});
end do;
printf("Chu trình Euler tìm được là:");
return results;
end proc:
4.1.6 Dữ liệu thử nghiệm
Ví dụ 1: Cho đồ thị vô hướng G(V, E) như hình vẽ
CH1101098_Nguyễn Ngọc Lâm Trang 24
Chương 4. Cài đặt ứng dụng minh họa
Input: G(V, E), v trong đó:
 V = [1, 2, 3, 4, 5, 6, 7, 8].
 E = {{1, 2},{1, 3}, {2, 4}, {3, 4},{4, 5},{4, 6},{5, 7},{6, 8},{7, 8}}.
 v = 1.
Output: results = [1, 2, 4, 5, 7, 8, 6, 4, 3, 1].
Chạy chương trình tìm chu trình Euler:
> with(GraphTheory):
V:= [1,2,3,4,5,6,7,8]:

E:= {{1,2},{1,3},{2,4},{3,4},{4,5},{4,6},{5,7},{6,8},{7,8}}:
> G:= Graph(V, E);
DrawGraph(G);
Hình 4.1 Đồ thị Euler trong Maple 16
Gọi thực thi thủ tục : Euler(G, 1).
> Euler(G, 1);
Chu trình Euler tìm được là: [1, 2, 4, 5, 7, 8, 6, 4, 3, 1].
Mô tả các bước xử lý trong chương trình:
CH1101098_Nguyễn Ngọc Lâm Trang 25

×