Phân Tích Luồng Cực Đại Trong Hệ Thống Mạng Luồng Bằng Phương Pháp Ford-Fulkerson

MỤC LỤC

Phương pháp Ford - Fulkerson

Phương pháp Ford-Fulkerson tuỳ thuộc vào ba ý tưởng quan trọng vượt trên phương pháp và có nhiều liên quan đến thuật toán và bài toán luồng: các mạng thặng dư, các lộ trình tăng cường và các phần cắt. Các ý tưởng này là thiết yếu đối với định lý max-flow min-cut quan trọng (Định lý 26.7), định rừ đặc điểm đối với giá trị của một luồng cực đại theo dạng các phần cắt của mạng luồng. Vào mỗi lần lặp lại, ta tăng giá trị luồng bằng cách tìm một “lộ trình tăng cường” mà ta có thể đơn giản xem nó như một lộ trình từ nguồn s đến bồn t dọc theo đó ta có thể đẩy thêm luồng, rồi tăng cường luồng dọc theo lộ trình này.

Theo định nghĩa về mạng thặng dư, mỗi cạnh (u, v) trên một lộ trình tăng cườ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. Nếu xem mạng thặng dư trong hình như một mạng luồng, ta có thể chuyển đi tới 4 đơn vị của luồng mạng bổ sung qua mỗi cạnh của lộ trình này mà không vi phạm sự ràng buộc dung lượng, bởi dung lượng thặng dư nhỏ nhất trên lộ trình này là ( , ) = 4. Kiểu thực thi dưới đây của phương pháp tính toán luồng cực đại trong mỗi đồ thị G = (V, E) bằng cách nhập luồng mạng ƒ[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 nó được chọn tồi, thuật toán 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ó không cần hội tụ theo giá trị cực đại luồng. Có thể cải thiện cận trên FORD-FULKERSON nếu ta thực thi phép tính của lộ trình tăng cường p trong dòng 4 bằng một thuật toán tìm kiếm độ rộng đầu tiên, nghĩa là, nếu lộ trình tăng cường là một lộ trình ngắn nhất từ s đến t trong mạng thặng dư, ở đó mỗi cạnh có một khoảng cách đơn vị (trọng số). Nó không thể tái xuất hiện về sau trên một lộ trình tăng cường khác cho đến sau khi luồng mạng từ u đến v giảm và đều này chỉ xảy ra nếu (v, u) xuất hiện trên một lộ trình tăng cường.

Bởi mỗi lần lặp lại của FORD-FULKERSON có thể được thực thi trong O(E) Thời gian khi thuật toán tìm kiếm độ rộng đầu tiên tìm thấy lộ trình tăng cường, nên tổng thời gian thực hiện của thuật toán Edmonds-Karp là O(VE2). Nêu cách xác định khả năng liên thông cạnh của một đồ thị không hướng G = (V, E) bằng cách chạy một thuật toán luồng cực đại trên tối đa |V| mạng luồng, mỗi mạng có O(V) đỉnh và O(E) cạnh.

Hình 26.4 (a) Mạng luồng G và luồng ƒ của Hình 26.4(b).
Hình 26.4 (a) Mạng luồng G và luồng ƒ của Hình 26.4(b).

So khớp hai nhánh cực đại

Khả năng liên thông cạnh [edge connectivity] của một đồ thị không hướng là số lượng cực tiểu k cạnh phải được gỡ bỏ để làm gián đoạn đồ thị. Ta có thể dùng phương pháp Ford-Fulkerson để tìm ra một so khớp cực đại trong một đồ thị hai hánh không hướng G = (V,E) trong thời gian đa thức trong V và E. Để xác minh f thỏa tính đối xứng ghềnh, các hạn chế dung lượng, sự bảo toàn luồng lưu, ta chỉ cần nhận xét rằng có thể có f bằng cách tăng cường luồng dọc theo mỗi lộ trình như vậy.

Theo trực giác, 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ó. Nếu hàm dung lượng c chỉ tiếp nhận các giá trị tích phân, thì luồng cực đại f được tạo bằng phương pháp Ford-Fulkerson sẽ có tính chất fcó giá trị số nguyên. Bản số của một so khớp cực đại trong một đồ thị hai nhánh G là giá trị của một luồng cực đại trong mạng luồng tương ứng G’ của nó.

Như vậy, cho một đồ thị hai nhánh không hướng G, ta có thể tìm ra một so khớp cực đại bằng cách tạo mạng luồng G’, chạy phương pháp Ford-Fulkerson, và trực tiếp có được một so khớp cực đại M từ luồng cực đại có giá trị số nguyên f đã tìm thấy. Nêu một cận trên thích hợp trên chiều dài của bất kỳ lộ trình tăng cường nào tìm thấy trong G’ trong khi thi hành FORD-FULKERSON. Chứng minh mọi đồ thị nhánh đều - d có một so khớp của bản số L bằng cách chứng tỏ một phần cắt cực tiểu của mạng luồng tương ứng có dung lượng L.

Hình 26.8 minh họa khái niệm của một so khớp.
Hình 26.8 minh họa khái niệm của một so khớp.

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) để tìm ra một lộ trình tăng cường, các thuật toán đẩy luồng trước lần lượt làm việc trên từng đỉnh một, chỉ xem xét các láng giềng của đỉnh trong mạng thặng dư. Trực giỏc đằng sau phương phỏp đẩy luồng trước được hiểu rừ nhất dưới dạng cỏc luồng chất lỏng: ta xét một mạng luồng G=(V,E) là một hệ thống các ống dẫn tương kết của các dung lượng đã cho. Áp dụng tính tương tự này cho phương pháp Ford-Fulkerson, ta có thể nói rằng mỗi lộ trình tăng cường trong mạng sẽ làm cho một luồng chất lỏng bổ sung nâng lên, mà không có các điểm nhánh, chảy từ nguồn đến bồn.

