Thuật toán đường đi tăng trưởng ngắn nhất luôn tăng luồng theo đường đi ngắn nhất từ nguồn đến đích trong đồ thị thặng dư. Một phương pháp tự nhiên cho bài toán này là tìm đường đi ngắn nhất trên đồ thị thặng dư bằng thuật toán tìm kiếm theo chiều rộng. Tuy nhiên, phương pháp này tốn quá nhiều thời gian. Ta có thể cải tiến nó bằng cách khai thác tính chất khoảng cách nhỏ nhất từđỉnh i bất kỳ đến đỉnh đích t là không giảm trong tất cả các lần tăng luồng. Thuật toán đường đi tăng trưởng ngắn nhất thực thi bằng cách tăng luồng theo các đường đi có thể chấp nhận. Nó tạo ra một đường đi có thể chấp nhận bằng cách thêm từng cung tại mỗi thời điểm. Thuật toán chứa một đường đi có thể chấp nhận bộ phận (nghĩa là
đường đi từ đỉnh s đến đỉnh i chỉ chứa các cung có thể chấp nhận) và thực hiện hoạt động tiến tới hoặc quay lui từ đỉnh cuối cùng trên đường đi này, ta gọi điểm này là điểm hiện hành. Nếu điểm hiện hành i có (gắn với) cung có thể chấp nhận (i, j), chúng ta thực thi một hành động tiến tới và thêm cung (i, j) vào đường đi có thể chấp nhận bộ phận; ngược lại, chúng ta sẽ thực thi một hành động quay lui và quay lại cung trước đó. Ta lặp lại các hành động này đến khi đường đi có thể chấp nhận bộ phận gặp đỉnh đích và khi đó chúng ta sẽ thực hiện quá trình tăng luồng. Chúng ta lặp lại quá trình này đến khi luồng đạt giá trị cực đại.
Thuật toán đường đi tăng trưởng ngắn nhất;
begin x := 0; xác định các nhãn khoảng cách chính xác d(i); i := s; while d(s) < n do begin if i có một cung có thể chấp nhận then begin advance(i); if i = t then augment và đặt i = s end
KHOA CNTT –
ĐH KHTN
CHƯƠNG 3: LUỒNG CỰC ĐẠI
else retreat(i)
end; end;
Hàm Tiến tới (i) begin
cho (i, j) là cung có thể chấp nhận trong A(i); pred(j) := i và i := j;
end;
HàmQuay lui (i)
begin
d(i) := min{d(j) + 1: (i, j) ∈ A(i) và rij > 0}; if i s then i := pred(i); ≠
end;
Hàm Tăng luồng begin
dùng chỉ số chỉ đỉnh trước pred(i) để xác định đường đi tăng trưởng P từ
nguồn đến đích.
δ:= min{rij : (i, j) ∈ P};
tăngδ đơn vị luồng theo đường đi P;
end;
Thuật toán đường đi tăng trưởng ngắn nhất chạy trong thời gian O(n2m).
Sự cải tiến trong thực tế
Thuật toán đường đi tăng trưởng ngắn nhất kết thúc khi d(s) n. Thực tế
cho thấy thuật toán này tốn quá nhiều thời gian để gán lại nhãn cho các đỉnh và phần lớn thời gian cho việc này được thực hiện sau khi đã xác định được giá trị
KHOA CNTT –
ĐH KHTN
trị luồng cực đại. Chúng ta sẽđưa ra một kỹ thuật có khả năng phát hiện lát cắt nhỏ
nhất và vì thế xác định được sự hiện diện của luồng cực đại trước khi nhãn của
đỉnh s thỏa điều kiện d(s) ≥ n.
Để thực thi phương pháp này, chúng ta dùng một mảng numb có n phần tử, với chỉ số từ 0 đến n – 1. Giá trị numb(k) là số lượng đỉnh có nhãn khoảng cách bằng k. Thuật toán khởi tạo mảng này bằng cách tính các nhãn khoảng cách bằng thuật toán tìm kiếm theo chiều rộng. Các giá trị dương trong mảng numb liên tiếp nhau (nghĩa là numb(0), numb(1), numb(2), …, numb(l) là các số dương đến chỉ số
l và tất cả các mục còn lại sẽ là 0). Do đó khi thuật toán tăng nhãn khoảng cách của một đỉnh từ k1 đến k2, nó trừ 1 từ numb(k1) và cộng 1 vào numb(k2), và kiểm tra xem numb(k1) có bằng 0 hay không. Nếu numb(k1) = 0, thuật toán kết thúc.