Tìm cây bao trùm nhỏ nhất từ một đồ thị liên thông có trọng số
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI ĐẠI HỌC KHOA HỌC TỰ NHIÊN Khoa Toán - Cơ - Tin học
Trang 251
Trang 3Phan Anh Quân : K61 - CNKHTN Toán 2
LỜI NÓI ĐẦU
Bài toán tìm cây bao trùm nhỏ nhất là một bài toán rất nổi tiếng trong lý thuyết
đồ thị, nó có rất nhiều ứng dụng quan trọng như trong việc thiết kế các mạng lưới(điện thoại, TV, điện, internet, ), tìm thuật toán xấp xỉ cho các bài toán độ khó NP,
Để tìm được cây bao trùm nhỏ nhất ta có thể áp dụng các thuật toán như Thuậttoán Bor ˚uvka, Thuật toán Prim, Thuật toán Kruskal Trong bài viết này, ngoài việcgiới thiệu về phần mềm Maple cũng như một số kiến thức cơ bản về cây, em xin đượctrình bày về hai thuật toán Prim và Kruskal và viết chương trình Maple cho hai thuậttoán trên
Nhân đây, em xin bày tỏ sự biết ơn sâu sắc tới PGS.TS Nguyễn Hữu Điển, người
đã tận tình giúp đỡ để em có thể hoàn thành bài tập lớn
Mọi sự đóng góp xin gửi về địa chỉ: phananhquan_t61@hus.edu.vn
Sinh viên: Phan Anh Quân
Lớp học: K61 - CNKHTN Toán
Trang 4MỤC LỤC 3
Mục lục
1.1 Maple là gì? 41.2 Một số chức năng chính của Maple 41.3 Cấu trúc của Maple 5
2.1 Cây 62.2 Cây bao trùm 82.3 Cây bao trùm nhỏ nhất 9
3.1 Thuật toán Kruskal 103.2 Thuật toán Prim 15
Trang 51 Giới thiệu về Maple 4
1 Giới thiệu về Maple
Trong phần này chúng ta sẽ điểm qua một số thông tin liên quan đến phần mềmMaple
1.1 Maple là gì?
Maple là một phần mềm tính toán chuyên dụng do Đại học Tổng hợp Waterloo(Canada) và trường Đại học Kỹ thuật Zurich (ETZ) xây dựng và đưa vào thươngmại đầu tiên năm 1985 Phần mềm đã trải qua nhiều lần cải tiến và phát triển vớinhiều phiên bản khác nhau, trở nên ngày càng hoàn thiện Maple chạy trên tất cả các
hệ điều hành, đòi hỏi cấu hình máy tính không lớn, thích hợp nhu cầu sử dụng củanhiều loại đối tượng: học sinh, sinh viên, giáo viên, Từ phiên bản 7, Maple cung cấpcà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 phổ thông vàđại học Ưu điểm đó khiến ngày càng có nhiều nước trên thế giới lựa chọn sử dụngMaple trong dạy - học toán tương tác trước đòi hỏi của thực tiễn và sự phát triển củagiáo dục
1.2 Một số chức năng chính của Maple
• Thực hiện các tính toán khối lượng lớn trong thời gian ngắn với độ chính xáccao, đáp ứng nhu cầu khắt khe trong nghiên cứu Khoa học kỹ thuật
• Giải quyết các bài toán cụ thể như: Giải tích (Tính giới hạn các hàm sốthực/phức, tính vi phân, nguyên hàm, tích phân, ), Đại số tuyến tính(sử dụnggói lệnh LinearAlgebra), Giải phương trình (Phương trình đại số, phương trìnhDiophantine, ODEs, PDEs, DAEs, DDEs), hình học (gói geometry), lý thuyết số(gói numtheory),
• Thuận tiện trong việc minh họa hình học: Vẽ các đồ thị (đồ thị chu tuyến, đồthị điểm, ) trong các tọa 2 chiều Oxy, tọa độ Oxyz, tọa độ cực, ; cho phépthực hiện các phép biến đổi đồ thị (co giãn, tịnh tiến, quay, ), minh họa đồ thịđộng cho phép thấy sự biến thiên của hàm số có tham số
• Một công cụ hữu ích cho học sinh, sinh viên trong việc tự học
• Một công cụ hữu ích cho giáo viên trong việ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
• Ngôn ngữ lập trình đơn giản, mạnh mẽ, có khả năng tương tác với nhiềungôn ngữ lập trình khác như C, C#, Fortran, Java, JavaScript, Julia, Matlab,Perl, Python, R, và Visual Basic
• Có khả năng thúc đẩy tương tác giữa người và máy, cho phép người dùng pháttriển các module chuyên dụng, lập trình hoặc thư viện riêng ngay trong phầnmềm
• Và nhiều tính năng khác
Trang 61.3 Cấu trúc của Maple 5
1.3 Cấu trúc của Maple
Maple dựa trên một hạt nhân nhỏ, được viết bằng C, từ đó cung cấp ngôn ngữ lậptrình Maple Hầu hết các tính năng được cung cấp bởi các thư viện chuyên dụng đến
từ nhiều nguồn khác nhau Hầu hết các thư viện được viết bằng ngôn ngữ Maple,với mã nguồn có thể xem được Nhiều các tính toán số được thực hiện bởi Thư viện
số NAG thư viện ATLAS hoặc thư viện GMP
Chức năng khác nhau trong Maple đòi hỏi dữ liệu số ở dưới các định dạng khácnhau Các ký hiệu, biểu tượng được lưu trữ trong bộ nhớ dưới dạng các đồ thị cóhướng không chu trình Giao diện chuẩn và giao diện máy tính (calculator interface)của Maple được viết bằng Java
Trang 72 Một số khái niệm cơ bản 6
2 Một số khái niệm cơ bản
Trong chương này ta sẽ trình bày một số khái niệm liên quan đến bài viết: cây,cây bao trùm
2.1 Cây
Ta có một số ví dụ về cây như sau:
Hình 2.1: Gia đình Toán học Bernoulli
Hình 2.2: Các đồ thị là cây (G1, G2) và không phải là cây (G3, G4)
Trang 82.1 Cây 7
Ta định nghĩa cây như sau
Định nghĩa 2.1. Một cây là một đồ thị vô hướng, liên thông và không có chu trình.Bởi vì một cây thì không có chu trình, nó không thể chứa các đa cạnh (qua haiđỉnh có nhiều hơn một cạnh) hay cạnh khuyên (cạnh có hai đầu mút trùng nhau) Vìvậy, một cây phải là một đồ thị đơn
Ví dụ 2.1. Trong Hình 2.2, các đồ thị G1, G2 là cây bởi vì chúng đều liên thông vàkhông có một chu trình đơn nào Trong khi đó đồ thị G3không là cây do nó có mộtchu trình là(a, b, c, d, a) Còn đồ thị G4thì không liên thông do đó nó cũng không làcây
Dưới đây ta sẽ nói qua một số kiểu cây đặc biệt
Định nghĩa 2.2. Một cây được gọi là cây có gốc nếu như một đỉnh của nó được xácđịnh là gốc và các cạnh đều được hướng ra từ gốc
gọi là đỉnh mẹ của v, v được gọi là đỉnh con của u.
• Các đỉnh có cùng một đỉnh mẹ được gọi là anh em
• Tổ tiên của một đỉnh v khác gốc là các đỉnh nằm trên đường đi từ gốc đến đinh
vkhác chính v (tức là đỉnh mẹ, đỉnh mẹ của đỉnh mẹ, tiếp tục cho đến gốc)
• Hậu duệ của một đỉnh v là tất cả các đỉnh nhận v là tổ tiên.
• Một đỉnh không có con được gọi là lá của cây Một đỉnh có con được gọi là một
đỉnh trongcủa cây
• Nếu v là một đỉnh trong cây, cây con gốc v là một đồ thị con chứa v cùng với
tất cả hậu duệ của v và các cạnh nối đến chúng
Trang 92.2 Cây bao trùm 8
Định nghĩa 2.3. Một cây có gốc được gọi là một cây m-phân nếu mỗi đỉnh trong cókhông quá m đỉnh con Cây này được gọi là m-phân đầy đủ nếu mỗi đỉnh có chínhxác m đỉnh con Một cây m-phân với m=2 được gọi là một cây nhị phân
Ví dụ 2.3. Trong Hình 2.4 dưới đây, T1 là một cây nhị phân đầy đủ, T2 là một cây3-phân đầy đủ, T3là một cây 5-phân đầy đủ, T4là một cây 3-phân
Hình 2.4:Cây m-phân
Để nhận biết khi nào đồ thị là một cây, ta có định lý sau
Định lý 2.1(Định lý cơ bản về cây) Cho G = (V, E) là một đồ thị vô hướng, các mệnh
đề sau là tương đương:
1 G là cây
2 G liên thông và|E| = |V| −1
3 G không có chu trình,|E| = |V| −1
4 G liên thông, nhưng nếu xóa đi một cạnh bất kỳ thì G không còn liên thông nữa
5 G không có chu trình, nhưng nếu thêm một cạnh vào thì G sẽ có chu trình
6 Giữa hai đỉnh bất kỳ của G luôn tồn tại duy nhất một đường đi
2.2 Cây bao trùm
Định nghĩa 2.4. Cho G là một đồ thị đơn Một cây bao trùm (spanning tree) của G
là một đồ thị con là cây chứa tất cả các đỉnh của G
Hình 2.5:Cây bao trùm (được tô đậm) của một đồ thị
Ta có một định lý đơn giản sau đây
Định lý 2.2 Một đồ thị đơn là liên thông khi và chỉ khi nó chứa một cây bao trùm
Trang 102.3 Cây bao trùm nhỏ nhất 9
2.3 Cây bao trùm nhỏ nhất
Trước tiên ta sẽ nêu định nghĩa sau
Định nghĩa 2.5 (Đồ thị có trọng số) Một đồ thị có trọng số (weighted graph) là một
đồ thị mà mỗi cạnh của nó được gắn với một hằng số cụ thể Hằng số đó được gọi làtrọng số (weight) của cạnh đó
Trên thực tế, một đồ thị có trọng số xuất hiện vô cùng phổ biến Ví dụ, trong mộtbản đồ với mỗi điểm là các địa điểm riêng biệt và các cạnh là các đường đi nối haiđiểm, trọng số của mỗi cạnh sẽ là độ dài của đường đi đó hoặc giá tiền để đi trênđường đi đó Hay trong một hệ thống dẫn nước, các cạnh sẽ là các ống nước và trọng
số sẽ là khả năng chịu tải lượng nước chảy qua tối đa của mỗi ống nước
Trong phần này ta sẽ làm việc với các đồ thị đơn liên thông có trọng số Bài toántìm cây bao trùm nhỏ nhất là bài toán tìm một cây bao trùm của một đồ thị đơn liênthông có trọng số sao cho tổng trọng số các cạnh trong cây bao trùm đó là nhỏ nhất
Ví dụ 2.4. Một đồ thị có trọng số
Hình 2.6:Độ dài đường đi giữa các thành phố (Nevada)
Ví dụ 2.5. Một đồ thị có trọng số với một cây bao trùm nhỏ nhất của nó
Hình 2.7:Cây bao trùm nhỏ nhất
Trang 113 Một số thuật toán tìm cây bao trùm nhỏ nhất 10
3 Một số thuật toán tìm cây bao trùm nhỏ nhất
Trong phần này, chúng ta sẽ tìm hiểu về hai thuật toán để tìm cây bao trùm nhỏnhất của một đồ thị đơn liên thông có trọng số
Thuật toán thứ nhất chúng ta sẽ đề cập tới trong phần này là thuật toán Kruskal,được đặt cùng tên với nhà toán học người Mĩ Joseph B Kruskal Jr., người đã pháthiện ra thuật toán này vào năm 1956
Thuật toán thứ hai được phát hiện ra đầu tiên bởi nhà toán học người Cộng hòaSéc Vojtˇech Jarník năm 1930 Thuật toán này về sau được phát hiện lại bởi Robert C.Prim vào năm 1957 và Edsger W Dijkstra vào năm 1959 Thuật toán này thường đượcbiết đến là thuật toán Prim (hay đôi khi là thuật toán Jarník, thuật toán Prim-Jarník,thuật toán Prim-Dijkstra hay thuật toán DJP)
3.1 Thuật toán Kruskal
Ta sẽ mô tả thuật toán Kruskal
Đầu vào Đồ thị G= (V, E, l)với V là tập đỉnh, E là tập cạnh, l : E→R là hàm trọng
số
Quá trình T :=cạnh có trọng số nhỏ nhất Thực hiện liên tục n−2 lần quá trìnhsau: chọn e là một cạnh có trọng số nhỏ nhất sao cho nó không nằm trong T vàkhông tạo thành chu trình nếu thêm vào T T := Tthêm vào e
Đầu ra Tsẽ là cây bao trùm nhỏ nhất của G
Hình 3.1:Thuật toán Kruskal
Trang 123.1 Thuật toán Kruskal 11
Ta sẽ viết chương trình cho thuật toán Kruskal như sau:
> with(networks):
Kruskals_MST := module()
option package;
export Kruskals_Algorithm;
Kruskals_Algorithm := proc (network_def::list, make_graph::truefalse)
local edgelist :: list, edge :: list, cmp_weights, mst :: set,
mst_edges :: posint, i :: posint, vertices :: set, vertex,
vertex_count :: posint, C :: table, rep_target, rep_value, G,
tot_cost :: posint;
# Obtain list of edges sorted by weight
cmp_weights := proc(a,b) return ( is(a[3] < b[3]) ) end proc:
edgelist := sort(network_def, cmp_weights);
# Obtain list of vertices
vertices := {}:
for edge in edgelist do vertices := vertices union { edge[1], edge[2] } end do:vertex_count := nops(vertices);
mst_edges := vertex_count - 1; # number of edges in MST = vertices - 1
# Initialize cycle-detecting table
C := table;
for vertex in vertices do C[vertex] := vertex end do;
# printf("vertex_count = %d, edges = %d\n", vertex_count, nops(edgelist));
end do;
end if;
end do:
Trang 133.1 Thuật toán Kruskal 12
# Sanity check
if (nops(mst) <> mst_edges) then
printf("*** Did not construct MST, %d <> %d ***\n",
nops(mst), mst_edges);
printf("*** Error in input? Not connected graph? ***\n");
return;
end if;
# At this point, shortest paths for graph is determined
printf("\nMinimum Spanning Tree:\n\n");
tot_cost := 0;
for edge in mst do;
printf ("%A - %A (%d)\n", edge[1], edge[2], edge[3]);
tot_cost := tot_cost + edge[3];
end proc: # Kruskals_Algorithm
end module: # Kruskals_MST
Kruskals_Algorithm(net, false); # dont display graph
Minimum Spanning Tree:
Trang 143.1 Thuật toán Kruskal 13
1 - 2 (1)
2 - 3 (2)
2 - 4 (5)Total cost = 8{[1, 2, 1], [2, 3, 2], [2, 4, 5]}
Một ví dụ phức tạp hơn, và cho hình ảnh cây bao trùm
Trang 153.1 Thuật toán Kruskal 14
Ví dụ 3.3 ># Network with city name labels
Trang 163.2 Thuật toán Prim 15
Minimum Spanning Tree:
Omaha - Chicago (5)
St Louis - Chicago (5)Chicago - Cincinatti (5)Boston - New York (3)New York - Washington DC (5)Pittsburgh - Washington DC (5)Pittsburgh - Cincinatti (4)Washington DC - Atlanta (4)Memphis - New Orleans (4)New Orleans - Atlanta (6)Atlanta - Miami (6)Total cost = 52
3.2 Thuật toán Prim
Ta sẽ mô tả thuật toán Prim
Đầu vào Đồ thị G = (V, E, l)với V là tập đỉnh, E là tập cạnh, l : E→R là hàm trọng
số
Trang 173.2 Thuật toán Prim 16
Quá trình T := đỉnh bất kỳ Thực hiện n−1 lần quá trình sau: Chọn e là cạnh cótrọng số nhỏ nhất thỏa mãn e có chung đỉnh với một đỉnh của T và thêm e vào
Tsẽ không tạo thành chu trình Khi đó T :=Tthêm vào e
Đầu ra Tsẽ là cây bao trùm nhỏ nhất của G
Hình 3.2:Thuật toán Prim
Ta sẽ viết chương trình cho thuật toán Prim như sau:
>restart:
with(GraphTheory):
PrimMST := module()
option package;
Trang 183.2 Thuật toán Prim 17
export Prim;
Prim := proc (G::Graph, stepByStep::truefalse := false,
draw::truefalse := true, initial := {})
local H :: list, V :: set, E :: set, e :: list, g::Graph ,
a::list, discarded::set, initVert::set,total::int,
uncheckedVerts::int:
#variable initialization
H:={}: #List of edges of the MST
E:=Edges(G,weights): #backup of G’s edge list, used in
destructive operations
uncheckedVerts:=nops(Vertices(G))-1: #number of G’s vertices
not yet reached by the MST
>
if initial <> {} then #determines initial vertex
if initial in Vertices(G) then
V:={initial}: #user-inputted initial vertex
else
printf("ERROR: initial vertex not in graph");
return "ERROR": #invalid initial vertex
end if:
else
V:={E[1][1][1]}: #default initial vertex
end if:
if draw and stepByStep then
printf("key: yellow = vertices, magenta = initial vertex, blue
= original graph edges,\n\tgreen = MST edges, red = discarded
total:=0: #total weight of the edges in the MST
while nops(E)>0 do; #continue while there are unprocessed
edges
e:={}: #assume no edge is added to the MST
for a in E do: #for each edge
if a[1][1] in V then
if a[1][2] in V then
E:=E minus {a}: #if it would cause a loop in the MST,
discard the edge
if stepByStep then #report discarded edge if the option is
Trang 193.2 Thuật toán Prim 18
discarded:=discarded union {a}:
if e={} or a[2]<e[2] then #if no loop is formed, take the
minimum weight edge
Trang 203.2 Thuật toán Prim 19
if(E<>{})then #if there are unprocessed edges, but none of
>
>
them belongs to the MST, report an error
printf("ERROR: unable to construct MST, graph may be
Trang 213.2 Thuật toán Prim 20
Ví dụ 3.5 (làm từng bước, nhưng không in cây bao trùm).
added edge (1,3) with weight 2 to the MST
added edge (3,6) with weight 2 to the MST
added edge (5,6) with weight 2 to the MST
discarded edge (3,5) as it would cause a loop
added edge (1,4) with weight 5 to the MST
discarded edge (3,4) as it would cause a loop
discarded edge (4,5) as it would cause a loop
added edge (2,4) with weight 4 to the MST
Trang 22[3] Nguyễn Hữu Điển, L A TEX- Với gói lệnh và phần mềm công cụ, NXBĐHQGHN, 2004.
[4] Kenneth H Rosen, Discrete Mathematics and Its Application, 7th ed., McGraw-Hill
Higher Education, 2012
[5] Thomas H Cormen, Charles E Leiserton, Ronald L Rivest, Clifford Stein,
Intro-duction to Algorithms, 2nd ed., The MIT Press, 2001
[6] https://en.wikipedia.org/
[7] https://www.maplesoft.com/