Загальна проблема SAT (булева задоволеність) не є повною. Але 2-СБ , де кожне речення має тільки дві змінні, в P . Напишіть розв’язувач для 2-SAT.
Вхід:
Екземпляр 2-SAT, закодований у CNF , наступним чином. Перший рядок містить V, кількість булевих змінних та N, кількість пропозицій. Далі слідує N рядків, кожне з 2 ненульовими цілими числами, що представляють буквальне значення пункту. Позитивні цілі числа представляють задану булеву змінну, а негативні цілі числа - заперечення змінної.
Приклад 1
вхід
4 5
1 2
2 3
3 4
-1 -3
-2 -4
яка кодує формули (х 1 або х 2 ) і (х 2 або х 3 ) і (х 3 або х 4 ) і (не х 1 або не х 3 ) і (не х 2 або не х 4 ) .
Єдине налаштування з 4 змінних, що робить всю формулу істинною, це x 1 = false, x 2 = true, x 3 = true, x 4 = false , тому ваша програма повинна вивести єдиний рядок
вихід
0 1 1 0
що представляють значення істинності змінних V (в порядку від x 1 до x V ). Якщо існує декілька рішень, ви можете вивести будь-яке непусте підмножина з них, по одному на рядок. Якщо рішення немає, потрібно вивести UNSOLVABLE.
Приклад 2
вхід
2 4
1 2
-1 2
-2 1
-1 -2
вихід
UNSOLVABLE
Приклад 3
вхід
2 4
1 2
-1 2
2 -1
-1 -2
вихід
0 1
Приклад 4
вхід
8 12
1 4
-2 5
3 7
2 -5
-8 -2
3 -1
4 -3
5 -4
-3 -7
6 7
1 7
-7 -1
вихід
1 1 1 1 1 1 0 0
0 1 0 1 1 0 1 0
0 1 0 1 1 1 1 0
(або будь-який непорожній підмножина цих 3 рядків)
Ваша програма повинна обробляти всі N, V <100 у розумний час. Спробуйте цей приклад, щоб переконатися, що ваша програма може обробляти великий екземпляр. Найменша програма виграє.