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

SỬ DỤNG MAPLE GIẢI MỘT SỐ BÀI TOÁN VỀ lý thuyết ĐỒ THỊ

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 (1.03 MB, 48 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT
BÁO CÁO CHUYÊN ĐỀ : LẬP TRÌNH SYMBOLIC
SỬ DỤNG MAPLE GIẢI MỘT SỐ BÀI
TOÁN VỀ LÝ THUYẾT ĐỒ THỊ
• CHU TRÌNH EULER
• TÔ MÀU ĐỒ THỊ (GRAPH COLORING)
• CÂY KHUNG NHỎ NHẤT (PRIM, KRUSKAL)
Konigsberg’s Problem
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
HV : VŨ MINH THÀNH
MS : CH1101134
Lớp : Cao học khóa 6
Email :

GVHD : GS-TS ĐỖ VĂN
NHƠN
2
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Lời Mở Đầu
Ngày nay, ngành công nghệ thông tin trên thế giới đang trên đà phát triển mạnh mẽ, và
ngày càng ứng dụng vào nhiều lĩnh vực: kinh tế, khoa học kĩ thuật, quân sự, y tế, giáo
dục… và nó đã đáp ứng ngày càng nhiều yêu cầu của các lĩnh vực này, để phục vụ cho
nhu cầu của con người. Ở nước ta, hòa nhập chung với sự phát triển ngành công nghệ
thông tin và ứng dụng vào các lĩnh vực của cuộc sống nhằm phục vụ các nhu cầu như:
nghiên cứu, học tập, lao động và giải trí… của con người. Nhà nước ta đã có những
chính sách cần thiết để đưa ngành công nghệ thông tin vào vị trí then chốt trong chiến
lược phát triển kinh tế của Đất nước.
Ứng dụng CNTT đóng vai trò quan trọng trong giáo dục, môn học Lập trình Symbolic
nói chung và Maple nói riêng là một môn học khá hay và thú vị. Qua môn học sinh động
này do thầy Nhơn phụ trách, ta có thể thấy rõ Maple là một thư viện và công cụ toán


học đa năng và mạnh mẽ, giúp cho các sinh viên, học sinh, và thầy cô giáo có thể dễ
dàng giải các bài toán và lập trình dễ dàng.
Trong khuôn khổ bài thu hoạch này, em sử dụng Maple giải một số bài toán đặc trưng
của lý thuyết đồ thị của Toán rời rạc.
Qua đây, em cũng xin gởi lời cám ơn chân thành đến GS-TS Đỗ Văn Nhơn, người đã
tận tâm truyền đạt những kiến thức lập trình Maple một cách trực quan sinh động môn
học “Lập trình Symbolic với Maple”. Phải nói là môn học do thầy phụ trách rất lôi cuốn
và sinh động.
Xin chân thành cám ơn !
Vũ Minh Thành – 01/2013
3
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
NỘI DUNG
4
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
1. PHẦN 1 : GIỚI THIỆU VỀ MAPLE – CÔNG CỤ LT SYMBOLIC
Maple là một
hệ
thống tính toán trên các
biểu thức đại
số và minh
hoạ
toán học
m

nh
mẽ
của công ty Warterloo Maple Inc. (http :

/ /ww w .


m a

p l

e s

o f

t .c

om ). Maple ra
đời
năm
1991
đến nay đã phát
triển
đến phiên
bản
15. Maple có cách cài
đặt
đơn
giản,
chạy được
trên
nhiều hệ điều
hành, có
cấu
trúc linh
hoạt để sử

dụng tối
ưu cấu
hình
máy và có trình
tr

giúp (help)
rất dễ sử
dụng.
Từ
phiên
bản
7, Maple cung
cấp
ngày
càng
nhiều
các công cụ
trực
quan, các gói
lệnh tự
học
gắn liền với
toán học phổ thông

đại
học. Ưu
điểm
đó
làm

cho
nhiều người
trên
thế giới lựa
chọn
sử
dụng Maple cùng
các
phần mềm
toán học
khác áp dụng
trong
dạy
học toán và các công việc tính toán
đòi hỏi của
thực tiễn

sự
phát
triển
của giáo dục.
C ó t h ể
nhận thấy rằng
ngoài
các
tính
năng
tính toán và minh
hoạ rất mạnh
mẽ bằng

các câu
lệnh
riêng
biệt (thường
chỉ
cho
ta
kết quả
cuối cùng), Maple còn là
một ngôn
ngữ lập
trình
hướng
thủ tục
(procedure).
Thủ tục là một dãy các
lệnh
của
Maple theo
thứ tự

người lập
trình định
sẵn để xử
lí một công
việc
nào đó, khi
thực
hiện
thủ tục này Maple

sẽ tự
động
thực hiện
các
lệnh

trong
thủ tục đó một cách
tuần
tự
và sau đó
trả lại kết quả
cuối
cùng.
Mapple có các chức năng cơ bản sau:
• Là một hệ thống tính toán trên các biểu thức đại số.
• Có thể thực hiện được hầu hết các phép toán cơ bản trong chương trình
toán đại học và sau đại học.
• Cung cấp các công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị động
và tĩnh của các đường và mặt được cho bởi các hàm tùy ý và trong các
hệ tọa độ khác nhau.
• Là một ngôn ngữ lập trình đơn giản và mạnh mẽ, có khả năng tương tác
với các ngôn ngữ lập trình khác.
• Cho phép trích xuất ra các định dạng khác nhau như word, HTML…
• Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp
học tương tác trực tiếp.
• Một trợ giáo hữu ích cho học sinh sinh viên trong việc tự học.
5
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
2. PHẦN 2 : SỬ DỤNG MAPLE GIẢI MỘT SỐ BÀI TOÁN LÝ THUYẾT

ĐỒ THỊ
1.1 GIỚI THIỆU VỀ LÝ THUYẾT ĐỒ THỊ
Lý thuyết đồ thị là một lĩnh vực đã có từ lâu và có nhiều ứng dụng hiện đại. Những tư tưởng
cơ bản của lý thuyết đồ thị được đề xuất vào những năm đầu của thế kỷ 18 bởi nhà toán học
lỗi lạc người Thụy Sỹ Lenhard Eurler. Chính ông là người đã sử dụng đồ thị để giải bài toán
nổi tiếng về các cái cầu ở thành phố Konigsberg.
Đồ thị được sử dụng để giải các bài toán trong nhiều lĩnh vực khác nhau.
Chẳng hạn, đồ thị có thể sử dụng để xác định các mạch vòng trong vấn đề giải tích
mạch điện. Chúng ta có thể phân biệt các hợp chất hóa học hữu cơ khác nhau với
cùng công thức phân tử nhưng khác nhau về cấu trúc phân tử nhờ đồ thị. Chúng ta
có thể xác định hai máy tính trong mạng có thể trao đổi thông tin được với nhau hay
không nhờ mô hình đồ thị của mạng máy tính. Đồ thị có trọng số trên các cạnh có thể
sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong
mạng giao thông. Chúng ta cũng còn sử dụng đồ thị để giải các bài toán về lập lịch,
thời khóa biểu, và phân bố tần số cho các trạm phát thanh và truyền hình…
1.1.1 Định nghĩa đồ thị
Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh này. Chúng ta phân
biệt các loại đồ thị khác nhau bởi kiểu và số lượng cạnh nối hai đỉnh nào đó của đồ thị. Để có
thể hình dung được tại sao lại cần đến các loại đồ thị khác nhau, chúng ta sẽ nêu ví dụ sử dụng
chúng để mô tả một mạng máy tính. Giả sử ta có một mạng gồm các máy tính và các kênh điện
thoại (gọi tắt là kênh thoại) nối các máy tính này. Chúng ta có thể biểu diễn các vị trí đặt náy
tính bởi các điểm và các kênh thoại nối chúng bởi các đoạn nối, xem hình 1.
Hình 1. Sơ đồ mạng máy tính.
6
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Nhận thấy rằng trong mạng ở hình 1, giữa hai máy bất kỳ chỉ có nhiều nhất là một kênh thoại
nối chúng, kênh thoại naỳ cho phép liên lạc cả hai chiều và không có máy tính nào lại được nối
với chính nó. Sơ đồ mạng máy cho trong hình 1 được gọi là đơn đồ thị vô hướng. Ta đi đến
định nghĩa sau
• Định nghĩa 1: Đơn đồ thị vô hướng G = (V,E) bao gồm V là tập các đỉnh, và E là tập các

cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh.
Trong trường hợp giữa hai máy tính nào đó thường xuyên phải truyền tải nhiều thông tin người
ta phải nối hai máy nàu bởi nhiều kênh thoại. Mạng với đa kênh thoại giữa các máy được cho
trong hình 2.
Trong trường hợp giữa hai máy tính nào đó thường xuyên phải truyền tải nhiều thông tin người
ta phải nối hai máy nàu bởi nhiều kênh thoại. Mạng với đa kênh thoại giữa các máy được cho
trong hình 2.
Hình 2. Sơ đồ mạng máy tính với đa kênh thoại.
• Định nghĩa 2 : Đa đồ thị vô hướng G= (V, E) bao gồm V là tập các đỉnh, và E là tập các
cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh. Hai cạnh e1 và
e2 được gọi là cạnh lặp nếu chúng cùng tương ứng với một cặp đỉnh.
7
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Hình 3. Sơ đồ mạng máy tính với kênh thoại thông báo.
Rõ ràng mỗi đơn đồ thị đều là đa đồ thị, nhưng không phải đa đồ thị nào cũng là đơn đồ thị, vì
trong đa đồ thị có thể có hai (hoặc nhiều hơn) cạnh nối một cặp đỉnh nào đó.
Trong mạng máy tính có thể có những kênh thoại nối một náy nào đó với chính nó (chẳng hạn
vời mục đính thông báo). Mạng như vậy được cho trong hình 3. Khi đó đa đồ thị không thể mô
tả được mạng như vậy, bởi vì có những khuyên (cạnh nối một đỉnh với chính nó). Trong 3
trường hợp nàychúng ta cần sử dụng đến khái niệm giả đồ thị vô hướng, được định nghĩa như
sau:
• Định nghĩa 3 : Giả đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các
cặp không có thứ tự gồm hai phần tử (không nhất thiết phải khác nhau) của V gọi là
cạnh. Cạnh e được gọi là khuyên nếu nó có dạng e = (u, u).
Hình 4. Mạng máy tính với kênh thoại một chiều
8
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Các kênh thoại trong mạng máy tính có thể chỉ cho phép truyền tin theo một chiều. Chẳng hạn,
trong hình 4 máy chủ ở Hà Nội chỉ có thể nhận tin từ các máy ở địa phương, có một số máy chỉ
có thể gửi tin đi, còn các kênh thoại cho phép truyền tin theo cả hai chiều được thay thế bởi hai

cạnh có hướng ngược chiều nhau.
Ta đi đến định nghĩa sau.
• Định nghĩa 4 : Đơn đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập
các cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung.
Nếu trong mạng có thể có đa kênh thoại một chiều, ta sẽ phải sử dụng đến khái niệm đa đồ thị
có hướng:
• Định nghĩa 5 : Đa đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các
cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung. Hai cung e1, e2 tương
ứng với cùng một cặp đỉnh được gọi là cung lặp.
Trong Maple cung cấp cho ta gói GraphTheory dùng để xử lý các bài toán về đồ thị,
ta sử dụng câu lệnh with để nạp gói này như sau :
1.2 GIẢI BÀI TOÁN TÌM CHU TRÌNH EULER
1.2.1 Giới thiêu đường đi và chu trình Euler
• Định nghĩa 1 : Chu trình đơn trong đồ thị G đi qua mỗi cạnh của nó một lần được gọi là
chu trình Euler. Đường đi đơn trong G đi qua mỗi cạnh của nó một lần được gọi là
đường đi Euler. Đồ thị được gọi là đồ thị Euler nếu nó có chu trình Euler, và gọi là đồ thị
nửa Euler nếu nó có đường đi Euler.
Rõ ràng mọi đồ thị Euler luôn là nửa Euler, nhưng điều ngược lại không luôn đúng.
Thí dụ 1. Đồ thị G1 trong hình 1 là đồ thị Euler vì nó có chu trình Euler a, e, c, d, e, b, a.
Đồ thị G3 không có chu trình Euler nhưng nó có đường đi Euler a, c, d, e, b, d, a, b, vì
thế G3 là đồ thị cửa Euler. Đồ thị G2 không có chu trình cũng như đường đi Euler.
9
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
10
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Thí dụ 2. Đồ thị H2 trong hình 2 là đồ thị Euler vì nó có chu trình Euler a, b, c, d, e, a.
Đồ thị H3 không có chu trình Euler nhưng nó có đường đi Euler c, a, b, c, d, b vì thế H3
là đồ thị nửa Euler. Đồ thị H1 không có chu trình cũng như đường đi Euler.
Điều kiện cần và đủ để một đồ thị là một đồ thị Euler được Euler tìm ra vào năm 1736
khi ông giải quyết bài toán hóc búa nổi tiếng thế giới thời đó về bảy cái cầu ở thành phố

Konigsberg và đây là định lý đầu tiên của lý thuyết đồ thị.
Đị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 G đều có bậc chẵn.
1.2.2 Giải tìm chu trình Euler bằng Maple
11
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Mặc dù Maple đã trang bị sẵn hàm IsEulerian để kiểm tra xem một đồ thị có chu trình
Euler hay không, nhưng hàm này chỉ áp dụng cho các đồ thị đơn giản (không vòng hay
đa cạnh). Ta sẽ đi xây dựng hàm kiểm tra chu trình Euler cho đa đồ thị (multigraphs).
Sourcecode trong đường dẫn ở đĩa CD :
\Sourcecode\Euler.mw
Ta đi xây dựng 1 số hàm con phụ trợ
Giả đồ thị (Pseudograph) : là đồ thị vô hướng, có vòng và đa cạnh.
12
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
• Hàm tính bậc của 1 đỉnh cho đồ thị bất kỳ (vô hướng, có vòng và đa cạnh)
Để tính bậc của 1 đỉnh, đầu tiên ta kiểm tra xem đồ thị có trọng số hay không sử dụng lệnh
IsWeighted. Nếu không có trọng số, dùng hàm Degree. Nếu có trọng số, ta sử dụng lệnh
IncidentEdgesđể xác định các cạnh kề với đỉnh cho trước. Lệnh add thêm trọng số, sau đó ta chỉ
việc kiểm tra xem có loop hay không, nếu có thì cộng 2 vào bậc của đỉnh. Hàm này được sử
dụng để tính chu trình Euler bên dưới.
> PseudoDegree := proc(G::Graph, v)
local E, e, d;
uses GraphTheory;
if IsWeighted(G) then
d := add(GetEdgeWeight(G,e),e in IncidentEdges(G,v));
else
d := Degree(G,v);
end if;
if GetVertexAttribute(G,v,"loop") then

d := d + 2;
end if;
return d;
end proc:
>
• Hàm kiểm tra 1 đa đồ thị có chu trình Euler hay không ?
Theo định lý Euler ta có, đa đồ thị liên thông với ít nhất 2 đỉnh thì có 1 chu trình Euler nếu và chỉ
nếu bậc của mỗi đỉnh là số chẵn. Ta dễ dàng kiểm chứng một giả đồ thị có chu trình Euler hay
không như hàm sau.
13
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
> IsPseudoEulerian := proc(G::Graph)
local v;
uses GraphTheory;
if IsDirected(G) then
return FAIL;
end if;
if (not IsConnected(G)) or (nops(Vertices(G)) < 2) then
return false;
end if;
for v in Vertices(G) do
if type(PseudoDegree(G,v),odd) then
return false;
end if;
end do;
return true;
end proc:
Ta dùng hàm này để giải bài toán cây cầu Konigsberg nổi tiếng. Đầu tiên ta tạo đồ thị mô tả bài
toán gồm các thành phố và các cầu như hình. Sau đó ta gọi để kiểm tra. Lưu ý, giữa 2 đỉnh A và
C có 2 cạnh, tương tự cho A và B, ở đây vẽ đậm lên cho dễ thấy.

> Konigsberg := Graph({[{"A","B"},2], [{"A","C"},2],
{"A","D"}, {"B","D"}, {"C","D"}});
> SetVertexPositions(Konigsberg,[[0,1],[0,0],[0,2],[1,1]]);
14
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
> DrawPseudograph(Konigsberg);
> IsPseudoEulerian(Konigsberg);
Kiểm tra lại bằng hàm của Maple có sẵn IsEulerian
>
Hàm chính tìm chu trình Euler của 1 đa đồ thị
> FindMultiEuler := proc(G::Graph)
local H, circuit, subC, i, v, insertPoint, e, w,
buildingSub, oldC;
uses GraphTheory;
if not IsPseudoEulerian(G) then
return false;
end if;
H := CopyGraph(G);
15
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
circuit := [];
while Edges(H) <> {} do
# find a starting point
if circuit = [] then
subC := [Vertices(H)[1]];
else
for i from 1 to nops(circuit) do
if Neighbors(H,circuit[i]) <> [] then
subC := [circuit[i]];
insertPoint := i;

break;
end if;
end do;
end if;
# build a subcircuit
buildingSub := true;
while buildingSub do
v := subC[-1];
w := Neighbors(H,v)[1];
e := {v,w};
if IsWeighted(H) then
if GetEdgeWeight(H,e) > 1 then
SetEdgeWeight(H,e,GetEdgeWeight(H,e)-1);
else
DeleteEdge(H,e);
end if;
else
16
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
DeleteEdge(H,e);
end if;
subC := [op(subC),w];
if w = subC[1] then
buildingSub := false;
end if;
end do;
# splice the subcircuit into the main circuit
if circuit = [] then
circuit := subC;
else

oldC := circuit;
circuit := [];
if insertPoint >= 2 then
circuit := oldC[1 (insertPoint-1)];
end if;
circuit := [op(circuit),op(subC)];
if insertPoint < nops(oldC) then
circuit:=[op(circuit),op(oldC[(insertPoint+1) 1])];
end if;
end if;
end do;
return circuit;
end proc:
Giải thích thuật toán
17
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Chương trình bắt đầu với việc dùng hàm IsPseudoEulerianđể tránh tìm kiếm chu trình
mà không tồn tại trong đồ thị. Sau đó ta gán đồ thị cho 1 biến H. Ta dùng biến H này để
lưu giữ đồ thị cần xử lý sau này.
Có 2 ý chính trong giải thuật này. Một là, đối với 1 đồ thị mà đỉnh đều có bậc chẵn, nếu
ta lấy bất kỳ đỉnh nào để bắt đầu và đi theo cạnh ngẫu nhiên nhưng không lặp lại, ta sẽ
quay về đỉnh ban đầu và tạo nên 1 chu trình. Ý thứ 2 là đối với đồ thị liên thông, nếu
chu trình của ta không bao gồm tất cả các cạnh của đồ thị, thì vài đỉnh được sử dụng
trong chu trình có sẵn có thể được dùng làm điểm khởi đầu cho 1 chu trình con mới.
Chu trình con mới này sau đó có thể được ghép vào trong chu trình chính. Việc này
cuối cùng sẽ dẫn đến việc sử dụng tất cả các cạnh và kết quả ta được chu trình Euler.
Biến circuit lưu giữ kết quả chu trình Euler và trả về kết quả cần tìm, nó chứa list các
đỉnh mà chu trình đi qua nó và ban đầu khởi tạo là rỗng. Vòng While chính gồm 3
phần : (1) xác định điểm bắt đầu của chu trình con (gọi là subC); (2) xây dựng chu trình
con; (3) ghép chu trình con vào chu trình chính.

Bước đầu tiên, tìm điểm bắt đầu của chu trình con, phụ thuộc vào trạng thái của chu
trình chính. Nếu circuit là ds rỗng, điểm bắt đầu là đỉnh đầu tiên trong đồ thị. Nếu
circuit không rỗng, thì câu lệnh else sẽ xem các đỉnh trong chu trình chính và tìm 1 đỉnh
mà có láng giềng. Đỉnh đầu tiên có láng giềng được sử dụng như điểm bắt đầu của chu
trình con. Biến insertPoint được sử dụng để lưu trữ các chỉ số, tương đối với circuit,
của đỉnh bắt đầu của chu trình con. Nó được sử dụng khi chu trình con được ghép vào
chu trình chính.
Bước thứ 2 là xây dựng subC. Biến buildingSub được sử dụng để điều khiển vòng
while. Nó được khởi tạo là true và được gán false khi biến subC trả về đỉnh khởi đầu
của nó và vì thế nó là 1 chu trình. Biến v được gán là đỉnh cuối hiện thời được tính như
là 1 phần của chu trình con và w biểu diễn cho 1 láng giềng của v. Biến e = {v, w} biểu
diễn 1 cạnh của đồ thị mà chưa được duyệt trong chu trình. Nếu H có trọng số, trọng số
này hoặc là giảm đi 1 để biểu thị việc loại 1 trong vài cạnh giữa các đỉnh hay là bị xóa
nếu có chỉ 1 cạnh như thế. Trong trường hợp không trọng số, cạnh thì luôn luôn bị xóa
khỏi đồ thị. Sau khi cạnh bị xóa, đỉnh w được thêm vào chu trình con, biểu diễn việc
thêm vào của cạnh. Cuối cùng, đỉnh mới nhất được so sánh với đỉnh bắt đầu để xác
định xem chu trình kết thúc hay chưa. Nếu đỉnh mới kết thúc chu trình, thì biến
buildingSub sẽ set bằng false, khiến cho vòng while sẽ dừng. Nếu không thì while sẽ
thực hiện việc xây dựng chu trình con.
Bước thứ 3, một khi chu trình con được xây dựng xong, sẽ được ghép với chu trình
chính. Ở lần đầu ở vòng lặp chính, chu trình chính rỗng và subC được copy vào
circuit. những lần lặp tiếp theo của vòng lặp chính, biến oldC được dùng để lưu giá trị
cũ của chu trình. Lưu ý biến insertPoint lưu chỉ số của đỉnh bắt đầu của subC. Mục
đích là đưa chu trình con vào vị trí đó.
18
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Vòng lặp chính tiếp tục cho đến khi tất cả cạnh của đồ thị đã có trong chu trình, làm cho
biến circuit là 1 chu trình Euler trong đồ thị. Như ví dụ minh họa sau, in ra chu trình
Euler.
Dữ liệu thử nghiệm

> Test := Graph({{"a","b"},[{"a","e"},3],{"b","c"},{"b","d"},
{"b","e"},[{"c","d"},2],{"c","e"},{"d","e"}});
> SetVertexPositions(Test,[[0,2],[1,2],[2,.5],[1,1],[0,1]]);
> DrawPseudograph(Test);
19
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
> TestPath := FindMultiEuler(Test);
20
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
1.3 BÀI TOÁN TÔ MÀU ĐỒ THỊ (GRAPH COLORING)
1.3.1 Giới thiệu bài toán tô màu đồ thị
Vấn đề liên quan đến tô màu các miền trên bản đồ, ví dụ bản đồ các vùng trên thế giới
đã dẫn đến nhiều kết quả trong lí thuyết đồ thị. Khi tô màu bản đồ, ta thường tô 2 miền
có chung đường biên giới bằng 2 màu khác nhau. Để đảm bảo điều này, ta có thể sử
dụng màu sắc riêng cho mỗi miền. Tuy nhiên, cách làm này là không hiệu quả, và nếu
bản đồ có quá nhiều miền, sẽ rất khó để phân biệt giữa các miền có màu sắc gần giống
nhau. Do đó, ta nên sử dụng số màu ít nhất có thể được. Nó dẫn đến bài toán xác định
số màu tối thiểu cần sử dụng để tô màu các miền bản đồ sao cho các miền lân cận luôn
khác màu nhau.
VD: Bản đồ H1a có thể tô được bằng 4 màu, nhưng không thể tô bằng 3 màu -> Số màu tối
thiểu phải là 4.
Bản đồ H1b có thể tô bằng 3 màu,nhưng 2 màu là không thể ->Số màu tối thiểu là 3.
Mỗi bản đồ trên mặt phẳng có thể biểu diễn bằng đồ thị: Mỗi miền biểu diễn bằng 1 đỉnh; 2 đỉnh
sẽ được nối với nhau khi 2 miền tương ứng có chung đường biên giới. Hai miền chỉ tiếp xúc
nhau tại 1 điểm coi như không kề nhau. Đồ thị này được gọi là đồ thị kép của bản đồ. Từ
phương pháp xây dựng đồ thị kép của 1 bản đồ, dễ thấy mỗi bản đồ phẳng sẽ tương ứng với 1
đồ thị kép phẳng .
H2 thể hiện đồ thị phẳng tương ứng của các bản đồ trong H1.
21
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT

• Định nghĩa 1 :
Phép tô màu của một đồ thị đơn là một quy tắc tô mỗi đỉnh đồ thị một màu cụ thể sao cho
không có 2 đỉnh kề nhau nào được tô cùng màu.
1 đồ thị có thể tô màu bằng các màu khác nhau cho mỗi đỉnh. Tuy nhiên, trong phần lớn
các đồ thị, ta có thể tô bằng số màu ít hơn số đỉnh. Vậy số màu tối thiểu cần sử dụng là
bao nhiêu?
22
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
• Định nghĩa 2 :
Số màu của một đồ thị G ( kí hiệu c(G))là số màu tối thiểu cần sử dụng để tô màu đồ thị
này.
Chú ý rằng số màu của 1 đồ thị phẳng chính là số màu tối thiểu cần sử dụng để tô màu
các miền bản đồ phẳng sao cho không có 2 miền nào kề nhau và được tô cùng màu.
Bài toán này đã được nghiên cứu hơn 100 năm, dẫn đến một trong các định lí nổi tiếng
nhất của toán học:
• Định lí 4 màu :
Số màu của 1 đồ thị phẳng không lớn hơn 4.
Giả thuyết 4 màu được đề ra từ những năm 1850. Nó cuối cùng đã được chứng minh bởi 2 nhà
toán học Mĩ là Kenneth Appel và Wolfgang Haken năm 1976. Trước đó, nhiều người đã đề ra
các cách chứng minh khác nhau của bài toán, nhưng tất cả đều sai và thường mắc phải những
lỗi khó phát hiện. Bên cạnh đó là những cố gắng vô ích trong việc phủ định giả thuyết bằng
cách chỉ ra những bản đồ đòi hỏi nhiều hơn 4 màu.
Có lẽ, sai lầm nổi tiếng nhất là chứng minh được xuất bản năm 1879 bởi một luật sư
ở Luân Đôn và một nhà toán học nghiệp dư, Afred Kempe. Các nhà toán học công
nhận chứng minh này là đúng cho đến năm 1890, khi Percy Heawood tìm ra lỗi. Tuy
nhiên, hướng lí luận của Kempe lại trở thành cơ sở cho thành công của Appel và
Haken sau này. Chứng minh của họ dựa trên phân tích cẩn thận từng trường hợp trên
máy tính. Họ chỉ ra rằng nếu giả thuyết 4 màu sai, họ phải tìm ra được phản ví dụ của 1
trong khoảng 2000 trường hợp khác nhau. Họ đã sử dụng máy tính chạy trong 1000
tiếng để thực hiện chứng minh của mình. Chứng minh này đã gây ra nhiều tranh cãi khi

sử dụng máy tính để thực hiện các thao tác chính. Ví dụ, chương trình máy tính có thể
mắc lỗi dẫn đến kết quả sai. Liệu lí lẽ của họ có thật sự là 1 chứng minh khi phụ thuộc
vào những kết quả không đáng tin cậy của máy tính?
Định lí 4 màu chỉ ứng dụng trên đồ thị phẳng. Đồ thị không phẳng có thể có số màu lớn hơn 4.
2 điều kiện được yêu cầu để xác định số màu của 1 đồ thị là n: Đầu tiên,phải chứng
minh đồ thị có thể tô bằng n màu.Việc này có thể thực hiện bằng cách xây dựng, như tô
màu. Thứ 2, chúng ta phải chỉ ra rằng đồ thị không thể tô bằng số màu ít hơn n. Các ví
dụ sau điển hình cho cách tìm số màu đồ thị.
23
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Một số ví dụ
24
ĐẠI HỌC QUỐC GIA TPHCM CHƯƠNG TRÌNH THẠC SĨ CNTT
Tô màu các đồ thị đầy đủ K
n
Ta có thể tô màu n đỉnh của K
n
bằng n màu riêng biệt. Liệu có cách tô nào tiết kiệm màu
hơn không? Câu trả lời là không.
Thật vậy, không có 2 đỉnh nào có thể tô cùng màu vì mọi đỉnh đều kề nhau. Vậy, ta có c(Kn) = n
(Chú ý: Kn không phải đồ thị phẳng khi n ≥ 5, do đó kết quả này không vi phạm định lí 4 màu).
H5 cho ta ví dụ về việc tô màu K5.
Tô màu các đồ thị vòng C
n
Ví dụ tô màu với n = 6 và n =5
25

×