Professional Documents
Culture Documents
Luồng - Cặp ghép cơ bản
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.
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
• 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]