canuc80k6405·6/50

Lát Domino Tối Đa

Nộp bài trên LQDOJ

Bài 64 · Matching

Cho một bảng gồm hàng và cột. Mỗi ô là một trong hai loại:

  • .: ô trống, có thể được phủ;
  • #: ô bị chặn, không được sử dụng.

Một quân domino phủ đúng hai ô trống có chung một cạnh. Hai quân domino không được phủ chung ô. Hãy đặt được nhiều quân domino nhất và in ra một cách đặt đạt số lượng đó.

Trong bảng kết quả, mỗi domino được biểu diễn bằng hai mũi tên hướng vào nhau:

  • nếu domino nằm ngang, ô bên trái là > và ô bên phải là <;
  • nếu domino nằm dọc, ô phía trên là và ô phía dưới là ^.

Những ô trống không được phủ vẫn là ., còn mọi ô bị chặn vẫn là #.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi dòng trong dòng tiếp theo chứa đúng ký tự, mô tả một hàng của bảng.

Output

  • Dòng đầu in số nguyên , là số domino lớn nhất có thể đặt.
  • Trong dòng tiếp theo, in bảng kết quả theo quy ước mũi tên ở trên. Nếu có nhiều cách đặt tối ưu, bạn có thể in bất kỳ cách nào.

Constraints

  • .
  • Mỗi ký tự của bảng là . hoặc #.

Scoring

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

Example

Test 1

Input

2 2
..
..

Output

2
><
><

Giải thích: Hai domino nằm ngang phủ cả bốn ô. Không thể đặt quá hai domino vì mỗi domino cần hai ô và bảng chỉ có bốn ô trống.

Lời giải tóm tắt
  • Mô hình hóa: Tô các ô theo parity của hàng + cột. Hai ô chung cạnh luôn có parity khác nhau, vì vậy mỗi ô trống parity chẵn có thể nối tới các ô trống kề nó parity lẻ. Mỗi domino tương ứng với một cạnh của đồ thị hai phía này. Điều kiện không chồng ô chính là điều kiện các cạnh được chọn không chung đỉnh.
  • Thuật toán: Dựng mạng luồng gồm nguồn, các ô parity chẵn, các ô parity lẻ và đích. Mọi cạnh có sức chứa 1. Chạy Dinic để tìm luồng cực đại; giá trị luồng là số domino tối đa. Với mỗi cạnh giữa hai ô đã mang một đơn vị luồng, ghi hai mũi tên tương ứng vào bảng.
  • Chứng minh tính đúng đắn: Mỗi cách đặt domino tạo ra một matching: lấy cạnh nối hai ô của từng domino. Ngược lại, mỗi matching tạo ra một cách đặt hợp lệ vì các cạnh không chung đầu mút. Do mạng luồng đơn vị biểu diễn đúng các matching của đồ thị hai phía, luồng cực đại có giá trị bằng kích thước matching lớn nhất, cũng chính là số domino lớn nhất. Các mũi tên được dựng từ những cạnh có luồng nên mô tả đúng một cách đặt đạt giá trị đó.
  • Độ phức tạp: Bảng có V = H·W đỉnh và O(H·W) cạnh. Dinic trên mạng hai phía đơn vị chạy đủ nhanh trong giới hạn; bộ nhớ là O(H·W).