canuc80k6402·3/50

Các Cặp Tương Thích

Nộp bài trên LQDOJ

Bài 64 · Matching

Có thành viên ở nhóm trái và thành viên ở nhóm phải. Danh sách cặp được cho biết trước; cặp nghĩa là thành viên của nhóm trái có thể làm việc cùng thành viên của nhóm phải.

Hãy chọn nhiều cặp tương thích nhất sao cho không thành viên nào xuất hiện trong hai cặp được chọn. Ngoài số lượng tối đa, bạn phải in ra một cách chọn đạt được số lượng đó.

Input

  • Dòng đầu chứa ba số nguyên và .
  • Mỗi dòng trong dòng tiếp theo chứa hai số nguyên và , mô tả một cặp tương thích. Thành viên nhóm trái được đánh số từ đến , thành viên nhóm phải được đánh số từ đến .

Output

  • Dòng đầu in số nguyên , là số cặp lớn nhất có thể chọn.
  • Trong dòng tiếp theo, mỗi dòng in một cặp được chọn. Các cặp phải có trong danh sách đầu vào; mọi chỉ số ở mỗi phía phải đôi một khác nhau.

  • Nếu có nhiều phương án tối ưu, bạn có thể in bất kỳ phương án nào.

Constraints

  • .
  • .
  • Mỗi cặp đầu vào thỏa .
  • Không có cặp nào xuất hiện hai lần trong input.

Scoring

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

Example

Test 1

Input

4 4 5
1 1
1 2
2 1
3 3
4 3

Output

3
1 2
2 1
3 3

Giải thích: Ba cặp được in không dùng chung thành viên và đều có trong input. Thành viên và ở nhóm trái cùng chỉ có thể dùng thành viên ở nhóm phải, nên không thể chọn đủ bốn cặp.

Lời giải tóm tắt
  • Phân tích: Mỗi thành viên nhóm trái và nhóm phải là một đỉnh; các cặp tương thích là các cạnh của đồ thị hai phía. Tập cặp hợp lệ cần in chính là một matching, và đề yêu cầu matching có kích thước lớn nhất.
  • Thuật toán: Duy trì cặp hiện tại của từng đỉnh phải. Lần lượt với mỗi đỉnh trái chưa ghép, tìm một đường tăng bằng DFS: đi qua một cạnh chưa dùng, rồi nếu đỉnh phải đã được ghép thì thử chuyển đỉnh trái cũ sang lựa chọn khác. Sau khi không còn đường tăng, truy ngược mảng ghép để in các cặp.
  • Chứng minh: Mỗi lần DFS thành công, việc đảo các cạnh trên đường tăng làm kích thước matching tăng đúng một và vẫn không có hai cạnh chung đỉnh. Khi mọi lần tìm tiếp theo đều thất bại, matching không còn đường tăng; theo định lý Berge, nó là matching cực đại về kích thước. Các cặp in ra lấy trực tiếp từ matching nên đều thuộc input và không trùng đỉnh.
  • Độ phức tạp: Với cách cài đặt DFS đường tăng, thời gian O(n·k) và bộ nhớ O(n+m+k).