Đặc biệt là các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Lý thuyết mã hóa, Tối ưu hóa… với các bài toán cụ thể như: Bài toán phân bố
Trang 1MỤC LỤC
LỜI MỞ ĐẦU 3
CHƯƠNG 1 LÝ THUYẾT ĐỒ THỊ 5
1.1 Định nghĩa đồ thị 5
1.2 Các thuật ngữ cơ bản 8
1.3 Một số dạng đồ thị đặc biệt 12
1.4 Biểu diễn đồ thị 16
CHƯƠNG 2 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 cơ bản 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 cơ bản 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 cơ bản 35
2.3.3 Thuật toán Preflow - Push 38
2.3.4 Tính đúng đắn của thuật toán đẩy luồng trước 38
2.4 Một số bài toán luồng tổng quát 43
2.4.1 Mạng với khả năng thông qua của các cung và các đỉnh 43
2.4.2 Mạng với khả năng thông qua của mỗi 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
Trang 2CHƯƠNG 3 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 và Unit 49
3.2 Form và các thành phần giao diện 50
3.2.1 Xây dựng ứng dụng từ những 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 của Windows 51
3.3 Ngôn ngữ Object Pascal 56
3.3.1 Các kiểu dữ liệu đơn giản 56
3.3.3 Các câu lệnh cấu trúc 59
CHƯƠNG 4 CÁC KẾT QUẢ CÀI ĐẶT 62
4.1 Mô tả bài toán 62
4.2 Giải bà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
Trang 3LỜI MỞ ĐẦU
Lý thuyết đồ thị là ngành khoa học được phát triển từ rất lâu nhưng lại có nhiều ứng dụng hiện đại Những ý tưởng cơ bản của lý thuyết đồ thị được nhà toán Thụy Sỹ tên là Leonhard Euler đưa ra từ thế kỷ 18, ông đã dùng lý thuyết đồ thị để giải quyết bài toán cầu Konigsberg nổi tiếng
Trong khoảng vài chục năm trở lại đây, cùng với sự ra đời của máy tính điện tử và sự phát triển nhanh chóng của tin học, lý thuyết đồ thị ngày càng được quan tâm nhiều hơn Đặc biệt là các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Lý thuyết mã hóa, Tối ưu hóa… với các bài toán cụ thể như: Bài toán phân bố luồng giao thông giữa các thành phố trong một mạng giao thông, Bài toán cạnh tranh giữa các loài trong môi trường sinh thái, Bài toán tô màu trên đồ thị… Đồ thị với các trọng số được gán trên các cạnh của nó có thể dùng để giải quyết các bài toán như: Bài toán tìm đường đi ngắn nhất giữa hai thành phố trong một mạng giao thông, Bài toán phân công lao động sao cho tổng lợi nhuận thu được là lớn nhất, Bài toán phân nhóm sinh hoạt chuyên đề cho một nhóm sinh viên…
Chính vì đồ thị có thể được sử dụng để giải quyết nhiều bài toán thuộc nhiều lĩnh vực khác nhau một cách dễ dàng và phổ biến như vây nên đồ thị nắm giữ một vai trò hết sức quan trọng trong cuộc sống, đặc biệt là trong lĩnh vực Công nghệ thông tin, dựa vào đồ thị và các thuật toán trên đồ thị người ta có thể xây dựng lên các phần mềm tiện ích để phục vụ cho nhu cầu học tập cũng như nghiên cứu
Hiểu được tầm quan trọng của đồ thị trong ngành học mà mình theo đuổi và say mê, được sự quan tâm, tận tình chỉ bảo của 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 trên đồ thị với mong
muốn sau khi hoàn thành đề tài này em sẽ khám phá được nhiều hơn các ứng dụng của đồ thị trong việc giải quyết một lớp các bài toán liên quan tới bài toán luồng cực đại
Trang 4Em xin gửi lời cảm ơn chân thành tới thầy giáo TS Vũ Vinh Quang cùng các thầy giáo, cô giáo khác đã tận tình chỉ bảo để em hoàn thành đề tài này
Em cũng xin gửi lời cảm ơn tới các bạn sinh viên lớp K2 A đã có những ý kiến đóng góp để chương trình của em được hoàn thiện hơn
Mặc dù đã hết sức cố gắng nhưng chắc chắn đề tài của em không tránh khỏi những thiếu sót Em rất mong nhận được sự góp ý của các thầy cô giáo
và các bạn để đề tài của em được hoàn thiện hơn
Em xin chân thành cảm ơn!
Thái Nguyên, ngày 15 tháng 05 năm 2008
Trang 5CHƯƠNG 1
LÝ THUYẾT ĐỒ THỊ
Đồ thị được sử dụng để giải các bài toán trong nhiều lĩnh vực khác nhau Chẳng hạn, đồ thị có thể sử dụng để xác định các mạch vòng trong vấn đề giải tích mạch điện Chúng ta có thể phân biệt các hợp chất hóa học hữu cơ khác nhau với cùng công thức phân tử nhưng khác nhau về cấu trúc phân tử nhờ đồ thị Chúng ta có thể xác định hai máy tính trong mạng có thể trao đổi thông tin được với nhau hay không nhờ mô hình đồ thị của mạng máy tính Đồ thị có trọng số trên các cạnh có thể sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạng giao thông Chúng ta cũng còn sử dụng đồ thị để giải các bài toán về lập lịch, thời khóa biểu, và phân bố tần số cho các trạm phát thanh và truyền hình…
1.1 Định nghĩa đồ thị
Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh này
Chúng ta phân biệt các loại đồ thị khác nhau bởi kiểu và số lượng cạnh nối hai
đỉnh nào đó của đồ thị Để có thể hình dung được tại sao lại cần đến các loại đồ thị khác nhau, chúng ta sẽ nêu ví dụ sử dụng chúng để mô tả một mạng máy tính Giả sử ta có một mạng gồm các máy tính và các kênh điện thoại (gọi tắt là kênh thoại) nối các máy tính này Chúng ta có thể biểu diễn các vị trí đặt máy tính bởi các điểm và các kênh thoại nối chúng bởi các đoạn nối, xem hình 1
Hình 1 Sơ đồ mạng máy tính
Nhận thấy rằng trong mạng ở hình 1, giữa hai máy bất kỳ chỉ có nhiều nhất là một kênh thoại nối chúng, kênh thoại này cho phép liên lạc cả hai chiều và không
Trang 6có máy tính nào lại được nối với chính nó Sơ đồ mạng máy cho trong hình 1
được gọi là đơn đồ thị vô hướng Ta đi đến định nghĩa sau:
Hình 2 Sơ đồ mạng máy tính với đa kênh thoại
Định nghĩa 2.
Đa đồ thị vô hướng G= (V, E) bao gồm V là tập các đỉnh, và E là tập các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh Hai cạnh e 1
và e 2 được gọi là cạnh lặp nếu chúng cùng tương ứng với một cặp đỉnh
Hình 3 Sơ đồ mạng máy tính với kênh thoại thông báo
Trang 7Rõ ràng mỗi đơn đồ thị đều là đa đồ thị, nhưng không phải đa đồ thị nào cũng
là đơn đồ thị, vì trong đa đồ thị có thể có hai (hoặc nhiều hơn) cạnh nối một cặp đỉnh nào đó
Trong mạng máy tính có thể có những kênh thoại nối một máy nào đó với chính nó (chẳng hạn với mục đính thông báo) Mạng như vậy được cho trong hình 3 Khi đó đa đồ thị không thể mô tả được mạng như vậy, bởi vì có những
khuyên (cạnh nối một đỉnh với chính nó) Trong trường hợp này chúng ta cần sử dụng đến khái niệm giả đồ thị vô hướng, được định nghĩa như sau:
Định nghĩa 3.
Giả đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các cặp không có thứ tự gồm hai phần tử (không nhất thiết phải khác nhau) của V gọi
là cạnh Cạnh e được gọi là khuyên nếu nó có dạng e = (u, u)
Hình 4 Mạng máy tính với kênh thoại một chiều
Các kênh thoại trong mạng máy tính có thể chỉ cho phép truyền tin theo một chiều Chẳng hạn, trong hình 4 máy chủ ở Thái Nguyên chỉ có thể nhận tin từ các máy ở Hà Nội, có một số máy chỉ có thể gửi tin đi, còn các kênh thoại cho phép truyền tin theo cả hai chiều được thay thế bởi hai cạnh có hướng ngược chiều nhau Ta đi đến định nghĩa sau
Định nghĩa 4.
Đơn đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung
Nếu trong mạng có thể có đa kênh thoại một chiều, ta sẽ phải sử dụng đến
khái niệm đa đồ thị có hướng
Trang 8Định nghĩa 5.
Đa đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các cặp
có thứ tự gồm hai phần tử khác nhau của V gọi là các cung Hai cung e 1 , e 2 tương ứng với cùng một cặp đỉnh được gọi là cung lặp
sẽ được gọi là các đỉnh đầu của cạnh (u, v)
Để có thể biết có bao nhiêu cạnh liên thuộc với một đỉnh, ta đưa vào định nghĩa sau:
deg(a) = 1, deg(b) = 4, deg(c) = 4, deg(f) = 3,
deg(d) = 1, deg(e) = 3, deg(g) = 0
Đỉnh bậc 0 gọi là đỉnh cô lập Đỉnh bậc 1 được gọi là đỉnh treo Trong ví dụ
trên đỉnh g là đỉnh cô lập, a và d là các đỉnh treo Bậc của đỉnh có tính chất sau:
Định lý 1 Giả sử G = (V, E) là đồ thị vô hướng với m cạnh Khi đó tổng bậc của tất cả các đỉnh bằng hai lần số cung
Trang 9Chứng minh Rõ ràng mỗi cạnh e = (u, v) được tính một lần trong deg(u) và một lần
trong deg(v) Từ đó suy ra tổng tất cả các bậc của các đỉnh bằng hai lần số cạnh
Thí dụ 2 Đồ thị với n đỉnh có bậc là 6 có bao nhiêu cạnh?
Giải: Theo định lý 1 ta có 2m = 6n Từ đó suy ra tổng các cạnh của đồ thị là 3n
Hệ quả Trong đồ thị vô hướng, số đỉnh bậc lẻ (nghĩa là có bậc là số lẻ) là một
số chẵn
Chứng minh Thực vậy, gọi O và U tương ứng là tập đỉnh bậc lẻ và tập đỉnh bậc
chẵn của đồ thị Ta có
2m = deg(v) + deg(v) v U v O
Do deg(v) là chẵn với v là đỉnh trong U nên tổng thứ nhất ở trên là số chẵn
Từ đó suy ra tổng thứ hai (chính là tổng bậc của các đỉnh bậc lẻ) cũng phải là số chẵn, do tất cả các số hạng của nó là số lẻ, nên tổng này phải gồm một số chẵn các số hạng Vì vậy, số đỉnh bậc lẻ phải là số chẵn
Ta xét các thuật ngữ tương tự cho đồ thị vô hướng
Định nghĩa 3.
Nếu e = (u, v) là cung của đồ thị có hướng G thì ta nói hai đỉnh u và v là kề nhau, và nói cung (u, v) nối đỉnh u với đỉnh v hoặc cũng nói cung này là đi ra khỏi đỉnh u và vào đỉnh v Đỉnh u(v) sẽ được gọi là đỉnh đầu (cuối) của cung (u, v)
Tương tự như khái niệm bậc, đối với đồ thị có hướng ta có khái niệm bán bậc
Trang 10Thí dụ 3 Xét đồ thị cho trong hình 2 Ta có
deg - (a)=1, deg - (b)=4, deg - (c)=3, deg - (d)=1, deg - (e) = 0, deg - (f) = 1
deg + (a)=1, deg + (b)=1, deg + (c)=1, deg + (d)=1, deg + (e)=3, deg - (f) = 2
Do mỗi cung (u, v) sẽ được tính một lần trong bán bậc vào của đỉnh v và một lần trong bán bậc ra của đỉnh u nên ta có:
Định lý 2 Giả sử G = (V, E) là đồ thị có hướng Khi đó
2m = deg+(v) + deg-(v) v V v V
Rất nhiều tính chất của đồ thị có hướng không phụ thuộc vào hướng trên các cung của nó Vì vậy, trong nhiều trường hợp sẽ thuận tiện hơn nếu ta bỏ qua hướng trên các cung của đồ thị Đồ thị vô hướng thu được bằng cách bỏ qua
hướng trên các cung được gọi là đồ thị vô hướng tương ứng với đồ thị có hướng
đã cho
Định nghĩa 5
Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dương, trên
đồ thị vô hướng G = (V, E) là dãy
x 0 , x 1 ,…, x n-1 , x n
trong đó u = x 0 , v = x n , (x i , x i+1 ) E, i = 0, 1, 2,…, n-1
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cạnh:
(x 0 , x 1 ), (x 1 , x 2 ), …, (x n-1 , x n )
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi Đường đi
có đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình Đường đi hay chu trình được gọi là đơn nếu như không có cạnh nào bị lặp lại
Thí dụ 4 Trên đồ thị vô hướng cho trong hình 1: a, d, c, f, e là đường đi đơn độ
dài 4 Còn d, e, c, a không là đường đi, do (c,e) không phải là cạnh của đồ thị Dãy b, c, f, e, b là chu trình độ dài 4 Đường đi a, b, e, d, a, b có độ dài là 5 không phải là đường đi đơn, do cạnh (a, b) có mặt trong nó 2 lần
Trang 11Hình 3 Đường đi trên đồ thị
Khái niệm đường đi và chu trình trên đồ thị có hướng được định nghĩa hoàn toàn tương tự như trong trường hợp đồ thị vô hướng, chỉ khác là ta có chú ý đến hướng trên các cung
Định nghĩa 6
Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó, n là số nguyên dương, trên
đồ thị có hướng G = (V, E) là dãy
x 0 , x 1 ,…, x n-1 , x n
trong đó u = x 0 , v = x n , (xi, x i+1 ) E, i = 0, 1, 2,…, n-1
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung:
(x 0 , x 1 ), (x 1 , x 2 ), …, (x n-1 , x n )
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi Đường đi
có đỉnh đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình Đường đi hay chu trình được gọi là đơn nếu như không có cạnh nào bị lặp lại
Thí dụ 5 Trên đồ thị có hướng cho trong hình 1: a, d, c, f, e là đường đi đơn độ
dài 4 Còn d, e, c, a không là đường đi, do (c, e) không phải là cạnh của đồ thị Dãy b, c, f, e, b là chu trình độ dài 4 Đường đi a, b, e, d, a, b có độ dài là 5 không phải là đường đi đơn, do cạnh (a, b) có mặt trong nó 2 lần
Xét một mạng máy tính Một câu hỏi đặt ra là hai máy tính bất kỳ trong mạng này có thể trao đổi thông tin được với nhau hoặc là trực tiếp qua kênh nối chúng hoặc thông qua một hoặc vài máy tính trung gian trong mạng? Nếu sử dụng đồ thị để biểu diễn mạng máy tính này (trong đó các đỉnh 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ị
Trang 12Đồ thị vòng C3, C4, C5, C6 cho trong hình 2
Hình 2 Đồ thị vòng C 3 , C 4 , C 5 , C 6
Trang 13Đồ thị lập phương n đỉnh Qn là đồ thị với các đỉnh biểu diễn 2n xâu nhị phân
độ dài n Hai đỉnh của nó gọi là kề nhau nếu như hai xâu nhị phân tương ứng chỉ khác nhau 1 bit Hình 4 cho thấy Qn với n = 1, 2, 3
Hình 4 Đồ thị lập phương Q 1 , Q 2 , Q 3
Đồ thị hai phía
Đơn đồ 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ỉ nố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 = (XY, E) để chỉ đồ thị hai phía với tập đỉnh XY
Định lý sau đây cho phép nhận biết một đơn đồ thị có phải là hai phía hay không
Định lý 1 Đơn đồ thị là đồ thị hai phía khi và chỉ khi nó không chứa chu trình
độ dài lẻ
Để kiểm tra xem một đồ thị liên thông có phải là hai phía hay không có thể áp dụng thủ tục sau Cho v là một đỉnh bất kỳ của đồ thị Đặt X = {v}, còn Y là tập các đỉnh kề của v Khi đó các đỉnh kề của các đỉnh trong Y phải thuộc vào X Ký
hiệu tập các đỉnh như vậy là T Vì thế nếu phát hiện T ∩ Y ≠ Ø thì đồ thị không
Trang 14phải là hai phía, kết thúc ngược lại, đặt X = X T Tiếp tục xét như vậy đối với T’ là tập các đỉnh kề của T
Đồ thị hai phía G = (XY, E) với |X| = m, |Y| = n được gọi là đồ thị hai phía đầy đủ và ký hiệu là Km, n nếu mỗi đỉnh trong tập X được nối với mỗi đỉnh trong
Y K2,3, K3,3, K3,4 được cho trong hình 5
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)
Trang 15H = (W, F) được gọi là đồng cấu nếu chúng có thể thu được từ cùng một đồ thị
Đồ thị phẳng còn tìm được những ứng dụng quan trọng trong công nghệ chế tạo mạch in
Biểu diễn phẳng của đồ thị sẽ chia mặt phẳng ra thành các miền, trong đó có thể có cả miền không bị chặn Thí dụ, biểu diễn phẳng của đồ thị cho trong hình
7 chia mặt phẳng ra thành 6 miền R1,R2, …, R6
Hình 7 Các miền tương ứng với biểu diễn phẳng của đồ thị
Euler đã chứng minh được rằng các cách biểu diễn phẳng khác nhau của một
đồ thị đều chia mặt phẳng ra thành cùng một số miền Để chứng minh điều đó, Euler đã tìm được mối liên hệ giữa số miền, số đỉnh của đồ thị và số cạnh của đồ thị phẳng sau đây
Định lý 3 (Công thức Euler) Giả sử G là đồ thị phẳng liên thông với n đỉnh, m cạnh Gọi r là số miền của mặt phẳng bị chia bởi biểu diễn phẳng của G
Khi đó r = m - n + 2
Có thể chứng minh định lý bằng qui nạp Xét thí dụ minh họa cho áp dụng công thức Euler
Thí dụ Cho G là đồ thị phẳng liên thông với 20 đỉnh, mỗi đỉnh đều có bậc là 3
Hỏi mặt phẳng bị chia làm bao nhiêu phần bởi biểu diễn phẳng của đồ thị G?
Trang 16Giải Do mỗi đỉnh của đồ thị đều có bậc là 3, nên tổng bậc của các đỉnh là
3x20=60 Từ đó suy ra số cạnh của đồ thị m = 60/20 = 30 Vì vậy, theo công thức Euler, số miền cần tìm là r = 30-20+2 = 12
Trang 17Ma trận liên thuộc
Giả sử G = (V, E) là một đồ thị vô hướng v1, v2, …, vn là tập các đỉnh còn
e1, e2,…, em là tập cạnh của nó Khi đó ma trận liên thuộc theo thứ tự trên của V
và E là ma trận M = [mij] trong đó:
mij = 1 nếu cạnh ej nối với đỉnh vi
mij = 0 nếu cạnh ej không nối với đỉnh vi
Trang 18CHƯƠNG 2 BÀI TOÁN 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 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 đỉnh và m cung, trong đó có hai đỉnh phân biệt s và t, đỉnh s gọi là đỉnh phát và đỉnh t gọi là đỉnh thu Mỗi cung e = (u, v) E được gán với một số không âm c(e) = c[u, v] gọi là khả năng thông qua của cung đó Để thuận tiện cho việc trình bày, ta qui ước rằng nếu mạng không có cung (u, v) thì ta thêm vào cung (u, v) với khả năng thông qua c[u, v] bằng 0
Định nghĩa 2
Cho mạng G = (V, E) với khả năng thông qua là trên các cung là c(e), ta gọi luồng f trên mạng G là một hàm có giá trị thực f : VxV→ R (đây chính là một phép gán cho mỗi cung e = (u, v) một số thực f(e) = f[u, v] và ta gọi nó là luồng trên cung e), thỏa mãn 3 tính chất:
Tính chất 1 (Ràng buộc dung lượng): Luồng trên mỗi cung không vượt
quá khả năng thông qua của cung đó: f[u, v] ≤ c[u, v], (u, v V)
Tính chất 2: Luồng trên cung (u, v) và luồng trên cung (v, u) có cùng giá
trị tuyệt đối nhưng trái dấu nhau : f[u, v] = -f[v, u] (u, v V)
Trang 19 Tính chất 3 (Bảo toàn luồng): Với mỗi đỉnh u không phải là đỉnh phát và
cũng không phải là đỉnh thu, tổng luồng trên cung đi ra khỏi u bằng 0:
t s V u v
u s
f ,
2.1.2 Bài toán luồng cực đại: Cho một mạng G = (V, E) với đỉnh phát s và đỉnh
thu t Tìm luồng f* có giá trị lớn nhất
Bài toán như vậy có thể xuất hiện trong rất nhiều ứng dụng thực tế Chẳng hạn khi cần xác định cường độ lớn nhất của dòng vận tải giữa hai nút của một bản đồ giao thông Trong ví dụ này lời giải của bài toán luồng cực đại sẽ chỉ cho
ta các đoạn đường đông xe nhất và chúng tạo thành "chỗ hẹp" tương ứng với dòng giao thông xét theo hai nút được chọn Một ví dụ khác là nếu xét đồ thị tương ứng với một hệ thống đường ống dẫn dầu Trong đó các ống tương ứng với các cung, điểm phát có thể coi là tầu chở dầu, điểm thu là bể chứa, còn những điểm nối giữa các ống là các nút của đồ thị Khả năng thông qua của các cung tương ứng với tiết diện của các ống Cần phải tìm luồng dầu lớn nhất có thể bơm
từ tàu chở dầu vào bể chứa
Không làm giảm tính tổng quát, trong bài toán tìm luồng cực đại, ta có thể giả thiết rằng với mọi luồng f thì luồng trên cung (u, v) và luồng trên cung (v, u) không đồng thời là số dương (u, v V) Bởi thế nếu không ta chỉ việc thêm bớt
cả f[u, v] và f[v, u] đi một lượng bằng min(f[u, v], f[v, u]) thì được một luồng mới
có giá trị bằng luồng ban đầu trong đó hoặc f[u, v] bằng 0 hoặc f[v, u] bằng 0 Trước khi xem một ví dụ về bài toán luồng trên mạng, ta khảo sát ba tính chất luồng Tính chất 1 (sự ràng buộc dung lượng) đơn giản muốn nói luồng mạng từ đỉnh này tới đỉnh khác không được vượt quá dung lượng đã cho Tính chất 2 nói rằng luồng mạng từ môt đỉnh u đến một đỉnh v là âm của luồng mạng theo hướng ngược lại Như vậy luồng mạng từ một đỉnh đến chính nó sẽ là 0, bởi u V, ta
có f[u, u] = -f[u, u], suy ra f[u, u] = 0 Tính chất 3 (bảo toàn luồng) nói rằng tổng luồng mạng rời một đỉnh khác với đinh phát và đỉnh thu sẽ là 0 Theo
Trang 20t s V v v
u
f , 0, \ , Nghĩa là tổng luồng mạng
vào một đỉnh là 0 Ta có thể thấy rằng không có luồng mạng nào giữa u và v nếu không có cạnh nào giữa chúng Nếu không có (u, v) E cũng không có (v, u) E thì c[u, v] = c[v, u] = 0 Do đó theo sự ràng buộc dung luợng f[u, v] ≤ 0 và f[v, u] ≤ 0 Nhưng bởi f[u, v] = -f[v, u] nên theo tính chất 2, ta có f[u, v] = f[v, u] = 0 Như vậy luồng mạng khác 0 từ đỉnh u đến đỉnh v hàm ý rằng (u, v) E hoặc (v, u) E
v u c
,,
Và giá trị luồng từ X sang T là :
f(X, Y) =
X v Y u
v u f
Trang 21Chứng minh
Với X V, ta có f(X, X) =
X
v u
v u f
,
, như vậy nếu f[u, v] xuất hiện trong
tổng thì f[v, u] cũng xuất hiện, theo tính chất 2 của luồng ta có f(X, X) = 0
Với X,Y V, ta có f (X, Y) =
X v Y u
v u f
,
, và f (X, Y) =
X v Y u
v u f
v u f
,
X v Z u
v u f
,
Y v Z u
v u f
2.2 Phương pháp Ford - Fulkerson
Trong phần này trình bày phương pháp Ford - Fulkerson để giải quyết bài toán luồng cực đại Ta gọi nó là phương pháp thay vì thuật toán bởi nó bao hàm vài thực hiện có các thời gian khác nhau Phương pháp Ford - Fulkerson tùy thuộc vào ba ý tưởng quan trọng có liên quan đến nhiều thuật toán và bài toán
luồng: các mạng thặng dư, các đường tăng luồng, và các lát cắt Các ý tưởng này
là rất quan trọng đối với định lý max - flow min - cut, chỉ rõ đặc điểm đối với giá
trị của một luồng cực đại theo dạng các lát cắt của mạng luồng
Trang 22Phương pháp Ford - Fulkerson là phương pháp lặp Ta bắt đầu với f[u, v] = 0 với tất cả u, v V, cho ra một luồng ban đầu có giá trị 0 Vào mỗi lần lặp, ta tăng giá trị luồng bằng cách tìm một “đường tăng luồng”, đơn giản xem nó là một đường đi từ đỉnh s tới đỉnh t, theo đó ta có thể đẩy thêm luồng, rồi tăng luồng dọc theo đường này Ta lặp lại quá trình trên cho đến khi không tìm thấy đường tăng luồng nào nữa Kết thúc quá trình này sẽ cho ta một luồng cực đại
Phương pháp Ford - Fulkerson có thể viết như sau:
<Khởi tạo một luồng f trên G theo 0 >
While <Tìm được đường tăng luồng P trên G > do f := f + f P ;
<Output>
2.2.1 Mạng thặng dư
Từ một mạng G và một luồng f trên G, ta xây dựng mạng Gf = (V, Ef) với tập cạnh Ef được định nghĩa bằng tập cạnh E bỏ đi các cung bão hòa (một cung được gọi là bão hòa nếu luồng trên cung đó đúng bằng khả năng thông qua):
Ef = {(u, v) | (u, v V) và f[u, v] < c[u, v] }
Khả năng thông qua của cung (u, v) trên Gf được tính bằng :
cf[u, v] = c[u, v] - f[u, v]
s và t lần lượt được coi là điểm phát và điểm thu trên Gf
Ví dụ, nếu c[u, v] = 20 và f[u, v] = 15 thì ta có thể chuyển đi thêm cf[u, v] = 5 đơn vị của luồng trước khi vượt quá sự ràng buộc dung lượng trên cạnh (u, v) Mạng Gf như vậy gọi là mạng thặng dư của mạng G sinh ra bởi luồng f
Hình 2: Mạng luồng G và mạng thặng dư G f tương ứng
Định lý 3: Cho mạng G và luồng f Gọi f’ là một luồng trên mạng Gf Khi đó (f+f’) cũng là một luồng trên G với giá trị luồng bằng |f|+|f’| Trong đó luồng
Trang 23(f+f’) được định nghĩa như sau: (f+f’)[u, v] = f[u, v] + f’[u, v] (u, v V)
Chứng minh: Ta chứng minh (f+f’) thỏa mãn 3 tính chất của luồng
f ') ,
( = ( f u,v f 'u,v)
V v
f , +
V
v
v u
v s f
f ') ,( = ( f s,v f 's,v)
V v
f , +
V
v
v s
f ' , = |f|+|f’|
Định lý được chứng minh
2.2.2 Đường tăng luồng
Cho mạng G và luồng f, một đường đi cơ bản từ s tới t trên mạng thặng dư Gf
là một đường tăng luồng Theo định nghĩa về mạng thăng dư, mỗi cạnh (u, v) trên một đường tăng luồng tiếp nhận vài luồng mạng dương bổ sung từ u đến v
mà không vi phạm sự ràng buộc dung lượng trên cạnh
Với một đường tăng luồng P, ta đặt Δp = min{cf[u, v] | (u, v) P} là giá trị nhỏ nhất của các khả năng thông qua trên các cung trên P và gọi ΔP là giá trị thặng dư của đường P
Đính lý 4: Cho G = (V, E) là một mạng luồng, cho f là một luồng trong Gf và cho
P là một đường tăng luồng trên Gf, thì các giá trị fP cho bởi:
Trang 24) , ( ,
) , ( ,
P v u
P v u P P
là một luồng trên Gf với giá trị |fP| = cf(P) > 0
Định lý sau đây chứng tỏ nếu bổ sung fP vào f, ta có một luồng khác trong G
mà giá trị của nó sát với cực đại hơn
Định lý 5: Cho G = (V, E) là một mạng luồng, cho f là một luồng trong G, và cho P là một đường tăng luồng trên Gf Cho fP được định nghĩa như trên thì phép đặt f := f + fP cho ta một luồng mới trên f có giá trị bằng |f| + ΔP
Chứng minh: Dễ dàng suy ra từ đỉnh lý 4 và định lý 5
Phép gán f := f + fP gọi là tăng luồng dọc theo đường P
Ví dụ:
Hình 3:Mạng thặng dư - đường tăng luồng P (tô đậm)
Mạng G sau khi tăng luồng dọc theo P
2.2.3 Lát cắt
Phương pháp Ford - Fulkerson liên tục tăng cường luồng dọc theo các đường
tăng luồng cho đến khi tìm thấy một luồng cực đại Định lý max-flow min-cut mà
ta sẽ chứng minh dưới đây, cho biết luồng là cực đại nếu và chỉ nếu mạng thặng
dư của nó không chứa đường tăng luồng nào nữa Trước hết ta xét khái niệm lát cắt của một mạng luồng
Định nghĩa: Ta gọi một lát cắt (S, T) là một cách phân hoạch tập đỉnh thành 2
tập khác rỗng rời nhau S và T Lát cắt thỏa mãn s S và t T gọi là lát cắt S-T Khả năng thông qua của lát cắt S-T được định nghĩa bởi c(S, T) =
v T u
v u c
,,
Luồng thông qua lát cắt S-T được định nghĩa như sau: f(S, T) =
S v T u
v u f
,,
Trang 25Định lý 6: Cho mạng G = (V, E) và luồng f, khi đó luồng thông qua lát cắt S-T bất kỳ bằng |f|
v u f
,
, ≤
v T u
v u c
,, = c(S, T)
Hệ quả: Giá trị của một luồng f bất kỳ trên mạng G không vượt quá khả năng
thông qua của một lát cắt S-T bất kỳ
Hình 4: Một lát cắt (S, T) trong mạng, ở đó S = {s, v 1 , v 2 } và T = {v 3 , v 4 , t} Luồng mạng qua lát cắt S-T là f(S, T) = 19 và dung lượng là c(S, T) = 26
Định lý 8:(Định lý max-flow min-cut)
Nếu f là một luồng trên mạng G = (V, E) với điểm phát s và điểm thu t, khi đó
ba mệnh đề sau là tương đương:
Trang 261 f là luồng cực đạt trên G
2 Mạng thặng dư Gf không có đường tăng luồng
3 Tồn tại (S, T) là một lát cắt để |f| = c(S, T)
Chứng minh:
(1) => (2) Giả sử phản chứng rằng f là một luồng cực đại trong G nhưng Gf
có một đường tăng luồng P Theo định lý 5, tổng luồng f + fP cũng là một luồng trong G với giá trị hoàn toàn lớn hơn |f|, trái với giả thiết f là luồng cực đại trên mạng
(2) => (3) Giả sử Gf không chứa đường tăng luồng nào, nghĩa là Gf không chứa một đường đi từ s tới t.Ta đặt:
S = {v V | Tồn tại đường đi từ s đến t}
T = V\S
Khi đó S ∩ T = Ø, s S, t S (do không có đường đi từ s tới t) nên t T,
do đó (S, T) là một lát cắt S-T Với u S, v T, ta có f[u, v] = c[u, v] bởi nếu f[u, v] < c[u, v] thì có cung (u, v) trên Gf và như vậy từ s có thể đến được v, trái với cách xây dựng lát cắt Từ đó suy ra f(S, T) = c(S, T)
(3) => (1) Theo định lý 7, giá trị của mọi luồng trên G ≤ c(S, T), nếu giá trị luồng f đúng bằng khả năng thông qua của lát cắt (S, T) thì f phải là luồng cực đại trên mạng
Định nghĩa: Lát cắt S-T có khả năng thông qua nhỏ nhất (bằng giá trị luồng cực
đại trên mạng) gọi là lát cắt S-T hẹp nhất của mạng G
2.2.4 Thuật toán Ford - Fulkerson cơ bản
Trong mỗi lần lặp lại của phương pháp Ford-Fulkerson, ta tìm bất kỳ đường tăng luồng P nào và tăng cường luồng dọc theo P với dung lượng thặng dư ΔP Kiểu thực thi của phương pháp tính toán luồng cực đại trong một đồ thị G = (V, E) bằng cách cập nhật luồng mạng f[u, v] giữa mỗi cặp u, v của các đỉnh được nối bằng một cạnh Nếu u và v không được nối bằng một cạnh theo một trong hai hướng, ta mặc định f[u, v] = 0
Trang 27FORD-FULKERSON
1 For mỗi cạnh (u, v) E
2 do f[u, v] := 0
3 f[v, u] := 0
4 While tồn tại một đường tăng luồng P từ s tới t trong mạng thặng dư G f
5 do Δ P := min {c f (u, v): (u, v) nằm trong P}
6 for mỗi cạnh (u, v) trong P
7 do f[u, v] := f[u, v] + Δ P
8 f[v, u] := f[v, u] - Δ P
Thuật toán Fulkerson cơ bản mở rộng dựa trên phương pháp
Ford-Fulkerson Các dòng 1-3 khởi tạo luồng f theo 0 Vòng lặp While của các dòng
4-8 liên tục tìm một đường tăng luồng P trong Gf và tăng luồng dọc theo P với dung lượng thặng dư ΔP Khi không có đường tăng luồng nào tồn tại, luồng f là một luồng cực đại
2.2.5 Phân tích Ford - Fulkerson
Thời gian thực hiện của Ford - Fulkerson tùy thuộc vào cách xác định đường tăng luồng P ở dòng 4 Nếu nó được chọn tồi, thuật toán thậm chí có thể không kết thúc: giá trị của luồng sẽ gia tăng cùng với các lần tăng cường liên tục, nhưng thậm chí nó còn không hội tụ theo giá trị luồng cực đại Tuy nhiên nếu đường tăng luồng được chọn bằng cách dùng thuật toán tìm kiếm theo chiểu rộng, thuật toán chạy trong thời gian đa thức
Trong thực tế, bài toán luồng cực đại nảy sinh với các dung lượng nguyên Dưới giả thiết này, một cách thực hiện của Ford-Fulkerson sẽ chạy trong thời gian O(E|f*|), ở đó f * là luồng cực đại mà thuật toán tìm thấy.Cụ thể như sau: Các dòng 1-3 chiếm thời gian (E) Vòng lặp While của các dòng 4-8 được thực
hiện tối đa |f*| lần, bởi giá trị luồng gia tăng ít nhất theo một đơn vị trong mỗi lần lặp lại
Trang 28Hình 5: Thực hiện thuật toán Ford-Fulkerson (a)-(d) Các lần lặp lại liên
tục của vòng lặp While Bên trái của từng phần sẽ nêu mạng thặng dư G f với một đường tăng luồng P được tô đậm Bên phải sẽ nêu luồng kết quả mới sau khi bổ sung f P vào f (e) Mạng thặng dư tại lần thực hiện vòng
while Nó không có các đường tăng luồng và do đó luồng f nêu trong (d) là một luồng cực đại
Công việc thực hiện trong vòng lặp While có thể sẽ hiệu quả nếu ta quản lý
một cách hiệu quả cấu trúc dữ liệu được dùng để thực thi mạng G = (V, E) Ta sẽ duy trì một cấu trúc dữ liệu tương ứng với một đồ thị có hướng G’ = (V, E’), ở đó
Trang 29E’ = {(u, v)| (u, v) E hoặc (v, u) E} Các cạnh trong mạng G cũng là cạnh trong G’, và do đó ta chỉ cần duy trì các dung lượng và các luồng trong cấu trúc
dữ liệu này Cho một luồng f trên G, các cạnh trong mạng thặng dư Gf bao gồm tất cả các cạnh (u, v) của G’ sao cho c[u, v] - f[u, v] ≠ 0 Do đó, thời gian để tìm một đường tăng luồng trong một mạng thặng dư là O(E’) = O(E) nếu ta dùng thuật toán tìm kiếm theo chiều sâu hoặc tìm kiếm theo chiều rộng Như vậy, mỗi
lần lặp lại của vòng lặp While sẽ mất O(E) thời gian, khiến tổng thời gian thực
hiện của Ford - Fulkerson trở thành O(E|f*|)
Khi dung lượng là nguyên và giá trị luồng tối ưu nhỏ, thời gian thực hiện của thuật toán Ford - Fulkerson tỏ ra thích hợp Hình 6 có nêu một ví dụ có thể xảy ra trên một mạng luồng đơn giản mà |f*| là lớn Một luồng cực đại trong mạng này
có giá trị 2.000.000: 1.000.000 đơn vị của luồng qua đường tăng luồng s u t,
và 1.000.000 đơn vị khác qua đường tăng luồng s v t Nếu đường tăng luồng đầu tiên mà Ford - Fulkerson tìm thấy là s u v t, luồng có giá trị 1 sau lần lặp đầu tiên Mạng thặng dư kết quả được nêu trong hình b Nếu lần lặp thứ hai tìm thấy đường tăng luồng s v u t, như đã nêu trong hình b thì luồng sẽ có giá trị 2 Hình c nêu mạng thặng dư kết quả Ta có thể tiếp tục, chọn đường tăng luồng s u v t trong các lần lặp lẻ và đường tăng luồng s v u t trong các lần lặp chẵn Ta thực hiện một tổng 2.000.000 lần tăng luồng, mỗi lần chỉ tăng giá trị luồng lên 1 đơn vị
Hình 6: (a) Một mạng luồng mà Ford-Fulkerson có thể mất O(E|f * |) thời gian với f * là luồng cực đại, ở đây |f * | = 2.000.000 Một đường tăng luồng với
dung lượng thặng dư 1 (b) Mạng thặng dư kết quả Một đường tăng luồng khác với dung lượng thặng dư 1 (c) Mạng thặng dư kết quả
Trang 30Có thể cải thiện độ phức tạp của thuật toán Ford - Fulkerson nếu ta thực hiện phép tính tìm đường tăng luồng P trong dòng 4 bằng một thuật toán tìm kiếm theo chiều rộng, nghĩa là nếu đường tăng luồng là một đường đi ngắn nhất từ s đến t trong mạng thặng dư, ở đó mỗi cạnh có khoảng cách đơn vị Đây là kiểu thực hiện
mà Edmonds và Karp áp dụng, độ phức tạp của nó là O(VE2)
2.2.6 Ứng dụng thuật toán Ford - Fulkerson
Mạng có nhiều điểm phát và điểm thu
Xét mạng G với p điểm phát s1, s2, , sp và q điểm thu t1, t2, , tq Một luồng có thể đi từ một điểm phát bất kỳ đến một điểm thu bất kỳ, được định nghĩa tương tự như trong bài toán luồng cực đại Bài toán cực đại từ các điểm phát đến các điểm thu
có thể đưa về bài toán với một điểm phát và một điểm thu bằng cách đưa vào thêm một điểm phát giả s và một điểm thu giả t Đỉnh s được nối tới tất cả các điểm phát
s1, s2, , sp và đỉnh t được nối với tất cả các điểm thu t1, t2, , tq bằng cung có khả năng thông qua là +, 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 khác bề ngoài có vẻ như 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
Trang 31toá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 v V được so khớp bằng cách so khớp M nếu có cạnh f trong M là liên thuộc trên v, bằng không v không khớp Một so khớp cực đại là một so khớp bản số cực đại, nghĩa là một so khớp M sao cho với một so khớp M’ bất kỳ, ta có |M| ≥ |M’| Trong đoạn này ta mặc định rằng tập hợp đỉnh có thể chia thành V = L R, trong đó L và R rời nhau và tất cả các cạnh trong E nằm giữa
L và R
Bài toán tìm một so khớp cực đại trong một đồ thị hai nhánh có nhiều ứng dụng ứng dụng thực tế Ví dụ, ta có thể xét việc so khớp một tập hợp L máy với một tập hợp R công việc được thực hiện đồng thời Ta xem sự hiện diện của một cạnh (u, v) trong E có nghĩa là một máy cụ thể u L có thể thực hiện một công việc v R Một so khớp cực đại cung cấp công việc cho càng nhiều máy càng tốt
Hình 8: Một đồ thi hai nhánh G = (V, E) với phân hoạch đỉnh V = L R
(a) Một so khớp với bản số 2
(b) Một so khớp với bản số 3
Trang 32Tìm một so khớp hai nhánh cực đại
Ta có thể dùng thuật toán Ford - Fulkerson để tìm một so khớp cực đại trong một đồ thị hai nhánh vô hướng G = (V, E) trong thời gian đa thức Ta định nghĩa mạng luồng tương ứng G’ = (V’, E’) với đồ thị hai nhánh G như sau Ta cho đỉnh phát s và đỉnh thu t là các đỉnh mới không nằm trong V, và ta thấy V’ = V{s, t} Nếu phân hoạch đỉnh của G là V = L R, các cạnh có hướng của G’ sẽ căn cứ vào:
E’ = {(s, u)|u L} {(u, v)| u L , v R và (u, v) E} {(v, t)|vR}
Để hoàn thành phần xây dựng, ta gán dung lượng đơn vị cho mỗi cạnh trong E’ Định lý sau chứng tỏ một so khớp trong G 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 đỉnh V = L R,
và cho G’ = (V’, E’) là mạng luồng tương ứng của nó Nếu M là một so khớp trong G thì có một luồng có giá trị số nguyên trong f trong G’ với giá trị |f| = |M| Ngược lại, nếu f là một luồng có giá trị số nguyên trong G’ thì có một so khớp M trong G với bản số |M| = |f|
Trang 33Chứng minh:
Trước tiên ta chứng tỏ một so khớp M trong G tương ứng với một luồng
có giá trị số nguyên trong G’ Định nghĩa f như sau Nếu (u, v) M thì f[s, u] = f[u, v] = f[v, t] = 1 và f[u, s] = f[v, u] = f[t, v] = -1 Với tất cả các cạnh khác (u, v) E’ thì f[u, v] = 0
Ta thấy, mỗi cạnh (u, v) M tương ứng với 1 đơn vị của luồng trong G’ trên đường tăng luồng s u v t Hơn nữa, các đường tăng luồng mà các cạnh trong M cảm sinh có đỉnh rời nhau, ngoại trừ s và t Để chứng minh f thỏa mãn các tính chất luồng, ta chỉ cần nhận xét rằng chỉ có thể có f bằng cách tăng cường luồng dọc theo mỗi đường tăng luồng đó Luồng mạng qua lát cắt (L{s},
R{t}) bằng với M, như vậy giá trị của luồng sẽ là |f| = |M|
Để chứng minh phần đảo, ta cho f là một luồng có giá trị số nguyên trong G’ và cho M = {(u, v) | u L, v R và f[u, v] > 0}
Mỗi đỉnh u L chỉ có một cạnh vào là (s, u) và dung lượng của nó là 1 Như vậy, mỗi u L có tối đa một đơn vị của luồng mạng dương nhập vào nó Bởi f
có giá trị số nguyên, với mỗi u L, 1 đơn vị của luồng mạng dương sẽ nhập vào
u nếu và chỉ nếu có chính xác một đỉnh v R sao cho f[u, v] = 1 Như vậy, có tối
đa một cạnh rời từng u L sẽ mang luồng mạng dương Có thể tạo một đối số đối xứng cho mỗi v R Do đó, tập hợp M được định nghĩa trong phát biểu của định nghĩa là một so khớp
Để thấy |M| = |f|, ta nhận xét rằng với mọi đỉnh so khớp u L, ta có f[s, u]=1
và với mọi cạnh (u, v) E\M ta có f[u, v] = 0 Bởi vậy dùng định lý 1, tính chất
1 của luồng mạng, và không có cạnh nào từ L tới t ta được:
Trang 34Bà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 đỉnh V = L R, ở đó
|L| = |R| Với bất kỳ X V, hãy định nghĩa láng giềng của X khi:
N(X) = {y V | (x, y) E và một x X}
Nghĩa là tập hợp các đỉnh kề với một phần tử của X Khi đó tồn tại một so khớp hoàn hảo trong G nếu và chỉ nếu |A| ≤ |N(A)| với mọi tập hơp con A L
2.3 Thuật toán Preflow - Push
Thuật toán Ford-Fulkerson không những là một cách tiếp cận thông minh
mà việc chứng minh tính đúng đắn của nó cho ta nhiều kết quả thú vị về mối liên
hệ giữa luồng cực đại và lát cắt hẹp nhất Tuy vậy độ phức tạp tính toán của thuật toán Ford-Fulkerson là khá lớn, dẫn tới những khó khăn khi thực hiện với
dữ liệu lớn Trong phần này ta sẽ trình bày một lớp các thuật toán nhanh nhất cho tới nay để giải bài toán luồng cực đại, tên chung của các thuật toán này là Preflow-Push
Ta có thể hình dung mạng như một hệ thống đường ống dẫn nước từ với điểm phát s tới điểm thu t, các cung là các đường ống, khả năng thông qua là lưu lượng đường ống có thể tải Nước chảy theo nguyên tắc từ chỗ cao về chỗ thấp Với một lượng nước lớn phát ra từ s tới một đỉnh v, nếu có cách chuyển lượng nước đó sang địa điểm khác thì không có vấn đề gì, nếu không thì có hiện tượng "quá tải" xảy ra tại v, ta "dâng cao" điểm v để lượng nước đó đổ sang điểm khác (có thể đổ ngược về s) Cứ tiếp tục quá trình như vậy cho tới khi không còn hiện tượng quá tải ở bất cứ điểm nào Cách tiếp cận này hoàn toàn khác với thuật toán Ford- Fulkerson: thuật toán Ford-Fulkerson cố gắng tìm một dòng chảy phụ (fP) từ s tới t và thêm dòng chảy này vào luồng hiện có đến khi không còn dòng chảy phụ nữa Các thuật toán đẩy luồng trước thay vì xét nguyên cả mạng thặng dư G = (V, E) như thuật toán Ford - Fulkerson để tìm một đường tăng luồng, thì nó lần lượt làm việc trên từng đỉnh một, và chỉ xem xét các láng giềng của đỉnh trong mạng thặng dư Vả lại khác với phương pháp Ford - Fulkerson, các thuật toán đẩy luồng trước không duy trì tính chất bảo toàn
Trang 35luồng xuyên suốt quá trình thực hiện Tuy nhiên, chúng duy trì một luồng trước,
là một hàm f : V x V R thỏa tính chất 2, các hạn chế dung lượng và phép nới lỏng dưới đây về sự bảo toàn luồng : f(V, u) ≥ 0 với tất cả các đỉnh u V\{s} Nghĩa là ngoài điểm phát ra, luồng mạng vào mỗi đỉnh đều không âm Ta gọi luồng mạng vào mỗi đỉnh u là luồng thặng dư vào u, căn cứ vào e(u) = f(V, u)
Ta nói một đỉnh u V\{s, t} là quá tải (tràn) nếu e(u) > 0
f[ , ]
Đỉnh v V\{s} được coi là quá tải nếu FlowIn[v] > 0 Khái niệm quá tải chỉ
đề cập tới các đỉnh không phải là đỉnh phát cũng không phải là đỉnh thu
Khái niệm Preflow tương tự như định nghĩa luồng, chỉ khác nhau ở tính chất 3
Vì vậy ta cũng có khái niệm mạng thặng dư Gf ứng với preflow tương tự như đối với luồng
2.3.2 Các phép toán cơ bản
Từ phần mô tả trên đây, ta thấy thuật toán đẩy luồng trước thực hiện hai phép toán cơ bản: Đẩy phần thặng dư của luồng từ một đỉnh đến một trong các láng giềng của nó và nâng một đỉnh Khả năng áp dụng của các phép toán này tùy thuộc vào chiều cao của các đỉnh, mà sau đây ta sẽ đĩnh nghĩa một cách chính xác
Trang 36a Thao tác khởi tạo
Ta gọi phép cho tương ứng mỗi đỉnh v với một số tự nhiên h[u] là một hàm
độ cao Trước hết khởi tạo hàm độ cao như sau:
Cuối cùng ta phải tính các giá trị FlowIn vừa khởi tạo:
For (u V) do FlowIn[u] := f[s, u];
b Thao tác push:
Định lý10: Cho hàm G = (V, E) là một mạng luồng, cho f là một luồng trước
trong G và cho h là một hàm chiều cao trên V.Với hai đỉnh bất kỳ u, v V, nếu h[u] > h[v] + 1, thì (u, v) không phải là một cạnh trong đồ thị thặng dư
Thao tác Push(u, v) được áp dụng khi 3 điều kiện sau được thỏa mãn:
u bị quá tải (tràn): (u ≠ s) and (u ≠ t ) and (FlowIn[u] > 0)
(u, v) là cung trên Gf: cf[u, v] = c[u, v] - f[u, v] > 0
Đỉnh u cao hơn đỉnh v : h[u] = h[v] + 1
Khi đó thao tác Push(u, v) sẽ thực hiện qua các bước sau:
Trang 37Thao tác Push hoạt động như sau: Đỉnh u được mặc nhận có một phần thặng
dư dương FlowIn[u], và dung lượng thặng dư của [u, v] dương Ta có thể chuyển tới = min(FlowIn[u], cf[u, v]) đơn vị của luồng từ u đến v mà không làm cho FlowIn[u] trở thành âm hoặc dung lượng c[u, v] trở thành vượt mức Như vậy nếu f là một luồng trước trước khi Push được gọi, thì nó vẫn giữ nguyên là một luồng trước sau khi thực hiện thao tác Push
Ta thấy rằng không có gì trong thao tác Push tùy thuộc vào các chiều cao của
u và v, vả lại ta không gọi trừ khi h[u] = h[v] + 1 Như vậy, luồng thặng dư chỉ được đẩy xuống một đỉnh khác theo chênh lệch chiều cao là 1 Theo định lý 10, không có cạnh thặng dư tồn tại giữa hai đỉnh có các chiều cao khác nhau hơn 1,
và như vậy sẽ không được gì nếu cho phép đẩy luồng theo một đơn vị chiều cao lớn hơn 1
Phép toán Push(u, v) là một phép đẩy từ u đến v Nếu áp dụng phép toán đẩy cho một cạnh (u, v) rời một đỉnh u, ta cũng nói rằng phép toán đẩy áp dụng cho
u Nó sẽ là một phép đẩy bão hòa nếu cạnh (u, v) trở thành bão hòa (cf[u, v] = 0
sau khi đẩy); còn không nó là một phép đẩy không bão hòa Nếu một cạnh là bão
hòa thì nó không xuất hiện trong mạng thặng dư nữa
c Thao tác Lift
Thao tác Lift được áp dụng khi hai điều kiện sau được thỏa mãn:
u bị quá tải: (u ≠ s) and (u ≠ t ) and (FlowIn[u] > 0)
u không chuyển được luồng xuống nơi thấp hơn: (u, v) Ef => h[u] < h[v] Khi đó thao tác Lift(u) đặt h[u] := 1 + min(h[v] | (u, v) Ef) Bản chất của thao tác Lift là khi đỉnh u bị quá tải và cũng không chuyển tải được cho đỉnh khác thì ta đẩy u lên cao hơn đỉnh thấp nhất có thể chuyển tải sang đúng một đơn vị độ cao
Khi gọi thao tác Lift ta nói rằng đỉnh u được nâng Điều quan trọng cần lưu ý là khi u được nâng, Ef phải chứa ít nhất một cạnh rời u, sao cho phép giảm nằm trên một tập hợp không trống Sự việc này là do giả thiết u quá tải Bởi FlowIn[u] > 0, ta có FlowIn[u] = f[V, u] > 0 và do đó phải có ít nhất một đỉnh v sao cho f[u, v] > 0 Vậy thì: cf[u, v] = c[u, v] - f[u, v]
= c[u, v] + f[v, u] > 0