Để luồng trước [preflow] trở thành một luồng “hợp pháp”, thuật toán gửi một phần thặng dư gom lại trong các bồn chứa của các đỉnh tràn trở về nguồn bằng cách tiếp tục nâng các đỉnh lên bên trên chiều cao cố định. 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. Nó mặc nhận rằng các dung lượng được căn cứ vào một hàm thời gian bất biến c và các dụng lượng thặng du cũng có thể được tính toán trong thời gian bất biến đã cho c và f.

Nói cách khác, ta có thể nâng một đỉnh tràn u nếu với mọi đỉnh v mà ta có dung lượng thặng dư từ u đến v, luồng không thể được đẩy từ u đến v bởi v không xuống đồi từ u. Nếu thuật toán GENERIC-PREFLOW-PUSH kết thúc khi chạy trên một mạng luồng G = (V,E) với nguồn s và bồn t, thì luồng trước f mà nó tính toán là một luồng cực đại cho G. Ngoài ra, một phép đẩy bão hòa từ một đỉnh u đến một đỉnh v làm tăng Φtối đa là 2|V|, bởi không có chiều cao nào thây đổi và chỉ có đỉnh v, mà chiều cao của nó tối đa là 2|V|, mới có khả năng trở thành tràn.

Giờ đây, ta đã ấn định giai đoạn cho phần phân tích dưới đây của thủ tục GENERIC-PREFLOW-PUSH, và do đó của bất kỳ thuật toán nào dựa trên phương pháp đẩy luồng trước. Phân tích thời gian thực hiện của thuật toán đẩy luồng trước chung theo dạng |V|,|E|, và k.(Mách nước: Mỗi cạnh hỗ trợ một phép đẩy không bão hòa bao nhiêu lần trước khi nó trở thành bão hòa?).

Thuật toán nâng tới trước

Một đỉnh tràn u được xả [discharged] bằng cách đẩy tất cả toàn bộ luồng thặng dư của nó qua các cạnh chấp nhận được đến các đỉnh lân cận, nâng u khi cần để khiến các cạnh rời u trở thành chấp nhận được. Trong mỗi phần, con số bên trong mỗi đỉnh là phần thặng dư của nó tại đầu của lần lặp lại đầu tiên nêu trong phần đó, và mỗi đỉnh được nêu theo chiều cao của nó xuyên suốt phần. (g) Đỉnh y giờ đây không có luồng thặng dư, và DISCHARGE kết thúc. Trong ví dụ này, DISCHARGE bắt đầu và hoàn tất với biến trỏ hiện hành tại đầu của danh sách láng giềng, nhưng nói chung điều này không nhất thiết phải như vậy. Dòng 4 nâng đỉnh u, rồi dòng 5 chỉnh lại láng giềng hiện hành của u trở thành đầu tiên trong N[u]. Bổ đề 26.29 dưới đây phát biểu phép nâng ứng dụng trong tình huống này).

Nếu v không NIL và (u,v) là một cạnh chấp nhận được (được xá định bởi đợt kiểm tra trong dòng 6), thì dòng 7 đẩy một phần (hoặc có thể tất cả) phần thặng dư của u đến đỉnh v. Phép xác định này được thực hiện bằng cách lưu chiều cao của u trong biến old-height trước phép toán xả (dòng 7) và so sánh chiều cao đã lưu này với chiều cao u sau đó (dòng 9). Trước tiên, nhận thấy nó chỉ thực hiện phép đẩy và nâng khi chúng được áp dụng, bởi bổ đề 26.29 bảo đảm DISCHARGE chỉ thực hiện chúng khi chúng được áp dụng.

Bởi y được nâng lên, nên nó được dời đến đầu của L.(c) Đỉnh x giờ đây theo y trong L, và do đó nó lại được xả, đẩy tất cả 5 đơn vị của luồng thặng dư đến t. Nếu ta chạy LIFT-TO-FRONT trên một mạng luồng G’= (V,E) có nguồn s và bồn t, thì mỗi lần lặp lại của vòng lặp while trong các dòng 6-11 sẽ duy trì sự bất biến rằng trong danh sách L là một đợt xắp xếp tôpô của các đỉnh trong mạng chấp nhận được Gf,h = (V,Ef,h). Do đó, với tất cả các đỉnh, tổng lượng công việc thực hiện trong việc đưa các biến trỏ ra phía trước trong các danh sách láng giềng là O(VE) theo bổ đề thiết lập quan hệ (Bài tập 5.4-1).

Hình 26.10 rà qua vài lần lặp lại của vòng lặp while trong các dòng 1-8, thi hành  đến khi nào đỉnh u có phần thặng dư dương
Hình 26.10 rà qua vài lần lặp lại của vòng lặp while trong các dòng 1-8, thi hành đến khi nào đỉnh u có phần thặng dư dương