Goldberg–Tarjan Push-Relabel Max Flow
I. Nhắc lại kiến thức từ thuật toán Ford-Fulkerson
1. Các ký hiệu và Khái niệm cơ bản
Thuật toán Push-Relabel hoạt động trên cùng nền tảng mạng luồng như Ford-Fulkerson. Các ký hiệu cơ bản giữ nguyên:
-
: Đồ thị có hướng với là tập đỉnh và là tập cạnh.
-
(Source - Đỉnh nguồn): Nơi luồng bắt đầu đi ra.
-
(Sink - Đỉnh đích): Nơi luồng đổ về.
-
(Capacity - Sức chứa): Lượng tối đa có thể truyền qua cạnh . Nếu không có cạnh, .
-
(Flow - Luồng hiện tại): Lượng thực tế đang chảy qua cạnh .
-
(Residual Capacity - Sức chứa thặng dư):
Điểm khác biệt cốt lõi với Ford-Fulkerson:
Ford-Fulkerson duy trì một luồng hợp lệ (bảo toàn luồng tại mọi đỉnh trung gian) và tăng dần theo từng đường . Push-Relabel thay vào đó duy trì một tiền luồng (preflow) — cho phép các đỉnh trung gian tạm thời có lượng dư — rồi dần dần "cân bằng" lại bằng hai thao tác Push và Relabel.
II. Push-Relabel cho Max Flow Problem
( Để hiểu nhanh thuật toán skip đến Part 3 và 4 để hiểu cách thuật toán hoạt động rồi quay lại Part 1,2 😁😁😁)
2. Các khái niệm cốt lõi của Push-Relabel
Tiền luồng (Preflow)
Một hàm là tiền luồng nếu thỏa mãn:
- Giới hạn sức chứa: với mọi .
- Không bảo toàn âm (Non-negative excess): Tổng luồng vào không nhỏ hơn tổng luồng ra tại mọi đỉnh :
Khác với luồng hợp lệ (yêu cầu bằng 0), tiền luồng cho phép đỉnh trung gian "giữ lại" một lượng dư tạm thời.
Lượng dư tại đỉnh (Excess - )
Lượng luồng "bị kẹt" tại đỉnh , chưa được đẩy tiếp:
- Nếu : đỉnh đang "thừa" luồng, gọi là đỉnh active.
- Điều kiện kết thúc: không còn đỉnh active nào (ngoài và ).
Hàm nhãn độ cao (Height function - )
Một hàm nguyên là hàm nhãn hợp lệ nếu:
Và với mọi cạnh có trong mạng thặng dư:
Hàm nhãn đóng vai trò như "độ dốc": luồng chỉ được đẩy từ nơi cao xuống nơi thấp hơn đúng 1 bậc.
Cạnh chấp nhận được (Admissible Edge) (cạnh khả thi)
Cạnh trong mạng thặng dư được gọi là admissible (cạnh khả thi) nếu:
Chỉ có thể thực hiện thao tác Push trên cạnh admissible.
Đỉnh active
Đỉnh được gọi là active nếu . Thuật toán tiếp tục chừng nào còn tồn tại đỉnh active.
3. Các bước thực hiện thuật toán
( Để hiểu nhanh thuật toán skip đến Part 3 và 4 để hiểu cách thuật toán hoạt động rồi quay lại Part 1,2 😁😁😁)
Ý tưởng chính: Bão hòa tất cả cạnh xuất phát từ ngay từ đầu, tạo ra các đỉnh active, rồi lần lượt "đẩy" lượng dư này xuống (hoặc trả ngược về ) thông qua hai thao tác Push và Relabel.
Thao tác PUSH(u, v)
Điều kiện áp dụng: và là cạnh admissible ( và ).
Thực hiện: Đẩy một lượng từ sang :
Cập nhật:
- Nếu : gọi là saturating push (cạnh bị bão hòa).
- Nếu : gọi là non-saturating push (đỉnh hết dư).
Thao tác RELABEL(u)
Điều kiện áp dụng: và không tồn tại cạnh admissible nào xuất phát từ (tức là với mọi có đều có ).
Thực hiện: Nâng nhãn lên đủ cao để tạo ra ít nhất một cạnh admissible:
Relabel không thay đổi luồng, chỉ thay đổi nhãn để "mở đường" cho Push tiếp theo.
Quy trình các bước chi tiết:
-
Bước 1: Khởi tạo
- Đặt .
- Đặt
- Với mọi cạnh : bão hòa hoàn toàn (saturate):
- ,
- ,
- Với mọi cạnh còn lại: .
-
Bước 2: Chọn đỉnh active
- Tìm một đỉnh có .
- Nếu không còn đỉnh active nào Dừng. Chuyển sang Bước 4.
- Nếu tìm thấy Chuyển sang Bước 3.
-
Bước 3: Kiểm tra cạnh admissible từ
- Kiểm tra xem có tồn tại cạnh với và không.
- Nếu có Thực hiện PUSH$(u, v)$, quay lại Bước 2.
- Nếu không có Thực hiện RELABEL$(u)$, quay lại Bước 3 (kiểm tra lại sau khi nâng nhãn).
-
Bước 4: Kết thúc
- Khi không còn đỉnh active (ngoài và ), tiền luồng hiện tại là luồng hợp lệ cực đại.
- Giá trị luồng cực đại chính là lượng dư tại đỉnh đích:
4. Ví dụ
Lấy graph:
Bước 1: Khởi tạo:
- Đặt , .
-
- Đặt
- Với mọi cạnh : bão hòa hoàn toàn (saturate) ở đây ta có cạnh :
- Ta có
-
-
-
,
-
,
-
,
-
,
-
- Với mọi cạnh còn lại: như
- Đặt

