You are on page 1of 11

Luồng – Cặp ghép cơ bản

https://lqdoj.edu.vn/contest/dnoi202108/ranking/

chia sẻ
Các nguồn tài liệu
• VNOI Wiki - Luồng, cp-algorithms.com
• Giải thuật lập trình (chuỗi 4 bài viết về luồng) viết từ bản chất &
chứng minh toán nên vô cùng đầy đủ về kiến thức, tuy nhiên sẽ bị khó
đọc (hàn lâm)
• Lý thuyết cặp ghép 1
• Chuỗi bài cặp ghép của Giải thuật lập trình
• Video bài giảng của thầy Bùi Thế Tâm : 1, 2, 3
Mô hình bài toán luồng
• Cho đồ thị . Trên mỗi cạnh có thông lượng .
• Yêu cầu : Cho trước 2 đỉnh . Tìm cách gán trên mỗi cạnh một số , sao
cho :
+
+ Với mọi khác , thì : (vào bao nhiêu – ra bấy nhiêu)
+ là lớn nhất.
• Vui lòng tìm đọc chi tiết hơn ở các nguồn tài liệu.
Ngắn gọn về các thuật toán tìm luồng
• Phương pháp Ford-Fulkerson : trí tuệ nằm trong việc đẩy luồng theo
cung ngược : Như là một kiểu backtrack.
• Edmond-Karps : Sở dĩ có được độ phức tạp thời gian như vậy vì sau
mỗi lần tăng luồng, luôn có thêm ít nhất một cạnh bị bão hòa.
• Dinitz : có thể coi như phiên bản mở rộng – nâng cao hơn thuật trên.
• Preflow-push Relabel : Có thể xem như là thuật toán luồng nhanh
nhất hiện tại. Tuy nhiên rất phức tạp không khuyến khích học.
Bài toán cặp ghép.
Mô hình bài toán cặp ghép :
Trên đồ thị G(V,E), cặp ghép là một tập cạnh M, sao cho không có 2
cạnh nào trong M có chung đầu mút.
Cặp ghép cực đại nếu |M| là lớn nhất. Ta thường tìm cặp ghép trên đồ
thị hai phía.
Ví dụ thực tế : Đề bài Phân việc.

Lý thuyết cặp ghép 1


Thuật toán tìm cặp ghép đơn giản
Trai
https://www.giaithuatlaptrinh.com/?p=2169
Gái
Pseudo-code thuật toán : 1
Vector<int> đồ_thị[]; 5
Bool tìm_bồ_mới(int u) {
if (đã thăm u) return false; thăm(u)=lượt; 2

for (bạn v kề u) 6
nếu (bồ[v] chưacó hoặc tìm_bồ_mới(bồ[v]))
bồ[v] = u, return true; 3
return false; //cô đơn
7
}
4

• (giựt bạn trai – bạn gái) thầy ĐCĐH


Dùng luồng giải cặp ghép
Về bản chất, bài toán cặp ghép chỉ là trường hợp đặc biệt của luồng :
Giải các bài tập
Tên các bài nằm ngoài contest nhóm : bài tuần 2 thầy Đông (link), VNOJ
Mafia
• Đọc đề, nhận ra ngay 2 ‘trở ngại’ : trọng số theo đỉnh (không theo
cạnh) và yêu cầu tính chi phí chặn ít nhất  từng bước giải quyết
• Trọng số đỉnh? Cần phải đưa về trọng số cạnh để áp dụng mô hình
luồng. Ta có mẹo sau : tách một đỉnh thành hai đỉnh . Nối một cung ,
thông lượng . Với mỗi cung trên đồ thị gốc, ta thay thế thành , tương
tự với mỗi cung trên đồ thị gốc, ta thay thế thành .
• Chi phí chặn ít nhất : Đây là một câu hỏi mang tính lí thuyết. Trên
mạng luồng, giá trị của lát cắt hẹp nhất chính bằng giá trị luồng cực
đại [Chứng minh… (chứng minh khá hay)]
Xem bài giảng về lát cắt của Hiếu : Lát cắt cực tiểu
Star
Đây là một bài nâng cao, nhằm giới thiệu về luồng 2 cận
• Ý tưởng : Ta chặt nhị phân đáp án. Với , cần kiểm tra xem ta có thể
khôi phục bảng để có độ ổn định hay không?
Để đạt được độ ổn định là , số lượng số 1 trên mỗi hàng / cột phải
nằm trong đoạn .
• Ta đưa bảng, về đồ thị như sau : Ô tạo nên một ràng buộc giữa hàng
và cột . Bạn hãy thử nghĩ cách xây dựng đồ thị nào? (tìm cách liên hệ
giữa các đỉnh , đỉnh đại diện cho hàng, đỉnh đại diện cho cột)
Luồng hai cận
Mô hình hoàn toàn giống bài toán luồng, chỉ khác ở điểm sau :

• Cách giải quyết : Thêm các đỉnh, cung vào đồ thị gốc để chuyển bài
toán luồng 2 cận về bài toán luồng 1 cận (xong rồi dùng y thuật luồng
bình thường để giải thôi).
[Người viết đang ôn bài, các bạn thông cảm]
[Tham khảo slide của Hiếu]

You might also like