Общая проблема SAT (булева выполнимость) является NP-полной. Но 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 за разумное время. Попробуйте этот пример, чтобы убедиться, что ваша программа может обрабатывать большие экземпляры. Самая маленькая программа выигрывает.