Bước 2: Chọn đỉnh active
-
Tìm một đỉnh có .
- Ta giả định tìm thấy Chuyển sang Bước 3.
-
Bước 3: Kiểm tra cạnh admissible từ
- Ta kiểm tra có tồn tại cạnh với và không . (Ta có thể thấy nhiều cạnh từ A -> v có nhưng lại ko thỏa mãn đk )
- Ta thực hiện RELABEL(A), quay lại Bước 3 (kiểm tra lại sau khi nâng nhãn).
- RELABEL(A)
- Vì và không tồn tại cạnh admissible (hãy dễ hiểu hơn ko có đỉnh nào có và đồng thời thoat mãn điều kiện có )
- quay lại Bước 3:
- Ta thấy có tồn tại cạnh với và
- PUSH(A, B)
- Lúc này cạnh (A,B) đã admissible
- Cập nhật:

(Ta tiếp tục vòn lặp khi ) LẶP LẦN 1:
Bước 2: Chọn đỉnh active
- Tìm một đỉnh có .
- Ta giả định tìm thấy Chuyển sang Bước 3. Bước 3: Ta kiểm tra có tồn tại cạnh với và không .
- Vì ko có ta thực hiện bước RELABEL(B) và PUSH(B, E) Tuy nhiên ở đây ta có:
- Cập nhật:
- (Bạn có thể thấy hiện tại = 1 do trước đó khi chảy vào E capacity (B,E) = 2)

LẶP LẦN 2: Bước 2: Chọn đỉnh active
- Tìm một đỉnh có .
- Ta giả định tìm thấy Chuyển sang Bước 3. Bước 3: Ta kiểm tra có tồn tại cạnh với và không .
- Vì ko có ta thực hiện bước RELABEL(C) và PUSH(C, D) (Bạn có thể thấy hiện tại = 4 do trước đó khi chảy vào D capacity (C,D) = 3)

LẶP LẦN 3: Bước 2: Chọn đỉnh active
- Tìm một đỉnh có .
- Ta giả định tìm thấy Chuyển sang Bước 3. Bước 3: Ta kiểm tra có tồn tại cạnh với và không .
- Vì ko có ta thực hiện bước RELABEL(D) và PUSH(D, E)

LẶP LẦN 4: Bước 2: Chọn đỉnh active
- Tìm một đỉnh có .
- Ta giả định tìm thấy Chuyển sang Bước 3. Bước 3: Ta kiểm tra có tồn tại cạnh với và không .
- Vì ko có ta thực hiện bước RELABEL(C) và PUSH(C, A)

LẶP LẦN 5:

LẶP LẦN 6:

LẶP LẦN 7:
- Dù trực quan ta thấy không còn đường có thể đi vào E nữa những thuật toán vẫn tiếp tục do vẫn thỏa mãn điều kiện ở Bước 2: Tìm một đỉnh có . Do đó các đỉnh còn sẽ chạy về S đến khi các còn lại (Note: trường hợp duy nhất bé hơn 0 do ta quy định từ đầu )

Cuối cùng ta sẽ thu được khi vòng lặp kết thúc.
5. Lưu ý quan trọng về Độ phức tạp
| Biến thể | Chiến lược chọn đỉnh active | Độ phức tạp |
|---|---|---|
| Generic Push-Relabel | Tùy ý | |
| FIFO Push-Relabel | Hàng đợi FIFO | |
| Highest-label Push-Relabel | Đỉnh có lớn nhất |
- So với Ford-Fulkerson (, phụ thuộc vào giá trị luồng) và Edmonds-Karp (), Push-Relabel với FIFO đạt — không phụ thuộc vào giá trị luồng hay số cạnh theo cách tệ nhất.
- Trong thực tế, biến thể Highest-label với thường là lựa chọn tốt nhất cho đồ thị dày.
- Thuật toán này đặc biệt hiệu quả trên các mạng lớn hoặc mạng có giá trị capacity rất lớn, nơi Ford-Fulkerson trở nên không thực tế.
III. References
https://en.wikipedia.org/wiki/Push–relabel_maximum_flow_algorithm https://www.geeksforgeeks.org/dsa/introduction-to-push-relabel-algorithm/ https://www.youtube.com/watch?v=LjNzXyjMu5w (video ví dụ trực quan)
All Rights Reserved