Đỉnh v được gọi là đỉnh cắt nếu khi loại bỏ v cùng với các cạnh liên thuộc với nó thì đồ 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... h
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI 2
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 để emhoà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ếusai sót tôi xin chịu hoàn toàn trách nhiệm
Xuân Hòa, ngày 06 tháng 5 năm 2014
Sinh viên
Nguyễn Thúy Linh
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ạcngườ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ảiquyết các bài toán thực tế Lý thuyết đồ thị không những có nhiều ứngdụng trong thực tế mà còn là công cụ đắc lực cho ngành công nghệ thôngtin 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 Tuynhiên, đây là kiến thức hoàn toàn mới, không có trong chương trình họccủ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ớitì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 dungkhó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ựccủ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ữngmố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ênhthoạ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ônkhổ 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
V và E thỏa mãn điều kiện E {{u,v}| u,v V;u v}
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.
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 8được xác định, ở đây giá trị W E Giá trị
gọi là trọng số của canh e.
Kí hiệu:G (V , E, w)
w(e) cho e
E
được
thường thì có một ý nghĩa định lượng nào đấy.
Trang 9đỉnh v) nếu v e Các đỉnh liên thuộc với một cạnh được gọi là các đầu mút của cạnh đó.
Hai đỉnh u và v của G được gọi là kề nhau nếu uv là một cạnh của G.
Xét đồ thị G được cho trong hình 4:
Trang 10Xét đồ thị G được cho trong hình 5 ta có
deg(v1 ) = 1, deg(v2 ) = 3, deg(v3 ) = 4, deg(v4 ) = 2
deg(v5 ) = 0, deg(v6 ) = 3, deg(v7 ) = 3
1.2.3 Đường đi, chu trình
đi trong G là một dãy phân biệt các đỉnh v0 ,v1,v2 , ,v n , v i V sao cho
v i v i1
E
với mọi i 0,1, ,n 1 Khi đó n được gọi là độ dài, đỉnh
v0 được gọi là đỉnh đầu, còn đỉnh
trên.
v n được gọi là đỉnh cuối của đường đi
Trang 11Hình 6 Đường đi và chu trình trên G.
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
đỉnh u và v khác nhau bất kỳ của G tồn tại một đường đi trong G với đỉnh đầu là u và đỉnh cuối là v
Trong trường hợp ngược lại, đồ thị được gọi là không 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
Hình 8 Đồ thị G không liên thông.
đỉnh của G Đỉnh v được gọi là đỉnh cắt nếu khi loại bỏ v cùng với các cạnh liên thuộc với nó thì đồ 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
Trang 13củ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à
Trang 14Đồ 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ử
thị hai phía đầy đủ và kí hiệu là
nối với mỗi đỉnh trong Y.
K m,n nếu mỗi đỉnh trong tập X đều được
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:
Trang 18- 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ìnhhó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ểudiễ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ậptrì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ếtnhiề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ấtphá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ộtcách hệ thống Những thuật toán như vậy gọi là những thuật toán tìmkiếm trên đồ thị Ở đây ta quan tâm đến hai thuật toán cơ bản đó là thuậttoá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)
Tư tưởng: Cho G (V ,
E)
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
if Chuaxet[u] then DFS(u);
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ựchiện nhờ thuật toán sau:
BEGIN
END.
(* Initialization *) for v V do Chuaxet[v] := true;
Trang 22và tiếp tục tìm kiếm các đỉnh tiếp
Trang 24Khi tất cả các đỉnh đã được đánh dấu là duyệt xong, thuật toán kết
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:
Procedure BFS(v);
Trang 25(* Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v*)
begin
QUEUE := ; QUEUE v; (* Kết nạp v vào QUEUE *) Chuaxet[v]:= false;
end;
end;
end;
QUEUE u; Chuaxet[u] := false;
Khi đó, tìm kiếm theo chiều rộng trên đồ thị được thực hiện nhờthuật toán sau:
Trang 26Ví dụ Dùng thuật toán BFS duyệt đồ thị sau:
minh họa trong các hình và bảng dưới đây Tương tự như DFS, ở đây tacũng quy định duyệt theo thứ tự từ tăng dần của chỉ số của các cạnh
khoanh tròn Các đỉnh đã duyệt xong được khoanh hình ô vuông
Trang 28Khi tất cả các đỉnh đã được đánh dấu là duyệt xong, thuật toán kết
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ếmtheo chiều sâu và tìm kiếm theo chiều rộng giúp người sử dụng dễ dàngkiể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ủamột đồ thị,…
2 Bài toán tìm đường đi ngắn nhất
Bài toán: Giả sử G (V , E,
w)
là một đồ thị có trọng số liên thông
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
Trang 29Tư 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ủ
Trang 30tụ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
for tất cả các đỉnh v không thuộc S
if L(u) + w(u, v) < L(v) then L(u) := L(u) + w(u, v) {* 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 31Ví dụ Dùng thuật toán Dijkstra hãy
2
v1
10
Các bước dùng thuật toán Dijkstra tìm độ dài của đường đi ngắn
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.
1
v1[0]
10
Trang 32[1]v2
v1[0]
10
Trang 33Chưa thăm Đã
thăm
Đangxét
Trang 345 1 6
Trang 362.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 đingắn nhất giữa hai đỉnh liên thuộc với cạnh đó Cụ thể, với mọi đỉnh
v j
Thuật toán Floyd được mô tả như sau:
Trang 37Các bước dùng thuật toán Floyd tìm độ dài của đường đi ngắn nhất
Trang 381
3
1
3
v 4 v 7 v 4 v 5 v 4 v 5 v 7 v 5 v 4 v 7 v 4 v 5 v 5 v 3 v 2 v 4 v 2 v 6 - v2 là đỉnh trung gian, ta có: 1 v3 1 v4 1 v3 1 v4 2 6 2 3 2 6 2 3
v2 v2 v2 v2 3 v1 3 v4 4 v1 4 v3 6 2 6 3 3 2 3 6
v2 v2 v2 v2 v1 v2 v3 v4 v 0 2 4 5
D2 v2 2 0 6 3
v 4 6 0 5
v4 5 3 5 0
- v3 là đỉnh trung gian, ta có: 1 v3 1 v4 1 v3 1 v4 2 6 2 3 2 6 2 3
v2 v2 v2 v2 v1 v2 v3 v4 4 v1 4 v2 v 0 2 4 5
D3 v2 2 0 6 3
5 4 5 6
v3 v3 v
4 6 0 5
v4 5 3 5 0
- v4 là đỉnh trung gian, ta có: 1 v2 1 v3 2 v1 2 v3 5 3 5 5 32 3 5 3 5
v4 v4 v4 v4
Trang 392.3 Ý nghĩa của bài toán tìm đường đi ngắn nhất
Bài toán tìm đường đi ngắn nhất giữa hai đỉnh của một đồ thị liênthông có một ý nghĩa to lớn trong các ứng dụng thực tế Chẳng hạn nhưtrong mạng lưới giao thông đường bộ, đường thủy hay đường không,chọn một hành trình tiết kiệm nhất theo tiêu chuẩn khoảng cách, thờigian hoặc chi phí Bài toán chọn một phương pháp tiết kiệm nhất để đưa
ra một hệ thống động lực từ trạng thái xuất phát đến một trạng thái đích.Trong lĩnh vực Tin học, xét ở một mạng máy tính, nhiều khi người tacần xác định một đường truyền có thời gian truyền tin ngắn nhất giữahai máy nào đó Để thực hiện được điều này có thể mô hình mạng bằng
đồ thị, sau đó vận dụng thuật toán tìm đường đi ngắn nhất để giảiquyết Các thuật toán được xây dựng dựa trên cơ sở lý thuyết đồ thị cóhiệu quả cao nhất để giải quyết các bài toán đó đã được trình bày ở trên.Mỗi thuật toán có những ưu nhược điểm riêng, vì vậy cần lựa chọnthuật toán phù hợp để giải các bài toán đó