Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 75 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
75
Dung lượng
2,65 MB
Nội dung
MỤC LỤC LỜI MỞ ĐẦU CHƯƠNG LÝ THUYẾT ĐỒ THỊ 1.1 Định nghĩa đồ thị 1.2 Các thuật ngữ 1.3 Một số dạng đồ thị đặc biệt 12 1.4 Biểu diễn đồ thị 16 CHƯƠNG BÀI TOÁN LUỒNG CỰC ĐẠI TRÊN MẠNG .18 2.1 Các khái niệm 18 2.1.1 Các mạng luồng 18 2.1.2 Bài toán luồng cực đại 19 2.1.3 Các tính chất .20 2.2 Phương pháp Ford - Fulkerson 21 2.2.1 Mạng thặng dư 22 2.2.2 Đường tăng luồng 23 2.2.3 Lát cắt .24 2.2.4 Thuật toán Ford - Fulkerson 26 2.2.5 Phân tích Ford - Fulkerson 27 2.2.6 Ứng dụng thuật toán Ford - Fulkerson 30 2.3 Thuật toán Preflow - Push 34 2.3.1 Định nghĩa Preflow 35 2.3.2 Các phép toán .35 2.3.3 Thuật toán Preflow - Push 38 2.3.4 Tính đắn thuật toán đẩy luồng trước 38 2.4 Một số toán luồng tổng quát 43 2.4.1 Mạng với khả thông qua cung đỉnh 43 2.4.2 Mạng với khả thông qua cung bị chặn hai phía .44 2.5 Một số ứng dụng tổ hợp 45 2.5.1 Bài toán đám cưới vùng quê 45 CHƯƠNG GIỚI THIỆU NGÔN NGỮ DELPHI .47 3.1 Khái quát ngôn ngữ Delphi 47 3.1.1 Delphi để làm gì? 47 3.1.2 Cấu trúc chương trình Delphi Unit 49 3.2 Form thành phần giao diện .50 3.2.1 Xây dựng ứng dụng từ thành phần công cụ VCL .50 3.2.2 Form 51 3.2.3 Các thành phần điều khiển Windows .51 3.3 Ngôn ngữ Object Pascal 56 3.3.1 Các kiểu liệu đơn giản .56 3.3.3 Các câu lệnh cấu trúc .59 CHƯƠNG CÁC KẾT QUẢ CÀI ĐẶT .62 4.1 Mô tả toán .62 4.2 Giải toán 62 4.2.1 Phương pháp Ford - Fulkerson 62 4.2.2 Thuật toán PreFlow - Push 62 4.3 Giao diện chương trình .63 KẾT LUẬN 65 TÀI LIỆU THAM KHẢO .65 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN .66 PHỤ LỤC .67 LỜI MỞ ĐẦU Lý thuyết đồ thị ngành khoa học phát triển từ lâu lại có nhiều ứng dụng đại Những ý tưởng lý thuyết đồ thị nhà toán Thụy Sỹ tên Leonhard Euler đưa từ kỷ 18, ông dùng lý thuyết đồ thị để giải toán cầu Konigsberg tiếng Trong khoảng vài chục năm trở lại đây, với đời máy tính điện tử phát triển nhanh chóng tin học, lý thuyết đồ thị ngày quan tâm nhiều Đặc biệt thuật toán đồ thị có nhiều ứng dụng nhiều lĩnh vực khác như: Mạng máy tính, Lý thuyết mã hóa, Tối ưu hóa… với toán cụ thể như: Bài toán phân bố luồng giao thông thành phố mạng giao thông, Bài toán cạnh tranh loài môi trường sinh thái, Bài toán tô màu đồ thị… Đồ thị với trọng số gán cạnh dùng để giải toán như: Bài toán tìm đường ngắn hai thành phố mạng giao thông, Bài toán phân công lao động cho tổng lợi nhuận thu lớn nhất, Bài toán phân nhóm sinh hoạt chuyên đề cho nhóm sinh viên… Chính đồ thị sử dụng để giải nhiều toán thuộc nhiều lĩnh vực khác cách dễ dàng phổ biến vây nên đồ thị nắm giữ vai trò quan trọng sống, đặc biệt lĩnh vực Công nghệ thông tin, dựa vào đồ thị thuật toán đồ thị người ta xây dựng lên phần mềm tiện ích để phục vụ cho nhu cầu học tập nghiên cứu Hiểu tầm quan trọng đồ thị ngành học mà theo đuổi say mê, quan tâm, tận tình bảo thầy giáo TS Vũ Vinh Quang, em chọn nghiên cứu đề tài Bài toán luồng cực đại đồ thị với mong muốn sau hoàn thành đề tài em khám phá nhiều ứng dụng đồ thị việc giải lớp toán liên quan tới toán luồng cực đại Em xin gửi lời cảm ơn chân thành tới thầy giáo TS Vũ Vinh Quang thầy giáo, cô giáo khác tận tình bảo để em hoàn thành đề tài Em xin gửi lời cảm ơn tới bạn sinh viên lớp K 2A có ý kiến đóng góp để chương trình em hoàn thiện Mặc dù cố gắng chắn đề tài em không tránh khỏi thiếu sót Em mong nhận góp ý thầy cô giáo bạn để đề tài em hoàn thiện Em xin chân thành cảm ơn! Thái Nguyên, ngày 15 tháng 05 năm 2008 CHƯƠNG LÝ THUYẾT ĐỒ THỊ Đồ thị sử dụng để giải toán nhiều lĩnh vực khác Chẳng hạn, đồ thị sử dụng để xác định mạch vòng vấn đề giải tích mạch điện Chúng ta phân biệt hợp chất hóa học hữu khác với công thức phân tử khác cấu trúc phân tử nhờ đồ thị Chúng ta xác định hai máy tính mạng trao đổi thông tin với hay không nhờ mô hình đồ thị mạng máy tính Đồ thị có trọng số cạnh sử dụng để giải toán như: Tìm đường ngắn hai thành phố mạng giao thông Chúng ta sử dụng đồ thị để giải toán lập lịch, thời khóa biểu, phân bố tần số cho trạm phát truyền hình… 1.1 Định nghĩa đồ thị Đồ thị cấu trúc rời rạc bao gồm đỉnh cạnh nối đỉnh Chúng ta phân biệt loại đồ thị khác kiểu số lượng cạnh nối hai đỉnh đồ thị Để hình dung lại cần đến loại đồ thị khác nhau, nêu ví dụ sử dụng chúng để mô tả mạng máy tính Giả sử ta có mạng gồm máy tính kênh điện thoại (gọi tắt kênh thoại) nối máy tính Chúng ta biểu diễn vị trí đặt máy tính điểm kênh thoại nối chúng đoạn nối, xem hình Hình Sơ đồ mạng máy tính Nhận thấy mạng hình 1, hai máy có nhiều kênh thoại nối chúng, kênh thoại cho phép liên lạc hai chiều máy tính lại nối với Sơ đồ mạng máy cho hình gọi đơn đồ thị vô hướng Ta đến định nghĩa sau: Định nghĩa Đơn đồ thị vô hướng G = (V, E) bao gồm V tập đỉnh, E tập cặp thứ tự gồm hai phần tử khác V gọi cạnh Trong trường hợp hai máy tính 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 nhiều kênh thoại Mạng với đa kênh thoại máy cho hình Hình Sơ đồ mạng máy tính với đa kênh thoại Định nghĩa Đa đồ thị vô hướng G= (V, E) bao gồm V tập đỉnh, E tập cặp thứ tự gồm hai phần tử khác V gọi cạnh Hai cạnh e1 e2 gọi cạnh lặp chúng tương ứng với cặp đỉnh Hình Sơ đồ mạng máy tính với kênh thoại thông báo Rõ ràng đơn đồ thị đa đồ thị, đa đồ thị đơn đồ thị, đa đồ thị có hai (hoặc nhiều hơn) cạnh nối cặp đỉnh Trong mạng máy tính có kênh thoại nối máy với (chẳng hạn với mục đính thông báo) Mạng cho hình Khi đa đồ thị mô tả mạng vậy, có khuyên (cạnh nối đỉnh với nó) Trong trường hợp cần sử dụng đến khái niệm giả đồ thị vô hướng, định nghĩa sau: Định nghĩa Giả đồ thị vô hướng G = (V, E) bao gồm V tập đỉnh E tập cặp thứ tự gồm hai phần tử (không thiết phải khác nhau) V gọi cạnh Cạnh e gọi khuyên có dạng e = (u, u) Hình Mạng máy tính với kênh thoại chiều Các kênh thoại mạng máy tính cho phép truyền tin theo chiều Chẳng hạn, hình máy chủ Thái Nguyên nhận tin từ máy Hà Nội, có số máy gửi tin đi, kênh thoại cho phép truyền tin theo hai chiều thay hai cạnh có hướng ngược chiều Ta đến định nghĩa sau Định nghĩa Đơn đồ thị có hướng G = (V, E) bao gồm V tập đỉnh E tập cặp có thứ tự gồm hai phần tử khác V gọi cung Nếu mạng có đa kênh thoại chiều, ta phải sử dụng đến khái niệm đa đồ thị có hướng Định nghĩa Đa đồ thị có hướng G = (V, E) bao gồm V tập đỉnh E tập cặp có thứ tự gồm hai phần tử khác V gọi cung Hai cung e1, e2 tương ứng với cặp đỉnh gọi cung lặp 1.2 Các thuật ngữ Trong phần trình bày số thuật ngữ lý thuyết đồ thị Trước tiên, ta xét thuật ngữ mô tả đỉnh cạnh đồ thị vô hướng Định nghĩa Hai đỉnh u v đồ thị vô hướng G gọi kề (u, v) cạnh đồ thị G Nếu e = (u, v) cạnh đồ thị ta nói cạnh liên thuộc với hai đỉnh u v, nói nối đỉnh u đỉnh v, đồng thời đỉnh u v gọi đỉnh đầu cạnh (u, v) Để biết có cạnh liên thuộc với đỉnh, ta đưa vào định nghĩa sau: Định nghĩa Ta gọi bậc đỉnh v đồ thị vô hướng số cạnh liên thuộc với ký hiệu deg(v) Hình Đồ thị vô hướng Thí dụ Xét đồ thị cho hình 1, ta có deg(a) = 1, deg(b) = 4, deg(c) = 4, deg(f) = 3, deg(d) = 1, deg(e) = 3, deg(g) = Đỉnh bậc gọi đỉnh cô lập Đỉnh bậc gọi đỉnh treo Trong ví dụ đỉnh g đỉnh cô lập, a d đỉnh treo Bậc đỉnh có tính chất sau: Định lý Giả sử G = (V, E) đồ thị vô hướng với m cạnh Khi tổng bậc tất đỉnh hai lần số cung Chứng minh Rõ ràng cạnh e = (u, v) tính lần deg(u) lần deg(v) Từ suy tổng tất bậc đỉnh hai lần số cạnh Thí dụ Đồ thị với n đỉnh có bậc có cạnh? Giải: Theo định lý ta có 2m = 6n Từ suy tổng cạnh đồ thị 3n Hệ Trong đồ thị vô hướng, số đỉnh bậc lẻ (nghĩa có bậc số lẻ) số chẵn Chứng minh Thực vậy, gọi O U tương ứng tập đỉnh bậc lẻ tập đỉnh bậc chẵn đồ thị Ta có 2m = deg(v) + deg(v) v U v O Do deg(v) chẵn với v đỉnh U nên tổng thứ số chẵn Từ suy tổng thứ hai (chính tổng bậc đỉnh bậc lẻ) phải số chẵn, tất số hạng số lẻ, nên tổng phải gồm số chẵn số hạng Vì vậy, số đỉnh bậc lẻ phải số chẵn Ta xét thuật ngữ tương tự cho đồ thị vô hướng Định nghĩa Nếu e = (u, v) cung đồ thị có hướng G ta nói hai đỉnh u v kề nhau, nói cung (u, v) nối đỉnh u với đỉnh v nói cung khỏi đỉnh u vào đỉnh v Đỉnh u(v) gọi đỉnh đầu (cuối) cung (u, v) Tương tự khái niệm bậc, đồ thị có hướng ta có khái niệm bán bậc bán bậc vào đỉnh Định nghĩa Ta gọi bán bậc (bán bậc vào) đỉnh v đồ thị có hướng số cung đồ thị khỏi (đi vào nó) ký hiệu deg +(v) (deg-(v)) Hình Đồ thị có hướng Thí dụ Xét đồ thị cho hình Ta có deg-(a)=1, deg-(b)=4, deg-(c)=3, deg-(d)=1, deg-(e) = 0, deg-(f) = deg+(a)=1, deg +(b)=1, deg+(c)=1, deg+(d)=1, deg +(e)=3, deg -(f) = Do cung (u, v) tính lần bán bậc vào đỉnh v lần bán bậc đỉnh u nên ta có: Định lý Giả sử G = (V, E) đồ thị có hướng Khi 2m = deg+(v) + deg-(v) v V v V Rất nhiều tính chất đồ thị có hướng không phụ thuộc vào hướng cung Vì vậy, nhiều trường hợp thuận tiện ta bỏ qua hướng cung đồ thị Đồ thị vô hướng thu cách bỏ qua hướng cung gọi đồ thị vô hướng tương ứng với đồ thị có hướng cho Định nghĩa Đường độ dài n từ đỉnh u đến đỉnh v, n số nguyên dương, đồ thị vô hướng G = (V, E) dãy x0, x1,…, xn-1, xn u = x0 , v = xn , (xi , xi+1) E, i = 0, 1, 2,…, n-1 Đường nói biểu diễn dạng dãy cạnh: (x0, x1), (x1, x2), …, (xn-1, xn) Đỉnh u gọi đỉnh đầu, đỉnh v gọi đỉnh cuối đường Đường có đỉnh đầu trùng với đỉnh cuối (tức u = v) gọi chu trình Đường hay chu trình gọi đơn cạnh bị lặp lại Thí dụ Trên đồ thị vô hướng cho hình 1: a, d, c, f, e đường đơn độ dài Còn d, e, c, a không đường đi, (c,e) cạnh đồ thị Dãy b, c, f, e, b chu trình độ dài Đường a, b, e, d, a, b có độ dài là đường đơn, cạnh (a, b) có mặt lần 10 e Lệnh FOR Dạng 1: For counter := initialValue to finalValue statement; Dạng 2: For counter := inittialValue downto finalValue statement; Trong đó, counter biến, initialValue finalValue biểu thức thể số lần lặp gán cho biến counter Statement khối lệnh lặp cần thực Lệnh For khởi gán giá trị initialValue cho biến counter, sau thực thi lệnh satement Tiếp đến, giá trị biến counter tăng lên đơn vị dạng giảm đơn vị dạng Khi counter với biểu thức finalValue, lệnh statement thực thi lần cuối sau chấm dứt vòng lặp, điều khiển thoát khỏi vòng lặp f Lệnh ngắt Break Continue Lệnh Break Lệnh Break gọi bên vòng lặp làm cho vòng lặp bị ngắt Quyền điều khiển chương trình chuyển cho dòng lệnh nằm vòng lặp Lệnh Continue Lệnh Continue gọi bên vòng lặp với mục đích bỏ qua đoạn mã lệnh lại bên continue để quay trở đầu vòng lặp 61 CHƯƠNG CÁC KẾT QUẢ CÀI ĐẶT 4.1 Mô tả toán Bài toán luồng cực đại mạng toán tối ưu đồ thị với nhiều ứng dụng rộng rãi thực tế học tập nghiên cứu Bài toán mô tả ngắn gọn sau: Cho mạng G = (V, E) với đỉnh phát s đỉnh thu t Tìm luồng f* có giá trị lớn 4.2 Giải toán Có thể dùng hai phương pháp sau để giải toán luồng cực đại: 4.2.1 Phương pháp Ford-Fulkerson Phương pháp Ford - Fulkerson phương pháp lặp Ta bắt đầu với f[u, v] = với tất u, v V, cho luồng ban đầu có giá trị Vào lần lặp, ta tăng giá trị luồng cách tìm “đường tăng luồng”, đơn giản xem đường từ đỉnh s tới đỉnh t, theo ta đẩy thêm luồng, tăng luồng dọc theo đường Ta lặp lại trình không tìm thấy đường tăng luồng Kết thúc trình cho ta luồng cực đại Phương pháp Ford - Fulkerson viết sau: While f := f + fP; 4.2.2 Thuật toán PreFlow-Push Trong thuật toán này, ta hình dung mạng hệ thống đường ống dẫn nước từ với điểm phát s tới điểm thu t, cung đường ống, khả thông qua lưu lượng đường ống tải Nước chảy theo nguyên tắc từ chỗ cao chỗ thấp Với lượng nước lớn phát từ s tới đỉnh v, có cách chuyển lượng nước sang địa điểm khác vấn đề gì, không có tượng "quá tải" xảy v, ta "dâng cao" điểm v để lượng nước đổ sang điểm khác (có thể đổ ngược s) Cứ tiếp tục trình không tượng tải điểm 62 Mô tả thuật toán PreFlow-Push bao gồm thao tác quan trọng Push(u, v), Lift(u)… Init; While If < v V để thực thao tác Push(u, v)> then Push(u, v) Else Lift(u); 4.3 Giao diện chương trình Form chương trình 63 Form chạy chương trình kết thuật toán Ford-Fulkerson Form chạy chương trình kết thuật toán PreFlow-Push 64 KẾT LUẬN Sau thời gian tìm hiểu nghiên cứu, em hoàn thành để tài tốt nghiệp với kết đạt sau: Phần lý thuyết Tìm hiểu khái niệm đồ thị toán luồng cực đại mạng Tìm hiểu thuật toán giải toán luồng cực đại mạng Phần thực nghiệm Cài đặt thành công thuật toán quan trọng toán luồng cực đại Ford-Fulkerson PreFlow-Push (có mã nguồn demo giao diện) Viết chương trình demo thể toàn ý tưởng, phương thức trình tìm lời giải Chương trình đạt công cụ hữu ích cho học tập nghiên cứu Hướng phát triển đề tài: Tìm hiểu thêm thuật toán tìm luồng cực đại đồ thị tiến hành cài đặt demo mô hình thực tế TÀI LIỆU THAM KHẢO 65 [1] Nguyễn Xuân My, Hồ Sỹ Đàm, Trần Đỗ Hùng, Lê Sỹ Quang: Một số vấn đề chọn lọc môn tin học – Tập 1, Nhà xuất giáo dục - 2004 [2] Kenneth H.Rosen: Toán học rời rạc ứng dụng tin học Nhà xuất Khoa học Kỹ thuật Hà Nội [3] Lê Phương Lan, Hoàng Đức Hải: Giáo trình lý thuyết & tập Delphi Nhà xuất Lao động xã hội - 2003 [4] Lê Hữu Đạt, Lê Phương Lan, Hoàng Đức Hải: Các kỹ xảo lập trình với Microsoft Visual Basic & Borland Delphi Nhà xuất giáo dục - 2000 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN 66 …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… .…………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… …………………………………………………………………………………………… Giáo viên hướng dẫn TS Vũ Vinh Quang PHỤ LỤC 67 Mã nguồn chương trình Unit Ford-Fulkerson unit Ford_Fulkerson; interface uses dothi ; type Mang1 = Array of Array of integer; Mang2 = Array of integer; var trace: mang2; n, s, t, k, tg : integer; c, f : mang1; procedure Init; function FindPath: Boolean; procedure IncFlow(var tg : integer); procedure FordFulkerson; function dinhphat : integer; function dinhthu : integer; implementation uses maxflow; function dinhphat : integer; {Tìm đỉnh phát} var i, j, count : integer; begin for j := to n - begin count := 0; for i := to n - if c[i, j] then inc(count); if count = then begin dinhphat := j; {Đỉnh phát đỉnh cung vào} exit; 68 end; end; end; function dinhthu : integer; {Tìm đỉnh thu} var i, j, count : integer; begin for i := to n - begin count := 0; for j := to n - if c[i, j] then inc(count); if count = then begin dinhthu := i; {Đỉnh thu đỉnh cung ra} exit; end; end; end; procedure init; var i, j : integer; begin n := G.sodinh; setlength(c, n, n); setlength(f, n, n); setlength(trace, n); for i := to n - for j := to n - begin c[i, j] := 0; f[i, j] := 0; end; 69 for i := to G.socanh - with G.DScanh[i] c[dinhdau, dinhcuoi] := trongso.giatri; s := dinhphat; t := dinhthu; end; function FindPath : boolean; {Tìm đường tăng luồng Gf, true Tìm thấy} var u, v, i : integer; Queue : array[1 200] of integer; {Hàng đợi cho thuật toán BFS} dau, cuoi : integer; begin for i := to n - trace[i] := -1; {trace[v] = v chưa thăm} dau := 1; cuoi := 1; Queue[1] := s; trace[s] := n; repeat u := Queue[dau]; dau := dau + 1; {Lấy u khỏi Queue} for v := to n - if (trace[v] = -1) and (c[u, v] > f[u, v]) then {Xét v chưa thăm kề u} begin trace[v] := u; if v = t then {Đến t thuật toán dừng} begin FindPath := true; exit; end; cuoi := cuoi + 1; Queue[cuoi] := v; {Đẩy v vào Queue} end; until dau > cuoi; FindPath := false; end; {Tăng luồng dọc theo đường tăng luồng f := f + fP} 70 procedure IncFlow(var tg : integer); var Delta, u, v : integer; begin {Tính Delta} Delta := 10000000; v := t; repeat u := trace[v]; if c[u, v] - f[u, v] < Delta then Delta := c[u, v] - f[u, v]; v := u; until v = s; tg := Delta; {f := f + fP} v := t; repeat u := trace[v]; f[u, v] := f[u, v] + Delta; f[v, u] := f[v, u] - Delta; v := u; until v = s; end; procedure FordFulkerson; begin repeat if not FindPath then break; IncFlow(tg); until false; end; end Unit PreFlow – Push 71 unit PreFlow_Push; interface uses dothi ; type Mang1 = Array of Array of integer; Mang2 = Array of integer; Mang3 = Array of Boolean; var n, s, t, k, dau, cuoi : integer; sld, FlowIn, h, Queue : mang2; InQueue : Mang3; c, f : mang1; procedure Input; function OverFlow(u : integer) : Boolean; procedure PushToQueue(u : integer); function PopFromQueue : integer; function Discharge(u : integer): Boolean; function Lift(u : integer) : Boolean; procedure PreFlowPush; implementation uses maxflow; function OverFlow(u : integer): Boolean; begin OverFlow := (u s) and (u t) and (FlowIn[u] > 0); end; procedure input; var i, j, v : integer; begin n := G.sodinh; setlength(c, n, n); setlength(f, n, n); setlength(FlowIn, n); setlength(InQueue, n); 72 setlength(h, n); setlength(Queue, n*n); for i := to n - for j := to n - begin c[i, j] := 0; f[i, j] := 0; end; for i := to G.socanh - with G.DScanh[i] c[dinhdau, dinhcuoi] := trongso.giatri; s := dinhphat; t := dinhthu; for v := to n - begin h[v] := 0; InQueue[v] := false; end; h[s] := n - 1; dau := 0; cuoi := n - 1; for v := to n - {Cho s phát hết công suất lên cung liên thuộc [s, v]} begin f[s, v] := c[s, v]; f[v, s] := -c[s, v]; FlowIn[v] := c[s, v]; if OverFlow(v) then {Nếu v bị tải đưa v vào Queue} begin cuoi := (cuoi + 1) mod n; Queue[cuoi] := v; InQueue[v] := true; end; end; end; procedure PushToQueue(u : integer); {Đẩy đỉnh u tải vào Queue} 73 begin if not InQueue[u] then begin cuoi := (cuoi + 1) mod n; Queue[cuoi] := u; InQueue[u] := true; end; end; function PopFromQueue : integer; {Lấy đỉnh tải khỏi Queue} var u : integer; begin u := Queue[dau]; dau := (dau + 1) mod n; InQueue[u] := false; PopFromQueue := u; end; function Discharge(u : integer): Boolean; {Giảm tải cho đỉnh u} var v : integer; Delta : integer; Pushed : Boolean; begin Pushed := false; for v := to n - if (c[u, v] > f[u, v]) and (h[u] > h[v]) then {Điều kiện để thực Push(u, v)} begin {Thực thao tác Push(u, v)} Delta := c[u, v] - f[u, v]; if FlowIn[u] < Delta then Delta := FlowIn[u]; f[u, v] := f[u, v] + Delta; f[v, u] := f[v, u] - Delta; FlowIn[u] := FlowIn[u] - Delta; 74 FlowIn[v] := FlowIn[v] + Delta; if OverFlow(v) then PushToQueue(v); {Thao tác Push sinh đỉnh tải mới} Pushed := true; {Cờ báo hiệu u giảm tải} end; Discharge := Pushed; end; function Lift(u : integer) : Boolean; var v, minH : integer; begin minH := maxint; for v := to n - if (c[u, v] > f[u, v]) and (h[v] < minH) then minH := h[v]; h[u] := minH + 1; end; procedure PreFlowPush; var u : integer; begin input; while dau (cuoi + 1) mod n begin u := PopFromQueue; if not Discharge(u) then Lift(u); if FlowIn[u] > then PushToQueue(u); end; end; end 75 [...]... sau đó tìm luồng cực đại trên mạng và cuối cùng dỡ bỏ hai đỉnh giả cũng như các cung giả mới thêm vào Hình 7: Mạng giả của mạng có nhiều điểm phát và nhiều điểm thu Bài toán so khớp hai nhánh cực đại Có thể chuyển dễ dàng chuyển đổi vài bài toán tổ hợp dưới dạng bài toán luồng cực đại Bài toán luồng cực đại nhiều điểm phát và nhiều điểm thu trong đoạn trên đã cho ta một ví dụ Có các bài toán tổ hợp... Hình 5 Đồ thị hai phía Đồ thị phẳng Đồ thị được gọi là đồ thị phẳng nếu ta có thể vẽ nó trên mặt phẳng sao cho các cạnh của nó không cắt nhau ngoài ở đỉnh Cách vẽ như vậy sẽ được gọi là biểu diễn phẳng của đồ thị Thí dụ đồ thị K4 là phẳng, vì có thể vẽ nó trên mặt phẳng sao cho các cạnh của nó không cắt nhau ngoài ở đỉnh (xem hình 6) Hình 6 Đồ thị K4 là đồ thị phẳng Một điều đáng lưu ý nếu đồ thị là... hai cạnh (u, w), (w, u) Hai đồ thị G = (V, E) và 14 H = (W, F) được gọi là đồng cấu nếu chúng có thể thu được từ cùng một đồ thị nào đó nhờ phép chia cạnh Định lý 2 (Kuratovski) Đồ thị là phẳng khi và chỉ khi nó không chứa đồ thị con đồng cấu với K3,3 hoặc K5 Trong trường hợp riêng, đồ thị K3,3 hoặc K5 không phải là đồ thị phẳng Bài toán về tính phẳng của đồ thị K3,3 là bài toán đố nổi tiếng về ba căn... nó luôn có cạnh nối Các đồ thị K3, K4, K5 cho trong hình dưới đây Hình 1 Đồ thị đầy đủ Đồ thị đầy đủ Kn có tất cả n(n-1)/2 cạnh, nó là đơn đồ thị có nhiều cạnh nhất Đồ thị vòng Đồ thị vòng Cn, n≥3 gồm n đỉnh v1, v2, .vn và các cạnh (v1, v2), (v2, v3) (vn-1, vn), (vn, v1) Đồ thị vòng C3, C4, C5, C6 cho trong hình 2 Hình 2 Đồ thị vòng C3, C4, C5, C6 12 Đồ thị bánh xe Đồ thị Wn thu được từ Cn bằng... chẳng liên quan tới đến các bài toán mạng luồng, nhưng trên thực tế có thể rút gọn thành một bài 30 toán luồng cực đại Đoạn này trình bày một bài toán như thế: Tìm một so khớp cực đại trong một đồ thị hai nhánh Bài toán: Cho một đồ thị vô hướng G = (V, E), một so khớp là một tập hợp con các cạnh M E sao cho với tất cả các đỉnh v V, có tối đa một cạnh của M là liên thuộc trên v Ta nói rằng một đỉnh... L) - 0 = f(s, V’) = |f| Một so khớp cực đại trong một đồ thị hai nhánh G tương ứng với một luồng cực đại trong mạng luồng tương ứng G’ của nó Như vậy, ta có thể tính toán một so khớp cực đại trong G bằng cách chạy một thuật toán luồng cực đại trên G’ 33 Bài toán so khớp hoàn hảo: Một so khớp hoàn hảo là một so khớp ở đó mọi đỉnh đều ăn khớp Cho G = (V, E) là một đồ thị hai nhánh không hướng có phân hoạch... tương ứng trực tiếp với một luồng trong mạng tương ứng với G’ của G Ta nói rằng một luồng f trên một mạng luồng G = (V, E) có giá trị số nguyên nếu f[u, v] là số nguyên với tất cả (u, v) V x V Hình 9 : Mạng luồng với đồ thị tương ứng với một đồ thị hai nhánh (a) Đồ thị hai nhánh G = (V, E) (b) Mạng luồng G’ có một luồng cực đại đã nêu Định lý 9 :Cho G = (V, E) là một đồ thị hai phía có phân hoạch... LUỒNG CỰC ĐẠI TRÊN MẠNG Bài toán luồng cực đại trên mạng là một trong số bài toán tối ưu trên đồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý thuyết tổ hợp Bài toán được đề xuất vào đầu năm 1950, và gắn liền với tên tuổi của các nhà toán học Mỹ là Ford, Fulkerson, Goldberg, Tarjan, Emond, Karp Trong chương này chúng ra sẽ trình bày thuật toán Ford-Fulkerson... Ford-Fulkerson và phương pháp đẩy luồng trước (Preflow-Push) của Goldberg để giải bài toán đặt ra và nêu một số ứng dụng của bài toán 2.1 Các khái niệm 2.1.1 Các mạng luồng Trong phần này, ta nêu một định nghĩa về các mạng luồng theo lý thuyết đồ thị, đề cập đến các tính chất của chúng và đưa ra định nghĩa bài toán luồng cực đại một cách chính xác Định nghĩa 1 Mạng là một đồ thị có hướng G = (V, E) gồm n... của đồ thị tương ứng với các máy tính, còn các cạnh tương ứng với các kênh nối) câu hỏi đó được phát biểu trong ngôn ngữ đồ thị như sau: Tồn tại hay không đường đi giữa mọi cặp đỉnh của đồ thị 11 1.3 Một số dạng đồ thị đặc biệt Trong mục này ta xét một số đơn đồ thị vô hướng dạng đặc biệt xuất hiện trong nhiều vấn đề ứng dụng thực tế Đồ thị đầy đủ Đồ thị đầy đủ n đỉnh, ký hiệu bởi Kn, là đơn đồ thị