2-SAT은 불리언 변수 x1,x2,…,xN이 있을 때, 2-CNF 식을 true로 만드는 값 배정이 있는지 판정하는 문제이다.
2-CNF 식은 (x∨y)∧(¬y∨z)∧(x∨¬z)∧(z∨y)와 같은 형태이다. 괄호로 묶인 각 부분을 절이라고 하며, 절은 변수 두 개를 ∨로 묶은 것이다. ∨는 OR, ∧는 AND, ¬은 NOT을 뜻한다.
변수의 개수 N과 절의 개수 M, 그리고 식 f가 주어졌을 때, 식 f를 true로 만들 수 있는지 없는지를 판정하는 프로그램을 작성하시오.
예를 들어 N=3, M=4이고 f=(¬x1∨x2)∧(¬x2∨x3)∧(x1∨x3)∧(x3∨x2)인 경우, x1을 false, x2를 false, x3을 true로 정하면 식 f가 true가 된다. 반면 N=1, M=2이고 f=(x1∨x1)∧(¬x1∨¬x1)인 경우에는 x1에 어떤 값을 넣어도 식 f를 true로 만들 수 없다.
첫째 줄에 변수의 개수 N (1≤N≤20)과 절의 개수 M (1≤M≤100)이 주어진다. 둘째 줄부터 M개의 줄에 절이 한 줄에 하나씩 주어진다. 절은 두 정수 i와 j (1≤∣i∣,∣j∣≤N)로 이루어지며, 양수는 각각 xi와 xj를, 음수는 각각 ¬x−i와 ¬x−j를 뜻한다.
첫째 줄에 식 f를 true로 만들 수 있으면 1을, 없으면 0을 출력한다.