Ogólny problem SAT (wartość logiczna) jest NP-zupełny. Ale 2-SAT , gdzie każda klauzula ma tylko 2 zmienne, jest w P . Napisz solver dla 2-SAT.
Wejście:
Instancja 2-SAT, zakodowana w CNF w następujący sposób. Pierwszy wiersz zawiera V, liczbę zmiennych logicznych i N, liczbę klauzul. Następnie następuje N linii, każda z 2 niezerowymi liczbami całkowitymi reprezentującymi literały klauzuli. Dodatnie liczby całkowite reprezentują podaną zmienną logiczną, a ujemne liczby całkowite reprezentują negację zmiennej.
Przykład 1
Wejście
4 5
1 2
2 3
3 4
-1 -3
-2 -4
który koduje wzór (x 1 lub x 2 ) i (x 2 lub x 3 ) i (x 3 lub x 4 ) i (nie x 1 lub nie x 3 ) i (nie x 2 lub nie x 4 ) .
Jedynym ustawieniem 4 zmiennych, które sprawiają, że cała formuła jest prawdziwa, jest x 1 = fałsz, x 2 = prawda, x 3 = prawda, x 4 = fałsz , więc twój program powinien wypisać pojedynczy wiersz
wynik
0 1 1 0
reprezentujące prawdziwe wartości zmiennych V (w kolejności od x 1 do x V ). Jeśli istnieje wiele rozwiązań, możesz wypisać dowolny niepusty ich podzbiór, po jednym w wierszu. Jeśli nie ma rozwiązania, musisz wydrukować UNSOLVABLE.
Przykład 2
Wejście
2 4
1 2
-1 2
-2 1
-1 -2
wynik
UNSOLVABLE
Przykład 3
Wejście
2 4
1 2
-1 2
2 -1
-1 -2
wynik
0 1
Przykład 4
Wejście
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
wynik
1 1 1 1 1 1 0 0
0 1 0 1 1 0 1 0
0 1 0 1 1 1 1 0
(lub dowolny niepusty podzbiór tych 3 wierszy)
Twój program musi obsłużyć wszystkie N, V <100 w rozsądnym czasie. Wypróbuj ten przykład, aby upewnić się, że Twój program może obsłużyć dużą instancję. Najmniejszy program wygrywa.