canuc80k6407·8/50

Phân Công Chi Phí Nhỏ Nhất

Nộp bài trên LQDOJ

Bài 64 · Matching

Một công ty có nhân viên và công việc. Chi phí để nhân viên thực hiện công việc là .

Hãy giao cho mỗi nhân viên đúng một công việc, đồng thời mỗi công việc cũng được giao cho đúng một nhân viên, sao cho tổng chi phí nhỏ nhất. Ngoài giá trị tối ưu, bạn phải in ra một phương án đạt được giá trị đó.

Input

  • Dòng đầu chứa số nguyên .
  • Mỗi dòng trong dòng tiếp theo chứa số nguyên. Số thứ trên dòng thứ là .

Output

  • Dòng đầu in tổng chi phí nhỏ nhất.
  • Trong dòng tiếp theo, mỗi dòng in hai số nguyên , nghĩa là giao công việc cho nhân viên . Mỗi chỉ số nhân viên và mỗi chỉ số công việc phải xuất hiện đúng một lần.

  • 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

  • .
  • .

Scoring

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

Example

Test 1

Input

3
9 2 7
6 4 3
5 8 1

Output

9
1 2
2 1
3 3

Giải thích: Phương án trên có chi phí . Mọi phép gán khác đều có tổng chi phí không nhỏ hơn .

Lời giải tóm tắt
  • Mô hình hóa: Nhân viên là phía trái, công việc là phía phải. Cạnh (i,j) có trọng số c[i][j]. Ta cần một perfect matching có tổng trọng số nhỏ nhất.
  • Thuật toán Hungarian: Duy trì các thế đỉnh u[i], v[j] và một matching hiện tại trên các cột. Khi thêm nhân viên i, thuật toán tìm một đường tăng có reduced cost nhỏ nhất. Mảng minv lưu chi phí bổ sung tốt nhất để đi tới từng công việc chưa xét; way lưu đường truy vết. Sau khi cập nhật thế đỉnh và gặp một công việc chưa được ghép, đảo các cạnh trên đường tăng để thêm nhân viên mới.
  • Thuật toán Hungarian: Cuối cùng, p[j] cho biết nhân viên đang nhận công việc j; đảo ánh xạ này để in các cặp theo thứ tự nhân viên.
  • Chứng minh tính đúng đắn: Hungarian duy trì một nghiệm đối ngẫu khả thi và một matching chỉ dùng các cạnh có reduced cost bằng 0. Mỗi vòng tìm đường tăng rồi cập nhật thế với lượng nhỏ nhất cần thiết, nên tính khả thi đối ngẫu được giữ nguyên và xuất hiện một đường tăng gồm các cạnh chặt. Sau n vòng ta có perfect matching. Giá của matching bằng giá nghiệm đối ngẫu, vì vậy theo đối ngẫu mạnh nó có tổng chi phí nhỏ nhất. Các cặp in ra chính là perfect matching đó.
  • Độ phức tạp: Thời gian O(n^3) và bộ nhớ O(n^2).