canuc80k7701·2/39

Cấu Hình Tùy Chọn

Nộp bài trên LQDOJ

Bài 77 · 2-SAT

Có tùy chọn, mỗi tùy chọn được chọn hoặc không chọn. Mỗi trong yêu cầu gồm hai literal: nghĩa là tùy chọn phải được chọn, còn nghĩa là tùy chọn phải không được chọn. Một yêu cầu được đáp ứng khi ít nhất một trong hai literal của nó đúng. Hãy tìm một cấu hình đáp ứng mọi yêu cầu.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi trong dòng tiếp theo chứa hai literal, mỗi literal gồm một dấu + hoặc - và một chỉ số tùy chọn.

Output

  • Nếu không có cấu hình hợp lệ, in IMPOSSIBLE.
  • Nếu có, in đúng dấu trên một dòng: dấu thứ là + nếu tùy chọn được chọn, và là - nếu không được chọn. Các dấu được phân tách bằng khoảng trắng.

Constraints

  • Mỗi chỉ số nằm trong .

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
+ 1 + 1
- 2 - 2
+ 3 + 3
+ 1 - 2

Output

+ - +

Giải thích: Ba dòng đầu ép chọn tùy chọn , bỏ tùy chọn và chọn tùy chọn ; khi đó dòng cuối có cả hai mong muốn đúng.

Test 2

Input

2 1
+ 1 + 1
- 1 - 1

Output

IMPOSSIBLE

Giải thích: Yêu cầu đầu ép chọn tùy chọn , còn yêu cầu sau ép bỏ nó, nên không có cấu hình hợp lệ.

Lời giải tóm tắt
  • Phân tích: Mỗi đối tượng có đúng hai trạng thái, vì vậy ta tạo một biến Boolean cho nó. Dấu + là literal biến, còn dấu - là literal phủ định; mỗi dòng là một mệnh đề hai literal.
  • Phân tích: Với một clause (A OR B), nếu A sai thì B buộc phải đúng, và ngược lại. Ta thêm hai cung kéo theo NOT A -> B và NOT B -> A.
  • Thuật toán: 1. Tạo hai đỉnh cho mỗi biến, tương ứng với hai literal đối nhau. 2. Chuyển từng ràng buộc của đề thành các clause hai literal rồi thêm các cung kéo theo. 3. Tìm các thành phần liên thông mạnh của đồ thị. 4. Nếu một literal và phủ định của nó nằm cùng thành phần, công thức vô nghiệm. Ngược lại, dùng thứ tự các thành phần để lấy phép gán. 5. Đổi phép gán Boolean thành các dấu +/-; nếu mâu thuẫn SCC thì in IMPOSSIBLE.
  • Chứng minh đúng: Mỗi phép biến đổi ràng buộc ở bước 2 là một tương đương logic, nên phép gán thỏa công thức 2-CNF khi và chỉ khi nó thỏa đề bài. Trong đồ thị kéo theo, nếu một literal và phủ định của nó cùng thành phần liên thông mạnh thì chúng kéo theo lẫn nhau, không thể gán nhất quán. Khi mọi cặp đối nhau thuộc hai thành phần khác nhau, thứ tự tô SCC tạo một phép gán thỏa mọi cung kéo theo, do đó thỏa mọi clause và mọi ràng buộc gốc. Vì vậy thuật toán báo vô nghiệm chính xác và mọi cấu hình được in đều hợp lệ.
  • Độ phức tạp: Thời gian O(V+E) và bộ nhớ O(V+E), trong đó V là số literal và E là số cung kéo theo; với bài này đều tuyến tính theo kích thước input.