Thuật toán Floyd-Warshall tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có trọng số...9 BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT...12 1.. LỜI MỞ ĐẦUTrong Toán học và Tin h
Trang 1LỜI MỞ ĐẦU 1
ĐẠI CƯƠNG VỀ ĐỒ THỊ 3
1 Các khái niệm cơ bản 3
1.1 Đồ thị vô hướng và đồ thị có hướng 3
1.2 Bậc, nửa bậc vào, nửa bậc ra 4
1.3 Đường đi, chu trình, tính liên thông 5
2 Biểu diễn đồ thị 6
2.1 Ma trận kề 6
2.1.1 Đồ thị vô hướng 6
2.1.2 Đồ thị có hướng 6
2.2 Danh sách cạnh (cung) 7
2.3 Danh sách kề 8
3 Thuật toán Floyd-Warshall tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có trọng số 9
BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT 12
1 Bài toán cực tiểu tổng và cực tiểu trị lớn nhất 12
2 Thuật toán cực tiểu tổng và cực tiểu trị lớn nhất 12
2.1 Thuật toán cực tiểu tổng 12
2.2 Thuật toán cực tiểu trị lớn nhất 12
3 Độ phức tạp thuật toán 13
4 Ví dụ 13
THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH 15
1 Thiết kế cấu trúc dữ liệu 15
2 Cài đặt giải thuật tìm cực tiểu tổng và cực tiểu trị lớn nhất 15
3 Chương trình trên C++ 17
4 Chương trình trên C# 21
KẾT LUẬN 25
TÀI LIỆU THAM KHẢO 26
Trang 2LỜI MỞ ĐẦU
Trong Toán học và Tin học, lý thuyết đồ thị có vai trò rất quan trọng, nónghiên cứu các tính chất của đồ thị - là một tập các đối tượng được gọi làcác đỉnh (hoặc nút) nối với nhau bởi các cạnh (hoặc cung) Cạnh có thể có hướng hoặc
vô hướng, cạnh có thể được gán một con số gọi là trọng số Đồ thị thường được vẽdưới dạng một tập các điểm (các đỉnh) nối với nhau bằng các đoạn thẳng (các cạnh)
Trong thực tế, đồ thị biểu diễn được rất nhiều cấu trúc Đồ thị có thể biểu diễnmột mạng lưới giao thông, trong đó các cơ sở quan trọng là các đỉnh, đường đi giữachúng là các cạnh, độ dài của mỗi con đường là trọng số Đồ thị có thể biểu diễn mạnglưới Internet, trong đó các máy chủ là các đỉnh, đường truyền là các cạnh và trong số
có thể là thời gian di chuyển hoặc độ rộng đường truyền đó,…
Trong bài toán tìm địa điểm trung tâm để đặt các cơ sở dịch vụ (trường học,bưu điện, phòng cháy chữa cháy, vị trí đặt máy chủ, ) sao cho kinh tế và hiệu quảnhất có rất nhiều ứng dụng trong thực tế Bài toán này thường được mô hình hoá mạnglưới dạng đồ thị, trong đó các cơ sở có thể được bố trí ở một hoặc vài vị trí
Nếu các cơ sở là các cơ quan như trường học, bưu điện thì nên đặt chúng ởcác vị trí sao cho tổng khoảng cách các vùng khác nhau đến cơ sở là nhỏ nhất Lớp bài
toàn này gọi là Bài toán cực tiểu tổng (minsum problem).
Mặt khác, nếu các cơ sở là các cơ quan như phòng cháy chữa cháy, thì nên đặtchúng ở các vị trí sao cho khoảng cách từ cơ sở đến điểm xa nhất của cộng đồng là
nhỏ nhất Lớp bài toán này gọi là Bài toán cực tiểu trị lớn nhất (minmax problem).
Trong giới hạn đề tài này, chúng tôi sẽ tìm hiểu các khái niệm cơ bản nhất về
đồ thị, nghiên cứu và cài đặt thuật toán để giải quyết bài toán trên
Chúng tôi xin chân thành cảm ơn PGS.TSKH Trần Quốc Chiến đã giảng dạy,hướng dẫn tận tình và cung cấp tài liệu tham khảo quý báu để chúng tôi hoàn thành đềtài này
Nhóm học viên thực hiệnMai Xuân Phú
Trần Hữu PhướcHuỳnh Thị Hiền Thắm Hoàng Tiến Sơn
Trang 3YÊU CẦU CỦA ĐỀ TÀI
ĐỀ TÀI 3: BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT
1 Trình bày bài toán cực tiểu tổng và cực tiểu trị lớn nhất
2 Trình bày thuật toán tìm cực tiểu tổng và cực tiểu trị lớn nhất
3 Thiết kế cấu trúc dữ liệu và giải thuật tìm cực tiểu tổng và cực tiểu trị lớn nhất
4 Viết chương trình cài đặt thuật toán tìm, cực tiểu tổng và cực tiểu trị lớn nhất bằngngôn ngữ C
THÀNH VIÊN NHÓM VÀ ĐÁNH GIÁ NHẬN XÉTT
T Họ và tên
Công việc(theo mục lục) Chữ ký Nhận xét của giáo viên
- Bài toán đề tài
- Chuẩn bị slide báo cáo
3 Hoàng Tiến Sơn
- Bài toán đề tài
- Chuẩn bị slide báo cáo
4 Mai Xuân Phú
- Thiết kế và cài đặt chương trình
- Viết chương 3
Trang 4CHƯƠNG 1ĐẠI CƯƠNG VỀ ĐỒ THỊ
1 Các khái niệm cơ bản
1.1 Đồ thị vô hướng và đồ thị có hướng
Đồ thị vô hướng G = (V,E) gồm một tập V các đỉnh và tập E các cạnh Mỗi cạnh
e E được liên kết với một cặp đỉnh v, w (không kể thứ tự)
Ví dụ:
Đồ thị có hướng G = (V,E) gồm một tập V các đỉnh và tập E các cạnh có hướng gọi là cung Mỗi cung e E được liên kết với một cặp đỉnh (v, w) có thứ tự.
Ví dụ:
Cho đồ thị có hướng G=(V, E) Nếu ta thay mỗi cung của G bằng một cạnh, thì
đồ thị vô hướng nhận được gọi là đồ thị lót của đồ thị có hướng G.
Ghi chú: Đồ thị vô hướng có thể coi là đồ thị có hướng trong đó mỗi cạnh
e=(v,w) tương ứng với hai cung (v,w) và (w,v)
Cho đồ thị (có hướng hoặc vô hướng) G = (V,E)
Nếu cạnh e liên kết đỉnh v, w thì ta nói cạnh e liên thuộc đỉnh v, w, các đỉnh v,
w liên thuộc cạnh e, các đỉnh v, w là các đỉnh biên của cạnh e và đỉnh v kề đỉnh w.
Nếu chỉ có duy nhất một cạnh e liên kết với cặp đỉnh v, w , ta viết e=(v,w)
e
e
Trang 5Nếu e là cung thì v gọi là đỉnh đầu và w gọi là đỉnh cuối của cung e.
Nếu có nhiều cạnh liên kết với cùng một cặp đỉnh thì ta nói đó là các cạnh song song.
Cạnh có hai đỉnh liên kết trùng nhau gọi là khuyên.
Đỉnh không kề với đỉnh khác gọi là đỉnh cô lập.
Số đỉnh của đồ thị gọi là bậc của đồ thị, số cạnh hoặc số cung của đồ thị gọi là
cỡ của đồ thị.
Đồ thị hữu hạn là đồ thị có bậc và cỡ hữu hạn.
Đồ thị đơn là đồ thị không có khuyên và không có cạnh song song.
Đồ thị vô hướng đủ là đồ thị mà mọi cặp đỉnh đều kề nhau.
Đồ thị có hướng đủ là đồ thị có đồ thị lót đủ.
1.2 Bậc, nửa bậc vào, nửa bậc ra
Cho đồ thị G = (V, E)
Giả sử đỉnh vV có p khuyên và q cạnh liên thuộc (không phải khuyên) Khi đó
bậc của đỉnh v là 2p + q và ký hiệu là deg G (v) hoặc đơn giản deg(v)
Số bậc đỉnh lớn nhất của G ký hiệu là Δ(G), số bậc đỉnh nhỏ nhất của G ký hiệu
Trang 6x1 x4
Trong đồ thị có hướng này ta có
degI(x1) = 0; degO(x1) = 2; degI(x2) = 1; degO(x2) = 2;
degI(x3) = 2; degO(x3) = 1; degI(x4) = 2; degO(x4) = 2;
degI(x5) = 1; degO(x5) = 1; degI(x6) = 2; degO(x6) = 0;
1.3 Đường đi, chu trình, tính liên thông
Cho đồ thị G=(V,E)
Dây từ đỉnh v đến đỉnh w là tập hợp các đỉnh và cạnh nối tiếp nhau bắt đầu từ
đỉnh v và kết thúc tại đỉnh w Số cạnh trên dây gọi là độ dài của dây .
Dây từ đỉnh v đến đỉnh w độ dài k được biểu diễn như sau
= (v, e1, v1, e2, v2, , vk-1, ek, w)trong đó vi (i = 1, , k-1) là các đỉnh trên dây và ei (i=1, ,k-1) là các cạnh trêndây liên thuộc đỉnh kề trước và sau nó Các đỉnh và cạnh trên dây có thể lặp lại
Đường đi từ đỉnh v đến đỉnh w là dây từ đỉnh v đến đỉnh w, trong đó các cạnh
không lặp lại
Đường đi sơ cấp là đường đi không đi qua một đỉnh quá 1 lần.
Ghi chú: Trong đồ thị n đỉnh, đường đi sơ cấp giữa hai đỉnh khác nhau có
nhiều nhất n-1 cạnh
Vòng là dây có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình là đường đi có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình sơ cấp là chu trình không đi qua một đỉnh quá 1 lần.
Ghi chú: Trong đồ thị n đỉnh, chu trình sơ cấp có nhiều nhất n cạnh.
Dây có hướng trong đồ thị có hướng là dãy các đỉnh và cung nối tiếp nhau (e1,
e2, ,ek) thoả mãn đỉnh cuối của cung ei là đỉnh đầu của cung ei+1 , i=1, ,k-1
Đường đi có hướng trong đồ thị có hướng là dây có hướng, trong đó các cung
không lặp lại
Đường đi có hướng sơ cấp là đường đi có hướng không đi qua một đỉnh quá 1
lần
Vòng có hướng là dây có hướng có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình có hướng là đường đi có hướng có đỉnh đầu và đỉnh cuối trùng
nhau
Chu trình có hướng sơ cấp là chu trình có hướng không đi qua một đỉnh quá 1
lần
Đồ thị vô hướng gọi là liên thông, nếu mọi cặp đỉnh của nó đều có đường đi
nối chúng với nhau
Đồ thị có hướng gọi là liên thông mạnh, nếu mọi cặp đỉnh (u,v) bao giờ cũng
tồn tại đường đi có hướng từ u đến v và từ v đến u
Trang 7Đồ thị có hướng gọi là bán liên thông, nếu với mọi cặp đỉnh (u,v) bao giờ cũng
tồn tại đường đi có hướng từ u đến v hoặc từ v đến u
Đồ thị có hướng gọi là liên thông yếu, nếu đồ thị lót (vô hướng) của nó liên
Cho đồ thị vô hướng G=(V,E) có n đỉnh theo thứ tự v1,v2, , vn Ma trận kề của
đồ thị G là ma trận vuông A=(aịj)nxn, trong đó aij là số cạnh (khuyên) nối vi với vj Lưu
ý rằng khi tính bậc của đỉnh mỗi khuyên được tính hai bậc
Từ định nghĩa suy ra rằng ma trận kề của đồ thị vô hướng luôn đối xứng quađường chéo chính
Cho đồ thị có hướng G=(V,E) có n đỉnh theo thứ tự v1, v2, , vn Ma trận kề
của đồ thị G là ma trận vuông A=(aịj)nxn, trong đó aij là số cung đi từ vi tới vj
Trang 8Trong trường hợp đồ thị thưa (đồ thị có n đỉnh và m cạnh hoặc cung thoả mãn
m < 6n) người ta thường dùng cách biểu diễn đồ thị dưới dạng danh sách cạnh (cung).
Trong cách biểu diễn đồ thị bởi danh sách cạnh (cung) chúng ta sẽ lưu trữ danhsách tất cả các cạnh (cung) của đồ thị vô hướng (có hướng) Một cạnh (cung) e=(x,y)của đồ thị sẽ tương ứng với hai biến Dau[e], Cuoi[e] Như vậy, để lưu trữ đồ thị ta cần
sử dụng 2m đơn vị bộ nhớ Nhược điểm của cách biểu diễn này là để xác định những đỉnh nào của đồ thị là kề với một đỉnh cho trước chúng ta phải làm cỡ m phép so sánh
(khi duyệt qua danh sách tất cả các cạnh hoặc cung của đồ thị)
Chú ý: Trong trường hợp đồ thị có trọng số ta cần thêm m đơn vị bộ nhớ để lưu
Trang 9được lưu trữ bởi các mảng Đầu[e], Cuối[e], e=1, 8, như sau:
Với mọi u Ke(v) do <công việc>
Sau đây là các ví dụ danh sách kề liên kết
Trang 103 Thuật toán Floyd-Warshall tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có trọng số.
Thuật toán Floyd-Warshall tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị(có hướng) có trọng số
Đầu vào Đồ thị G=(V,E,w), V= {1, 2, , n}, có trọng số với mọi cung (i,j).
Đầu ra Ma trận D=[d(i,j)]nxn, trong đó d(i,j) là chiều dài đường đi ngắn nhất
từ i đến j với mọi cặp (i,j)
Ma trận P=[p(i,j)]nxn dùng để xác định đường đi ngắn nhất
Nếu k=n, kết thúc D=Dn là ma trận độ dài đường đi ngắn nhất, P=Pn
Ngược lại, nếu k<n, tăng k lên 1 đơn vị (k:=k+1) và sang (3)
(3) Tính ma trận Dk và Pk theo Dk1 và Pk1:
Với mọi cặp (i,j), i=1 n, j=1 n thực hiện:
Nếu dk1(i,j) > dk1(i,k) + dk1(k,j), thì đặt
dk(i,j) := dk1(i,k) + dk1(k,j)
và
pk(i,j) := pk1(i,k)ngược lại đặt
dk(i,j) := dk1(i,j)và
pk(i,j) := pk1(i,j)Quay lại bước (2)
Trang 11 Phương pháp xác định đường đi ngắn nhất từ đỉnh i đến đỉnh j : Đường đi
ngắn nhất từ i đến j gồm dãy các đỉnh
i, i1, i2, i3, , ik, ik+1, , im, jthỏa mãn
i1 = p(i,j), i2 = p(i1,j), , ik+1 = p(ik,j), , p(im,j) = j
Trang 12d 4 1 8 7 d a b b b(không có thay đổi)
- Các ma trận cập nhật qua đỉnh d: (các giá trị mới được gạch dưới)
Cuối cùng, ta có ma trận khoảng cách ngắn nhất giữa các đỉnh D = D4 Ta thấy
đồ thị liên thông và chứa chu trình
Sử dụng ma trận P = P4 , ta có thể tìm đường đi ngắn nhất giữa các đỉnh Chẳnghạn, để tìm đường đi từ đỉnh d đến đỉnh c ta làm như sau:
Đặt
i1 := P(d,c) = b; i2 := P(b,c) = c
Từ đó ta nhận được đường đi ngắn nhất từ d đến c:
dbcvới độ dài là 8
Trang 13CHƯƠNG 2BÀI TOÁN CỰC TIỂU TỔNG VÀ CỰC TIỂU TRỊ LỚN NHẤT
1 Bài toán cực tiểu tổng và cực tiểu trị lớn nhất
Trong bài toán tìm địa điểm trung tâm để đặt các cơ sở dịch vụ (trường học,bưu điện, phòng cháy chữa cháy, vị trí đặt máy chủ, ) sao cho kinh tế và hiệu quảnhất có rất nhiều ứng dụng trong thực tế Bài toán này thường được mô hình hoá nhưmạng lưới dạng đồ thị, trong đó các cơ sở có thể được bố trí ở một hoặc vài vị trí
Nếu các cơ sở là các cơ quan như trường học hay bưu điện thì nên đặt chúng ởcác vị trí sao cho tổng khoảng cách các vùng khác nhau đến cơ sở là nhỏ nhất Lớp bài
toàn này gọi là Bài toán cực tiểu tổng (minsum problem).
Mặt khác, nếu các cơ sở là các cơ quan như phòng cháy chữa cháy, thì nên đặtchúng ở các vị trí sao cho khoảng cách từ cơ sở đến điểm xa nhất của cộng đồng là
nhỏ nhất Lớp bài toán này gọi là Bài toán cực tiểu trị lớn nhất (minmax problem).
2 Thuật toán cực tiểu tổng và cực tiểu trị lớn nhất
2.1 Thuật toán cực tiểu tổng
Đầu vào: Trọng đồ G = (V,E,c), trong đó V = {1, 2, , n}, với trọng số cạnh
Cực tiểu tổng lớn nhất: N = min(s(i)), i V.
Tập các đỉnh cực tiểu trị lớn nhất: {vi | s(i) N, i V}.
(4) Kết thúc
2.2 Thuật toán cực tiểu trị lớn nhất
Đầu vào: Trọng đồ G = (V,E,c), trong đó V = {1, 2, , n}, với trọng số cạnh
không âm
Đầu ra: M là cực tiểu trị lớn nhất, và {v1, v2,…, vm} là tập các đỉnh cực tiểu trị lớnnhất
Phương pháp:
Trang 14(5) Tìm D = [d(i,j)] là ma trận khoảng cách nhỏ nhất của G (bằng thuật toán Warshal, d(i,i)=0, i).
Floyd-(6) Tìm L = [l(i)] là danh sách độ lệch tâm (i V), trong đó l(i) là phần tử lớn nhất trên hàng i của ma trận D.
(7) Kết quả:
Cực tiểu trị lớn nhất: M = min(l(i)), i V.
Tập các đỉnh cực tiểu trị lớn nhất: {vi | l(i) M, i V}.
(8) Kết thúc
3 Độ phức tạp thuật toán
Độ phức tạp tính toán trong từng bước của thuật toán:
Bước (1): thuật toán Floyd-Warshall có độ phức tạp tính toán là O(n3) nên thuật
toán trên có độ phức tạp là O(n3), với n = |V| là số đỉnh của đồ thị.
Bước (2): tìm phần tử lớn nhất trên mỗi hàng của ma trận D, nếu sử dụng thuật
toán tìm kiếm tuần tự thông thường trên mỗi hàng thì có độ phức tạp là O(n2)
Bước (3): thực chất là tìm kiếm phần tử nhỏ nhất trong mảng L và danh sách
đỉnh thỏa mãn l(i) M nên độ thức tạp là O(n).
Như vậy, độ phức tạp thuật toán tìm cực tiểu trị lớn nhất là O(n3), với n = |V| là
2 0 2 1 2 3 4
2 2 0 1 2 3 4
1 1 1 0 1 2 3
2 2 2 1 0 1 2
3 3 3 2 1 0 1
4 4 4 3 2 1 0
Độ lệch tâm của các đỉnh tương ứng là L = {4, 3, 2, 3, 4, 4, 4}
Từ mảng L ta tìm được giá trị nhỏ nhất là M = 2 (cực tiểu trị lớn nhất), chỉ đỉnh
3 có l(3) 2 nên đỉnh 3 là đỉnh cực tiểu độ lệch tâm duy nhất và tâm đồ thị là {3}.
Trang 15Tổng các hàng tương ứng là 18, 13, 10, 9, 14, 14, 14 (N=9) Như vậy đỉnh 4 làđỉnh cực tiểu tổng duy nhất và tập đỉnh cực tiểu tổng là {4}
Trang 16CHƯƠNG 3THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH
1 Thiết kế cấu trúc dữ liệu
Để giải quyết bài toán “Tìm cực tiểu trị tổng và cực tiểu trị lớn nhất” nhóm đềxuất sử dụng cấu trúc dữ liệu như sau:
1 Danh sách cạnh để biểu diễn đồ thị vô hướng có trọng số không âm
- Danh sách là mảng một chiều có m phần tử (là số cạnh của đồ thị); mỗi phần
tử của danh sách có dữ liệu bản ghi (struct) gồm 3 field dau để ghi nhận đỉnh đầu của cạnh, cuoi để ghi nhận đỉnh cuối của cạnh, trongso để ghi nhận trọng
số của cạnh
- Dau, cuoi có giá trị từ 1, ,n là kí hiệu của đỉnh; trongso=w ij nếu có cạnh nối
từ i đến j và w ij =0 nếu i=i; trongso= nếu không có cạnh nối từ i đến j (ij)
typedef struct Canh
typedef int matran[100][100];
3 Mảng 1 chiều để lưu độ lệch tâm của các đỉnh đồ thị
typedef int dslechtam[100];
2 Cài đặt giải thuật tìm cực tiểu tổng và cực tiểu trị lớn nhất
Một số hàm cài đặt thuật toán:
Đường đi nhỏ nhất giữa các cặp đỉnh đồ thị (thuật toán Floyd_Warshall):
Từ ma trận trọng số D thông qua thuật toán ta tìm được ma trận Dn là ma trận
đường đi nhỏ nhất giữa các cặp đỉnh.
void Floyd_Warshall(matran D,matran Dn,matran duongdi,int n)
{
//KHOI TAO
for (int i=0;i<n;i++)
Trang 17if ((Dn[i][k]!=32767)&&(Dn[k][j]!=32767)&&(Dn[i][j]>Dn[i] [k]+Dn[k][j]))
{ Dn[i][j]=Dn[i][k]+Dn[k][j];
duongdi[i][j]=duongdi[i][k];
} } }
Tính độ lệch tâm của các đỉnh: độ lệch tâm của các đỉnh chính là giá trị
lớn nhất trong mỗi hàng của ma trận đường đi Dn L[i] là độ lệch tâm của đỉnh i (i=1,2,…,n)
void tinhdolechtam(matran Dn,dslechtam L, int n)
Trang 18Tìm cực tiểu trị lớn nhất và các đỉnh: giá trị nhỏ nhất trong danh sách lệch tâm chính là giá trị cực tiểu cần tìm và các đỉnh có giá trị lệch tâm cực tiểu chính là tâm của đồ thị.
Tìm cực tiểu tổng lớn nhất và các đỉnh: giá trị nhỏ nhất trong danh sách tổng các hàng tương ứng của ma trận khoảng cách là giá trị cực tiểu tổng cần tìm
typedef int matran[100][100];
typedef int dslechtam[100];
void Init(Canh C[],int &n, int &m)