canuc80k4906·7/50

Ghép Đôi Sân Khấu

Nộp bài trên LQDOJ

Bài 49 · Network Flow

Câu lạc bộ có bạn thuộc nhóm và bạn thuộc nhóm . Ban tổ chức đã ghi nhận cặp có thể cùng biểu diễn.

Hãy chọn nhiều cặp nhất có thể. Mỗi cặp phải gồm một người từ mỗi nhóm, phải nằm trong danh sách cho trước, và mỗi người chỉ được xuất hiện trong tối đa một cặp. Nếu có nhiều cách tối ưu, bạn có thể in bất kỳ cách nào.

Input

  • Dòng đầu chứa ba số nguyên .
  • Mỗi trong dòng tiếp theo chứa , biểu diễn một cặp hợp lệ giữa người của nhóm và người của nhóm . Một cặp có thể xuất hiện lặp trong input.

Output

  • Dòng đầu in số cặp lớn nhất .
  • Tiếp theo in đúng dòng, mỗi dòng gồm của một cặp được chọn.

Constraints

  • .
  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4 3 7
1 1
1 2
2 1
2 3
3 2
4 2
4 3

Output

3
1 1
2 3
3 2

Giải thích: Ba cặp được in dùng ba người khác nhau ở mỗi phía. Nhóm chỉ có ba người nên không thể chọn hơn cặp.

Lời giải tóm tắt
  • Phân tích: Đây là matching hai phía. Tạo một nút cho mỗi người; mỗi đơn vị flow đi theo đường S -> A_i -> B_j -> T biểu diễn việc chọn cặp (i,j).
  • Thuật toán: Nối S tới mọi nút nhóm A capacity 1, nối mỗi cặp tiềm năng từ A sang B capacity 1, và nối mọi nút nhóm B tới T capacity 1. Chạy Dinic, sau đó duyệt các cạnh A-B gốc; cạnh mang một đơn vị flow là cặp được chọn.
  • Chứng minh: Mọi matching kích thước r tạo được flow nguyên giá trị r. Ngược lại, các capacity biên bằng 1 bảo đảm một flow nguyên không dùng một người hai lần, nên các cạnh A-B mang flow tạo thành matching cùng kích thước. Do đó maximum flow và maximum matching có cùng giá trị, còn phần khôi phục cho một phương án tối ưu.
  • Độ phức tạp: Cận Dinic tổng quát là O(V^2E), với V=n+m+2, E=O(n+m+k); bộ nhớ O(V+E).