Khi đó G được biểu diễn bằng ma trận: - Đơn giản, trực quan, dễ cài đặt trên máy tính - Để kiểm tra xem hai đỉnh i, j của đồ thị có kề nhau hay không, ta chỉ việc kiểm tra bằng một phé
Trang 2LỜI CẢM ƠN
Trong quá trình thực hiện khoá luận em đã nhận được nhiều sự giúp
đỡ quý báu và bổ ích từ các thầy cô và bạn bè Em xin chân thành cảm
ơn các thầy cô trong khoa Toán trường Đại học Sư phạm Hà Nội 2 đã tận tâm giảng dạy, truyền thụ kiến thức và kinh nghiệm quý báu để em hoàn thành tốt khoá học Đặc biệt, em xin bày tỏ lòng cảm ơn sâu sắc của
mình tới thầy Trần Minh Tước, thầy đã trực tiếp hướng dẫn, nhiệt tình
giúp đỡ và chỉ bảo em trong suốt quá trình thực hiện khoá luận
Em xin chân thành cảm ơn các thầy cô trong tổ toán Ứng dụng – khoa Toán, thư viện nhà trường, gia đình và bạn bè đã tạo mọi điều kiện, động viên, giúp đỡ để em hoàn thành khoá luận này
Xuân Hòa, ngày 06 tháng 5 năm 2014
Sinh viên
Nguyễn Thúy Linh
Trang 3LỜI CAM ĐOAN
Tôi cam đoan khoá luận “Những vấn đề cơ bản và một số thuật
toán trên đồ thị” là kết quả nghiên cứu của tôi dưới sự hướng dẫn của
TS.Trần Minh Tước Tôi xin khẳng định kết quả nghiên cứu trong khoá
luận này không sao chép kết quả của bất cứ tác giả nào khác Nếu sai sót tôi xin chịu hoàn toàn trách nhiệm
Trang 4MỤC LỤC
MỞ ĐẦU 1
Chương 1 MỘT SỐ KIẾN THỨC CƠ BẢN VỀ ĐỒ THỊ 2
1 Một số khái niệm của đồ thị 2
1.1 Định nghĩa đồ thị 2
1.2 Các thuật ngữ cơ bản 5
1.3 Một số đồ thị đặc biệt 9
2 Biểu diễn đồ thị 11
2.1 Biểu diễn đồ thị bằng ma trận kề, ma trận trọng số 11
2.2 Ma trận liên thuộc 13
2.3 Ý nghĩa của các cách biểu diễn đồ thị 14
Chương 2 MỘT SỐ THUẬT TOÁN TRÊN ĐỒ THỊ 16
1 Bài toán duyệt đồ thị 16
1.1 Thuật toán tìm kiếm theo chiều sâu DFS (Depth First Search) 16
1.2 Thuật toán tìm kiếm theo chiều rộng BFS (Breath First Search) 20
1.3 Ý nghĩa của bài toán duyệt đồ thị 24
2 Bài toán tìm đường đi ngắn nhất 24
2.1 Thuật toán tìm đường đi ngắn nhất Dijkstra 24
2.2 Thuật toán Floyd 30
2.3 Ý nghĩa của bài toán tìm đường đi ngắn nhất 33
3 Bài toán cây khung cực tiểu 34
3.1 Cây, cây khung và một số tính chất 34
3.2 Bài toán cây khung cực tiểu 35
3.3 Ý nghĩa của bài toán cây khung cực tiểu 42
KẾT LUẬN 44
TÀI LIỆU THAM KHẢO 45
Trang 5MỞ ĐẦU
Lý thuyết đồ thị là ngành khoa học được phát hiện từ lâu nhưng lại
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 từ những năm đầu của thế kỉ XVIII bởi nhà toán học lỗi lạc người Thụy Sĩ Leonhard Euler Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng về các cây cầu ở thành phố Königsberg Từ đó lý thuyết đồ thị ngày càng khẳng định được vị trí quan trọng trong việc giải quyết các bài toán thực tế Lý thuyết đồ thị không những có nhiều ứng dụng trong thực tế mà còn là công cụ đắc lực cho ngành công nghệ thông tin Nó giúp cho chúng ta mô tả dễ dàng các bài toán phức tạp một cách
cụ thể, để từ đó ta có thể mã hóa các bài toán đó bằng máy tính Tuy nhiên, đây là kiến thức hoàn toàn mới, không có trong chương trình học của tôi Với mong muốn học hỏi và tìm tòi kiến thức mới nên tôi chọn đề
tài “Những vấn đề cơ bản và một số thuật toán trên đồ thị”
Nội dung khóa luận của tôi tuy không phải là những kết quả mới tìm được nhưng với tinh thần học hỏi kiến thức mới, hi vọng đề tài này
sẽ đem lại nhiều kiến thức bổ ích cho bản thân và cho độc giả Nội dung khóa luận gồm hai chương:
Chương 1 Một số kiến thức cơ bản về đồ thị
Chương 2 Một số thuật toán trên đồ thị
Tuy đã có nhiều cố gắng, song do hạn chế về thời gian và năng lực của bản thân, nên khóa luận không tránh khỏi sai sót, rất mong được sự quan tâm góp ý của thầy cô và các bạn
Tôi xin chân thành cảm ơn!
Trang 6Chương 1 MỘT SỐ KIẾN THỨC CƠ BẢN VỀ ĐỒ THỊ
1 Một số khái niệm của đồ thị
1.1 Định nghĩa đồ thị
Ta có thể hình dung đồ thị như tập hữu hạn các đối tượng và những mối liên hệ giữa các đối tượng đó Sơ đồ biểu diễn một mạng máy tính là một hình ảnh của đồ thị Các đối tượng là các máy tính, mỗi kênh thoại
sẽ biểu diễn mối liên hệ giữa hai máy tính trong mạng
Có nhiều loại đồ thị được xây dựng dựa vào cấu trúc của đồ thị, cụ thể là tùy thuộc vào sự xác định mối liên hệ giữa các đối tượng Khuôn khổ khóa luận này tôi chỉ đề cập tới đồ thị vô hướng và đồ thị vô hướng
có trọng số
Định nghĩa 1.1 Đồ thị là một cặp G( , )V E gồm hai tập hợp hữu hạn
Phần tử của V được gọi là đỉnh, phần tử của E được gọi là cạnh của đồ thị G
Người ta thường ký hiệu V { , , , }v v1 2 v n ,cạnh e{ , }u v thường viết gọn hơn là uv (cũng trùng với vu)
Trong định nghĩa này, mỗi phần tử của E là một tập gồm hai phần
tử khác nhau thuộc V Như vậy, các đồ thị được xét ở đây là các đồ thị hữu hạn, không có khuyên và cạnh bội (xem [1]) , gọi tắt là đồ thị
Một cách trực quan, người ta thường biểu diễn đồ thị bằng sơ đồ đỉnh – cạnh như sau:
- Biểu diễn mỗi đỉnh của đồ thị bằng một vòng tròn nhỏ (rỗng hoặc đặc)
- Một cạnh được biểu diễn bởi một đoạn (cong hay thẳng) nối hai
Trang 7đỉnh liên thuộc với cạnh đó
Ví dụ Đồ thị G( , )V E với V { , , , }v v1 2 v7 , E{v v1 2, v v 1 5,
2 3, 1 3, 2 6, 2 7, 3 4, 3 5, 3 7, 4 6, 5 6, 6 7}
v v v v v v v v v v v v v v v v v v v v
là đồ thị được biểu diễn trong hình 1
Hình1 Đồ thị G được biểu diễn bằng sơ đồ đỉnh – cạnh
Định nghĩa 1.2 Giả sử G( , )V E là đồ thị không rỗng Đồ thị
( , )
G V E được gọi là đồ thị con của G, kí hiệu G G , nếu V V
Trang 8gọi là trọng số của canh e
Các phần tử của W có thể chỉ đơn thuần là các dữ liệu nhưng E
thường thì có một ý nghĩa định lượng nào đấy
Trang 91.2 Các thuật ngữ cơ bản
1.2.1 Liên thuộc, kề
Định nghĩa 1.4 Giả sử G( , )V E là đồ thị không rỗng với v V và
Xét đồ thị G được cho trong hình 4:
Đỉnh v liên thuộc với 1 e e1, 2 Đỉnh v kề với các đỉnh 2 v v v 1, , 3 5
1.2.2 Bậc của đỉnh
Định nghĩa 1.5 Giả sử G( , )V E là đồ thị không rỗng với v là một
Trang 10Ví dụ
Hình 5 Bậc của các đỉnh trên đồ thị G
Xét đồ thị G được cho trong hình 5 ta có
deg( v ) = 1, deg(1 v ) = 3, deg(2 v ) = 4, deg(3 v ) = 2 4
Từ khái niệm ta có đỉnh v là đỉnh cô lập, 5 v là đỉnh treo 1
Định nghĩa 1.6 Giả sử G( , )V E là đồ thị không rỗng, một đường đi
Trang 11Một đường đi được gọi là chu trình nếu đỉnh đầu và đỉnh cuối của
Dãy v v v v v là đường đi đơn độ dài 4 1, , , ,2 3 4 6
Dãy v v v v v v là chu trình có độ dài 5 1, , , , ,2 4 6 5 1
1.2.4 Liên thông, thành phần liên thông
Định nghĩa 1.7 Đồ thị G = (V, E) được gọi là liên thông nếu với hai
Trong trường hợp ngược lại, đồ thị được gọi là không liên thông
Ví dụ Đồ thị G( , )V E cho trong hình 7 là đồ thị liên thông
Trang 12Như vậy có thể thấy một đồ thị G không liên thông là tập hợp các
đồ thị liên thông
Mỗi đồ thị liên thông là đồ thị con của G và được gọi là một
thành phần liên thông của đồ thị G đã cho
Ví dụ Đồ thị G( , )V E cho trong hình 8 là đồ thị không liên thông Nó
Trang 13Định nghĩa 1.9 Giả sử G( , )V E là đồ thị không rỗng với e là một
cạnh của G Cạnh e được gọi là cầu nếu khi loại bỏ nó khỏi đồ thị nhận
được sẽ có số thành phần liên thông lớn hơn số thành phần liên thông của đồ thị ban đầu
Đồ thị mà giữa hai đỉnh bất kỳ của nó luôn có cạnh nối được gọi là
đồ thị đầy đủ Đồ thị đầy đủ n đỉnh, ký hiệu là K n
Ví dụ Các đồ thị K K K K cho trong hình 11 dưới đây 2, 3, 4, 5
Trang 14Đồ thị bánh xe thu được bằng cách bổ sung vào đồ thị vòng C n
một đỉnh mới nối với tất cả các đỉnh của C Kí hiệu n W n
Ví dụ Đồ thị bánh xe W W W W cho trong hình 13 3, 4, 5, 6
1.3.4 Đồ thị hai phía
Đồ thị G = (V, E) được gọi là hai phía nếu như tập đỉnh V của nó
có thể phân hoạch thành hai tập X và Y sao cho mỗi cạnh của đồ thị chỉ
Trang 15nố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 G =(X Y, E) để chỉ đồ thị hai phía với tập đỉnh X Y
Đồ thị hai phía G = (XY, E) với X = m, Y = n được gọi là đồ
nối với mỗi đỉnh trong Y
Ví dụ Các đồ thị K2,3,K3,3,K được cho trong hình 15 3,4
Trang 17Ví dụ Giả sử G( , , )V E w là đồ thị có trọng số được biểu diễn bằng
hình 18 Khi đó G được biểu diễn bằng ma trận:
- Đơn giản, trực quan, dễ cài đặt trên máy tính
- Để kiểm tra xem hai đỉnh (i, j) 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: bij≠ 0
Trang 18- cij= 0 nếu cạnh e jliên thuộc với đỉnh v i
- cij = l nếu cạnh e jliên thuộc với đỉnh v i
Ví dụ Giả sử G = (V, E) là đồ thị với tập đỉnh V { , , , , }v v v v v1 2 3 4 5 và tập cạnh E{ , , , , , }e e e e e e1 2 3 4 5 6 được cho trong hình 18 Khi đó ma trận liên thuộc của đồ thị G là:
- Ma trận liên thuộc tốn ít bộ nhớ hơn khi đồ thị có ít cạnh
- Nhìn vào ma trận ta có thể dễ dàng biết được số lượng cạnh, số lượng đỉnh và bậc của các đỉnh
Nhược điểm:
- Biểu diễn phức tạp nếu đồ thị có số lượng cạnh nhiều
2.3 Ý nghĩa của các cách biểu diễn đồ thị
Trong những ứng dụng rộng rãi của đồ thị đối với các lĩnh vực khoa
Trang 19học khác và đối với thực tế cuộc sống, việc biểu diễn đồ thị đóng một vai trò quan trọng
Biểu diễn đồ thị với sơ đồ đỉnh cạnh được dùng khi muốn mô hình hóa nhiều bài toán trong thực tế
Với các loại ma trận (kề, liên thuộc, trọng số) và một số cách biểu diễn khác nữa không được đề cập ở đây (Xem [1]), người ta sẽ mô phỏng được đồ thị trong các hệ thống máy tính thuận tiện cho việc lập trình
Phối hợp cả hai dạng biểu diễn nói trên, việc lập trình giải quyết nhiều bài toán thực tế sẽ trở nên đơn giản, thuận tiện hơn
Trang 20Chương 2 MỘT SỐ THUẬT TOÁN TRÊN ĐỒ THỊ
1 Bài toán duyệt đồ thị
Một bài toán quan trọng trong lý thuyết đồ thị là bài toán duyệt đồ thị Ta phải duyệt qua tất cả các đỉnh của đồ thị, bắt đầu từ một đỉnh xuất phát nào đó Vấn đề này đưa về một bài toán liệt kê mà yêu cầu của nó là không được bỏ sót và cũng không được lặp lại bất kỳ đỉnh nào Chính vì vậy mà ta phải xây dựng những thuật toán cho phép duyệt các đỉnh một cách hệ thống Những thuật toán như vậy gọi là những thuật toán tìm kiếm trên đồ thị Ở đây ta quan tâm đến hai thuật toán cơ bản đó là thuật toán tìm kiếm theo chiều sâu và thuật toán tìm kiếm theo chiều rộng
1.1 Thuật toán tìm kiếm theo chiều sâu DFS (Depth First Search)
bắt đầu tìm kiếm từ đỉnh v nào đó của đồ thị Sau đó với mỗi đỉnh u tùy
ý kề với v, ta lặp lại quá trình một cách đệ quy đối với u Ở bước tổng quát, giả sử đang xét đỉnh v, nếu như trong số các đỉnh kề với v ta tìm
được một đỉnh nào đó là chưa xét thì ta sẽ xét đỉnh này và bắt đầu từ nó
ta sẽ tiếp tục quá trình tìm kiếm Còn nếu như không có đỉnh nào kề với
v là chưa xét thì ta nói đỉnh này là đã duyệt xong và quay trở lại tiếp tục
tìm kiếm từ đỉnh mà trước đó ta đến được đỉnh v Quá trình này có thể
mô tả bởi thủ tục đệ quy sau:
Trang 21for u Ke(v) do
end; (* đỉnh v đã duyệt xong *)
Khi đó, tìm kiếm theo chiều sâu trên đồ thị tổng quát được thực hiện nhờ thuật toán sau:
Thuật toán tìm kiếm theo chiều sâu trên đồ thị G được cho trong
hình 1 được minh họa trong hình dưới đây Các đỉnh đang xét được
khoanh tròn Các đỉnh đã duyệt xong được khoanh hình ô vuông Thứ tự duyệt bằng tay ta có thể tự quy định từ trên xuống dưới, từ trái qua phải hoặc theo sự tăng dần của chỉ số của đỉnh để tránh nhầm lẫn (bỏ sót hay lặp lại đỉnh trong quá trình duyệt) Ở ví dụ này, ta tìm kiếm theo thứ tự tăng dần chỉ số của các đỉnh Thuật toán bắt đầu tìm kiếm từ đỉnh
Trang 22đỉnh kề với nó là v v v và tiếp tục tìm kiếm đến 2, ,3 4 v , đến 2 v và đến 3 v 5
Sau khi thăm đỉnh v 7 ta thấy không còn đỉnh nào kề với nó nữa, ta
nói v 7 đã duyệt xong, ta quay lại v và tiếp tục tìm kiếm các đỉnh tiếp 5
Trang 24Khi tất cả các đỉnh đã được đánh dấu là duyệt xong, thuật toán kết
thúc
1.2 Thuật toán tìm kiếm theo chiều rộng BFS (Breath First Search)
Tư tưởng: Thuật toán tìm kiếm theo chiều rộng trên đồ thị được xây
dựng dựa trên cơ sở hàng đợi QUEUE Tức là đỉnh được thăm càng sớm
sẽ càng sớm trở thành đã duyệt xong (tức là càng sớm rời khỏi hàng đợi) Một đỉnh sẽ trở thành đã duyệt xong ngay sau khi ta xét xong tất cả các
đỉnh kề với nó Thủ tục có thể mô tả như sau:
Trang 25(* Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v*)
Trang 26Ví dụ Dùng thuật toán BFS duyệt đồ thị sau:
Hình 2 Đồ thị G Thuật toán tìm kiếm theo chiều rộng được cho trong hình 2 được
minh họa trong các hình và bảng dưới đây Tương tự như DFS, ở đây ta cũng quy định duyệt theo thứ tự từ tăng dần của chỉ số của các cạnh Thuật toán BFS bắt đầu tìm kiếm từ đỉnh v Các đỉnh đang xét được 1
khoanh tròn Các đỉnh đã duyệt xong được khoanh hình ô vuông
Trang 28
Khi tất cả các đỉnh đã được đánh dấu là duyệt xong, thuật toán kết thúc
1.3 Ý nghĩa của bài toán duyệt đồ thị
Với một đồ thị có nhiều nút, việc kiểm tra tính liên thông của đồ
thị là bài toán lớn, cần có cách thức để thực hiện nhanh, chính xác Trên đây đã nêu hai cách duyệt đồ thị phổ biến được áp dụng đó là tìm kiếm theo chiều sâu và tìm kiếm theo chiều rộng giúp người sử dụng dễ dàng kiểm tra những tính chất liên quan đến tính liên thông của đồ thị như kiểm tra sự liên thông của một đồ thị, tìm đường đi giữa hai đỉnh của một đồ thị,…
2 Bài toán tìm đường đi ngắn nhất
với w: E Giả sử a z V, và L là đường đi từ a tới z Hãy tìm đường đi ngắn nhất trong số tất cả các đường đi từ a tới z và cho biết độ
dài đó bằng bao nhiêu?
2.1 Thuật toán tìm đường đi ngắn nhất Dijkstra
Tư tưởng: Trong trường hợp trọng số của các cạnh là không âm
Thuật toán này dựa trên một dãy các bước lặp Một tập đặc biệt các đỉnh được xây dựng bằng cách cộng thêm một đỉnh trong mỗi bước lặp Thủ
v
Trang 29tục gán nhãn được thực hiện trong mỗi lần lặp đó Trong thủ tục gán
nhãn này, đỉnh z được gán nhãn bằng độ dài của đường đi ngắn nhất từ a tới z và chỉ đi qua các đỉnh đã thuộc tập đặc biệt Một đỉnh được thêm
vào tập này là đỉnh có nhãn nhỏ nhất so với các đỉnh chưa có trong tập
đó Thuật toán tìm đường đi ngắn nhất Dijkstra:
Procedure Dijkstra (*G là đồ thị liên thông có trọng số, với trọng
for tất cả các đỉnh v không thuộc S
{* thêm vào S đỉnh có nhãn nhỏ nhất , và sửa đổi nhãn
của các đỉnh không thuộc S*}
end {* L(z) bằng độ dài đường đi ngắn nhất từ a tới z *}
Trang 30Ví dụ Dùng thuật toán Dijkstra hãy
tìm độ dài của đường đi ngắn
nhất giữa hai đỉnh v và 1 v của 3
đồ thị có trọng số trên hình 3
Các bước dùng thuật toán Dijkstra tìm độ dài của đường đi ngắn
nhất giữa hai đỉnh v 1 và v 3 được biểu diễn như hình và bảng dưới đây
Tại mỗi bước lặp của thuật toán các đỉnh của tập S được khoanh tròn
Chưa thăm Đã
thăm
Đang xét
Trang 31Chưa thăm Đã
thăm
Đang xét
Trang 3228
Chưa thăm Đã
thăm
Đang xét
Trang 33Vậy đường đi ngắn nhất từ v đến 1 v là 3 v1 v4 v3có độ dài bằng 4
Chưa thăm Đã thăm Đang
Trang 342.2 Thuật toán Floyd
Tư tưởng: Thuật toán Floyd có thể dùng để tìm độ dài của đường đi
ngắn nhất giữa tất cả các cặp đỉnh trong một đồ thị liên thông có trọng
số Giả sử đồ thị có trọng số G = (V, E,w) Từ ma trận trọng số của G,
thuật toán Floyd tính lại các trọng số của cạnh thành độ dài đường đi ngắn nhất giữa hai đỉnh liên thuộc với cạnh đó Cụ thể, với mọi đỉnh
k
như đường đi từ v tới i v jđang có lại dài hơn đường đi từ v tới i v cộng k
với đường đi từ v tới k v jthì ta huỷ bỏ đường đi từ v tới i v jhiện thời và coi đường đi từ v tới i v jsẽ là nối của hai đường đi từ v tới i v rồi từ k v tới k
Ví dụ Dùng thuật toán Floyd hãy tìm độ dài của đường đi ngắn nhất